diff --git a/BUILD.gn b/BUILD.gn index 6791cf2..e0f531c 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -1300,28 +1300,6 @@ } } -# Because of the source assignment filter, many targets end up over-filtering -# their sources if the output directory contains a platform name. Assert that -# this doesn't happen. http://crbug.com/548283 -template("assert_valid_out_dir") { - # List copied from //build/config/BUILDCONFIG.gn. - set_sources_assignment_filter([ - "*\bandroid/*", - "*\bchromeos/*", - "*\bcocoa/*", - "*\bios/*", - "*\blinux/*", - "*\bmac/*", - "*\bposix/*", - "*\bwin/*", - ]) - not_needed([ "target_name" ]) - sources = invoker.actual_sources - assert( - sources == invoker.actual_sources, - "Do not use a platform name in your output directory (found \"$root_build_dir\"). http://crbug.com/548283") -} - if (closure_compile) { group("webui_closure_compile") { testonly = true @@ -1353,6 +1331,20 @@ } } -assert_valid_out_dir("_unused") { - actual_sources = [ "$root_build_dir/foo" ] -} +# Because of the source assignment filter, many targets end up over-filtering +# their sources if the output directory contains a platform name. Assert that +# this doesn't happen. http://crbug.com/548283 +assert( + filter_exclude([ "$root_build_dir/foo" ], + # List copied from //build/config/BUILDCONFIG.gn. + [ + "*\bandroid/*", + "*\bchromeos/*", + "*\bcocoa/*", + "*\bios/*", + "*\blinux/*", + "*\bmac/*", + "*\bposix/*", + "*\bwin/*", + ]) != [], + "Do not use a platform name in your output directory (found \"$root_build_dir\"). http://crbug.com/548283")
diff --git a/DEPS b/DEPS index c4cabfb..d66b604 100644 --- a/DEPS +++ b/DEPS
@@ -187,11 +187,11 @@ # 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': '6963f58c7678be5c4ce9543724fa03081732400b', + 'angle_revision': 'b1b6a171ee024e05d487e61f4200f83d1caf9224', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '18daa81e3d3dd15936e201688d5914f7758d5cb0', + 'swiftshader_revision': 'b8bae186cbec0e26de654603e401e691f87ab558', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -246,7 +246,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': '7219f4292e3e6178abd59852ccc0666a24cbbef3', + 'devtools_frontend_revision': '4d806b9daa241aa3f21012dcfc5b11db58be3ea7', # 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. @@ -863,7 +863,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '27402f3ffd344b31e04e3435e4ec820e1af3a276', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8926292ad6bb0f18e892ba0635ec0d6ed3370313', 'condition': 'checkout_linux', }, @@ -1239,7 +1239,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '8afa26ab1b1320e53d86cd3f39cec9cda8bf72fc', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '658be97b194052b6e2569541cfa7ae9d1764afb0', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1443,7 +1443,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '84ee597cdeae08bb26e578fc66a35bcf35f633f4', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '4b6ba7c207903cab654769160d626ab42b1b152a', + Var('webrtc_git') + '/src.git' + '@' + '86eb5d9703db177bfcb7c85617d4551f5f9b9490', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1518,7 +1518,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ebc56f2f561fa09172c7cf8c1bcb397e9675227a', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ef7ec269b5b5ef9d0d507e123dba3c204f6a69b2', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index 01a32a3..dd2127e 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -4,6 +4,7 @@ import("//android_webview/variables.gni") import("//build/config/android/rules.gni") +import("//build/config/python.gni") import("//device/vr/buildflags/buildflags.gni") import("//testing/test.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") @@ -20,37 +21,26 @@ } if (public_android_sdk) { - group("webview_cts_tests") { - _py_files = - read_file("//android_webview/tools/run_cts.pydeps", "list lines") + python_library("webview_cts_tests") { + pydeps_file = "//android_webview/tools/run_cts.pydeps" deps = [ "//android_webview:system_webview_apk" ] - data_deps = [ "//build/android:logdog_wrapper_py", "//build/android:test_runner_py", "//testing/buildbot/filters:webview_cts_tests_filters", ] - - # Filter out comments. - set_sources_assignment_filter([ "#*" ]) - sources = _py_files - - data = sources - data += [ "//android_webview/tools/cts_config/" ] + data = [ "//android_webview/tools/cts_config/" ] } - group("system_webview_wpt") { + python_library("system_webview_wpt") { testonly = true + pydeps_file = "//testing/scripts/run_android_wpt.pydeps" data_deps = [ "//android_webview:system_webview_apk", "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk", "//chrome/test/chromedriver:chromedriver($host_toolchain)", ] - set_sources_assignment_filter([ "#*" ]) - sources = - read_file("//testing/scripts/run_android_wpt.pydeps", "list lines") - data = sources - data += [ "//third_party/blink/web_tests/external/" ] + data = [ "//third_party/blink/web_tests/external/" ] } }
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt index d306475..a3602e2 100644 --- a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt +++ b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
@@ -62,13 +62,12 @@ # permissions API (crbug.com/490120), presentation API (crbug.com/521319), # share API (crbug.com/765923), custom scheme handlers (crbug.com/589502), -# media session API (crbug.com/925997), sms API (crbug.com/963653), and WebXr -# API (crbug.com/1012899) are not supported in webview. +# media session API (crbug.com/925997), and WebXr API (crbug.com/1012899) +# are not supported in webview. interface Navigator getter mediaSession # crbug.com/925997 getter permissions # crbug.com/490120 getter presentation # crbug.com/521319 - getter sms # crbug.com/963653 getter xr # crbug.com/1012899 method registerProtocolHandler # crbug.com/589502 method unregisterProtocolHandler # crbug.com/589502 @@ -78,10 +77,6 @@ interface MediaMetadata interface MediaSession -# SMS API is disabled in Android WebView, (crbug.com/963653) -interface SMS -interface SMSReceiver - # notifications not yet supported in webview, crbug.com/551446 interface ServiceWorkerRegistration : EventTarget getter pushManager
diff --git a/ash/accelerators/accelerator_confirmation_dialog.cc b/ash/accelerators/accelerator_confirmation_dialog.cc index 14310a1c..06441bc 100644 --- a/ash/accelerators/accelerator_confirmation_dialog.cc +++ b/ash/accelerators/accelerator_confirmation_dialog.cc
@@ -28,10 +28,10 @@ base::OnceClosure on_accept_callback, base::OnceClosure on_cancel_callback) : window_title_(l10n_util::GetStringUTF16(window_title_text_id)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_CONTINUE_BUTTON)); - DialogDelegate::set_accept_callback(std::move(on_accept_callback)); - DialogDelegate::set_cancel_callback(std::move(on_cancel_callback)); + DialogDelegate::SetAcceptCallback(std::move(on_accept_callback)); + DialogDelegate::SetCancelCallback(std::move(on_cancel_callback)); SetLayoutManager(std::make_unique<views::FillLayout>()); SetBorder(views::CreateEmptyBorder(
diff --git a/ash/app_list/views/remove_query_confirmation_dialog.cc b/ash/app_list/views/remove_query_confirmation_dialog.cc index 235c42c..3a9c3082 100644 --- a/ash/app_list/views/remove_query_confirmation_dialog.cc +++ b/ash/app_list/views/remove_query_confirmation_dialog.cc
@@ -29,18 +29,18 @@ : confirm_callback_(std::move(confirm_callback)), event_flags_(event_flags), contents_view_(contents_view) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_REMOVE_SUGGESTION_BUTTON_LABEL)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_APP_CANCEL)); auto run_callback = [](RemoveQueryConfirmationDialog* dialog, bool accept) { std::move(dialog->confirm_callback_).Run(accept, dialog->event_flags_); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), false)); const views::LayoutProvider* provider = views::LayoutProvider::Get();
diff --git a/ash/display/display_change_dialog.cc b/ash/display/display_change_dialog.cc index 1dcdf81..866f33f4c 100644 --- a/ash/display/display_change_dialog.cc +++ b/ash/display/display_change_dialog.cc
@@ -41,12 +41,12 @@ std::move(timeout_message_with_placeholder)), on_accept_callback_(std::move(on_accept_callback)), on_cancel_callback_(std::move(on_cancel_callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_CONFIRM_BUTTON)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &DisplayChangeDialog::OnConfirmButtonClicked, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &DisplayChangeDialog::OnCancelButtonClicked, base::Unretained(this))); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/ash/ime/ime_mode_indicator_view.cc b/ash/ime/ime_mode_indicator_view.cc index 30d3ff3a..9b5405d9 100644 --- a/ash/ime/ime_mode_indicator_view.cc +++ b/ash/ime/ime_mode_indicator_view.cc
@@ -49,7 +49,7 @@ ImeModeIndicatorView::ImeModeIndicatorView(const gfx::Rect& cursor_bounds, const base::string16& label) : cursor_bounds_(cursor_bounds), label_view_(new views::Label(label)) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); SetCanActivate(false); set_accept_events(false); set_shadow(views::BubbleBorder::BIG_SHADOW);
diff --git a/ash/login/ui/public_account_warning_dialog.cc b/ash/login/ui/public_account_warning_dialog.cc index 6957d2a..f27ee8ca 100644 --- a/ash/login/ui/public_account_warning_dialog.cc +++ b/ash/login/ui/public_account_warning_dialog.cc
@@ -62,7 +62,7 @@ PublicAccountWarningDialog::PublicAccountWarningDialog( base::WeakPtr<LoginExpandedPublicAccountView> controller) : controller_(controller) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical, gfx::Insets(), kBetweenLabelPaddingDp));
diff --git a/ash/session/multiprofiles_intro_dialog.cc b/ash/session/multiprofiles_intro_dialog.cc index 1d57fb4..d41216c 100644 --- a/ash/session/multiprofiles_intro_dialog.cc +++ b/ash/session/multiprofiles_intro_dialog.cc
@@ -60,13 +60,13 @@ l10n_util::GetStringUTF16(IDS_ASH_DIALOG_DONT_SHOW_AGAIN))), on_accept_(std::move(on_accept)) { never_show_again_checkbox_->SetChecked(true); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](MultiprofilesIntroDialog* dialog) { std::move(dialog->on_accept_) .Run(true, dialog->never_show_again_checkbox_->GetChecked()); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( [](MultiprofilesIntroDialog* dialog) { std::move(dialog->on_accept_).Run(false, false); },
diff --git a/ash/session/session_aborted_dialog.cc b/ash/session/session_aborted_dialog.cc index bce1fdb5..21cad84 100644 --- a/ash/session/session_aborted_dialog.cc +++ b/ash/session/session_aborted_dialog.cc
@@ -69,12 +69,12 @@ } SessionAbortedDialog::SessionAbortedDialog() { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_ASH_MULTIPROFILES_SESSION_ABORT_BUTTON_LABEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( []() { Shell::Get()->session_controller()->RequestSignOut(); })); }
diff --git a/ash/session/teleport_warning_dialog.cc b/ash/session/teleport_warning_dialog.cc index 33b14f3..d6a9874 100644 --- a/ash/session/teleport_warning_dialog.cc +++ b/ash/session/teleport_warning_dialog.cc
@@ -30,13 +30,13 @@ l10n_util::GetStringUTF16(IDS_ASH_DIALOG_DONT_SHOW_AGAIN))), on_accept_(std::move(callback)) { never_show_again_checkbox_->SetChecked(true); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](TeleportWarningDialog* dialog) { std::move(dialog->on_accept_) .Run(true, dialog->never_show_again_checkbox_->GetChecked()); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( [](TeleportWarningDialog* dialog) { std::move(dialog->on_accept_).Run(false, false); },
diff --git a/ash/shelf/contextual_nudge.cc b/ash/shelf/contextual_nudge.cc index a989145..c836a17e 100644 --- a/ash/shelf/contextual_nudge.cc +++ b/ash/shelf/contextual_nudge.cc
@@ -55,7 +55,7 @@ SetCanActivate(false); set_adjust_if_offscreen(false); set_shadow(views::BubbleBorder::NO_ASSETS); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); if (parent_window) { set_parent_window(parent_window);
diff --git a/ash/shelf/shelf_bubble.cc b/ash/shelf/shelf_bubble.cc index 3c03621..a8e099f 100644 --- a/ash/shelf/shelf_bubble.cc +++ b/ash/shelf/shelf_bubble.cc
@@ -36,7 +36,7 @@ /* Don't pass the Shelf so the translucent color is always used. */ nullptr, Shell::Get()->wallpaper_controller()) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); background_animator_.Init(ShelfBackgroundType::kDefaultBg); background_animator_.AddObserver(this);
diff --git a/ash/system/accessibility/accessibility_feature_disable_dialog.cc b/ash/system/accessibility/accessibility_feature_disable_dialog.cc index ad58699..4a01201 100644 --- a/ash/system/accessibility/accessibility_feature_disable_dialog.cc +++ b/ash/system/accessibility/accessibility_feature_disable_dialog.cc
@@ -27,10 +27,10 @@ base::OnceClosure on_accept_callback, base::OnceClosure on_cancel_callback) : window_title_(l10n_util::GetStringUTF16(window_title_text_id)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_YES_BUTTON)); - DialogDelegate::set_accept_callback(std::move(on_accept_callback)); - DialogDelegate::set_cancel_callback(std::move(on_cancel_callback)); + DialogDelegate::SetAcceptCallback(std::move(on_accept_callback)); + DialogDelegate::SetCancelCallback(std::move(on_cancel_callback)); SetLayoutManager(std::make_unique<views::FillLayout>()); SetBorder(views::CreateEmptyBorder(
diff --git a/ash/system/network/network_state_list_detailed_view.cc b/ash/system/network/network_state_list_detailed_view.cc index 5a19c3be..b01f534 100644 --- a/ash/system/network/network_state_list_detailed_view.cc +++ b/ash/system/network/network_state_list_detailed_view.cc
@@ -110,7 +110,7 @@ NetworkStateListDetailedView* detailed_view) : views::BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), detailed_view_(detailed_view) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_margins(gfx::Insets(kBubbleMargin)); SetArrow(views::BubbleBorder::NONE); set_shadow(views::BubbleBorder::NO_ASSETS);
diff --git a/ash/system/palette/palette_welcome_bubble.cc b/ash/system/palette/palette_welcome_bubble.cc index cb3b622e..15d5752 100644 --- a/ash/system/palette/palette_welcome_bubble.cc +++ b/ash/system/palette/palette_welcome_bubble.cc
@@ -36,7 +36,7 @@ public: WelcomeBubbleView(views::View* anchor, views::BubbleBorder::Arrow arrow) : views::BubbleDialogDelegateView(anchor, arrow) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_close_on_deactivate(true); SetCanActivate(false); set_accept_events(true);
diff --git a/ash/system/screen_security/screen_switch_check_controller.cc b/ash/system/screen_security/screen_switch_check_controller.cc index 6698bd9..fab309d 100644 --- a/ash/system/screen_security/screen_switch_check_controller.cc +++ b/ash/system/screen_security/screen_switch_check_controller.cc
@@ -26,12 +26,12 @@ AddChildView(new views::MessageBoxView(views::MessageBoxView::InitParams( l10n_util::GetStringUTF16(IDS_DESKTOP_CASTING_ACTIVE_MESSAGE)))); SetLayoutManager(std::make_unique<views::FillLayout>()); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DESKTOP_CASTING_ACTIVE_CONTINUE)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &CancelCastingDialog::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &CancelCastingDialog::OnDialogCancelled, base::Unretained(this))); } ~CancelCastingDialog() override = default;
diff --git a/ash/system/session/logout_confirmation_dialog.cc b/ash/system/session/logout_confirmation_dialog.cc index f29e2ba..e06f189 100644 --- a/ash/system/session/logout_confirmation_dialog.cc +++ b/ash/system/session/logout_confirmation_dialog.cc
@@ -37,10 +37,10 @@ LogoutConfirmationController* controller, base::TimeTicks logout_time) : controller_(controller), logout_time_(logout_time) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_LOGOUT_CONFIRMATION_BUTTON)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &LogoutConfirmationDialog::OnDialogAccepted, base::Unretained(this))); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/ash/system/session/shutdown_confirmation_dialog.cc b/ash/system/session/shutdown_confirmation_dialog.cc index 902eadd49..a3085c2 100644 --- a/ash/system/session/shutdown_confirmation_dialog.cc +++ b/ash/system/session/shutdown_confirmation_dialog.cc
@@ -34,14 +34,14 @@ base::OnceClosure on_accept_callback, base::OnceClosure on_cancel_callback) : window_title_(l10n_util::GetStringUTF16(window_title_text_id)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_SHUTDOWN_CONFIRMATION_OK_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_ASH_SHUTDOWN_CONFIRMATION_CANCEL_BUTTON)); - DialogDelegate::set_accept_callback(std::move(on_accept_callback)); - DialogDelegate::set_cancel_callback(std::move(on_cancel_callback)); + DialogDelegate::SetAcceptCallback(std::move(on_accept_callback)); + DialogDelegate::SetCancelCallback(std::move(on_cancel_callback)); SetLayoutManager(std::make_unique<views::FillLayout>()); SetBorder(views::CreateEmptyBorder( views::LayoutProvider::Get()->GetDialogInsetsForContentType(
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc index 07ced94..48ea206 100644 --- a/ash/system/tray/tray_bubble_view.cc +++ b/ash/system/tray/tray_bubble_view.cc
@@ -225,7 +225,7 @@ owned_bubble_border_(bubble_border_), is_gesture_dragging_(false), mouse_actively_entered_(false) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DCHECK(delegate_); DCHECK(params_.parent_window); // anchor_widget() is computed by BubbleDialogDelegateView().
diff --git a/base/BUILD.gn b/base/BUILD.gn index 384ce89..16691065 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -344,6 +344,8 @@ "memory/shared_memory_hooks.h", "memory/shared_memory_mapping.cc", "memory/shared_memory_mapping.h", + "memory/shared_memory_security_policy.cc", + "memory/shared_memory_security_policy.h", "memory/shared_memory_tracker.cc", "memory/shared_memory_tracker.h", "memory/singleton.h",
diff --git a/base/android/linker/BUILD.gn b/base/android/linker/BUILD.gn index 5186f7c9..14efe73 100644 --- a/base/android/linker/BUILD.gn +++ b/base/android/linker/BUILD.gn
@@ -32,6 +32,11 @@ # Disable coverage to avoid linker issue. configs -= [ "//build/config/coverage:default_coverage" ] + # Disable orderfile instrumentation. Code in this target is in a different + # .so, cannot call unexported instrumentation functions from another one (link + # time error). + configs -= [ "//build/config/android:default_orderfile_instrumentation" ] + # Avoid linking libc++ and support libraries, to avoid 100 kiB of # un-necessary code. no_default_deps = true
diff --git a/base/memory/platform_shared_memory_region.cc b/base/memory/platform_shared_memory_region.cc index 45647925..944b12c 100644 --- a/base/memory/platform_shared_memory_region.cc +++ b/base/memory/platform_shared_memory_region.cc
@@ -5,11 +5,21 @@ #include "base/memory/platform_shared_memory_region.h" #include "base/memory/shared_memory_mapping.h" +#include "base/memory/shared_memory_security_policy.h" +#include "base/metrics/histogram_functions.h" #include "base/numerics/checked_math.h" namespace base { namespace subtle { +namespace { + +void RecordMappingWasBlockedHistogram(bool blocked) { + base::UmaHistogramBoolean("SharedMemory.MapBlockedForSecurity", blocked); +} + +} // namespace + // static PlatformSharedMemoryRegion PlatformSharedMemoryRegion::CreateWritable( size_t size) { @@ -49,10 +59,19 @@ return false; } + if (!SharedMemorySecurityPolicy::AcquireReservationForMapping(size)) { + RecordMappingWasBlockedHistogram(/*blocked=*/true); + return false; + } else { + RecordMappingWasBlockedHistogram(/*blocked=*/false); + } + bool success = MapAtInternal(offset, size, memory, mapped_size); if (success) { DCHECK_EQ( 0U, reinterpret_cast<uintptr_t>(*memory) & (kMapMinimumAlignment - 1)); + } else { + SharedMemorySecurityPolicy::ReleaseReservationForMapping(size); } return success;
diff --git a/base/memory/shared_memory_hooks.h b/base/memory/shared_memory_hooks.h index a7e401e..4404b54c 100644 --- a/base/memory/shared_memory_hooks.h +++ b/base/memory/shared_memory_hooks.h
@@ -9,6 +9,13 @@ #include "base/memory/unsafe_shared_memory_region.h" #include "base/memory/writable_shared_memory_region.h" +namespace service_manager { + +struct MainParams; +int Main(const MainParams&); + +} // namespace service_manager + namespace base { class SharedMemoryHooks { @@ -17,6 +24,7 @@ private: friend class SharedMemoryHooksTest; + friend int service_manager::Main(const service_manager::MainParams&); // Allows shared memory region creation to be hooked. Useful for sandboxed // processes that are restricted from invoking the platform APIs directly.
diff --git a/base/memory/shared_memory_mapping.cc b/base/memory/shared_memory_mapping.cc index 0c9c0f8a1..c475d00 100644 --- a/base/memory/shared_memory_mapping.cc +++ b/base/memory/shared_memory_mapping.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/logging.h" +#include "base/memory/shared_memory_security_policy.h" #include "base/memory/shared_memory_tracker.h" #include "base/unguessable_token.h" #include "build/build_config.h" @@ -65,6 +66,7 @@ if (!IsValid()) return; + SharedMemorySecurityPolicy::ReleaseReservationForMapping(size_); SharedMemoryTracker::GetInstance()->DecrementMemoryUsage(*this); #if defined(OS_WIN) if (!UnmapViewOfFile(memory_))
diff --git a/base/memory/shared_memory_mapping_unittest.cc b/base/memory/shared_memory_mapping_unittest.cc index 52cd294..b710d978 100644 --- a/base/memory/shared_memory_mapping_unittest.cc +++ b/base/memory/shared_memory_mapping_unittest.cc
@@ -11,6 +11,10 @@ #include "base/containers/span.h" #include "base/memory/read_only_shared_memory_region.h" +#include "base/memory/writable_shared_memory_region.h" +#include "base/test/metrics/histogram_tester.h" +#include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { @@ -143,4 +147,27 @@ .empty()); } +TEST_F(SharedMemoryMappingTest, TotalMappedSizeLimit) { + // Nothing interesting to test if the address space isn't 64 bits, since + // there's no real limit enforced on 32 bits other than complete address + // space exhaustion. + // Also exclude NaCl since pointers are 32 bits on all architectures: + // https://bugs.chromium.org/p/nativeclient/issues/detail?id=1162 +#if defined(ARCH_CPU_64_BITS) && !defined(OS_NACL) + base::HistogramTester histogram_tester; + auto region = WritableSharedMemoryRegion::Create(1024 * 1024 * 1024); + // The limit is 32GB of mappings on 64-bit platforms, so the final mapping + // should fail. + std::vector<WritableSharedMemoryMapping> mappings(32); + for (size_t i = 0; i < mappings.size(); ++i) { + auto& mapping = mappings[i]; + mapping = region.Map(); + DCHECK_EQ(&mapping != &mappings.back(), mapping.IsValid()); + } + EXPECT_THAT( + histogram_tester.GetAllSamples("SharedMemory.MapBlockedForSecurity"), + ::testing::ElementsAre(Bucket(0, 31), Bucket(1, 1))); +#endif // defined(ARCH_CPU_64_BITS) +} + } // namespace base
diff --git a/base/memory/shared_memory_security_policy.cc b/base/memory/shared_memory_security_policy.cc new file mode 100644 index 0000000..df54018 --- /dev/null +++ b/base/memory/shared_memory_security_policy.cc
@@ -0,0 +1,92 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/memory/shared_memory_security_policy.h" + +#include <algorithm> +#include <atomic> + +#include "base/bits.h" +#include "base/numerics/checked_math.h" +#include "base/optional.h" +#include "base/process/process_metrics.h" +#include "build/build_config.h" + +namespace base { + +namespace { + +// Note: pointers are 32 bits on all architectures in NaCl. See +// https://bugs.chromium.org/p/nativeclient/issues/detail?id=1162 +#if defined(ARCH_CPU_32_BITS) || defined(OS_NACL) +// No effective limit on 32-bit, since there simply isn't enough address space +// for ASLR to be particularly effective. +constexpr size_t kTotalMappedSizeLimit = -1; +#elif defined(ARCH_CPU_64_BITS) +// 32 GB of mappings ought to be enough for anybody. +constexpr size_t kTotalMappedSizeLimit = 32ULL * 1024 * 1024 * 1024; +#endif + +static std::atomic_size_t total_mapped_size_; + +base::Optional<size_t> AlignWithPageSize(size_t size) { +#if defined(OS_WIN) + // TODO(crbug.com/210609): Matches alignment requirements defined in + // platform_shared_memory_region_win.cc:PlatformSharedMemoryRegion::Create. + // Remove this when NaCl is gone. + static const size_t kSectionSize = 65536; + const size_t page_size = std::max(kSectionSize, GetPageSize()); +#else + const size_t page_size = GetPageSize(); +#endif // defined(OS_WIN) + size_t rounded_size = bits::Align(size, page_size); + + // Fail on overflow. + if (rounded_size < size) + return base::nullopt; + + return rounded_size; +} + +} // namespace + +// static +bool SharedMemorySecurityPolicy::AcquireReservationForMapping(size_t size) { + size_t previous_mapped_size = + total_mapped_size_.load(std::memory_order_relaxed); + size_t total_mapped_size; + + base::Optional<size_t> page_aligned_size = AlignWithPageSize(size); + + if (!page_aligned_size) + return false; + + // Relaxed memory ordering is all that's needed since all atomicity is all + // that's required. If the value is stale, compare_exchange_weak() will fail + // and the loop will retry the operation with an updated total mapped size. + do { + if (!CheckAdd(previous_mapped_size, *page_aligned_size) + .AssignIfValid(&total_mapped_size)) { + return false; + } + if (total_mapped_size >= kTotalMappedSizeLimit) + return false; + } while (!total_mapped_size_.compare_exchange_weak( + previous_mapped_size, total_mapped_size, std::memory_order_relaxed, + std::memory_order_relaxed)); + + return true; +} + +// static +void SharedMemorySecurityPolicy::ReleaseReservationForMapping(size_t size) { + // Note #1: relaxed memory ordering is sufficient since atomicity is all + // that's required. + // Note #2: |size| should never overflow when aligned to page size, since + // this should only be called if |AcquireReservationForMapping()| returned + // true. + total_mapped_size_.fetch_sub(size, std::memory_order_relaxed); +} + +} // namespace base
diff --git a/base/memory/shared_memory_security_policy.h b/base/memory/shared_memory_security_policy.h new file mode 100644 index 0000000..bf356bb --- /dev/null +++ b/base/memory/shared_memory_security_policy.h
@@ -0,0 +1,37 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_ +#define BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_ + +#include <stddef.h> + +#include "base/compiler_specific.h" + +namespace base { + +namespace subtle { +class PlatformSharedMemoryRegion; +} // namespace subtle + +// Helper to enforce a limit for the total amount of shared memory that can be +// mapped. This can help prevent an attacker from spraying the address space of +// a process with shared memory mappings to bypass ASLR. For more details, see +// https://googleprojectzero.blogspot.com/2019/04/virtually-unlimited-memory-escaping.html +class SharedMemorySecurityPolicy { + private: + friend class subtle::PlatformSharedMemoryRegion; + friend class SharedMemoryMapping; + + // Checks that a mapping with |size| can be created. Returns false if there is + // an overflow in internal calculations, or the max limit has been reached. + static bool AcquireReservationForMapping(size_t size) WARN_UNUSED_RESULT; + + // Releases a reservation that was previously acquired. + static void ReleaseReservationForMapping(size_t size); +}; + +} // namespace base + +#endif // BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
diff --git a/build/.gitignore b/build/.gitignore index 33a4e19..d020852 100644 --- a/build/.gitignore +++ b/build/.gitignore
@@ -22,6 +22,5 @@ /linux/ubuntu_*-sysroot/ /ios_files /mac_files -/xcode_links !/util/LASTCHANGE.dummy
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 32492da..2f32362 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -114,20 +114,13 @@ if (_type != "android_apk" && _type != "java_binary" && _type != "dist_jar" && _type != "java_annotation_processor" && _type != "dist_aar" && _type != "android_app_bundle") { - set_sources_assignment_filter(_java_target_whitelist) _parent_invoker = invoker.invoker _target_label = get_label_info(":${_parent_invoker.target_name}", "label_no_toolchain") - sources = [ _target_label ] - if (sources != []) { - set_sources_assignment_filter(_java_target_blacklist) - sources = [] - sources = [ _target_label ] - if (sources != []) { - assert(false, "Invalid java target name: $_target_label") - } + if (filter_exclude([ _target_label ], _java_target_whitelist) != [] && + filter_exclude([ _target_label ], _java_target_blacklist) != []) { + assert(false, "Invalid java target name: $_target_label") } - sources = [] } action_with_pydeps(target_name) { @@ -151,23 +144,16 @@ _deps_configs = [] if (defined(invoker.possible_config_deps)) { foreach(_possible_dep, invoker.possible_config_deps) { - set_sources_assignment_filter(_java_target_whitelist) _target_label = get_label_info(_possible_dep, "label_no_toolchain") - sources = [ _target_label ] - if (sources == []) { - set_sources_assignment_filter(_java_target_blacklist) - sources = [] - sources = [ _target_label ] - if (sources != []) { - # Put the bug number in the target name so that false-positives - # have a hint in the error message about non-existent dependencies. - deps += [ "$_target_label$build_config_target_suffix" ] - _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir") - _dep_name = get_label_info(_possible_dep, "name") - _deps_configs += [ "$_dep_gen_dir/$_dep_name.build_config" ] - } + if (filter_exclude([ _target_label ], _java_target_whitelist) == [] && + filter_exclude([ _target_label ], _java_target_blacklist) != []) { + # Put the bug number in the target name so that false-positives + # have a hint in the error message about non-existent dependencies. + deps += [ "$_target_label$build_config_target_suffix" ] + _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir") + _dep_name = get_label_info(_possible_dep, "name") + _deps_configs += [ "$_dep_gen_dir/$_dep_name.build_config" ] } - sources = [] } } _rebased_deps_configs = rebase_path(_deps_configs, root_build_dir) @@ -3154,17 +3140,14 @@ _chromium_code = invoker.chromium_code } else { # Default based on whether target is in third_party. - set_sources_assignment_filter([ "*\bthird_party\b*" ]) - sources = [ get_label_info(":$_main_target_name", "dir") ] - _chromium_code = sources != [] + _chromium_code = + filter_exclude([ get_label_info(":$_main_target_name", "dir") ], + [ "*\bthird_party\b*" ]) != [] if (!_chromium_code && !_is_prebuilt && _java_files != []) { # Unless third_party code has an org.chromium file in it. - set_sources_assignment_filter([ "*\bchromium\b*" ]) - sources = _java_files - _chromium_code = _java_files != sources + _chromium_code = + filter_exclude(_java_files, [ "*\bchromium\b*" ]) != _java_files } - set_sources_assignment_filter([]) - sources = [] } if (defined(_final_jar_path)) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index d0d63d2..64938a5 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -1188,9 +1188,8 @@ # This needs to get outputs from grit's internal target, not the final # source_set. - set_sources_assignment_filter([ "*.stamp" ]) - sources = get_target_outputs(":${_grit_target_name}_grit") - inputs = sources + inputs = filter_exclude(get_target_outputs(":${_grit_target_name}_grit"), + [ "*.stamp" ]) output = _resources_zip deps = [ ":$_grit_target_name" ] }
diff --git a/build/config/compiler/pgo/BUILD.gn b/build/config/compiler/pgo/BUILD.gn index 29d434a..dd794c9 100644 --- a/build/config/compiler/pgo/BUILD.gn +++ b/build/config/compiler/pgo/BUILD.gn
@@ -13,8 +13,7 @@ # Only add flags when chrome_pgo_phase == 1, so that variables we would use # are not required to be defined when we're not actually using PGO. - if (chrome_pgo_phase == 1 && is_clang && use_lld && !is_nacl && - is_a_target_toolchain) { + if (chrome_pgo_phase == 1 && is_clang && !is_nacl && is_a_target_toolchain) { cflags = [ "-fprofile-instr-generate" ] if (!is_win) { # Windows directly calls link.exe instead of the compiler driver when
diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni index b03360eb..b42ef65 100644 --- a/build/config/ios/ios_sdk.gni +++ b/build/config/ios/ios_sdk.gni
@@ -106,7 +106,10 @@ ] } if (ios_use_goma_rbe) { - ios_sdk_info_args += [ "--create_symlink_under_src" ] + ios_sdk_info_args += [ + "--create_symlink_at", + rebase_path("$root_build_dir/sdk/xcode_links", "//"), + ] } script_name = "//build/config/mac/sdk_info.py" _ios_sdk_result = exec_script(script_name, ios_sdk_info_args, "scope")
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni index d290187..8eb865d 100644 --- a/build/config/mac/mac_sdk.gni +++ b/build/config/mac/mac_sdk.gni
@@ -92,8 +92,9 @@ # put system xcode under src to avoid absolute path. if (use_system_xcode && ios_use_goma_rbe) { sdk_info_args += [ - "--create_symlink_under_src", "--get_sdk_info", + "--create_symlink_at", + rebase_path("$root_build_dir/sdk/xcode_links", "//"), ] } sdk_info_args += [ mac_sdk_name ]
diff --git a/build/config/mac/sdk_info.py b/build/config/mac/sdk_info.py index 65abd7f..35c439e 100644 --- a/build/config/mac/sdk_info.py +++ b/build/config/mac/sdk_info.py
@@ -108,35 +108,42 @@ settings['sdk_build'] = settings['sdk_version'] -def CreateXcodeSymlinkUnderChromiumSource(src): - """Create symlink to Xcode directory under Chromium source.""" +def CreateXcodeSymlinkAt(src, dst): + """Create symlink to Xcode directory at target location.""" - if not os.path.isdir(XCODE_LINK_DIR): - os.makedirs(XCODE_LINK_DIR) + if not os.path.isdir(dst): + os.makedirs(dst) - dst = os.path.join(XCODE_LINK_DIR, os.path.basename(src)) - # Update the symlink if exist. + dst = os.path.join(dst, os.path.basename(src)) + updated_value = '//' + os.path.relpath(dst, ROOT_SRC_DIR) + + # Update the symlink only if it is different from the current destination. if os.path.islink(dst): + current_src = os.readlink(dst) + if current_src == src: + return updated_value os.unlink(dst) + sys.stderr.write('existing symlink %s points %s; want %s. Removed.' % + (dst, current_src, src)) os.symlink(src, dst) - - return '//' + os.path.relpath(dst, ROOT_SRC_DIR) + return updated_value if __name__ == '__main__': doctest.testmod() parser = argparse.ArgumentParser() - parser.add_argument("--developer_dir", required=False) + parser.add_argument("--developer_dir", dest="developer_dir", required=False) parser.add_argument("--get_sdk_info", action="store_true", dest="get_sdk_info", default=False, help="Returns SDK info in addition to xcode/machine info.") - parser.add_argument("--create_symlink_under_src", - action="store_true", dest="create_symlink_under_src", - default=False, - help="Create symlink of SDK under Chromium source " - "and returns the symlinked paths as SDK info instead " - "of the original location.") + parser.add_argument( + "--create_symlink_at", + action="store", + dest="create_symlink_at", + help="Create symlink of SDK at given location and " + "returns the symlinked paths as SDK info instead " + "of the original location.") args, unknownargs = parser.parse_known_args() if args.developer_dir: os.environ['DEVELOPER_DIR'] = args.developer_dir @@ -155,8 +162,8 @@ for key in sorted(settings): value = settings[key] - if args.create_symlink_under_src and '_path' in key: - value = CreateXcodeSymlinkUnderChromiumSource(value) + if args.create_symlink_at and '_path' in key: + value = CreateXcodeSymlinkAt(value, args.create_symlink_at) if isinstance(value, str): value = '"%s"' % value print('%s=%s' % (key, value))
diff --git a/build/config/python.gni b/build/config/python.gni index 0fb8bd4..79dcc6e 100644 --- a/build/config/python.gni +++ b/build/config/python.gni
@@ -41,21 +41,19 @@ ]) if (defined(invoker.pydeps_file)) { - _py_files = read_file(invoker.pydeps_file, "list lines") - - # Filter out comments. - set_sources_assignment_filter([ "#*" ]) - sources = _py_files + # Read and filter out comments. + _pydeps_lines = read_file(invoker.pydeps_file, "list lines") + _pydeps_entries = filter_exclude(_pydeps_lines, [ "#*" ]) # Dependencies are listed relative to the pydeps file directory, but data # parameter expects paths that are relative to the current BUILD.gn _script_dir = get_path_info(invoker.pydeps_file, "dir") - _rebased_py_files = rebase_path(sources, ".", _script_dir) + _rebased_pydeps_entries = rebase_path(_pydeps_entries, ".", _script_dir) # Even though the .pydep file is not used at runtime, it must be added # so that "gn analyze" will mark the target as changed when .py files # are removed but none are added or modified. - data = _rebased_py_files + [ invoker.pydeps_file ] + data = _rebased_pydeps_entries + [ invoker.pydeps_file ] } else { data = [] } @@ -83,18 +81,6 @@ # args = [...] # } template("action_with_pydeps") { - # Read the .pydeps file now. Note that this is done everytime this - # template is called, but benchmarking doesn't show any impact on overall - # 'gn gen' speed anyway. - _pydeps_file = invoker.script + "deps" - _pydeps_raw = read_file(_pydeps_file, "list lines") - - # Filter out comments. - set_sources_assignment_filter([ "#*" ]) - sources = _pydeps_raw - _pydeps = sources - sources = [] - action(target_name) { # Forward all variables. Ensure that testonly and visibility are forwarded # explicitly, since this performs recursive scope lookups, which is @@ -113,6 +99,13 @@ "visibility", ]) + # Read and filter out comments. + # Happens every time the template is instantiated, but benchmarking shows no + # perceivable impact on overall 'gn gen' speed. + _pydeps_file = invoker.script + "deps" + _pydeps_lines = read_file(_pydeps_file, "list lines") + _pydeps_entries = filter_exclude(_pydeps_lines, [ "#*" ]) + if (!defined(inputs)) { inputs = [] } @@ -120,26 +113,11 @@ # Dependencies are listed relative to the script directory, but inputs # expects paths that are relative to the current BUILD.gn _script_dir = get_path_info(_pydeps_file, "dir") - inputs += rebase_path(_pydeps, ".", _script_dir) + inputs += rebase_path(_pydeps_entries, ".", _script_dir) } } template("action_foreach_with_pydeps") { - _pydeps_file = invoker.script + "deps" - _pydeps_raw = read_file(_pydeps_file, "list lines") - - # Filter out comments. - # This is a bit convoluted to preserve the value of sources if defined. - _old_sources = [] - if (defined(sources)) { - _old_sources = sources - } - set_sources_assignment_filter([ "#*" ]) - sources = _pydeps_raw - _pydeps = sources - set_sources_assignment_filter([]) - sources = _old_sources - action_foreach(target_name) { # Forward all variables. Ensure that testonly and visibility are forwarded # explicitly, since this performs recursive scope lookups, which is @@ -158,6 +136,13 @@ "visibility", ]) + # Read and filter out comments. + # Happens every time the template is instantiated, but benchmarking shows no + # perceivable impact on overall 'gn gen' speed. + _pydeps_file = invoker.script + "deps" + _pydeps_lines = read_file(_pydeps_file, "list lines") + _pydeps_entries = filter_exclude(_pydeps_lines, [ "#*" ]) + if (!defined(inputs)) { inputs = [] } @@ -165,6 +150,6 @@ # Dependencies are listed relative to the script directory, but inputs # expects paths that are relative to the current BUILD.gn _script_dir = get_path_info(script, "dir") - inputs += rebase_path(_pydeps, ".", _script_dir) + inputs += rebase_path(_pydeps_entries, ".", _script_dir) } }
diff --git a/build_overrides/OWNERS b/build_overrides/OWNERS index ee6af5a..fc9fc3b3 100644 --- a/build_overrides/OWNERS +++ b/build_overrides/OWNERS
@@ -1,6 +1,6 @@ file://build/OWNERS machenbach@chromium.org -phoglund@chromium.org +mbonadei@chromium.org # COMPONENT: Build # TEAM: infra-dev@chromium.org
diff --git a/cc/input/scroll_snap_data.cc b/cc/input/scroll_snap_data.cc index e6305f4..10f3280 100644 --- a/cc/input/scroll_snap_data.cc +++ b/cc/input/scroll_snap_data.cc
@@ -13,8 +13,8 @@ namespace { bool IsMutualVisible(const SnapSearchResult& a, const SnapSearchResult& b) { - return a.visible_range().Contains(gfx::RangeF(b.snap_offset())) && - b.visible_range().Contains(gfx::RangeF(a.snap_offset())); + return gfx::RangeF(b.snap_offset()).IsBoundedBy(a.visible_range()) && + gfx::RangeF(a.snap_offset()).IsBoundedBy(b.visible_range()); } void SetOrUpdateResult(const SnapSearchResult& candidate,
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc index fcc15047..bf1be87 100644 --- a/cc/metrics/frame_sequence_tracker.cc +++ b/cc/metrics/frame_sequence_tracker.cc
@@ -505,9 +505,9 @@ FrameSequenceTrackerType type, ThroughputUkmReporter* throughput_ukm_reporter) : type_(type), - metrics_( - std::make_unique<FrameSequenceMetrics>(type, - throughput_ukm_reporter)) { + metrics_(std::make_unique<FrameSequenceMetrics>(type, + throughput_ukm_reporter)), + trace_data_(metrics_.get()) { DCHECK_LT(type_, FrameSequenceTrackerType::kMaxType); } @@ -814,9 +814,8 @@ if (ignored_frame_tokens_.contains(frame_token)) return; - TRACE_EVENT_NESTABLE_ASYNC_INSTANT_WITH_TIMESTAMP0( - "cc,benchmark", "FramePresented", TRACE_ID_LOCAL(metrics_.get()), - feedback.timestamp); + trace_data_.Advance(feedback.timestamp); + const bool was_presented = !feedback.timestamp.is_null(); if (was_presented && last_submitted_frame_) { DCHECK_LT(impl_throughput().frames_produced, @@ -1090,4 +1089,19 @@ FrameSequenceTracker::CheckerboardingData::CheckerboardingData() = default; FrameSequenceTracker::CheckerboardingData::~CheckerboardingData() = default; +FrameSequenceTracker::TraceData::TraceData(const void* id) : trace_id(id) {} +void FrameSequenceTracker::TraceData::Advance(base::TimeTicks new_timestamp) { + // Use different names, because otherwise the trace-viewer shows the slices in + // the same color, and that makes it difficult to tell the traces apart from + // each other. + const char* trace_names[] = {"Frame", "Frame ", "Frame "}; + TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( + "cc,benchmark", trace_names[++this->frame_count % 3], + TRACE_ID_LOCAL(this->trace_id), this->last_timestamp); + TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0( + "cc,benchmark", trace_names[this->frame_count % 3], + TRACE_ID_LOCAL(this->trace_id), new_timestamp); + this->last_timestamp = new_timestamp; +} + } // namespace cc
diff --git a/cc/metrics/frame_sequence_tracker.h b/cc/metrics/frame_sequence_tracker.h index 7828201f..d3d9669 100644 --- a/cc/metrics/frame_sequence_tracker.h +++ b/cc/metrics/frame_sequence_tracker.h
@@ -425,6 +425,16 @@ // TODO(xidachen): remove this one. uint64_t current_begin_main_sequence_ = 0; + // Tracks some data to generate useful trace events. + struct TraceData { + explicit TraceData(const void* trace_id); + const void* trace_id; + base::TimeTicks last_timestamp = base::TimeTicks::Now(); + int frame_count = 0; + + void Advance(base::TimeTicks new_timestamp); + } trace_data_; + #if DCHECK_IS_ON() bool is_inside_frame_ = false;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 31c5af0..71e241a 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -247,8 +247,6 @@ } // namespace -DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeDurationHistogramTimer, - "Scheduling.%s.PendingTreeDuration") DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeRasterDurationHistogramTimer, "Scheduling.%s.PendingTreeRasterDuration") @@ -1728,7 +1726,6 @@ if (pending_tree_) pending_tree_->DetachLayers(); pending_tree_ = nullptr; - pending_tree_duration_timer_ = nullptr; if (recycle_tree_) recycle_tree_->DetachLayers(); recycle_tree_ = nullptr; @@ -3016,9 +3013,6 @@ client_->OnCanDrawStateChanged(CanDraw()); TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("cc", "PendingTree:waiting", TRACE_ID_LOCAL(pending_tree_.get())); - - DCHECK(!pending_tree_duration_timer_); - pending_tree_duration_timer_.reset(new PendingTreeDurationHistogramTimer()); } void LayerTreeHostImpl::PushScrollbarOpacitiesFromActiveToPending() { @@ -3056,10 +3050,6 @@ TRACE_ID_LOCAL(pending_tree_.get())); active_tree_->lifecycle().AdvanceTo(LayerTreeLifecycle::kBeginningSync); - DCHECK(pending_tree_duration_timer_); - // Reset will call the destructor and log the timer histogram. - pending_tree_duration_timer_.reset(); - // In most cases, this will be reset in NotifyReadyToActivate, since we // activate the pending tree only when its ready. But an activation may be // forced, in the case of a context loss for instance, so reset it here as
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 3c141a9..8f439cf 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -91,7 +91,6 @@ class MutatorEvents; class MutatorHost; class PageScaleAnimation; -class PendingTreeDurationHistogramTimer; class PendingTreeRasterDurationHistogramTimer; class RasterTilePriorityQueue; class RasterBufferProvider; @@ -1248,8 +1247,6 @@ std::unique_ptr<Viewport> viewport_; - std::unique_ptr<PendingTreeDurationHistogramTimer> - pending_tree_duration_timer_; std::unique_ptr<PendingTreeRasterDurationHistogramTimer> pending_tree_raster_duration_timer_;
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 910f1ce0..97a36fe 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -2331,17 +2331,15 @@ } } -group("chrome_public_wpt") { +python_library("chrome_public_wpt") { testonly = true + pydeps_file = "//testing/scripts/run_android_wpt.pydeps" + data = [ "//third_party/blink/web_tests/external/" ] data_deps = [ ":chrome_public_apk", "//build/android:test_runner_py", "//chrome/test/chromedriver:chromedriver($host_toolchain)", ] - set_sources_assignment_filter([ "#*" ]) - sources = read_file("//testing/scripts/run_android_wpt.pydeps", "list lines") - data = sources - data += [ "//third_party/blink/web_tests/external/" ] } chrome_bundle("chrome_modern_public_bundle") {
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java index 1487412..bf4c057 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
@@ -48,6 +48,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.BooleanAndProto; import org.chromium.chrome.browser.autofill_assistant.proto.BooleanList; +import org.chromium.chrome.browser.autofill_assistant.proto.BooleanNotProto; import org.chromium.chrome.browser.autofill_assistant.proto.CallbackProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipType; @@ -90,6 +91,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto; import org.chromium.chrome.browser.autofill_assistant.proto.TextViewProto; import org.chromium.chrome.browser.autofill_assistant.proto.ToStringProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ToggleUserActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.UserActionList; import org.chromium.chrome.browser.autofill_assistant.proto.UserActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ValueProto; @@ -1197,4 +1199,96 @@ .check(matches(isImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO))); onView(withText("custom-desc")).check(matches(withContentDescription("custom"))); } + + /** + * Shows a chip that becomes enabled/disabled based on other interactions. + */ + @Test + @MediumTest + public void testGenericUiDisableChips() { + List<InteractionProto> interactions = new ArrayList<>(); + interactions.add( + (InteractionProto) InteractionProto.newBuilder() + .setTriggerEvent(EventProto.newBuilder().setOnValueChanged( + OnModelValueChangedEventProto.newBuilder().setModelIdentifier( + "chips"))) + .addCallbacks(CallbackProto.newBuilder().setSetUserActions( + SetUserActionsProto.newBuilder().setModelIdentifier("chips"))) + .build()); + interactions.add( + (InteractionProto) InteractionProto.newBuilder() + .setTriggerEvent(EventProto.newBuilder().setOnValueChanged( + OnModelValueChangedEventProto.newBuilder().setModelIdentifier( + "enabled"))) + .addCallbacks(CallbackProto.newBuilder().setToggleUserAction( + ToggleUserActionProto.newBuilder() + .setUserActionsModelIdentifier("chips") + .setEnabledModelIdentifier("enabled") + .setUserActionIdentifier("done_chip"))) + .build()); + interactions.add( + (InteractionProto) InteractionProto.newBuilder() + .setTriggerEvent(EventProto.newBuilder().setOnViewClicked( + OnViewClickedEventProto.newBuilder().setViewIdentifier( + "text_view"))) + .addCallbacks(CallbackProto.newBuilder().setComputeValue( + ComputeValueProto.newBuilder() + .setResultModelIdentifier("enabled") + .setBooleanNot( + BooleanNotProto.newBuilder().setModelIdentifier( + "enabled")))) + .build()); + + List<ModelProto.ModelValue> modelValues = new ArrayList<>(); + modelValues.add( + (ModelProto.ModelValue) ModelProto.ModelValue.newBuilder() + .setIdentifier("chips") + .setValue(ValueProto.newBuilder().setUserActions( + UserActionList.newBuilder().addValues( + UserActionProto.newBuilder() + .setChip(ChipProto.newBuilder() + .setText("Done") + .setType(ChipType.NORMAL_ACTION)) + .setIdentifier("done_chip")))) + .build()); + modelValues.add((ModelProto.ModelValue) ModelProto.ModelValue.newBuilder() + .setIdentifier("enabled") + .setValue(ValueProto.newBuilder().setBooleans( + BooleanList.newBuilder().addValues(false))) + .build()); + + GenericUserInterfaceProto genericUserInterface = + (GenericUserInterfaceProto) GenericUserInterfaceProto.newBuilder() + .setRootView(createTextView("Click me to toggle the chip", "text_view")) + .setInteractions( + InteractionsProto.newBuilder().addAllInteractions(interactions)) + .setModel(ModelProto.newBuilder().addAllValues(modelValues)) + .build(); + + ArrayList<ActionProto> list = new ArrayList<>(); + list.add((ActionProto) ActionProto.newBuilder() + .setShowGenericUi(ShowGenericUiProto.newBuilder().setGenericUserInterface( + genericUserInterface)) + .build()); + AutofillAssistantTestScript script = new AutofillAssistantTestScript( + (SupportedScriptProto) SupportedScriptProto.newBuilder() + .setPath("form_target_website.html") + .setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip( + ChipProto.newBuilder().setText("Autostart"))) + .build(), + list); + + AutofillAssistantTestService testService = + new AutofillAssistantTestService(Collections.singletonList(script)); + startAutofillAssistant(mTestRule.getActivity(), testService); + + waitUntilViewMatchesCondition(withText("Done"), isCompletelyDisplayed()); + onView(withContentDescription("Done")).check(matches(not(isEnabled()))); + + onView(withText("Click me to toggle the chip")).perform(click()); + waitUntilViewMatchesCondition(withContentDescription("Done"), isEnabled()); + + onView(withText("Click me to toggle the chip")).perform(click()); + waitUntilViewMatchesCondition(withContentDescription("Done"), not(isEnabled())); + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java index 897e99c..ee9e305 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
@@ -66,21 +66,19 @@ public final int id; public final String title; public final String originalUrl; - public final Profile profile; public final String visibleUrl; /** * Constructs a new TabInfo object */ protected TabInfo(int id, String title, String url, String originalUrl, String referrerUrl, - long timestampMillis, Profile profile, String visibleUrl) { + long timestampMillis, String visibleUrl) { this.id = id; this.title = title; this.url = url; this.originalUrl = originalUrl; this.referrerUrl = referrerUrl; this.timestampMillis = timestampMillis; - this.profile = profile; this.visibleUrl = visibleUrl; } @@ -91,11 +89,12 @@ String referrerUrl = getReferrerUrlFromTab(tab); return new TabInfo(tab.getId(), tab.getTitle(), tab.getUrlString(), tab.getOriginalUrl(), referrerUrl != null ? referrerUrl : "", - tab.getTimestampMillis(), ((TabImpl) tab).getProfile(), tab.getUrlString()); + tab.getTimestampMillis(), tab.getUrlString()); } public double getSiteEngagementScore() { - return SiteEngagementService.getForProfile(profile).getScore(visibleUrl); + return SiteEngagementService.getForProfile(Profile.getLastUsedRegularProfile()) + .getScore(visibleUrl); } private static String getReferrerUrlFromTab(Tab tab) {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java index 823f9c6..279238a3 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java
@@ -49,8 +49,8 @@ private TabContext.TabInfo getMockTab(int id, String title, String url, String originalUrl, String referrer, long timestamp, double siteEngagementScore) { - TabContext.TabInfo tabInfo = spy( - new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, null, "")); + TabContext.TabInfo tabInfo = + spy(new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, "")); doReturn(siteEngagementScore).when(tabInfo).getSiteEngagementScore(); return tabInfo; }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java index fb5e5b91..645270f 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
@@ -54,8 +54,8 @@ private TabContext.TabInfo getMockTab(int id, String title, String url, String originalUrl, String referrer, long timestamp, double siteEngagementScore) { - TabContext.TabInfo tabInfo = spy( - new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, null, "")); + TabContext.TabInfo tabInfo = + spy(new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, "")); doReturn(siteEngagementScore).when(tabInfo).getSiteEngagementScore(); return tabInfo; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java index dbf80303..51663f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog; import org.chromium.chrome.browser.autofill.prefeditor.EditorObserverForTest; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.payments.PaymentApp; import org.chromium.chrome.browser.payments.PaymentRequestImpl.PaymentUisShowStateReconciler; import org.chromium.chrome.browser.payments.ShippingStrings; import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.LineItemBreakdownSection; @@ -1022,6 +1023,13 @@ && mPaymentMethodSectionInformation != null && mPaymentMethodSectionInformation.getSelectedItem() != null && !mIsClientCheckingSelection && !mIsEditingPaymentItem && !mIsClosing); + + PaymentApp selectedApp = mPaymentMethodSectionInformation == null + ? null + : (PaymentApp) mPaymentMethodSectionInformation.getSelectedItem(); + mPayButton.setText(selectedApp != null && !selectedApp.isAutofillInstrument() + ? R.string.payments_continue_button + : R.string.payments_pay_button); mReadyToPayNotifierForTest.run(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java index d4daf1b..616b586 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
@@ -12,6 +12,7 @@ import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.support.test.filters.MediumTest; +import android.widget.Button; import org.junit.Before; import org.junit.ClassRule; @@ -62,6 +63,13 @@ "310-310-6000", "jon.doe@gmail.com", "en-US")); } + protected String getPrimaryButtonLabel() { + Button primary = (Button) mPaymentRequestTestRule.getPaymentRequestUI() + .getDialogForTest() + .findViewById(R.id.button_primary); + return primary.getText().toString(); + } + /** * Verify modifier for Bobpay is only applied for Bobpay. */ @@ -81,6 +89,9 @@ assertTrue(mPaymentRequestTestRule.getSelectedPaymentAppLabel().startsWith( "https://bobpay.com")); assertEquals("USD $4.00", mPaymentRequestTestRule.getOrderSummaryTotal()); + assertEquals(mPaymentRequestTestRule.getActivity().getResources().getString( + R.string.payments_continue_button), + getPrimaryButtonLabel()); // select other payment method and verify modifier for bobpay is not applied mPaymentRequestTestRule.clickOnPaymentMethodSuggestionOptionAndWait( @@ -88,6 +99,9 @@ assertFalse(mPaymentRequestTestRule.getSelectedPaymentAppLabel().startsWith( "https://bobpay.com")); assertEquals("USD $5.00", mPaymentRequestTestRule.getOrderSummaryTotal()); + assertEquals(mPaymentRequestTestRule.getActivity().getResources().getString( + R.string.payments_pay_button), + getPrimaryButtonLabel()); } /**
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index eec9412..a8cb7a4f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3882,15 +3882,19 @@ flag_descriptions::kSharingDeriveVapidKeyDescription, kOsAll, FEATURE_VALUE_TYPE(kSharingDeriveVapidKey)}, +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ + defined(OS_CHROMEOS) {"sharing-peer-connection-receiver", flag_descriptions::kSharingPeerConnectionReceiverName, - flag_descriptions::kSharingPeerConnectionReceiverDescription, kOsAll, + flag_descriptions::kSharingPeerConnectionReceiverDescription, kOsDesktop, FEATURE_VALUE_TYPE(kSharingPeerConnectionReceiver)}, {"sharing-peer-connection-sender", flag_descriptions::kSharingPeerConnectionSenderName, - flag_descriptions::kSharingPeerConnectionSenderDescription, kOsAll, + flag_descriptions::kSharingPeerConnectionSenderDescription, kOsDesktop, FEATURE_VALUE_TYPE(kSharingPeerConnectionSender)}, +#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || + // defined(OS_CHROMEOS) {"sharing-qr-code-generator", flag_descriptions::kSharingQRCodeGeneratorName, @@ -4058,10 +4062,6 @@ flag_descriptions::kDisableBestEffortTasksName, flag_descriptions::kDisableBestEffortTasksDescription, kOsAll, SINGLE_VALUE_TYPE(switches::kDisableBestEffortTasks)}, - {"enable-sync-uss-passwords", - flag_descriptions::kEnableSyncUSSPasswordsName, - flag_descriptions::kEnableSyncUSSPasswordsDescription, kOsAll, - FEATURE_VALUE_TYPE(switches::kSyncUSSPasswords)}, #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS) {"web-contents-occlusion", flag_descriptions::kWebContentsOcclusionName,
diff --git a/chrome/browser/accessibility/caption_bubble.cc b/chrome/browser/accessibility/caption_bubble.cc index 93ccf43..942d02b 100644 --- a/chrome/browser/accessibility/caption_bubble.cc +++ b/chrome/browser/accessibility/caption_bubble.cc
@@ -20,7 +20,7 @@ : BubbleDialogDelegateView(anchor, views::BubbleBorder::FLOAT, views::BubbleBorder::Shadow::NO_SHADOW) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::set_draggable(true); }
diff --git a/chrome/browser/android/autofill_assistant/interaction_handler_android.cc b/chrome/browser/android/autofill_assistant/interaction_handler_android.cc index 966cf00..1c1ee3d 100644 --- a/chrome/browser/android/autofill_assistant/interaction_handler_android.cc +++ b/chrome/browser/android/autofill_assistant/interaction_handler_android.cc
@@ -58,6 +58,14 @@ basic_interactions->EndAction(proto); } +void TryToggleUserAction(base::WeakPtr<BasicInteractions> basic_interactions, + const ToggleUserActionProto& proto) { + if (!basic_interactions) { + return; + } + basic_interactions->ToggleUserAction(proto); +} + void ShowInfoPopup(const InfoPopupProto& proto, base::android::ScopedJavaGlobalRef<jobject> jcontext) { JNIEnv* env = base::android::AttachCurrentThread(); @@ -362,6 +370,27 @@ return base::Optional<InteractionHandlerAndroid::InteractionCallback>( base::BindRepeating(&SetTextViewText, user_model->GetWeakPtr(), proto.set_text(), views)); + break; + case CallbackProto::kToggleUserAction: + if (proto.toggle_user_action().user_actions_model_identifier().empty()) { + VLOG(1) << "Error creating ToggleUserAction interaction: " + "user_actions_model_identifier not set"; + return base::nullopt; + } + if (proto.toggle_user_action().user_action_identifier().empty()) { + VLOG(1) << "Error creating ToggleUserAction interaction: " + "user_action_identifier not set"; + return base::nullopt; + } + if (proto.toggle_user_action().enabled_model_identifier().empty()) { + VLOG(1) << "Error creating ToggleUserAction interaction: " + "enabled_model_identifier not set"; + return base::nullopt; + } + return base::Optional<InteractionHandlerAndroid::InteractionCallback>( + base::BindRepeating(&TryToggleUserAction, + basic_interactions->GetWeakPtr(), + proto.toggle_user_action())); case CallbackProto::KIND_NOT_SET: VLOG(1) << "Error creating interaction: kind not set"; return base::nullopt;
diff --git a/chrome/browser/android/preferences/website_preference_bridge.cc b/chrome/browser/android/preferences/website_preference_bridge.cc index c7a68f2..e8235f5a 100644 --- a/chrome/browser/android/preferences/website_preference_bridge.cc +++ b/chrome/browser/android/preferences/website_preference_bridge.cc
@@ -22,14 +22,10 @@ #include "chrome/android/chrome_jni_headers/WebsitePreferenceBridge_jni.h" #include "chrome/browser/android/search_permissions/search_permissions_service.h" #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" -#include "chrome/browser/content_settings/cookie_settings_factory.h" -#include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/content_settings/tab_specific_content_settings.h" #include "chrome/browser/content_settings/web_site_settings_uma_util.h" #include "chrome/browser/engagement/important_sites_util.h" #include "chrome/browser/media/android/cdm/media_drm_license_manager.h" #include "chrome/browser/notifications/notification_permission_context.h" -#include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h" #include "chrome/browser/permissions/permission_manager_factory.h" #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h" #include "chrome/browser/profiles/profile.h" @@ -41,10 +37,12 @@ #include "chrome/common/pref_names.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings.h" #include "components/permissions/permission_decision_auto_blocker.h" #include "components/permissions/permission_manager.h" #include "components/permissions/permission_uma_util.h" #include "components/permissions/permission_util.h" +#include "components/permissions/permissions_client.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" @@ -81,11 +79,20 @@ return profile; } +Profile* GetOriginalProfile() { + return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); +} + HostContentSettingsMap* GetHostContentSettingsMap(bool is_incognito) { - return HostContentSettingsMapFactory::GetForProfile( + return permissions::PermissionsClient::Get()->GetSettingsMap( GetActiveUserProfile(is_incognito)); } +HostContentSettingsMap* GetHostContentSettingsMap() { + return permissions::PermissionsClient::Get()->GetSettingsMap( + GetOriginalProfile()); +} + // Reset the give permission for the DSE if the permission and origin are // controlled by the DSE. bool MaybeResetDSEPermission(ContentSettingsType type, @@ -107,8 +114,7 @@ return false; } -ScopedJavaLocalRef<jstring> -JNI_WebsitePreferenceBridge_ConvertOriginToJavaString( +ScopedJavaLocalRef<jstring> ConvertOriginToJavaString( JNIEnv* env, const std::string& origin) { // The string |jorigin| is used to group permissions together in the Site @@ -142,12 +148,11 @@ const base::android::JavaRef<jstring>&, const base::android::JavaRef<jstring>&); -void JNI_WebsitePreferenceBridge_GetOrigins( - JNIEnv* env, - ContentSettingsType content_type, - InfoListInsertionFunction insertionFunc, - const JavaRef<jobject>& list, - jboolean managedOnly) { +void GetOrigins(JNIEnv* env, + ContentSettingsType content_type, + InfoListInsertionFunction insertionFunc, + const JavaRef<jobject>& list, + jboolean managedOnly) { HostContentSettingsMap* content_settings_map = GetHostContentSettingsMap(false); // is_incognito ContentSettingsForOneType all_settings; @@ -181,17 +186,14 @@ jembedder = ConvertUTF8ToJavaString(env, embedder); seen_origins.push_back(origin); - insertionFunc( - env, list, - JNI_WebsitePreferenceBridge_ConvertOriginToJavaString(env, origin), - jembedder); + insertionFunc(env, list, ConvertOriginToJavaString(env, origin), jembedder); } // Add any origins which have a default content setting value (thus skipped // above), but have been automatically blocked for this permission type. // We use an empty embedder since embargo doesn't care about it. permissions::PermissionDecisionAutoBlocker* auto_blocker = - PermissionDecisionAutoBlockerFactory::GetForProfile( + permissions::PermissionsClient::Get()->GetPermissionDecisionAutoBlocker( GetActiveUserProfile(false /* is_incognito */)); ScopedJavaLocalRef<jstring> jembedder; @@ -205,20 +207,17 @@ if (auto_blocker->GetEmbargoResult(GURL(origin), content_type) .content_setting == CONTENT_SETTING_BLOCK) { seen_origins.push_back(origin); - insertionFunc( - env, list, - JNI_WebsitePreferenceBridge_ConvertOriginToJavaString(env, origin), - jembedder); + insertionFunc(env, list, ConvertOriginToJavaString(env, origin), + jembedder); } } } -ContentSetting JNI_WebsitePreferenceBridge_GetSettingForOrigin( - JNIEnv* env, - ContentSettingsType content_type, - jstring origin, - jstring embedder, - jboolean is_incognito) { +ContentSetting GetSettingForOrigin(JNIEnv* env, + ContentSettingsType content_type, + jstring origin, + jstring embedder, + jboolean is_incognito) { GURL url(ConvertJavaStringToUTF8(env, origin)); std::string embedder_str = ConvertJavaStringToUTF8(env, embedder); GURL embedder_url; @@ -235,13 +234,12 @@ .content_setting; } -void JNI_WebsitePreferenceBridge_SetSettingForOrigin( - JNIEnv* env, - ContentSettingsType content_type, - jstring origin, - jstring embedder, - ContentSetting setting, - jboolean is_incognito) { +void SetSettingForOrigin(JNIEnv* env, + ContentSettingsType content_type, + jstring origin, + jstring embedder, + ContentSetting setting, + jboolean is_incognito) { GURL origin_url(ConvertJavaStringToUTF8(env, origin)); GURL embedder_url = embedder ? GURL(ConvertJavaStringToUTF8(env, embedder)) : GURL(); @@ -250,7 +248,8 @@ // The permission may have been blocked due to being under embargo, so if it // was changed away from BLOCK, clear embargo status if it exists. if (setting != CONTENT_SETTING_BLOCK) { - PermissionDecisionAutoBlockerFactory::GetForProfile(profile) + permissions::PermissionsClient::Get() + ->GetPermissionDecisionAutoBlocker(profile) ->RemoveEmbargoByUrl(origin_url, content_type); } @@ -263,7 +262,7 @@ scoped_revocation_reporter( profile, origin_url, embedder_url, content_type, permissions::PermissionSourceUI::SITE_SETTINGS); - HostContentSettingsMapFactory::GetForProfile(profile) + GetHostContentSettingsMap(is_incognito) ->SetContentSettingDefaultScope(origin_url, embedder_url, content_type, std::string(), setting); WebSiteSettingsUmaUtil::LogPermissionChange(content_type, setting); @@ -296,13 +295,8 @@ return origin == url::Origin::Create(other); } -Profile* GetOriginalProfile() { - return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); -} - bool GetBooleanForContentSetting(ContentSettingsType type) { - HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); + HostContentSettingsMap* content_settings = GetHostContentSettingsMap(); switch (content_settings->GetDefaultContentSetting(type, nullptr)) { case CONTENT_SETTING_BLOCK: return false; @@ -315,8 +309,7 @@ bool IsContentSettingManaged(ContentSettingsType content_settings_type) { std::string source; - HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); + HostContentSettingsMap* content_settings = GetHostContentSettingsMap(); content_settings->GetDefaultContentSetting(content_settings_type, &source); HostContentSettingsMap::ProviderType provider = content_settings->GetProviderTypeFromSource(source); @@ -326,8 +319,7 @@ bool IsContentSettingManagedByCustodian( ContentSettingsType content_settings_type) { std::string source; - HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); + HostContentSettingsMap* content_settings = GetHostContentSettingsMap(); content_settings->GetDefaultContentSetting(content_settings_type, &source); HostContentSettingsMap::ProviderType provider = content_settings->GetProviderTypeFromSource(source); @@ -336,8 +328,7 @@ bool IsContentSettingUserModifiable(ContentSettingsType content_settings_type) { std::string source; - HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); + HostContentSettingsMap* content_settings = GetHostContentSettingsMap(); content_settings->GetDefaultContentSetting(content_settings_type, &source); HostContentSettingsMap::ProviderType provider = content_settings->GetProviderTypeFromSource(source); @@ -349,18 +340,17 @@ static void JNI_WebsitePreferenceBridge_GetClipboardOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::CLIPBOARD_READ_WRITE, - &Java_WebsitePreferenceBridge_insertClipboardInfoIntoList, list, false); + GetOrigins(env, ContentSettingsType::CLIPBOARD_READ_WRITE, + &Java_WebsitePreferenceBridge_insertClipboardInfoIntoList, list, + false); } static jint JNI_WebsitePreferenceBridge_GetClipboardSettingForOrigin( JNIEnv* env, const JavaParamRef<jstring>& origin, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::CLIPBOARD_READ_WRITE, origin, origin, - is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::CLIPBOARD_READ_WRITE, + origin, origin, is_incognito); } static void JNI_WebsitePreferenceBridge_SetClipboardSettingForOrigin( @@ -368,19 +358,17 @@ const JavaParamRef<jstring>& origin, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::CLIPBOARD_READ_WRITE, origin, origin, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::CLIPBOARD_READ_WRITE, origin, + origin, static_cast<ContentSetting>(value), is_incognito); } static void JNI_WebsitePreferenceBridge_GetGeolocationOrigins( JNIEnv* env, const JavaParamRef<jobject>& list, jboolean managedOnly) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::GEOLOCATION, - &Java_WebsitePreferenceBridge_insertGeolocationInfoIntoList, list, - managedOnly); + GetOrigins(env, ContentSettingsType::GEOLOCATION, + &Java_WebsitePreferenceBridge_insertGeolocationInfoIntoList, list, + managedOnly); } static jint JNI_WebsitePreferenceBridge_GetGeolocationSettingForOrigin( @@ -388,8 +376,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::GEOLOCATION, origin, embedder, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::GEOLOCATION, origin, + embedder, is_incognito); } static void JNI_WebsitePreferenceBridge_SetGeolocationSettingForOrigin( @@ -398,17 +386,15 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::GEOLOCATION, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::GEOLOCATION, origin, embedder, + static_cast<ContentSetting>(value), is_incognito); } static void JNI_WebsitePreferenceBridge_GetMidiOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::MIDI_SYSEX, - &Java_WebsitePreferenceBridge_insertMidiInfoIntoList, list, false); + GetOrigins(env, ContentSettingsType::MIDI_SYSEX, + &Java_WebsitePreferenceBridge_insertMidiInfoIntoList, list, false); } static jint JNI_WebsitePreferenceBridge_GetMidiSettingForOrigin( @@ -416,8 +402,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::MIDI_SYSEX, origin, embedder, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::MIDI_SYSEX, origin, + embedder, is_incognito); } static void JNI_WebsitePreferenceBridge_SetMidiSettingForOrigin( @@ -426,15 +412,14 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::MIDI_SYSEX, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::MIDI_SYSEX, origin, embedder, + static_cast<ContentSetting>(value), is_incognito); } static void JNI_WebsitePreferenceBridge_GetProtectedMediaIdentifierOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( + GetOrigins( env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, &Java_WebsitePreferenceBridge_insertProtectedMediaIdentifierInfoIntoList, list, false); @@ -446,9 +431,9 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, origin, embedder, - is_incognito); + return GetSettingForOrigin(env, + ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, + origin, embedder, is_incognito); } static void @@ -458,25 +443,25 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, + origin, embedder, static_cast<ContentSetting>(value), + is_incognito); } static void JNI_WebsitePreferenceBridge_GetNotificationOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::NOTIFICATIONS, - &Java_WebsitePreferenceBridge_insertNotificationIntoList, list, false); + GetOrigins(env, ContentSettingsType::NOTIFICATIONS, + &Java_WebsitePreferenceBridge_insertNotificationIntoList, list, + false); } static jint JNI_WebsitePreferenceBridge_GetNotificationSettingForOrigin( JNIEnv* env, const JavaParamRef<jstring>& origin, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::NOTIFICATIONS, origin, origin, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::NOTIFICATIONS, origin, + origin, is_incognito); } static jboolean JNI_WebsitePreferenceBridge_IsNotificationEmbargoedForOrigin( @@ -515,7 +500,8 @@ GURL url = GURL(ConvertJavaStringToUTF8(env, origin)); ContentSetting setting = static_cast<ContentSetting>(value); - PermissionDecisionAutoBlockerFactory::GetForProfile(profile) + permissions::PermissionsClient::Get() + ->GetPermissionDecisionAutoBlocker(profile) ->RemoveEmbargoByUrl(url, ContentSettingsType::NOTIFICATIONS); if (MaybeResetDSEPermission(ContentSettingsType::NOTIFICATIONS, url, GURL(), @@ -559,20 +545,18 @@ JNIEnv* env, const JavaParamRef<jobject>& list, jboolean managedOnly) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::MEDIASTREAM_CAMERA, - &Java_WebsitePreferenceBridge_insertCameraInfoIntoList, list, - managedOnly); + GetOrigins(env, ContentSettingsType::MEDIASTREAM_CAMERA, + &Java_WebsitePreferenceBridge_insertCameraInfoIntoList, list, + managedOnly); } static void JNI_WebsitePreferenceBridge_GetMicrophoneOrigins( JNIEnv* env, const JavaParamRef<jobject>& list, jboolean managedOnly) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::MEDIASTREAM_MIC, - &Java_WebsitePreferenceBridge_insertMicrophoneInfoIntoList, list, - managedOnly); + GetOrigins(env, ContentSettingsType::MEDIASTREAM_MIC, + &Java_WebsitePreferenceBridge_insertMicrophoneInfoIntoList, list, + managedOnly); } static jint JNI_WebsitePreferenceBridge_GetMicrophoneSettingForOrigin( @@ -580,9 +564,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::MEDIASTREAM_MIC, origin, embedder, - is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_MIC, origin, + embedder, is_incognito); } static jint JNI_WebsitePreferenceBridge_GetCameraSettingForOrigin( @@ -590,9 +573,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::MEDIASTREAM_CAMERA, origin, embedder, - is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_CAMERA, + origin, embedder, is_incognito); } static void JNI_WebsitePreferenceBridge_SetMicrophoneSettingForOrigin( @@ -601,9 +583,9 @@ jint value, jboolean is_incognito) { // Here 'nullptr' indicates that microphone uses wildcard for embedder. - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::MEDIASTREAM_MIC, origin, nullptr, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_MIC, origin, + nullptr, static_cast<ContentSetting>(value), + is_incognito); } static void JNI_WebsitePreferenceBridge_SetCameraSettingForOrigin( @@ -612,9 +594,9 @@ jint value, jboolean is_incognito) { // Here 'nullptr' indicates that camera uses wildcard for embedder. - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::MEDIASTREAM_CAMERA, origin, nullptr, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_CAMERA, origin, + nullptr, static_cast<ContentSetting>(value), + is_incognito); } static jboolean JNI_WebsitePreferenceBridge_IsContentSettingsPatternValid( @@ -907,9 +889,8 @@ static void JNI_WebsitePreferenceBridge_GetArOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::AR, - &Java_WebsitePreferenceBridge_insertArInfoIntoList, list, false); + GetOrigins(env, ContentSettingsType::AR, + &Java_WebsitePreferenceBridge_insertArInfoIntoList, list, false); } static jint JNI_WebsitePreferenceBridge_GetArSettingForOrigin( @@ -917,8 +898,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::AR, origin, embedder, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::AR, origin, embedder, + is_incognito); } static void JNI_WebsitePreferenceBridge_SetArSettingForOrigin( @@ -927,17 +908,15 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::AR, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::AR, origin, embedder, + static_cast<ContentSetting>(value), is_incognito); } static void JNI_WebsitePreferenceBridge_GetNfcOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::NFC, - &Java_WebsitePreferenceBridge_insertNfcInfoIntoList, list, false); + GetOrigins(env, ContentSettingsType::NFC, + &Java_WebsitePreferenceBridge_insertNfcInfoIntoList, list, false); } static jint JNI_WebsitePreferenceBridge_GetNfcSettingForOrigin( @@ -945,8 +924,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::NFC, origin, embedder, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::NFC, origin, embedder, + is_incognito); } static void JNI_WebsitePreferenceBridge_SetNfcSettingForOrigin( @@ -955,17 +934,16 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::NFC, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::NFC, origin, embedder, + static_cast<ContentSetting>(value), is_incognito); } static void JNI_WebsitePreferenceBridge_GetSensorsOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::SENSORS, - &Java_WebsitePreferenceBridge_insertSensorsInfoIntoList, list, false); + GetOrigins(env, ContentSettingsType::SENSORS, + &Java_WebsitePreferenceBridge_insertSensorsInfoIntoList, list, + false); } static jint JNI_WebsitePreferenceBridge_GetSensorsSettingForOrigin( @@ -973,8 +951,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::SENSORS, origin, embedder, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::SENSORS, origin, + embedder, is_incognito); } static void JNI_WebsitePreferenceBridge_SetSensorsSettingForOrigin( @@ -983,17 +961,15 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::SENSORS, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::SENSORS, origin, embedder, + static_cast<ContentSetting>(value), is_incognito); } static void JNI_WebsitePreferenceBridge_GetVrOrigins( JNIEnv* env, const JavaParamRef<jobject>& list) { - JNI_WebsitePreferenceBridge_GetOrigins( - env, ContentSettingsType::VR, - &Java_WebsitePreferenceBridge_insertVrInfoIntoList, list, false); + GetOrigins(env, ContentSettingsType::VR, + &Java_WebsitePreferenceBridge_insertVrInfoIntoList, list, false); } static jint JNI_WebsitePreferenceBridge_GetVrSettingForOrigin( @@ -1001,8 +977,8 @@ const JavaParamRef<jstring>& origin, const JavaParamRef<jstring>& embedder, jboolean is_incognito) { - return JNI_WebsitePreferenceBridge_GetSettingForOrigin( - env, ContentSettingsType::VR, origin, embedder, is_incognito); + return GetSettingForOrigin(env, ContentSettingsType::VR, origin, embedder, + is_incognito); } static void JNI_WebsitePreferenceBridge_SetVrSettingForOrigin( @@ -1011,9 +987,8 @@ const JavaParamRef<jstring>& embedder, jint value, jboolean is_incognito) { - JNI_WebsitePreferenceBridge_SetSettingForOrigin( - env, ContentSettingsType::VR, origin, embedder, - static_cast<ContentSetting>(value), is_incognito); + SetSettingForOrigin(env, ContentSettingsType::VR, origin, embedder, + static_cast<ContentSetting>(value), is_incognito); } // On Android O+ notification channels are not stored in the Chrome profile and @@ -1072,9 +1047,7 @@ } } - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting(type, value); + GetHostContentSettingsMap()->SetDefaultContentSetting(type, value); } static void JNI_WebsitePreferenceBridge_SetContentSettingForPattern( @@ -1087,9 +1060,7 @@ ConvertJavaStringToUTF8(env, primary_pattern); std::string secondary_pattern_string = ConvertJavaStringToUTF8(env, secondary_pattern); - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetContentSettingCustomScope( + GetHostContentSettingsMap()->SetContentSettingCustomScope( ContentSettingsPattern::FromString(primary_pattern_string), secondary_pattern_string.empty() ? ContentSettingsPattern::Wildcard() @@ -1102,10 +1073,8 @@ JNIEnv* env, int content_settings_type, const JavaParamRef<jobject>& list) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); ContentSettingsForOneType entries; - host_content_settings_map->GetSettingsForOneType( + GetHostContentSettingsMap()->GetSettingsForOneType( static_cast<ContentSettingsType>(content_settings_type), "", &entries); for (size_t i = 0; i < entries.size(); ++i) { Java_WebsitePreferenceBridge_addContentSettingExceptionToList( @@ -1120,9 +1089,7 @@ static jint JNI_WebsitePreferenceBridge_GetContentSetting( JNIEnv* env, int content_settings_type) { - HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - return content_settings->GetDefaultContentSetting( + return GetHostContentSettingsMap()->GetDefaultContentSetting( static_cast<ContentSettingsType>(content_settings_type), nullptr); } @@ -1130,9 +1097,7 @@ JNIEnv* env, int content_settings_type, int setting) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( static_cast<ContentSettingsType>(content_settings_type), static_cast<ContentSetting>(setting)); } @@ -1196,9 +1161,7 @@ JNIEnv* env) { if (!IsContentSettingManaged(ContentSettingsType::GEOLOCATION)) return false; - HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - return content_settings->GetDefaultContentSetting( + return GetHostContentSettingsMap()->GetDefaultContentSetting( ContentSettingsType::GEOLOCATION, nullptr) == CONTENT_SETTING_ALLOW; } @@ -1215,54 +1178,42 @@ static void JNI_WebsitePreferenceBridge_SetArEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::AR, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetClipboardEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::CLIPBOARD_READ_WRITE, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetNfcEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::NFC, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetVrEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::VR, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetSensorsEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::SENSORS, allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetSoundEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::SOUND, allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); @@ -1277,9 +1228,7 @@ static void JNI_WebsitePreferenceBridge_SetAllowCookiesEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::COOKIES, allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); } @@ -1287,9 +1236,7 @@ static void JNI_WebsitePreferenceBridge_SetBackgroundSyncEnabled( JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::BACKGROUND_SYNC, allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); } @@ -1297,9 +1244,7 @@ static void JNI_WebsitePreferenceBridge_SetAutomaticDownloadsEnabled( JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::AUTOMATIC_DOWNLOADS, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } @@ -1307,27 +1252,21 @@ static void JNI_WebsitePreferenceBridge_SetAllowLocationEnabled( JNIEnv* env, jboolean is_enabled) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::GEOLOCATION, is_enabled ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetCameraEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::MEDIASTREAM_CAMERA, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } static void JNI_WebsitePreferenceBridge_SetMicEnabled(JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::MEDIASTREAM_MIC, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); } @@ -1335,9 +1274,7 @@ static void JNI_WebsitePreferenceBridge_SetNotificationsEnabled( JNIEnv* env, jboolean allow) { - HostContentSettingsMap* host_content_settings_map = - HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); - host_content_settings_map->SetDefaultContentSetting( + GetHostContentSettingsMap()->SetDefaultContentSetting( ContentSettingsType::NOTIFICATIONS, allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); }
diff --git a/chrome/browser/apps/app_shim/BUILD.gn b/chrome/browser/apps/app_shim/BUILD.gn index ee6922e..2467346 100644 --- a/chrome/browser/apps/app_shim/BUILD.gn +++ b/chrome/browser/apps/app_shim/BUILD.gn
@@ -6,6 +6,8 @@ # communicating with app_shim processes on Mac. source_set("app_shim") { sources = [ + "app_shim_handler_delegate_mac.cc", + "app_shim_handler_delegate_mac.h", "app_shim_host_bootstrap_mac.cc", "app_shim_host_bootstrap_mac.h", "app_shim_host_mac.cc",
diff --git a/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.cc b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.cc new file mode 100644 index 0000000..110fb69 --- /dev/null +++ b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.cc
@@ -0,0 +1,281 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h" + +#include "apps/launcher.h" +#include "chrome/browser/apps/app_shim/app_shim_termination_manager.h" +#include "chrome/browser/apps/launch_service/launch_service.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/extensions/launch_util.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/profiles/profiles_state.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/extensions/app_launch_params.h" +#include "chrome/browser/ui/extensions/extension_enable_flow.h" +#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" +#include "chrome/browser/ui/user_manager.h" +#include "chrome/browser/web_applications/components/web_app_shortcut_mac.h" +#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h" +#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.h" +#include "chrome/common/extensions/extension_constants.h" +#include "chrome/common/extensions/extension_metrics.h" +#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/app_window_registry.h" +#include "extensions/browser/app_window/native_app_window.h" +#include "extensions/browser/extension_host.h" +#include "extensions/browser/extension_prefs.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/common/constants.h" + +using extensions::AppWindowRegistry; +using extensions::Extension; +using extensions::ExtensionRegistry; +using extensions::NativeAppWindow; + +namespace apps { + +namespace { + +typedef AppWindowRegistry::AppWindowList AppWindowList; + +// Attempts to launch a packaged app, prompting the user to enable it if +// necessary. The prompt is shown in its own window. +// This class manages its own lifetime. +class EnableViaPrompt : public ExtensionEnableFlowDelegate { + public: + EnableViaPrompt(Profile* profile, + const std::string& extension_id, + base::OnceCallback<void()> callback) + : profile_(profile), + extension_id_(extension_id), + callback_(std::move(callback)) {} + + void Run() { + flow_.reset(new ExtensionEnableFlow(profile_, extension_id_, this)); + flow_->Start(); + } + + private: + ~EnableViaPrompt() override { std::move(callback_).Run(); } + + // ExtensionEnableFlowDelegate overrides. + void ExtensionEnableFlowFinished() override { delete this; } + void ExtensionEnableFlowAborted(bool user_initiated) override { delete this; } + + Profile* profile_; + std::string extension_id_; + base::OnceCallback<void()> callback_; + std::unique_ptr<ExtensionEnableFlow> flow_; + + DISALLOW_COPY_AND_ASSIGN(EnableViaPrompt); +}; + +const Extension* MaybeGetAppExtension(content::BrowserContext* context, + const std::string& extension_id) { + if (!context) + return nullptr; + + ExtensionRegistry* registry = ExtensionRegistry::Get(context); + const Extension* extension = + registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED); + return extension && + (extension->is_platform_app() || extension->is_hosted_app()) + ? extension + : nullptr; +} + +} // namespace + +AppShimHandlerDelegate::AppShimHandlerDelegate() = default; +AppShimHandlerDelegate::~AppShimHandlerDelegate() = default; + +Profile* AppShimHandlerDelegate::ProfileForPath( + const base::FilePath& full_path) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + Profile* profile = profile_manager->GetProfileByPath(full_path); + + // Use IsValidProfile to check if the profile has been created. + return profile && profile_manager->IsValidProfile(profile) ? profile + : nullptr; +} + +void AppShimHandlerDelegate::LoadProfileAsync( + const base::FilePath& full_path, + base::OnceCallback<void(Profile*)> callback) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + profile_manager->LoadProfileByPath(full_path, false, std::move(callback)); +} + +bool AppShimHandlerDelegate::IsProfileLockedForPath( + const base::FilePath& full_path) { + return profiles::IsProfileLocked(full_path); +} + +bool AppShimHandlerDelegate::ShowAppWindows(Profile* profile, + const web_app::AppId& app_id) { + AppWindowList windows = + AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id); + for (auto it = windows.rbegin(); it != windows.rend(); ++it) { + if (*it) + (*it)->GetBaseWindow()->Show(); + } + return !windows.empty(); +} + +void AppShimHandlerDelegate::CloseAppWindows(Profile* profile, + const web_app::AppId& app_id) { + AppWindowList windows = + AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id); + for (auto it = windows.begin(); it != windows.end(); ++it) { + if (*it) + (*it)->GetBaseWindow()->Close(); + } +} + +bool AppShimHandlerDelegate::AppIsInstalled(Profile* profile, + const web_app::AppId& app_id) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + return profile && extension; +} + +bool AppShimHandlerDelegate::AppCanCreateHost(Profile* profile, + const web_app::AppId& app_id) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + if (!profile || !extension) + return false; + if (extension->is_hosted_app() && + extensions::GetLaunchType(extensions::ExtensionPrefs::Get(profile), + extension) == extensions::LAUNCH_TYPE_REGULAR) { + return false; + } + // Note that this will return true for non-hosted apps (e.g, Chrome Remote + // Desktop). + return true; +} + +bool AppShimHandlerDelegate::AppIsMultiProfile(Profile* profile, + const web_app::AppId& app_id) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + if (!profile || !extension) + return false; + return extension->from_bookmark(); +} + +bool AppShimHandlerDelegate::AppUsesRemoteCocoa(Profile* profile, + const web_app::AppId& app_id) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + if (!profile || !extension) + return false; + return extension->is_hosted_app() && extension->from_bookmark(); +} + +std::unique_ptr<AppShimHost> AppShimHandlerDelegate::CreateHost( + AppShimHost::Client* client, + const base::FilePath& profile_path, + const web_app::AppId& app_id, + bool use_remote_cocoa) { + return std::make_unique<AppShimHost>(client, app_id, profile_path, + use_remote_cocoa); +} + +void AppShimHandlerDelegate::EnableExtension( + Profile* profile, + const web_app::AppId& app_id, + base::OnceCallback<void()> callback) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + if (extension) + std::move(callback).Run(); + else + (new EnableViaPrompt(profile, app_id, std::move(callback)))->Run(); +} + +void AppShimHandlerDelegate::LaunchApp( + Profile* profile, + const web_app::AppId& app_id, + const std::vector<base::FilePath>& files) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + DCHECK(extension); + extensions::RecordAppLaunchType(extension_misc::APP_LAUNCH_CMD_LINE_APP, + extension->GetType()); + if (extension->is_hosted_app()) { + auto params = CreateAppLaunchParamsUserContainer( + profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB, + apps::mojom::AppLaunchSource::kSourceCommandLine); + params.launch_files = files; + apps::LaunchService::Get(profile)->OpenApplication(params); + return; + } + if (files.empty()) { + apps::LaunchPlatformApp(profile, extension, + extensions::AppLaunchSource::kSourceCommandLine); + } else { + for (std::vector<base::FilePath>::const_iterator it = files.begin(); + it != files.end(); ++it) { + apps::LaunchPlatformAppWithPath(profile, extension, *it); + } + } +} + +void AppShimHandlerDelegate::OpenAppURLInBrowserWindow( + const base::FilePath& profile_path, + const GURL& url) { + Profile* profile = + profile_path.empty() ? nullptr : ProfileForPath(profile_path); + if (!profile) + profile = g_browser_process->profile_manager()->GetLastUsedProfile(); + if (!profile) + return; + Browser* browser = + new Browser(Browser::CreateParams(Browser::TYPE_NORMAL, profile, true)); + browser->window()->Show(); + NavigateParams params(browser, url, ui::PAGE_TRANSITION_AUTO_BOOKMARK); + params.tabstrip_add_types = TabStripModel::ADD_ACTIVE; + params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; + Navigate(¶ms); +} + +void AppShimHandlerDelegate::LaunchShim( + Profile* profile, + const web_app::AppId& app_id, + bool recreate_shims, + apps::ShimLaunchedCallback launched_callback, + apps::ShimTerminatedCallback terminated_callback) { + const Extension* extension = MaybeGetAppExtension(profile, app_id); + if (!extension) { + std::move(launched_callback).Run(base::Process()); + return; + } + + // Only force recreation of shims when RemoteViews is in use (that is, for + // PWAs). Otherwise, shims may be created unexpectedly. + // https://crbug.com/941160 + if (recreate_shims && AppUsesRemoteCocoa(profile, app_id)) { + // Load the resources needed to build the app shim (icons, etc), and then + // recreate the shim and launch it. + web_app::GetShortcutInfoForApp( + extension, profile, + base::BindOnce( + &web_app::LaunchShim, + web_app::LaunchShimUpdateBehavior::RECREATE_UNCONDITIONALLY, + std::move(launched_callback), std::move(terminated_callback))); + } else { + web_app::LaunchShim( + web_app::LaunchShimUpdateBehavior::DO_NOT_RECREATE, + std::move(launched_callback), std::move(terminated_callback), + web_app::ShortcutInfoForExtensionAndProfile(extension, profile)); + } +} + +void AppShimHandlerDelegate::LaunchUserManager() { + UserManager::Show(base::FilePath(), + profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION); +} + +void AppShimHandlerDelegate::MaybeTerminate() { + apps::AppShimTerminationManager::Get()->MaybeTerminate(); +} + +} // namespace apps
diff --git a/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h new file mode 100644 index 0000000..6635f1f --- /dev/null +++ b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h
@@ -0,0 +1,98 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_HANDLER_DELEGATE_MAC_H_ +#define CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_HANDLER_DELEGATE_MAC_H_ + +#include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h" + +namespace apps { + +class AppShimHandlerDelegate : public ExtensionAppShimHandler::Delegate { + public: + AppShimHandlerDelegate(); + ~AppShimHandlerDelegate() override; + + // Return the profile for |path|, only if it is already loaded. + Profile* ProfileForPath(const base::FilePath& path) override; + + // Load a profile and call |callback| when completed or failed. + void LoadProfileAsync(const base::FilePath& path, + base::OnceCallback<void(Profile*)> callback) override; + + // Return true if the specified path is for a valid profile that is also + // locked. + bool IsProfileLockedForPath(const base::FilePath& path) override; + + // Show all app windows (for non-PWA apps). Return true if there existed any + // windows. + bool ShowAppWindows(Profile* profile, const web_app::AppId& app_id) override; + + // Close all app windows (for non-PWA apps). + void CloseAppWindows(Profile* profile, const web_app::AppId& app_id) override; + + // Return true iff |app_id| corresponds to an app that is installed for + // |profile|. + bool AppIsInstalled(Profile* profile, const web_app::AppId& app_id) override; + + // Return true iff the specified app can create an AppShimHost, which will + // keep the app shim process connected (as opposed to, e.g, a bookmark app + // that opens in a tab, which will immediately close). + bool AppCanCreateHost(Profile* profile, + const web_app::AppId& app_id) override; + + // Return true if Cocoa windows for this app should be hosted in the app + // shim process. + bool AppUsesRemoteCocoa(Profile* profile, + const web_app::AppId& app_id) override; + + // Return true if a single app shim is used for all profiles (as opposed to + // one shim per profile). + bool AppIsMultiProfile(Profile* profile, + const web_app::AppId& app_id) override; + + // Create an AppShimHost for the specified parameters (intercept-able for + // tests). + std::unique_ptr<AppShimHost> CreateHost(AppShimHost::Client* client, + const base::FilePath& profile_path, + const web_app::AppId& app_id, + bool use_remote_cocoa) override; + + // Open a dialog to enable the specified extension. Call |callback| after + // the dialog is executed. + void EnableExtension(Profile* profile, + const std::string& extension_id, + base::OnceCallback<void()> callback) override; + + // Launch the app in Chrome. This will (often) create a new window. + void LaunchApp(Profile* profile, + const web_app::AppId& app_id, + const std::vector<base::FilePath>& files) override; + + // Open the specified URL in a new Chrome window. This is the fallback when + // an app shim exists, but there is no profile or extension for it. If + // |profile_path| is specified, then that profile is preferred, otherwise, + // the last used profile is used. + void OpenAppURLInBrowserWindow(const base::FilePath& profile_path, + const GURL& url) override; + + // Launch the shim process for an app. + void LaunchShim(Profile* profile, + const web_app::AppId& app_id, + bool recreate_shims, + ShimLaunchedCallback launched_callback, + ShimTerminatedCallback terminated_callback) override; + + // Launch the user manager (in response to attempting to access a locked + // profile). + void LaunchUserManager() override; + + // Terminate Chrome if Chrome attempted to quit, but was prevented from + // quitting due to apps being open. + void MaybeTerminate() override; +}; + +} // namespace apps + +#endif // CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_HANDLER_DELEGATE_MAC_H_
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc index 40cd2ece..74849ce 100644 --- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc +++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
@@ -12,10 +12,8 @@ #include <utility> #include "apps/app_lifetime_monitor_factory.h" -#include "apps/launcher.h" #include "base/bind.h" #include "base/callback.h" -#include "base/feature_list.h" #include "base/files/file_path.h" #include "base/hash/sha1.h" #include "base/logging.h" @@ -23,16 +21,15 @@ #include "base/mac/scoped_cftyperef.h" #include "base/macros.h" #include "base/stl_util.h" +#include "chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h" #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h" #include "chrome/browser/apps/app_shim/app_shim_host_mac.h" #include "chrome/browser/apps/app_shim/app_shim_listener.h" #include "chrome/browser/apps/app_shim/app_shim_termination_manager.h" -#include "chrome/browser/apps/launch_service/launch_service.h" #include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/profiles/avatar_menu.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_attributes_entry.h" @@ -40,44 +37,17 @@ #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_window.h" -#include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/ui/browser_list.h" -#include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/extensions/app_launch_params.h" -#include "chrome/browser/ui/extensions/extension_enable_flow.h" -#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" -#include "chrome/browser/ui/user_manager.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h" -#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h" -#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.h" -#include "chrome/common/chrome_features.h" -#include "chrome/common/extensions/extension_constants.h" -#include "chrome/common/extensions/extension_metrics.h" -#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "components/crx_file/id_util.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_source.h" -#include "extensions/browser/app_window/app_window.h" -#include "extensions/browser/app_window/app_window_registry.h" -#include "extensions/browser/app_window/native_app_window.h" -#include "extensions/browser/extension_host.h" -#include "extensions/browser/extension_prefs.h" -#include "extensions/browser/extension_registry.h" -#include "extensions/common/constants.h" -#include "ui/base/cocoa/focus_window_set.h" - -using extensions::AppWindowRegistry; -using extensions::Extension; -using extensions::ExtensionRegistry; -using extensions::NativeAppWindow; namespace { -typedef AppWindowRegistry::AppWindowList AppWindowList; - // Create a SHA1 hex digest of a certificate, for use specifically in building // a code signing requirement string in IsAcceptablyCodeSigned(), below. std::string CertificateSHA1Digest(SecCertificateRef certificate) { @@ -161,61 +131,11 @@ shim_requirement) == errSecSuccess; } -// Attempts to launch a packaged app, prompting the user to enable it if -// necessary. The prompt is shown in its own window. -// This class manages its own lifetime. -class EnableViaPrompt : public ExtensionEnableFlowDelegate { - public: - EnableViaPrompt(Profile* profile, - const std::string& extension_id, - base::OnceCallback<void()> callback) - : profile_(profile), - extension_id_(extension_id), - callback_(std::move(callback)) {} - - void Run() { - flow_.reset(new ExtensionEnableFlow(profile_, extension_id_, this)); - flow_->Start(); - } - - private: - ~EnableViaPrompt() override { std::move(callback_).Run(); } - - // ExtensionEnableFlowDelegate overrides. - void ExtensionEnableFlowFinished() override { - delete this; - } - void ExtensionEnableFlowAborted(bool user_initiated) override { - delete this; - } - - Profile* profile_; - std::string extension_id_; - base::OnceCallback<void()> callback_; - std::unique_ptr<ExtensionEnableFlow> flow_; - - DISALLOW_COPY_AND_ASSIGN(EnableViaPrompt); -}; - bool ProfileMenuItemComparator(const chrome::mojom::ProfileMenuItemPtr& a, const chrome::mojom::ProfileMenuItemPtr& b) { return a->menu_index < b->menu_index; } -const Extension* MaybeGetAppExtension(content::BrowserContext* context, - const std::string& extension_id) { - if (!context) - return nullptr; - - ExtensionRegistry* registry = ExtensionRegistry::Get(context); - const Extension* extension = - registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED); - return extension && - (extension->is_platform_app() || extension->is_hosted_app()) - ? extension - : nullptr; -} - } // namespace namespace apps { @@ -245,7 +165,7 @@ // The state for an individual app. This includes the state for all // profiles that are using the app. struct ExtensionAppShimHandler::AppState { - AppState(const std::string& app_id, + AppState(const web_app::AppId& app_id, std::unique_ptr<AppShimHost> multi_profile_host) : app_id(app_id), multi_profile_host(std::move(multi_profile_host)) {} ~AppState() = default; @@ -299,200 +219,8 @@ AppShimRegistry::Get()->OnAppQuit(app_id, last_active_profile_paths); } -Profile* ExtensionAppShimHandler::Delegate::ProfileForPath( - const base::FilePath& full_path) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - Profile* profile = profile_manager->GetProfileByPath(full_path); - - // Use IsValidProfile to check if the profile has been created. - return profile && profile_manager->IsValidProfile(profile) ? profile : NULL; -} - -void ExtensionAppShimHandler::Delegate::LoadProfileAsync( - const base::FilePath& full_path, - base::OnceCallback<void(Profile*)> callback) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - profile_manager->LoadProfileByPath(full_path, false, std::move(callback)); -} - -bool ExtensionAppShimHandler::Delegate::IsProfileLockedForPath( - const base::FilePath& full_path) { - return profiles::IsProfileLocked(full_path); -} - -bool ExtensionAppShimHandler::Delegate::ShowAppWindows( - Profile* profile, - const std::string& app_id) { - AppWindowList windows = - AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id); - for (auto it = windows.rbegin(); it != windows.rend(); ++it) { - if (*it) - (*it)->GetBaseWindow()->Show(); - } - return !windows.empty(); -} - -void ExtensionAppShimHandler::Delegate::CloseAppWindows( - Profile* profile, - const std::string& app_id) { - AppWindowList windows = - AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id); - for (auto it = windows.begin(); it != windows.end(); ++it) { - if (*it) - (*it)->GetBaseWindow()->Close(); - } -} - -bool ExtensionAppShimHandler::Delegate::AppIsInstalled( - Profile* profile, - const std::string& app_id) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - return profile && extension; -} - -bool ExtensionAppShimHandler::Delegate::AppCanCreateHost( - Profile* profile, - const std::string& app_id) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - if (!profile || !extension) - return false; - if (extension->is_hosted_app() && - extensions::GetLaunchType(extensions::ExtensionPrefs::Get(profile), - extension) == extensions::LAUNCH_TYPE_REGULAR) { - return false; - } - // Note that this will return true for non-hosted apps (e.g, Chrome Remote - // Desktop). - return true; -} - -bool ExtensionAppShimHandler::Delegate::AppIsMultiProfile( - Profile* profile, - const std::string& app_id) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - if (!profile || !extension) - return false; - return extension->from_bookmark(); -} - -bool ExtensionAppShimHandler::Delegate::AppUsesRemoteCocoa( - Profile* profile, - const std::string& app_id) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - if (!profile || !extension) - return false; - return extension->is_hosted_app() && extension->from_bookmark(); -} - -std::unique_ptr<AppShimHost> ExtensionAppShimHandler::Delegate::CreateHost( - AppShimHost::Client* client, - const base::FilePath& profile_path, - const std::string& app_id, - bool use_remote_cocoa) { - return std::make_unique<AppShimHost>(client, app_id, profile_path, - use_remote_cocoa); -} - -void ExtensionAppShimHandler::Delegate::EnableExtension( - Profile* profile, - const std::string& app_id, - base::OnceCallback<void()> callback) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - if (extension) - std::move(callback).Run(); - else - (new EnableViaPrompt(profile, app_id, std::move(callback)))->Run(); -} - -void ExtensionAppShimHandler::Delegate::LaunchApp( - Profile* profile, - const std::string& app_id, - const std::vector<base::FilePath>& files) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - DCHECK(extension); - extensions::RecordAppLaunchType( - extension_misc::APP_LAUNCH_CMD_LINE_APP, extension->GetType()); - if (extension->is_hosted_app()) { - auto params = CreateAppLaunchParamsUserContainer( - profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB, - apps::mojom::AppLaunchSource::kSourceCommandLine); - params.launch_files = files; - apps::LaunchService::Get(profile)->OpenApplication(params); - return; - } - if (files.empty()) { - apps::LaunchPlatformApp(profile, extension, - extensions::AppLaunchSource::kSourceCommandLine); - } else { - for (std::vector<base::FilePath>::const_iterator it = files.begin(); - it != files.end(); ++it) { - apps::LaunchPlatformAppWithPath(profile, extension, *it); - } - } -} - -void ExtensionAppShimHandler::Delegate::OpenAppURLInBrowserWindow( - const base::FilePath& profile_path, - const GURL& url) { - Profile* profile = - profile_path.empty() ? nullptr : ProfileForPath(profile_path); - if (!profile) - profile = g_browser_process->profile_manager()->GetLastUsedProfile(); - if (!profile) - return; - Browser* browser = - new Browser(Browser::CreateParams(Browser::TYPE_NORMAL, profile, true)); - browser->window()->Show(); - NavigateParams params(browser, url, ui::PAGE_TRANSITION_AUTO_BOOKMARK); - params.tabstrip_add_types = TabStripModel::ADD_ACTIVE; - params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; - Navigate(¶ms); -} - -void ExtensionAppShimHandler::Delegate::LaunchShim( - Profile* profile, - const std::string& app_id, - bool recreate_shims, - apps::ShimLaunchedCallback launched_callback, - apps::ShimTerminatedCallback terminated_callback) { - const Extension* extension = MaybeGetAppExtension(profile, app_id); - if (!extension) { - std::move(launched_callback).Run(base::Process()); - return; - } - - // Only force recreation of shims when RemoteViews is in use (that is, for - // PWAs). Otherwise, shims may be created unexpectedly. - // https://crbug.com/941160 - if (recreate_shims && AppUsesRemoteCocoa(profile, app_id)) { - // Load the resources needed to build the app shim (icons, etc), and then - // recreate the shim and launch it. - web_app::GetShortcutInfoForApp( - extension, profile, - base::BindOnce( - &web_app::LaunchShim, - web_app::LaunchShimUpdateBehavior::RECREATE_UNCONDITIONALLY, - std::move(launched_callback), std::move(terminated_callback))); - } else { - web_app::LaunchShim( - web_app::LaunchShimUpdateBehavior::DO_NOT_RECREATE, - std::move(launched_callback), std::move(terminated_callback), - web_app::ShortcutInfoForExtensionAndProfile(extension, profile)); - } -} - -void ExtensionAppShimHandler::Delegate::LaunchUserManager() { - UserManager::Show(base::FilePath(), - profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION); -} - -void ExtensionAppShimHandler::Delegate::MaybeTerminate() { - apps::AppShimTerminationManager::Get()->MaybeTerminate(); -} - ExtensionAppShimHandler::ExtensionAppShimHandler() - : delegate_(new Delegate), - weak_factory_(this) { + : delegate_(new AppShimHandlerDelegate), weak_factory_(this) { // This is instantiated in BrowserProcessImpl::PreMainMessageLoopRun with // AppShimListener. Since PROFILE_CREATED is not fired until // ProfileManager::GetLastUsedProfile/GetLastOpenedProfiles, this should catch @@ -509,7 +237,7 @@ } AppShimHost* ExtensionAppShimHandler::FindHost(Profile* profile, - const std::string& app_id) { + const web_app::AppId& app_id) { auto found_app = apps_.find(app_id); if (found_app == apps_.end()) return nullptr; @@ -573,7 +301,7 @@ void ExtensionAppShimHandler::OnShimProcessConnectedForRegisterOnly( std::unique_ptr<AppShimHostBootstrap> bootstrap) { - const std::string& app_id = bootstrap->GetAppId(); + const web_app::AppId& app_id = bootstrap->GetAppId(); DCHECK_EQ(bootstrap->GetLaunchType(), chrome::mojom::AppShimLaunchType::kRegisterOnly); @@ -612,7 +340,7 @@ void ExtensionAppShimHandler::OnShimProcessConnectedForLaunch( std::unique_ptr<AppShimHostBootstrap> bootstrap) { - const std::string& app_id = bootstrap->GetAppId(); + const web_app::AppId& app_id = bootstrap->GetAppId(); DCHECK_EQ(bootstrap->GetLaunchType(), chrome::mojom::AppShimLaunchType::kNormal); @@ -816,7 +544,7 @@ } void ExtensionAppShimHandler::CloseShimForApp(Profile* profile, - const std::string& app_id) { + const web_app::AppId& app_id) { auto found_app = apps_.find(app_id); if (found_app == apps_.end()) return; @@ -834,7 +562,7 @@ void ExtensionAppShimHandler::LoadProfileAndApp( const base::FilePath& profile_path, - const std::string& app_id, + const web_app::AppId& app_id, LoadProfileAppCallback callback) { Profile* profile = delegate_->ProfileForPath(profile_path); if (profile) { @@ -849,7 +577,7 @@ void ExtensionAppShimHandler::OnProfileLoaded( const base::FilePath& profile_path, - const std::string& app_id, + const web_app::AppId& app_id, LoadProfileAppCallback callback, Profile* profile) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -878,7 +606,7 @@ } void ExtensionAppShimHandler::OnAppEnabled(const base::FilePath& profile_path, - const std::string& app_id, + const web_app::AppId& app_id, LoadProfileAppCallback callback) { std::move(callback).Run(delegate_->ProfileForPath(profile_path)); } @@ -975,7 +703,7 @@ } void ExtensionAppShimHandler::OnShimSelectedProfileAndAppLoaded( - const std::string& app_id, + const web_app::AppId& app_id, Profile* profile) { if (!delegate_->AppIsInstalled(profile, app_id)) return; @@ -1162,7 +890,7 @@ ExtensionAppShimHandler::ProfileState* ExtensionAppShimHandler::GetOrCreateProfileState(Profile* profile, - const std::string& app_id) { + const web_app::AppId& app_id) { if (web_app::AppShimLaunchDisabled()) return nullptr;
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h index 9f51238..eee2568b 100644 --- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h +++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
@@ -20,6 +20,7 @@ #include "chrome/browser/profiles/avatar_menu_observer.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list_observer.h" +#include "chrome/browser/web_applications/components/web_app_id.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" @@ -46,84 +47,90 @@ public: class Delegate { public: - virtual ~Delegate() {} + virtual ~Delegate() = default; // Return the profile for |path|, only if it is already loaded. - virtual Profile* ProfileForPath(const base::FilePath& path); + virtual Profile* ProfileForPath(const base::FilePath& path) = 0; // Load a profile and call |callback| when completed or failed. - virtual void LoadProfileAsync(const base::FilePath& path, - base::OnceCallback<void(Profile*)> callback); + virtual void LoadProfileAsync( + const base::FilePath& path, + base::OnceCallback<void(Profile*)> callback) = 0; // Return true if the specified path is for a valid profile that is also // locked. - virtual bool IsProfileLockedForPath(const base::FilePath& path); + virtual bool IsProfileLockedForPath(const base::FilePath& path) = 0; // Show all app windows (for non-PWA apps). Return true if there existed any // windows. - virtual bool ShowAppWindows(Profile* profile, const std::string& app_id); + virtual bool ShowAppWindows(Profile* profile, + const web_app::AppId& app_id) = 0; // Close all app windows (for non-PWA apps). - virtual void CloseAppWindows(Profile* profile, const std::string& app_id); + virtual void CloseAppWindows(Profile* profile, + const web_app::AppId& app_id) = 0; // Return true iff |app_id| corresponds to an app that is installed for // |profile|. - virtual bool AppIsInstalled(Profile* profile, const std::string& app_id); + virtual bool AppIsInstalled(Profile* profile, + const web_app::AppId& app_id) = 0; // Return true iff the specified app can create an AppShimHost, which will // keep the app shim process connected (as opposed to, e.g, a bookmark app // that opens in a tab, which will immediately close). - virtual bool AppCanCreateHost(Profile* profile, const std::string& app_id); + virtual bool AppCanCreateHost(Profile* profile, + const web_app::AppId& app_id) = 0; // Return true if Cocoa windows for this app should be hosted in the app // shim process. virtual bool AppUsesRemoteCocoa(Profile* profile, - const std::string& app_id); + const web_app::AppId& app_id) = 0; // Return true if a single app shim is used for all profiles (as opposed to // one shim per profile). - virtual bool AppIsMultiProfile(Profile* profile, const std::string& app_id); + virtual bool AppIsMultiProfile(Profile* profile, + const web_app::AppId& app_id) = 0; // Create an AppShimHost for the specified parameters (intercept-able for // tests). virtual std::unique_ptr<AppShimHost> CreateHost( AppShimHost::Client* client, const base::FilePath& profile_path, - const std::string& app_id, - bool use_remote_cocoa); + const web_app::AppId& app_id, + bool use_remote_cocoa) = 0; // Open a dialog to enable the specified extension. Call |callback| after // the dialog is executed. virtual void EnableExtension(Profile* profile, const std::string& extension_id, - base::OnceCallback<void()> callback); + base::OnceCallback<void()> callback) = 0; // Launch the app in Chrome. This will (often) create a new window. virtual void LaunchApp(Profile* profile, - const std::string& app_id, - const std::vector<base::FilePath>& files); + const web_app::AppId& app_id, + const std::vector<base::FilePath>& files) = 0; // Open the specified URL in a new Chrome window. This is the fallback when // an app shim exists, but there is no profile or extension for it. If // |profile_path| is specified, then that profile is preferred, otherwise, // the last used profile is used. virtual void OpenAppURLInBrowserWindow(const base::FilePath& profile_path, - const GURL& url); + const GURL& url) = 0; // Launch the shim process for an app. virtual void LaunchShim(Profile* profile, - const std::string& app_id, + const web_app::AppId& app_id, bool recreate_shims, ShimLaunchedCallback launched_callback, - ShimTerminatedCallback terminated_callback); + ShimTerminatedCallback terminated_callback) = 0; // Launch the user manager (in response to attempting to access a locked // profile). - virtual void LaunchUserManager(); + virtual void LaunchUserManager() = 0; // Terminate Chrome if Chrome attempted to quit, but was prevented from // quitting due to apps being open. - virtual void MaybeTerminate(); + virtual void MaybeTerminate() = 0; }; // Helper function to get the instance on the browser process. This will be @@ -135,7 +142,7 @@ // Get the host corresponding to a profile and app id, or null if there is // none. - AppShimHost* FindHost(Profile* profile, const std::string& app_id); + AppShimHost* FindHost(Profile* profile, const web_app::AppId& app_id); // If the specified |browser| should be using RemoteCocoa (because it is a // bookmark app), then get or create an AppShimHost for it, and return @@ -213,7 +220,7 @@ void CloseShimsForProfile(Profile* profile); // Close one specified app. - void CloseShimForApp(Profile* profile, const std::string& app_id); + void CloseShimForApp(Profile* profile, const web_app::AppId& app_id); // This is called by OnShimProcessConnected if the app shim was launched by // Chrome, and should connect to an already-existing AppShimHost. @@ -243,21 +250,21 @@ std::unique_ptr<AppShimHostBootstrap> bootstrap); // Continuation of OnShimSelectedProfile, once the profile has loaded. - void OnShimSelectedProfileAndAppLoaded(const std::string& app_id, + void OnShimSelectedProfileAndAppLoaded(const web_app::AppId& app_id, Profile* profile); // Load the specified profile and extension, and run |callback| with // the result. The callback's arguments may be nullptr on failure. using LoadProfileAppCallback = base::OnceCallback<void(Profile*)>; void LoadProfileAndApp(const base::FilePath& profile_path, - const std::string& app_id, + const web_app::AppId& app_id, LoadProfileAppCallback callback); void OnProfileLoaded(const base::FilePath& profile_path, - const std::string& app_id, + const web_app::AppId& app_id, LoadProfileAppCallback callback, Profile* profile); void OnAppEnabled(const base::FilePath& profile_path, - const std::string& app_id, + const web_app::AppId& app_id, LoadProfileAppCallback callback); // Update the profiles menu for the specified host. @@ -268,7 +275,7 @@ // Retrieve the ProfileState for a given (Profile, AppId) pair. If one // does not exist, create one. ProfileState* GetOrCreateProfileState(Profile* profile, - const std::string& app_id); + const web_app::AppId& app_id); // Map from extension id to the state for that app. std::map<std::string, std::unique_ptr<AppState>> apps_;
diff --git a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc index 85e9173..3b78f5f4 100644 --- a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc +++ b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
@@ -93,9 +93,9 @@ : content::WebContentsObserver(web_contents), domain_(domain), callback_(std::move(callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_PERMISSION_DENY)); learn_more_button_ = DialogDelegate::SetExtraView(CreateLearnMoreButton(this)); @@ -109,11 +109,11 @@ std::move(dialog->callback_).Run(response); }; - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( run_callback, base::Unretained(this), CONSENT_RESPONSE_ALLOW)); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( run_callback, base::Unretained(this), CONSENT_RESPONSE_DENY)); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( run_callback, base::Unretained(this), CONSENT_RESPONSE_NONE)); // Explanation string.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc index 42c7c72..9b68bc60 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
@@ -98,6 +98,18 @@ registry_->SaveAppActivity(); } +AppActivityRegistry::SystemNotification::SystemNotification( + base::Optional<base::TimeDelta> app_time_limit, + AppNotification app_notification) + : time_limit(app_time_limit), notification(app_notification) {} + +AppActivityRegistry::SystemNotification::SystemNotification( + const SystemNotification&) = default; + +AppActivityRegistry::SystemNotification& +AppActivityRegistry::SystemNotification::operator=(const SystemNotification&) = + default; + AppActivityRegistry::AppDetails::AppDetails() = default; AppActivityRegistry::AppDetails::AppDetails(const AppActivity& activity) @@ -181,8 +193,14 @@ // sessions and app service does not. Make sure not to override cached state. if (!base::Contains(activity_registry_, app_id)) { Add(app_id); - } else if (GetAppState(app_id) == AppState::kLimitReached) { - NotifyLimitReached(app_id, /* was_active */ false); + } else { + activity_registry_.at(app_id).received_app_installed_ = true; + + // First send the system notifications for the application. + SendSystemNotificationsForApp(app_id); + + if (GetAppState(app_id) == AppState::kLimitReached) + NotifyLimitReached(app_id, /* was_active */ false); } } @@ -360,11 +378,27 @@ return limit->daily_limit(); } +void AppActivityRegistry::SetReportingEnabled(base::Optional<bool> value) { + if (value.has_value()) + activity_reporting_enabled_ = value.value(); +} + AppActivityReportInterface::ReportParams AppActivityRegistry::GenerateAppActivityReport( enterprise_management::ChildStatusReportRequest* report) { + // Calling SaveAppActivity is beneficial even if this method is returning + // early due to reporting not being enabled. This is because it helps move the + // ActiveTimes information from AppActivityRegistry to the stored pref data + // which will then be cleaned in the direct CleanRegistry() call below. SaveAppActivity(); + // If app activity reporting is not enabled, simply return. + if (!activity_reporting_enabled_) { + base::Time timestamp = base::Time::Now(); + CleanRegistry(timestamp); + return AppActivityReportInterface::ReportParams{timestamp, false}; + } + PrefService* pref_service = profile_->GetPrefs(); const base::Value* value = pref_service->GetList(prefs::kPerAppTimeLimitsAppActivities); @@ -672,6 +706,7 @@ void AppActivityRegistry::Add(const AppId& app_id) { activity_registry_[app_id].activity = AppActivity(AppState::kAvailable); + activity_registry_[app_id].received_app_installed_ = true; newly_installed_apps_.push_back(app_id); for (auto& observer : app_state_observers_) observer.OnAppInstalled(app_id); @@ -859,34 +894,31 @@ if (time_left <= kFiveMinutes && time_left > kOneMinute && last_notification != AppNotification::kFiveMinutes) { - notification_delegate_->ShowAppTimeLimitNotification( - app_id, time_limit, AppNotification::kFiveMinutes); - details.activity.set_last_notification(AppNotification::kFiveMinutes); + MaybeShowSystemNotification( + app_id, SystemNotification(time_limit, AppNotification::kFiveMinutes)); ScheduleTimeLimitCheckForApp(app_id); return; } if (time_left <= kOneMinute && time_left > kZeroMinutes && last_notification != AppNotification::kOneMinute) { - notification_delegate_->ShowAppTimeLimitNotification( - app_id, time_limit, AppNotification::kOneMinute); - details.activity.set_last_notification(AppNotification::kOneMinute); + MaybeShowSystemNotification( + app_id, SystemNotification(time_limit, AppNotification::kOneMinute)); ScheduleTimeLimitCheckForApp(app_id); return; } if (time_left == kZeroMinutes && last_notification != AppNotification::kTimeLimitReached) { - details.activity.set_last_notification(AppNotification::kTimeLimitReached); + MaybeShowSystemNotification( + app_id, + SystemNotification(time_limit, AppNotification::kTimeLimitReached)); if (ContributesToWebTimeLimit(app_id, GetAppState(app_id))) { WebTimeLimitReached(base::Time::Now()); } else { SetAppState(app_id, AppState::kLimitReached); } - - notification_delegate_->ShowAppTimeLimitNotification( - app_id, time_limit, AppNotification::kTimeLimitReached); } } @@ -910,16 +942,18 @@ // Time limit was removed. if (!has_time_limit && had_time_limit) { - notification_delegate_->ShowAppTimeLimitNotification( - app_id, base::nullopt, AppNotification::kTimeLimitChanged); + MaybeShowSystemNotification( + app_id, + SystemNotification(base::nullopt, AppNotification::kTimeLimitChanged)); return true; } // Time limit was set or value changed. if (has_time_limit && (!had_time_limit || old_limit->daily_limit() != new_limit->daily_limit())) { - notification_delegate_->ShowAppTimeLimitNotification( - app_id, new_limit->daily_limit(), AppNotification::kTimeLimitChanged); + MaybeShowSystemNotification( + app_id, SystemNotification(new_limit->daily_limit(), + AppNotification::kTimeLimitChanged)); return true; } @@ -1007,9 +1041,15 @@ // |timestamp|. details.activity.CaptureOngoingActivity(timestamp); + std::vector<AppActivity::ActiveTime> activity = + details.activity.TakeActiveTimes(); + + // If reporting is not enabled, don't save unnecessary data. + if (!activity_reporting_enabled_) + activity.clear(); + return PersistedAppInfo(app_id, details.activity.app_state(), - running_active_time, - details.activity.TakeActiveTimes()); + running_active_time, std::move(activity)); } bool AppActivityRegistry::ShouldCleanUpStoredPref() { @@ -1025,5 +1065,41 @@ return time < base::Time::Now() - base::TimeDelta::FromDays(30); } +void AppActivityRegistry::SendSystemNotificationsForApp(const AppId& app_id) { + DCHECK(base::Contains(activity_registry_, app_id)); + + AppDetails& app_details = activity_registry_.at(app_id); + DCHECK(app_details.received_app_installed_); + + // TODO(yilkal): Filter out the notifications to show. For example don't show + // 5 min and 1 min left notifications at the same time here. However, time + // limit changed and 1 min left notifications can be shown at the same time. + for (const auto& elem : app_details.pending_notifications_) { + notification_delegate_->ShowAppTimeLimitNotification( + app_id, elem.time_limit, elem.notification); + } + app_details.pending_notifications_.clear(); +} + +void AppActivityRegistry::MaybeShowSystemNotification( + const AppId& app_id, + const SystemNotification& notification) { + DCHECK(base::Contains(activity_registry_, app_id)); + + AppDetails& app_details = activity_registry_.at(app_id); + app_details.activity.set_last_notification(notification.notification); + + // AppActivityRegistry has not yet received OnAppInstalled call from + // AppService. Add notification to |AppDetails::pending_notifications_|. + if (!app_details.received_app_installed_) { + app_details.pending_notifications_.push_back(notification); + return; + } + + // Otherwise, just show the notification. + notification_delegate_->ShowAppTimeLimitNotification( + app_id, notification.time_limit, notification.notification); +} + } // namespace app_time } // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h index b2bccbbe..e6a34720 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
@@ -131,6 +131,9 @@ // Will return nullopt if there is no limit set. base::Optional<base::TimeDelta> GetTimeLimit(const AppId& app_id) const; + // Reporting enablement is set if |enabled| has value. + void SetReportingEnabled(base::Optional<bool> enabled); + // Populates |report| with collected app activity. Returns whether any data // were reported. AppActivityReportInterface::ReportParams GenerateAppActivityReport( @@ -170,6 +173,15 @@ AppRestriction restriction) const; private: + struct SystemNotification { + SystemNotification(base::Optional<base::TimeDelta> app_time_limit, + AppNotification app_notification); + SystemNotification(const SystemNotification&); + SystemNotification& operator=(const SystemNotification&); + base::Optional<base::TimeDelta> time_limit = base::nullopt; + AppNotification notification = AppNotification::kUnknown; + }; + // Bundles detailed data stored for a specific app. struct AppDetails { AppDetails(); @@ -204,6 +216,16 @@ // Timer set up for when the app time limit is expected to be reached and // preceding notifications. std::unique_ptr<base::OneShotTimer> app_limit_timer; + + // Boolean to specify if OnAppInstalled call has been received for this + // particular application. + bool received_app_installed_ = false; + + // At the beginning of a session, we may want to send system notifications + // for applications. This may happen if there is an update in + // PerAppTimeLimits policy while the user was logged out. In these + // scenarios, we have to wait until the application is installed. + std::vector<SystemNotification> pending_notifications_; }; // Removes data older than |timestamp| from the registry. @@ -261,6 +283,13 @@ // from base::Time::Now(); bool ShouldCleanUpStoredPref(); + // Sends system notification for the application. + void SendSystemNotificationsForApp(const AppId& app_id); + + // Shows notification or queues it to be shown later. + void MaybeShowSystemNotification(const AppId& app_id, + const SystemNotification& notification); + Profile* const profile_; // Owned by AppTimeController. @@ -283,6 +312,9 @@ // This records the timestamp of the latest set app limit. base::Time latest_app_limit_update_; + + // Boolean to capture if app activity data reporting is enabled. + bool activity_reporting_enabled_ = true; }; } // namespace app_time
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc index 9aa63d8b..6b6059f9 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
@@ -874,6 +874,9 @@ // Reinitialized the registry. We don't expect redundant time limit updatese // will result in notifications. ReInitializeRegistry(); + registry().OnAppInstalled(GetChromeAppId()); + registry().OnAppInstalled(kApp1); + registry().OnAppInstalled(kApp2); EXPECT_CALL(notification_delegate_mock(), ShowAppTimeLimitNotification( @@ -908,6 +911,38 @@ registry().UpdateAppLimits(app_limits); } +TEST_F(AppActivityRegistryTest, NoNotification) { + AppLimit app1_limit(AppRestriction::kTimeLimit, + base::TimeDelta::FromMinutes(30), base::Time::Now()); + std::map<AppId, AppLimit> app_limits = {{kApp1, app1_limit}}; + + EXPECT_CALL(notification_delegate_mock(), + ShowAppTimeLimitNotification( + kApp1, app1_limit.daily_limit(), + chromeos::app_time::AppNotification::kTimeLimitChanged)) + .Times(0); + registry().SaveAppActivity(); + ReInitializeRegistry(); + registry().UpdateAppLimits(app_limits); +} + +TEST_F(AppActivityRegistryTest, NotificationAfterAppInstall) { + AppLimit app1_limit(AppRestriction::kTimeLimit, + base::TimeDelta::FromMinutes(30), base::Time::Now()); + std::map<AppId, AppLimit> app_limits = {{kApp1, app1_limit}}; + + EXPECT_CALL(notification_delegate_mock(), + ShowAppTimeLimitNotification( + kApp1, app1_limit.daily_limit(), + chromeos::app_time::AppNotification::kTimeLimitChanged)) + .Times(1); + + registry().SaveAppActivity(); + ReInitializeRegistry(); + registry().UpdateAppLimits(app_limits); + registry().OnAppInstalled(kApp1); +} + TEST_F(AppActivityRegistryTest, AvoidRedundantCallsToPauseApp) { AppStateObserverMock state_observer_mock; registry().AddAppStateObserver(&state_observer_mock);
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc index a1d5366..6ab3239 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
@@ -341,10 +341,12 @@ LOG(WARNING) << "Invalid PerAppTimeLimits policy."; return; } - bool updated = app_registry_->UpdateAppLimits(policy::AppLimitsFromDict(*policy)); + app_registry_->SetReportingEnabled( + policy::ActivityReportingEnabledFromDict(*policy)); + base::Optional<base::TimeDelta> new_reset_time = policy::ResetTimeFromDict(*policy); // TODO(agawronska): Propagate the information about reset time change.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc index ff2a2a5..58ea259e 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc
@@ -13,6 +13,7 @@ value_.SetKey(policy::kAppLimitsArray, base::Value(base::Value::Type::LIST)); value_.SetKey(policy::kResetAtDict, base::Value(base::Value::Type::DICTIONARY)); + value_.SetBoolKey(policy::kActivityReportingEnabled, true); } AppTimeLimitsPolicyBuilder::~AppTimeLimitsPolicyBuilder() = default; @@ -33,5 +34,9 @@ value_.SetKey(policy::kResetAtDict, policy::ResetTimeToDict(hour, minutes)); } +void AppTimeLimitsPolicyBuilder::SetAppActivityReportingEnabled(bool enabled) { + value_.SetBoolKey(policy::kActivityReportingEnabled, enabled); +} + } // namespace app_time } // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h index eb6e104..a6e856b 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h
@@ -28,6 +28,8 @@ // Sets reset time in the policy. void SetResetTime(int hour, int minutes); + void SetAppActivityReportingEnabled(bool enabled); + const base::Value& value() const { return value_; } private:
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc index d812dc0..868478ba 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc
@@ -28,6 +28,7 @@ const char kResetAtDict[] = "reset_at"; const char kHourInt[] = "hour"; const char kMinInt[] = "minute"; +const char kActivityReportingEnabled[] = "activity_reporting_enabled"; apps::mojom::AppType PolicyStringToAppType(const std::string& app_type) { if (app_type == "ARC") @@ -217,6 +218,12 @@ return value; } +base::Optional<bool> ActivityReportingEnabledFromDict(const base::Value& dict) { + if (!dict.is_dict()) + return base::nullopt; + return dict.FindBoolPath(kActivityReportingEnabled); +} + std::map<AppId, AppLimit> AppLimitsFromDict(const base::Value& dict) { std::map<AppId, AppLimit> app_limits;
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h index f5292fb..82bffe2 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h +++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h
@@ -38,6 +38,7 @@ extern const char kResetAtDict[]; extern const char kHourInt[]; extern const char kMinInt[]; +extern const char kActivityReportingEnabled[]; // Converts between apps::mojom::AppType and string used by app time limits // policies. @@ -74,6 +75,10 @@ // Serializes daily limits reset to the dictionary. base::Value ResetTimeToDict(int hour, int minutes); +// Deserializes activity reporting enabled boolean from |dict|. +// Returns value if |dict| contains a valid entry. +base::Optional<bool> ActivityReportingEnabledFromDict(const base::Value& dict); + // Deserializes app limits data from the |dict|. // Will return empty map if |dict| is invalid. std::map<AppId, AppLimit> AppLimitsFromDict(const base::Value& dict);
diff --git a/chrome/browser/chromeos/external_protocol_dialog.cc b/chrome/browser/chromeos/external_protocol_dialog.cc index 55a7021..e1bd0c1 100644 --- a/chrome/browser/chromeos/external_protocol_dialog.cc +++ b/chrome/browser/chromeos/external_protocol_dialog.cc
@@ -61,8 +61,8 @@ ExternalProtocolDialog::ExternalProtocolDialog(WebContents* web_contents, const GURL& url) : creation_time_(base::TimeTicks::Now()), scheme_(url.scheme()) { - views::DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - views::DialogDelegate::set_button_label( + views::DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + views::DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT));
diff --git a/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc b/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc index a93b08f5..2e6f11d 100644 --- a/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc +++ b/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc
@@ -42,8 +42,8 @@ ToastDialogView::ToastDialogView(const base::string16& app_name, base::OnceClosure dismissed_callback) : app_name_(app_name) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_close_callback(std::move(dismissed_callback)); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetCloseCallback(std::move(dismissed_callback)); chrome::RecordDialogCreation( chrome::DialogIdentifier::LOCK_SCREEN_NOTE_APP_TOAST);
diff --git a/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc index 81f2a9c..6192d93 100644 --- a/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc
@@ -23,11 +23,13 @@ #include "base/test/scoped_path_override.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/chromeos/child_accounts/child_user_service.h" #include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h" #include "chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h" #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h" +#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h" #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h" #include "chrome/browser/chromeos/login/users/mock_user_manager.h" #include "chrome/browser/chromeos/ownership/fake_owner_settings_service.h" @@ -55,6 +57,7 @@ #include "components/account_id/account_id.h" #include "components/policy/proto/device_management_backend.pb.h" #include "components/prefs/pref_service.h" +#include "components/prefs/scoped_user_pref_update.h" #include "components/prefs/testing_pref_service.h" #include "components/session_manager/core/session_manager.h" #include "components/user_manager/scoped_user_manager.h" @@ -421,6 +424,8 @@ time, &profile_pref_service_)); } + Profile* testing_profile() { return testing_profile_.get(); } + // Since this is a unit test running in browser_tests we must do additional // unit test setup and make a TestingBrowserProcess. Must be first member. TestingBrowserProcessInitializer initializer_; @@ -761,4 +766,41 @@ EXPECT_EQ(0, child_status_.app_activity_size()); } +TEST_F(ChildStatusCollectorTest, ReportingAppActivityNoReport) { + // Nothing reported yet. + GetStatus(); + EXPECT_EQ(0, child_status_.app_activity_size()); + status_collector_->OnSubmittedSuccessfully(); + + const chromeos::app_time::AppId app1(apps::mojom::AppType::kWeb, "app1"); + const chromeos::app_time::AppId app2(apps::mojom::AppType::kExtension, + "app2"); + const base::TimeDelta app1_interval = base::TimeDelta::FromMinutes(1); + const base::TimeDelta app2_interval = base::TimeDelta::FromMinutes(2); + + SimulateAppActivity(app1, app1_interval); + SimulateAppActivity(app2, app2_interval); + SimulateAppActivity(app1, app1_interval); + SimulateAppActivity(app2, app2_interval); + SimulateAppActivity(app1, app1_interval); + + { + chromeos::app_time::AppTimeLimitsPolicyBuilder builder; + builder.SetAppActivityReportingEnabled(/* enabled */ false); + DictionaryPrefUpdate update(testing_profile()->GetPrefs(), + prefs::kPerAppTimeLimitsPolicy); + base::Value* value = update.Get(); + *value = builder.value().Clone(); + } + + SimulateAppActivity(app1, app1_interval); + SimulateAppActivity(app2, app2_interval); + SimulateAppActivity(app1, app1_interval); + SimulateAppActivity(app2, app2_interval); + SimulateAppActivity(app1, app1_interval); + + GetStatus(); + EXPECT_EQ(0, child_status_.app_activity_size()); +} + } // namespace policy
diff --git a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc index ae0ceed2..f6e4a356 100644 --- a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc +++ b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc
@@ -33,7 +33,7 @@ IdleActionWarningDialogView::IdleActionWarningDialogView( base::TimeTicks idle_action_time) : idle_action_time_(idle_action_time) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); SetBorder(views::CreateEmptyBorder( ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(views::TEXT,
diff --git a/chrome/browser/chromeos/ui/echo_dialog_view.cc b/chrome/browser/chromeos/ui/echo_dialog_view.cc index e1e8bd5..a26e3e8 100644 --- a/chrome/browser/chromeos/ui/echo_dialog_view.cc +++ b/chrome/browser/chromeos/ui/echo_dialog_view.cc
@@ -45,26 +45,26 @@ chrome::RecordDialogCreation(chrome::DialogIdentifier::ECHO); if (params.echo_enabled) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK | + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_OFFERS_CONSENT_INFOBAR_ENABLE_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_OFFERS_CONSENT_INFOBAR_DISABLE_BUTTON)); InitForEnabledEcho(params.service_name, params.origin); } else { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_ECHO_CONSENT_DISMISS_BUTTON)); InitForDisabledEcho(); } - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &EchoDialogListener::OnAccept, base::Unretained(listener_))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &EchoDialogListener::OnCancel, base::Unretained(listener_))); }
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc index a10389d..27bd712b 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc +++ b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -25,12 +25,22 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "third_party/blink/public/common/context_menu_data/media_type.h" +#if defined(OS_MACOSX) +#include "chrome/test/base/launchservices_utils_mac.h" +#endif + using content::WebContents; class RegisterProtocolHandlerBrowserTest : public InProcessBrowserTest { public: RegisterProtocolHandlerBrowserTest() { } + void SetUpOnMainThread() override { +#if defined(OS_MACOSX) + ASSERT_TRUE(test::RegisterAppWithLaunchServices()); +#endif + } + TestRenderViewContextMenu* CreateContextMenu(GURL url) { content::ContextMenuParams params; params.media_type = blink::ContextMenuDataMediaType::kNone;
diff --git a/chrome/browser/download/download_frame_policy_browsertest.cc b/chrome/browser/download/download_frame_policy_browsertest.cc index 70d04071..9f628905 100644 --- a/chrome/browser/download/download_frame_policy_browsertest.cc +++ b/chrome/browser/download/download_frame_policy_browsertest.cc
@@ -721,10 +721,7 @@ // Test that when the iframe sandbox attribute is updated before navigation, // the updated flag will be controlling the navigation-instantiating frame's -// policy for the download intervention. Given that the feature is disabled by -// default, the download will occur, but the point of the test is to track the -// use counter for whether or not the download would have been blocked by the -// policy. +// policy for the download intervention. IN_PROC_BROWSER_TEST_P( DownloadFramePolicyBrowserTest_UpdateIframeSandboxFlags, PendingSandboxPolicyUsedForNavigationInstantiatingFrame) { @@ -732,6 +729,7 @@ bool from_allow_to_disallow; std::tie(is_cross_origin, from_allow_to_disallow) = GetParam(); + size_t number_of_downloads = from_allow_to_disallow ? 0u : 1u; SandboxOption initial_sandbox_option = from_allow_to_disallow ? SandboxOption::kAllowDownloads : SandboxOption::kDisallowDownloads; @@ -741,7 +739,7 @@ : kSandboxTokensAllowDownloads; InitializeHistogramTesterAndWebFeatureWaiter(); - SetNumDownloadsExpectation(1); + SetNumDownloadsExpectation(number_of_downloads); InitializeOneSubframeSetup(initial_sandbox_option, false /* is_ad_frame */, is_cross_origin); @@ -769,16 +767,14 @@ // Test that when the iframe sandbox attribute is updated before navigation, // the updated flag will NOT be controlling the navigation-initiator frame's -// policy for the download intervention. Given that the feature is disabled by -// default, the download will occur, but the point of the test is to track the -// use counter for whether or not the download would have been blocked by the -// policy. +// policy for the download intervention. IN_PROC_BROWSER_TEST_P(DownloadFramePolicyBrowserTest_UpdateIframeSandboxFlags, EffectiveSandboxPolicyUsedForNavigationInitiatorFrame) { bool is_cross_origin; bool from_allow_to_disallow; std::tie(is_cross_origin, from_allow_to_disallow) = GetParam(); + size_t number_of_downloads = from_allow_to_disallow ? 1u : 0u; SandboxOption initial_sandbox_option = from_allow_to_disallow ? SandboxOption::kAllowDownloads : SandboxOption::kDisallowDownloads; @@ -788,7 +784,7 @@ : kSandboxTokensAllowDownloads; InitializeHistogramTesterAndWebFeatureWaiter(); - SetNumDownloadsExpectation(1); + SetNumDownloadsExpectation(number_of_downloads); InitializeOneSubframeSetup(initial_sandbox_option, false /* is_ad_frame */, is_cross_origin);
diff --git a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc index 127f747..1a1c21e 100644 --- a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc +++ b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
@@ -239,7 +239,7 @@ // from extension id to its sync data. SettingSyncDataMultimap GetAllSyncData(syncer::ModelType model_type) { syncer::SyncDataList as_list = - GetSyncableService(model_type)->GetAllSyncData(model_type); + GetSyncableService(model_type)->GetAllSyncDataForTesting(model_type); SettingSyncDataMultimap as_map; for (auto it = as_list.begin(); it != as_list.end(); ++it) { std::unique_ptr<SettingSyncData> sync_data(new SettingSyncData(*it)); @@ -1026,7 +1026,7 @@ GetExisting("bad")->set_status_code(ValueStore::CORRUPTION); { syncer::SyncDataList all_sync_data = - GetSyncableService(model_type)->GetAllSyncData(model_type); + GetSyncableService(model_type)->GetAllSyncDataForTesting(model_type); EXPECT_EQ(1u, all_sync_data.size()); EXPECT_EQ("good/foo", syncer::SyncDataLocal(all_sync_data[0]).GetTag()); }
diff --git a/chrome/browser/extensions/api/storage/sync_storage_backend.cc b/chrome/browser/extensions/api/storage/sync_storage_backend.cc index 6e1cd48..d25a5140 100644 --- a/chrome/browser/extensions/api/storage/sync_storage_backend.cc +++ b/chrome/browser/extensions/api/storage/sync_storage_backend.cc
@@ -146,8 +146,8 @@ std::move(done).Run(); } -syncer::SyncDataList SyncStorageBackend::GetAllSyncData(syncer::ModelType type) - const { +syncer::SyncDataList SyncStorageBackend::GetAllSyncDataForTesting( + syncer::ModelType type) const { DCHECK(IsOnBackendSequence()); // For all extensions, get all their settings. This has the effect // of bringing in the entire state of extension settings in memory; sad.
diff --git a/chrome/browser/extensions/api/storage/sync_storage_backend.h b/chrome/browser/extensions/api/storage/sync_storage_backend.h index f57cedb..db9c01d 100644 --- a/chrome/browser/extensions/api/storage/sync_storage_backend.h +++ b/chrome/browser/extensions/api/storage/sync_storage_backend.h
@@ -49,7 +49,7 @@ // syncer::SyncableService implementation. void WaitUntilReadyToSync(base::OnceClosure done) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; syncer::SyncMergeResult MergeDataAndStartSyncing( syncer::ModelType type, const syncer::SyncDataList& initial_sync_data,
diff --git a/chrome/browser/extensions/extension_service_sync_unittest.cc b/chrome/browser/extensions/extension_service_sync_unittest.cc index 4e1cee8..fccb6c3 100644 --- a/chrome/browser/extensions/extension_service_sync_unittest.cc +++ b/chrome/browser/extensions/extension_service_sync_unittest.cc
@@ -699,7 +699,7 @@ std::make_unique<syncer::SyncErrorFactoryMock>()); syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -728,7 +728,7 @@ { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -744,7 +744,7 @@ extensions::disable_reason::DISABLE_USER_ACTION); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -761,7 +761,7 @@ extensions::disable_reason::DISABLE_RELOAD); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -780,7 +780,7 @@ extensions::disable_reason::DISABLE_RELOAD); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -806,7 +806,7 @@ std::make_unique<syncer::SyncErrorFactoryMock>()); syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -834,7 +834,7 @@ std::make_unique<syncer::SyncErrorFactoryMock>()); syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 0U); } @@ -851,7 +851,7 @@ { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -864,7 +864,7 @@ extensions::disable_reason::DISABLE_USER_ACTION); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -876,7 +876,7 @@ extensions::util::SetIsIncognitoEnabled(good_crx, profile(), true); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -888,7 +888,7 @@ service()->EnableExtension(good_crx); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> data = ExtensionSyncData::CreateFromSyncData(list[0]); @@ -947,7 +947,7 @@ syncer::StringOrdinal::CreateInitialOrdinal(); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::APPS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> app_sync_data = @@ -960,7 +960,7 @@ sorting->SetAppLaunchOrdinal(app->id(), initial_ordinal.CreateAfter()); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::APPS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> app_sync_data = @@ -973,7 +973,7 @@ sorting->SetPageOrdinal(app->id(), initial_ordinal.CreateAfter()); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::APPS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS); ASSERT_EQ(list.size(), 1U); std::unique_ptr<ExtensionSyncData> app_sync_data = @@ -1010,7 +1010,7 @@ ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id()); { syncer::SyncDataList list = - extension_sync_service()->GetAllSyncData(syncer::APPS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS); ASSERT_EQ(list.size(), 3U); std::unique_ptr<ExtensionSyncData> data[kAppCount]; @@ -1055,9 +1055,12 @@ extensions::disable_reason::DISABLE_USER_ACTION); TerminateExtension(theme2_crx); - EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size()); EXPECT_EQ( - 2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size()); + 0u, + extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS).size()); + EXPECT_EQ(2u, extension_sync_service() + ->GetAllSyncDataForTesting(syncer::EXTENSIONS) + .size()); } TEST_F(ExtensionServiceSyncTest, ProcessSyncDataUninstall) { @@ -1341,7 +1344,7 @@ EXPECT_FALSE(service()->updater()->WillCheckSoon()); // Make sure the version we'll send back to sync didn't change. syncer::SyncDataList data = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(1u, data.size()); std::unique_ptr<ExtensionSyncData> extension_data = ExtensionSyncData::CreateFromSyncData(data[0]); @@ -1360,7 +1363,7 @@ EXPECT_FALSE(service()->updater()->WillCheckSoon()); // Make sure the version we'll send back to sync didn't change. syncer::SyncDataList data = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(1u, data.size()); std::unique_ptr<ExtensionSyncData> extension_data = ExtensionSyncData::CreateFromSyncData(data[0]); @@ -1382,7 +1385,7 @@ // haven't actually updated yet. This is to prevent the data in sync from // flip-flopping back and forth until all clients are up to date. syncer::SyncDataList data = - extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); + extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS); ASSERT_EQ(1u, data.size()); std::unique_ptr<ExtensionSyncData> extension_data = ExtensionSyncData::CreateFromSyncData(data[0]);
diff --git a/chrome/browser/extensions/extension_sync_service.cc b/chrome/browser/extensions/extension_sync_service.cc index e9fc392..d9d31a9 100644 --- a/chrome/browser/extensions/extension_sync_service.cc +++ b/chrome/browser/extensions/extension_sync_service.cc
@@ -203,7 +203,7 @@ GetSyncBundle(type)->Reset(); } -syncer::SyncDataList ExtensionSyncService::GetAllSyncData( +syncer::SyncDataList ExtensionSyncService::GetAllSyncDataForTesting( syncer::ModelType type) const { const SyncBundle* bundle = GetSyncBundle(type); if (!bundle->IsSyncing())
diff --git a/chrome/browser/extensions/extension_sync_service.h b/chrome/browser/extensions/extension_sync_service.h index 06de954..26a2be2 100644 --- a/chrome/browser/extensions/extension_sync_service.h +++ b/chrome/browser/extensions/extension_sync_service.h
@@ -70,7 +70,7 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index e24fc8c..85bbbf6 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -785,10 +785,6 @@ const char kEnableSyncUSSNigoriDescription[] = "Enables the new, experimental implementation of sync encryption keys"; -const char kEnableSyncUSSPasswordsName[] = "Enable USS for passwords sync"; -const char kEnableSyncUSSPasswordsDescription[] = - "Enables the new, experimental implementation of passwords sync"; - const char kEnableTextFragmentAnchorName[] = "Enable Text Fragment Anchor."; const char kEnableTextFragmentAnchorDescription[] = "Enables scrolling to text specified in URL's fragment.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index eb1902b..cce43c8 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -461,9 +461,6 @@ extern const char kEnableSyncUSSNigoriName[]; extern const char kEnableSyncUSSNigoriDescription[]; -extern const char kEnableSyncUSSPasswordsName[]; -extern const char kEnableSyncUSSPasswordsDescription[]; - extern const char kEnableTextFragmentAnchorName[]; extern const char kEnableTextFragmentAnchorDescription[];
diff --git a/chrome/browser/media/webrtc/OWNERS b/chrome/browser/media/webrtc/OWNERS index 768e9f6..2e2b5fb1 100644 --- a/chrome/browser/media/webrtc/OWNERS +++ b/chrome/browser/media/webrtc/OWNERS
@@ -6,7 +6,7 @@ # For WebRTC browser tests. per-file *webrtc*browsertest*=hbos@chromium.org -per-file *webrtc*browsertest*=phoglund@chromium.org +per-file *webrtc*browsertest*=mbonadei@chromium.org # For changes related to the tab media indicators. per-file media_stream_capture_indicator*=miu@chromium.org
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc index 43e14c41..74b4d99 100644 --- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -141,7 +141,7 @@ page_load_metrics::InitPageLoadTimingForTest(timing.get()); observer->OnTimingUpdated( navigation_handle()->GetRenderFrameHost(), std::move(timing), - page_load_metrics::mojom::PageLoadMetadataPtr(base::in_place), + page_load_metrics::mojom::FrameMetadataPtr(base::in_place), page_load_metrics::mojom::PageLoadFeaturesPtr(base::in_place), resources, page_load_metrics::mojom::FrameRenderDataUpdatePtr(base::in_place),
diff --git a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc index 8f93a06..56ba2053 100644 --- a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
@@ -201,7 +201,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -265,7 +265,7 @@ NavigationSimulator::CreateRendererInitiated(amp_url, main_rfh()) ->CommitSameDocument(); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -316,7 +316,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -380,7 +380,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -420,7 +420,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -487,7 +487,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -529,7 +529,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -585,7 +585,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe1")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe1); @@ -690,7 +690,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe); @@ -775,7 +775,7 @@ content::RenderFrameHostTester::For(web_contents()->GetMainFrame()) ->AppendChild("subframe")); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags = blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded; tester()->SimulateMetadataUpdate(metadata, subframe);
diff --git a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc index c0ee9b0..7f39b5e7 100644 --- a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc
@@ -52,7 +52,7 @@ base::TimeDelta::FromMilliseconds(3); PopulateRequiredTimingFields(&timing); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorDocumentWriteBlock; NavigateAndCommit(GURL("https://www.google.com/")); @@ -101,7 +101,7 @@ timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1); PopulateRequiredTimingFields(&timing); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorDocumentWriteBlockReload; NavigateAndCommit(GURL("https://www.google.com/")); @@ -160,7 +160,7 @@ timing.paint_timing->first_contentful_paint = contentful_paint; PopulateRequiredTimingFields(&timing); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; NavigateAndCommit(GURL("https://www.google.com/")); tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
diff --git a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc index cc6f109..c4e5abd7 100644 --- a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc
@@ -171,7 +171,7 @@ InitializeTestPageLoadTiming(&timing); NavigateAndCommit(GURL(kDefaultTestUrl)); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled; tester()->SimulateTimingAndMetadataUpdate(timing, metadata); @@ -248,7 +248,7 @@ page_load_metrics::InitPageLoadTimingForTest(&timing); PopulateRequiredTimingFields(&timing); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled; @@ -304,7 +304,7 @@ InitializeTestPageLoadTiming(&timing); NavigateAndCommit(GURL(kInboxTestUrl)); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled; tester()->SimulateTimingAndMetadataUpdate(timing, metadata); @@ -427,7 +427,7 @@ InitializeTestPageLoadTiming(&timing); NavigateAndCommit(GURL(kSearchTestUrl)); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled; tester()->SimulateTimingAndMetadataUpdate(timing, metadata); @@ -550,7 +550,7 @@ InitializeTestPageLoadTiming(&timing); NavigateAndCommit(GURL(kSearchTestUrl)); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; tester()->SimulateTimingAndMetadataUpdate(timing, metadata); tester()->histogram_tester().ExpectTotalCount( @@ -617,7 +617,7 @@ GURL(kDefaultTestUrl), ui::PageTransitionFromInt(ui::PAGE_TRANSITION_RELOAD | ui::PAGE_TRANSITION_FORWARD_BACK)); - page_load_metrics::mojom::PageLoadMetadata metadata; + page_load_metrics::mojom::FrameMetadata metadata; metadata.behavior_flags |= blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled; tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc index cb54aa3a..b0967fc 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -2485,3 +2485,199 @@ internal::kFeaturesHistogramName, static_cast<int32_t>(WebFeature::kSecureContextCheckFailed), 0); } + +// Creates a single frame within the main frame and verifies the intersection +// with the main frame. +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, + MainFrameDocumentIntersectionSingleFrame) { + ASSERT_TRUE(embedded_test_server()->Start()); + + auto waiter = CreatePageLoadMetricsTestWaiter(); + ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL( + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(100, 100, 200, 200)); + + // Create a 200x200 iframe at 100,100. + EXPECT_TRUE(ExecJs(web_contents, + "createIframeAtRect(\"test\", 100, 100, 200, 200);")); + + waiter->Wait(); +} + +// Creates a set of nested frames within the main frame and verifies +// their intersections with the main frame. +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, + MainFrameDocumentIntersectionSameOrigin) { + EXPECT_TRUE(embedded_test_server()->Start()); + + auto waiter = CreatePageLoadMetricsTestWaiter(); + ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL( + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(100, 100, 200, 200)); + + // Create a 200x200 iframe at 100,100. + EXPECT_TRUE(ExecJs(web_contents, + "createIframeAtRect(\"test\", 100, 100, 200, 200);")); + waiter->Wait(); + + NavigateIframeToURL( + web_contents, "test", + embedded_test_server()->GetURL( + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + + // Creates the grandchild iframe within the child frame at 10, 10 with + // dimensions 300x300. This frame is clipped by 110 pixels in the bottom and + // right. This translates to an intersection of 110, 110, 190, 190 with the + // main frame. + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(110, 110, 190, 190)); + content::RenderFrameHost* child_frame = + content::ChildFrameAt(web_contents->GetMainFrame(), 0); + EXPECT_TRUE( + ExecJs(child_frame, "createIframeAtRect(\"test2\", 10, 10, 300, 300);")); + + waiter->Wait(); +} + +// Creates a set of nested frames, with a cross origin subframe, within the +// main frame and verifies their intersections with the main frame. +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, + MainFrameDocumentIntersectionCrossOrigin) { + EXPECT_TRUE(embedded_test_server()->Start()); + auto waiter = CreatePageLoadMetricsTestWaiter(); + ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL( + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(100, 100, 200, 200)); + + // Create a 200x200 iframe at 100,100. + EXPECT_TRUE(ExecJs(web_contents, + "createIframeAtRect(\"test\", 100, 100, 200, 200);")); + waiter->Wait(); + + NavigateIframeToURL( + web_contents, "test", + embedded_test_server()->GetURL( + "b.com", + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + + // Creates the grandchild iframe within the child frame at 10, 10 with + // dimensions 300x300. This frame is clipped by 110 pixels in the bottom and + // right. This translates to an intersection of 110, 110, 190, 190 with the + // main frame. + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(110, 110, 190, 190)); + content::RenderFrameHost* child_frame = + content::ChildFrameAt(web_contents->GetMainFrame(), 0); + EXPECT_TRUE( + ExecJs(child_frame, "createIframeAtRect(\"test2\", 10, 10, 300, 300);")); + + waiter->Wait(); +} + +// Creates a set of nested frames, with a cross origin subframe that is out of +// view within the main frame and verifies their intersections with the main +// frame. +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, + MainFrameDocumentIntersectionCrossOriginOutOfView) { + EXPECT_TRUE(embedded_test_server()->Start()); + auto waiter = CreatePageLoadMetricsTestWaiter(); + ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL( + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(100, 100, 200, 200)); + + // Create a 200x200 iframe at 100,100. + EXPECT_TRUE(ExecJs(web_contents, + "createIframeAtRect(\"test\", 100, 100, 200, 200);")); + waiter->Wait(); + + NavigateIframeToURL( + web_contents, "test", + embedded_test_server()->GetURL( + "b.com", + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + + // Creates the grandchild iframe within the child frame outside the parent + // frame's viewport. + waiter->AddMainFrameDocumentIntersectionExpectation(gfx::Rect(0, 0, 0, 0)); + content::RenderFrameHost* child_frame = + content::ChildFrameAt(web_contents->GetMainFrame(), 0); + EXPECT_TRUE(ExecJs(child_frame, + "createIframeAtRect(\"test2\", 5000, 5000, 190, 190);")); + + waiter->Wait(); +} + +// Creates a set of nested frames, with a cross origin subframe that is out of +// view within the main frame and verifies their intersections with the main +// frame. The out of view frame is then scrolled back into view and the +// intersection is verified. +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, + MainFrameDocumentIntersectionCrossOriginScrolled) { + EXPECT_TRUE(embedded_test_server()->Start()); + auto waiter = CreatePageLoadMetricsTestWaiter(); + ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL( + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(100, 100, 200, 200)); + + // Create a 200x200 iframe at 100,100. + EXPECT_TRUE(ExecJs(web_contents, + "createIframeAtRect(\"test\", 100, 100, 200, 200);")); + waiter->Wait(); + + NavigateIframeToURL( + web_contents, "test", + embedded_test_server()->GetURL( + "b.com", + "/page_load_metrics/blank_with_positioned_iframe_writer.html")); + + // Creates the grandchild iframe within the child frame outside the parent + // frame's viewport. + waiter->AddMainFrameDocumentIntersectionExpectation(gfx::Rect(0, 0, 0, 0)); + content::RenderFrameHost* child_frame = + content::ChildFrameAt(web_contents->GetMainFrame(), 0); + EXPECT_TRUE(ExecJs(child_frame, + "createIframeAtRect(\"test2\", 5000, 5000, 190, 190);")); + waiter->Wait(); + + // Scroll the child frame and verify the grandchild frame's intersection. + // The parent frame is at position 100,100 with dimensions 200x200. The + // child frame after scrolling is positioned at 100,100 within the parent + // frame and is clipped to 100x100. The grand child's main frame document + // position is then 200,200 after the child frame is scrolled. + waiter->AddMainFrameDocumentIntersectionExpectation( + gfx::Rect(200, 200, 100, 100)); + + EXPECT_TRUE(ExecJs(child_frame, "window.scroll(4900, 4900); ")); + + waiter->Wait(); +}
diff --git a/chrome/browser/password_manager/account_storage/account_password_store_factory.cc b/chrome/browser/password_manager/account_storage/account_password_store_factory.cc index 2f8df20..9f1a917 100644 --- a/chrome/browser/password_manager/account_storage/account_password_store_factory.cc +++ b/chrome/browser/password_manager/account_storage/account_password_store_factory.cc
@@ -119,7 +119,7 @@ scoped_refptr<PasswordStore> ps = new password_manager::PasswordStoreDefault(std::move(login_db)); - if (!ps->Init(/*flare=*/base::DoNothing(), profile->GetPrefs(), + if (!ps->Init(profile->GetPrefs(), base::BindRepeating(&SyncEnabledOrDisabled, profile))) { // TODO(crbug.com/479725): Remove the LOG once this error is visible in the // UI.
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index 0c276a36..8fd45689 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -549,12 +549,14 @@ void ChromePasswordManagerClient::NotifyUserCredentialsWereLeaked( password_manager::CredentialLeakType leak_type, - const GURL& origin) { + const GURL& origin, + const base::string16& username) { #if defined(OS_ANDROID) HideSavePasswordInfobar(web_contents()); #if defined(ENABLE_PASSWORD_CHANGE) + was_leak_warning_shown_ = true; (new CredentialLeakPasswordChangeControllerAndroid( - leak_type, origin, web_contents()->GetTopLevelNativeWindow())) + leak_type, origin, username, web_contents()->GetTopLevelNativeWindow())) ->ShowDialog(); #else (new CredentialLeakControllerAndroid( @@ -832,6 +834,15 @@ return false; } +bool ChromePasswordManagerClient::WasCredentialLeakDialogShown() const { +#if defined(ENABLE_PASSWORD_CHANGE) + return was_leak_warning_shown_; +#else + // Don't allow a password change flow if the feature is not enabled. + return false; +#endif +} + net::CertStatus ChromePasswordManagerClient::GetMainFrameCertStatus() const { content::NavigationEntry* entry = web_contents()->GetController().GetLastCommittedEntry();
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h index 5a972f64..d25b42d 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.h +++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -131,7 +131,8 @@ const password_manager::PasswordFormManagerForUI* form_manager) override; void NotifyUserCredentialsWereLeaked( password_manager::CredentialLeakType leak_type, - const GURL& origin) override; + const GURL& origin, + const base::string16& username) override; void TriggerReauthForAccount( const CoreAccountId& account_id, base::OnceCallback<void(ReauthSucceeded)> reauth_callback) override; @@ -142,6 +143,7 @@ password_manager::PasswordStore* GetAccountPasswordStore() const override; password_manager::SyncState GetPasswordSyncState() const override; bool WasLastNavigationHTTPError() const override; + bool WasCredentialLeakDialogShown() const override; net::CertStatus GetMainFrameCertStatus() const override; void PromptUserToEnableAutosignin() override; bool IsIncognito() const override; @@ -372,6 +374,11 @@ // Whether OnPaste() was called from this ChromePasswordManagerClient bool was_on_paste_called_ = false; +#if defined(ENABLE_PASSWORD_CHANGE) + // Whether a leak warning was shown. + bool was_leak_warning_shown_ = false; +#endif + // Helper for performing logic that is common between // ChromePasswordManagerClient and IOSChromePasswordManagerClient. password_manager::PasswordManagerClientHelper helper_;
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc index 4588e17b..22a4401 100644 --- a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc +++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
@@ -20,8 +20,12 @@ CredentialLeakPasswordChangeControllerAndroid( password_manager::CredentialLeakType leak_type, const GURL& origin, + const base::string16& username, ui::WindowAndroid* window_android) - : leak_type_(leak_type), origin_(origin), window_android_(window_android) {} + : leak_type_(leak_type), + origin_(origin), + username_(username), + window_android_(window_android) {} CredentialLeakPasswordChangeControllerAndroid:: ~CredentialLeakPasswordChangeControllerAndroid() = default;
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h index 0ffbfc27..a1e32aa 100644 --- a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h +++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
@@ -7,6 +7,7 @@ #include <memory> #include "base/macros.h" +#include "base/strings/string16.h" #include "components/password_manager/core/browser/leak_detection_dialog_utils.h" #include "ui/gfx/range/range.h" #include "url/gurl.h" @@ -27,6 +28,7 @@ CredentialLeakPasswordChangeControllerAndroid( password_manager::CredentialLeakType leak_type, const GURL& origin, + const base::string16& username, ui::WindowAndroid* window_android); ~CredentialLeakPasswordChangeControllerAndroid(); @@ -72,6 +74,8 @@ const GURL origin_; + const base::string16 username_; + ui::WindowAndroid* window_android_; std::unique_ptr<CredentialLeakDialogPasswordChangeViewAndroid> dialog_view_;
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc index 5ebc850..d95471a 100644 --- a/chrome/browser/password_manager/password_store_factory.cc +++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -14,7 +14,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/sync/glue/sync_start_util.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/web_data_service_factory.h" #include "chrome/common/chrome_paths_internal.h" @@ -162,8 +161,7 @@ NOTIMPLEMENTED(); #endif DCHECK(ps); - if (!ps->Init(sync_start_util::GetFlareForSyncableService(profile->GetPath()), - profile->GetPrefs())) { + if (!ps->Init(profile->GetPrefs())) { // TODO(crbug.com/479725): Remove the LOG once this error is visible in the // UI. LOG(WARNING) << "Could not initialize password store.";
diff --git a/chrome/browser/password_manager/password_store_factory.h b/chrome/browser/password_manager/password_store_factory.h index 8c5e78b00..74366f87 100644 --- a/chrome/browser/password_manager/password_store_factory.h +++ b/chrome/browser/password_manager/password_store_factory.h
@@ -30,7 +30,7 @@ static PasswordStoreFactory* GetInstance(); - // Called by the PasswordDataTypeController whenever there is a possibility + // Called by the PasswordModelTypeController whenever there is a possibility // that syncing passwords has just started or ended for |profile|. static void OnPasswordsSyncedStatePotentiallyChanged(Profile* profile);
diff --git a/chrome/browser/password_manager/password_store_x_unittest.cc b/chrome/browser/password_manager/password_store_x_unittest.cc index d625ff4..06e84da 100644 --- a/chrome/browser/password_manager/password_store_x_unittest.cc +++ b/chrome/browser/password_manager/password_store_x_unittest.cc
@@ -133,7 +133,7 @@ test_login_db_file_path(), password_manager::IsAccountStore(false)); scoped_refptr<PasswordStoreX> store = new PasswordStoreX(std::move(login_db), fake_pref_service()); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); // Check the contents are still around. MockPasswordStoreConsumer consumer; @@ -179,7 +179,7 @@ scoped_refptr<PasswordStoreX> store = new PasswordStoreX(std::move(login_db), fake_pref_service()); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); WaitForPasswordStore(); // Add a password to the db. @@ -234,7 +234,7 @@ scoped_refptr<PasswordStoreX> store = new PasswordStoreX(std::move(login_db), fake_pref_service()); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); WaitForPasswordStore(); // Add another password to the db.
diff --git a/chrome/browser/payments/BUILD.gn b/chrome/browser/payments/BUILD.gn index f97970f7..5ad6856 100644 --- a/chrome/browser/payments/BUILD.gn +++ b/chrome/browser/payments/BUILD.gn
@@ -9,6 +9,7 @@ "empty_parameters_browsertest.cc", "has_enrolled_instrument_browsertest.cc", "has_enrolled_instrument_query_quota_browsertest.cc", + "iframe_csp_browsertest.cc", "journey_logger_browsertest.cc", "payment_handler_change_shipping_address_option_browsertest.cc", "payment_handler_enable_delegations_browsertest.cc",
diff --git a/chrome/browser/payments/iframe_csp_browsertest.cc b/chrome/browser/payments/iframe_csp_browsertest.cc new file mode 100644 index 0000000..bcc4469f --- /dev/null +++ b/chrome/browser/payments/iframe_csp_browsertest.cc
@@ -0,0 +1,62 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "base/macros.h" +#include "chrome/test/payments/payment_request_platform_browsertest_base.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace payments { + +class IframeCspTest : public PaymentRequestPlatformBrowserTestBase { + public: + IframeCspTest() : app_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} + + ~IframeCspTest() override = default; + + void SetUpOnMainThread() override { + PaymentRequestPlatformBrowserTestBase::SetUpOnMainThread(); + + // kylepay.com is a payment app that supports just-in-time installation. + app_server_.ServeFilesFromSourceDirectory( + "components/test/data/payments/kylepay.com"); + ASSERT_TRUE(app_server_.Start()); + + // Set up test manifest downloader that knows how to fake origin. + const std::string method_name = "kylepay.com"; + SetDownloaderAndIgnorePortInOriginComparisonForTesting( + {{method_name, &app_server_}}); + } + + private: + net::EmbeddedTestServer app_server_; +}; + +IN_PROC_BROWSER_TEST_F(IframeCspTest, Show) { + NavigateTo("/csp_test_main.html"); + + content::WebContentsConsoleObserver console_observer(GetActiveWebContents()); + // Filter for console messages related to the CSP failure. There should be + // none. + console_observer.SetPattern( + "Refused to load the image 'https://kylepay.com:*/icon.png *"); + + GURL iframe_url = + https_server()->GetURL("other.example", "/csp_test_iframe.html"); + EXPECT_TRUE( + content::NavigateIframeToURL(GetActiveWebContents(), "test", iframe_url)); + + content::RenderFrameHost* iframe = content::FrameMatchingPredicate( + GetActiveWebContents(), + base::BindRepeating(&content::FrameHasSourceUrl, iframe_url)); + EXPECT_EQ(iframe_url, iframe->GetLastCommittedURL()); + + EXPECT_EQ(true, content::EvalJs(iframe, "checkCanMakePayment()")); + EXPECT_TRUE(console_observer.messages().empty()); +} + +} // namespace payments
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc index 1c9aeb8f..447dfa6 100644 --- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc +++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
@@ -17,6 +17,7 @@ #include "content/public/common/transferrable_url_loader.mojom.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h" #include "extensions/common/extension.h" +#include "extensions/common/manifest_handlers/mime_types_handler.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -54,6 +55,8 @@ if (extension_id.empty()) return; + MimeTypesHandler::ReportUsedHandler(extension_id); + std::string view_id = base::GenerateGUID(); // The string passed down to the original client with the response body. std::string payload = view_id;
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder.cc b/chrome/browser/profiles/profile_activity_metrics_recorder.cc index c8cf894..325ed011 100644 --- a/chrome/browser/profiles/profile_activity_metrics_recorder.cc +++ b/chrome/browser/profiles/profile_activity_metrics_recorder.cc
@@ -24,6 +24,10 @@ // in the metrics. constexpr int kMaxProfileBucket = 100; +// Long time of inactivity that is treated as if user starts the browser anew. +constexpr base::TimeDelta kLongTimeOfInactivity = + base::TimeDelta::FromMinutes(30); + int GetMetricsBucketIndex(Profile* profile) { if (profile->IsGuestSession()) return 0; @@ -77,6 +81,12 @@ } } +void RecordProfilesState() { + g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .RecordProfilesState(); +} + } // namespace // static @@ -98,11 +108,28 @@ RecordBrowserActivation(active_profile); if (last_active_profile_ != active_profile) { + // No-op, if starting a new session (|last_active_profile_| is nullptr). RecordProfileSessionDuration( last_active_profile_, base::TimeTicks::Now() - profile_session_start_); + last_active_profile_ = active_profile; profile_session_start_ = base::TimeTicks::Now(); + + // Record state at startup (when last_profile_session_end_ is 0) and + // whenever the user starts browsing after a longer time of inactivity. Do + // it asynchronously because active_time of the just activated profile is + // also updated from OnBrowserSetLastActive() in another BrowserListObserver + // and we have no guarantee if this happens before or after this function + // call. + if (profile_session_start_ - last_profile_session_end_ > + kLongTimeOfInactivity) { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&RecordProfilesState)); + } } + + // This browsing session is still lasting. + last_profile_session_end_ = base::TimeTicks::Now(); } void ProfileActivityMetricsRecorder::OnSessionEnded( @@ -113,6 +140,7 @@ RecordProfileSessionDuration(last_active_profile_, session_end - profile_session_start_); last_active_profile_ = nullptr; + last_profile_session_end_ = base::TimeTicks::Now(); } ProfileActivityMetricsRecorder::ProfileActivityMetricsRecorder() {
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder.h b/chrome/browser/profiles/profile_activity_metrics_recorder.h index 5a2977c..99ec5a9 100644 --- a/chrome/browser/profiles/profile_activity_metrics_recorder.h +++ b/chrome/browser/profiles/profile_activity_metrics_recorder.h
@@ -42,6 +42,7 @@ Profile* last_active_profile_ = nullptr; base::TimeTicks profile_session_start_; + base::TimeTicks last_profile_session_end_; base::ActionCallback action_callback_;
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc b/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc index f8a3fc86..54c7c15 100644 --- a/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc +++ b/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc
@@ -24,6 +24,8 @@ namespace { constexpr base::TimeDelta kInactivityTimeout = base::TimeDelta::FromMinutes(5); +constexpr base::TimeDelta kLongTimeOfInactivity = + base::TimeDelta::FromMinutes(30); } // namespace @@ -57,7 +59,9 @@ Browser::CreateParams browser_params(profile, false); browsers_.push_back(CreateBrowserWithTestWindowForParams(&browser_params)); + // This triggers the recorder to post a task, wait until that's done. BrowserList::SetLastActive(browsers_.back().get()); + task_environment_.RunUntilIdle(); } void ActivateIncognitoBrowser(Profile* profile) { @@ -206,3 +210,42 @@ histograms()->ExpectBucketCount("Profile.SessionDuration.PerProfile", /*bucket=*/1, /*count=*/2); } + +TEST_F(ProfileActivityMetricsRecorderTest, ProfileState) { + Profile* regular_profile = profile_manager()->CreateTestingProfile("p1"); + Profile* guest_profile = profile_manager()->CreateGuestProfile(); + histograms()->ExpectTotalCount("Profile.State.Avatar_All", 0); + + // TODO(crbug.com/1060113): It seems like some state is sometimes carried over + // in these tests: sometimes the first profile activation does not trigger + // recording profile state any more. Reset the object to simulate a fresh + // start. + ProfileActivityMetricsRecorder::CleanupForTesting(); + ProfileActivityMetricsRecorder::Initialize(); + + ActivateBrowser(regular_profile); + histograms()->ExpectTotalCount("Profile.State.Avatar_All", 1); + // This is somehow important for the session to end later in the test. + SimulateUserEvent(); + + // Repeating the same thing immediately has no impact. + ActivateBrowser(regular_profile); + histograms()->ExpectTotalCount("Profile.State.Avatar_All", 1); + + // Repeating the same thing immediately has no impact (neither for any other + // profile). Note that guest profile can only get created with incognito. + ActivateIncognitoBrowser(guest_profile); + histograms()->ExpectTotalCount("Profile.State.Avatar_All", 1); + + // Stay inactive so the session ends and stay inactive long after that. + task_environment()->FastForwardBy(kInactivityTimeout * 2 + + kLongTimeOfInactivity); + + // Now we get another record (no matter which profile triggers that). + ActivateBrowser(regular_profile); + histograms()->ExpectTotalCount("Profile.State.Avatar_All", 2); + + // Repeating the same thing immediately has no impact. + ActivateBrowser(regular_profile); + histograms()->ExpectTotalCount("Profile.State.Avatar_All", 2); +}
diff --git a/chrome/browser/profiles/profile_attributes_entry.cc b/chrome/browser/profiles/profile_attributes_entry.cc index 27d0e1a..92774ed 100644 --- a/chrome/browser/profiles/profile_attributes_entry.cc +++ b/chrome/browser/profiles/profile_attributes_entry.cc
@@ -177,22 +177,6 @@ return false; } -base::string16 ProfileAttributesEntry::GetNameToDisplay() const { - base::string16 name_to_display = GetGAIANameToDisplay(); - - base::string16 local_profile_name = GetLocalProfileName(); - if (name_to_display.empty()) - return local_profile_name; - - if (!ShouldShowProfileLocalName(name_to_display)) - return name_to_display; - - name_to_display.append(base::UTF8ToUTF16(" (")); - name_to_display.append(local_profile_name); - name_to_display.append(base::UTF8ToUTF16(")")); - return name_to_display; -} - base::string16 ProfileAttributesEntry::GetLastNameToDisplay() const { return last_name_to_display_; } @@ -206,8 +190,25 @@ return true; } +NameForm ProfileAttributesEntry::GetNameForm() const { + base::string16 name_to_display = GetGAIANameToDisplay(); + if (name_to_display.empty()) + return NameForm::kLocalName; + if (!ShouldShowProfileLocalName(name_to_display)) + return NameForm::kGaiaName; + return NameForm::kGaiaAndLocalName; +} + base::string16 ProfileAttributesEntry::GetName() const { - return GetNameToDisplay(); + switch (GetNameForm()) { + case NameForm::kGaiaName: + return GetGAIANameToDisplay(); + case NameForm::kLocalName: + return GetLocalProfileName(); + case NameForm::kGaiaAndLocalName: + return GetGAIANameToDisplay() + base::UTF8ToUTF16(" (") + + GetLocalProfileName() + base::UTF8ToUTF16(")"); + } } base::string16 ProfileAttributesEntry::GetShortcutName() const {
diff --git a/chrome/browser/profiles/profile_attributes_entry.h b/chrome/browser/profiles/profile_attributes_entry.h index 1a31f561..02105ec 100644 --- a/chrome/browser/profiles/profile_attributes_entry.h +++ b/chrome/browser/profiles/profile_attributes_entry.h
@@ -32,6 +32,12 @@ kSignedInWithConsentedPrimaryAccount, }; +enum class NameForm { + kGaiaName, + kLocalName, + kGaiaAndLocalName, +}; + class ProfileAttributesEntry { public: static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); @@ -51,6 +57,8 @@ base::string16 GetGAIANameToDisplay() const; // Returns true if the profile name has changed. bool HasProfileNameChanged(); + // Returns how the value of GetName() gets constructed. + NameForm GetNameForm() const; // Gets the local profile name. base::string16 GetLocalProfileName() const; @@ -172,13 +180,6 @@ const base::FilePath& path, PrefService* prefs); - // Gets the name of the profile which is the one displayed in the User Menu, - // which could be: - // - Profile name (The profile is not signed in). - // - Gaia name if the profile name is empty or |ShouldShowProfileLocalName()| - // return false. - // - Otherwise the concatenation of GAIA name and local profile name. - base::string16 GetNameToDisplay() const; base::string16 GetLastNameToDisplay() const; // Returns true if:
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc index 898feb7..316e0def 100644 --- a/chrome/browser/profiles/profile_attributes_storage.cc +++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -22,7 +22,10 @@ #include "build/build_config.h" #include "chrome/browser/profiles/profile_avatar_downloader.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" +#include "chrome/browser/profiles/profile_metrics.h" #include "chrome/grit/generated_resources.h" +#include "components/policy/core/browser/browser_policy_connector.h" +#include "components/profile_metrics/state.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "third_party/icu/source/i18n/unicode/coll.h" @@ -56,6 +59,13 @@ IDS_DEFAULT_AVATAR_NAME_26 }; +enum class MultiProfileUserType { + kSingleProfile, // There is only one profile. + kActiveMultiProfile, // Several profiles are actively used. + kLatentMultiProfile // There are several profiles, but only one is actively + // used. +}; + // Reads a PNG from disk and decodes it. If the bitmap was successfully read // from disk then this will return the bitmap image, otherwise it will return // an empty gfx::Image. @@ -137,6 +147,76 @@ return a->GetPath().value() < b->GetPath().value(); } +MultiProfileUserType GetMultiProfileUserType( + const std::vector<ProfileAttributesEntry*>& entries) { + DCHECK(entries.size() > 0); + if (entries.size() == 1u) + return MultiProfileUserType::kSingleProfile; + + int active_count = std::count_if( + entries.begin(), entries.end(), [](ProfileAttributesEntry* entry) { + return ProfileMetrics::IsProfileActive(entry); + }); + + if (active_count <= 1) + return MultiProfileUserType::kLatentMultiProfile; + return MultiProfileUserType::kActiveMultiProfile; +} + +profile_metrics::AvatarState GetAvatarState(ProfileAttributesEntry* entry) { + size_t index = entry->GetAvatarIconIndex(); + bool is_modern = profiles::IsModernAvatarIconIndex(index); + if (entry->GetSigninState() == SigninState::kNotSignedIn) { + if (index == profiles::GetPlaceholderAvatarIndex()) + return profile_metrics::AvatarState::kSignedOutDefault; + return is_modern ? profile_metrics::AvatarState::kSignedOutModern + : profile_metrics::AvatarState::kSignedOutOld; + } + if (entry->IsUsingGAIAPicture()) + return profile_metrics::AvatarState::kSignedInGaia; + return is_modern ? profile_metrics::AvatarState::kSignedInModern + : profile_metrics::AvatarState::kSignedInOld; +} + +profile_metrics::NameState GetNameState(ProfileAttributesEntry* entry) { + bool has_default_name = entry->IsUsingDefaultName(); + switch (entry->GetNameForm()) { + case NameForm::kGaiaName: + return profile_metrics::NameState::kGaiaName; + case NameForm::kLocalName: + return has_default_name ? profile_metrics::NameState::kDefaultName + : profile_metrics::NameState::kCustomName; + case NameForm::kGaiaAndLocalName: + return has_default_name ? profile_metrics::NameState::kGaiaAndDefaultName + : profile_metrics::NameState::kGaiaAndCustomName; + } +} + +profile_metrics::UnconsentedPrimaryAccountType GetUnconsentedPrimaryAccountType( + ProfileAttributesEntry* entry) { + if (entry->GetSigninState() == SigninState::kNotSignedIn) + return profile_metrics::UnconsentedPrimaryAccountType::kSignedOut; + if (entry->IsChild()) + return profile_metrics::UnconsentedPrimaryAccountType::kChild; + if (policy::BrowserPolicyConnector::IsNonEnterpriseUser( + base::UTF16ToUTF8(entry->GetUserName()))) { + return profile_metrics::UnconsentedPrimaryAccountType::kConsumer; + } + // TODO(crbug.com/1060113): Figure out how to distinguish EDU accounts from + // other enterprise. + return profile_metrics::UnconsentedPrimaryAccountType::kEnterprise; +} + +void RecordProfileState(ProfileAttributesEntry* entry, + profile_metrics::StateSuffix suffix) { + profile_metrics::LogProfileAvatar(GetAvatarState(entry), suffix); + profile_metrics::LogProfileName(GetNameState(entry), suffix); + profile_metrics::LogProfileAccountType( + GetUnconsentedPrimaryAccountType(entry), suffix); + profile_metrics::LogProfileDaysSinceLastUse( + (base::Time::Now() - entry->GetActiveTime()).InDays(), suffix); +} + } // namespace ProfileAttributesStorage::ProfileAttributesStorage(PrefService* prefs) @@ -300,6 +380,38 @@ observer_list_.RemoveObserver(obs); } +void ProfileAttributesStorage::RecordProfilesState() { + std::vector<ProfileAttributesEntry*> entries = GetAllProfilesAttributes(); + if (entries.size() == 0) + return; + + MultiProfileUserType type = GetMultiProfileUserType(entries); + + for (ProfileAttributesEntry* entry : entries) { + RecordProfileState(entry, profile_metrics::StateSuffix::kAll); + + switch (type) { + case MultiProfileUserType::kSingleProfile: + RecordProfileState(entry, profile_metrics::StateSuffix::kSingleProfile); + break; + case MultiProfileUserType::kActiveMultiProfile: + RecordProfileState(entry, + profile_metrics::StateSuffix::kActiveMultiProfile); + break; + case MultiProfileUserType::kLatentMultiProfile: { + if (ProfileMetrics::IsProfileActive(entry)) { + RecordProfileState( + entry, profile_metrics::StateSuffix::kLatentMultiProfileActive); + } else { + RecordProfileState( + entry, profile_metrics::StateSuffix::kLatentMultiProfileOthers); + } + break; + } + } + } +} + void ProfileAttributesStorage::NotifyOnProfileAvatarChanged( const base::FilePath& profile_path) const { for (auto& observer : observer_list_)
diff --git a/chrome/browser/profiles/profile_attributes_storage.h b/chrome/browser/profiles/profile_attributes_storage.h index ddbe82a..9bb5aaf 100644 --- a/chrome/browser/profiles/profile_attributes_storage.h +++ b/chrome/browser/profiles/profile_attributes_storage.h
@@ -94,6 +94,10 @@ bool IsDefaultProfileName(const base::string16& name, bool include_check_for_legacy_profile_name) const; + // Records statistics about profiles as would be visible in the profile picker + // (if we would display it in this moment). + void RecordProfilesState(); + // Returns an avatar icon index that can be assigned to a newly created // profile. Note that the icon may not be unique since there are a limited // set of default icons.
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc index 7b6b0c81..36d991a3 100644 --- a/chrome/browser/profiles/profile_attributes_storage_unittest.cc +++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
@@ -11,6 +11,7 @@ #include "base/format_macros.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" #include "chrome/browser/profiles/profile_avatar_downloader.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" @@ -21,6 +22,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/account_id/account_id.h" +#include "components/profile_metrics/state.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" @@ -829,3 +831,80 @@ EXPECT_FALSE(base::PathExists(icon_path)); } #endif + +TEST_F(ProfileAttributesStorageTest, ProfilesState_ActiveMultiProfile) { + EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); + for (size_t i = 0; i < 5; ++i) + AddTestingProfile(); + EXPECT_EQ(5U, storage()->GetNumberOfProfiles()); + + std::vector<ProfileAttributesEntry*> entries = + storage()->GetAllProfilesAttributes(); + entries[0]->SetActiveTimeToNow(); + entries[1]->SetActiveTimeToNow(); + + base::HistogramTester histogram_tester; + storage()->RecordProfilesState(); + + // There are 5 profiles all together. + histogram_tester.ExpectTotalCount("Profile.State.Avatar_All", 5); + histogram_tester.ExpectTotalCount("Profile.State.Avatar_ActiveMultiProfile", + 5); + + // Other user segments get 0 records. + histogram_tester.ExpectTotalCount("Profile.State.Avatar_SingleProfile", 0); + histogram_tester.ExpectTotalCount( + "Profile.State.Avatar_LatentMultiProfileActive", 0); + histogram_tester.ExpectTotalCount( + "Profile.State.Avatar_LatentMultiProfileOthers", 0); +} + +// On Android (at least on KitKat), all profiles are considered active (because +// ActiveTime is not set in production). Thus, these test does not work. +#if !defined(OS_ANDROID) +TEST_F(ProfileAttributesStorageTest, ProfilesState_LatentMultiProfile) { + EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); + for (size_t i = 0; i < 5; ++i) + AddTestingProfile(); + EXPECT_EQ(5U, storage()->GetNumberOfProfiles()); + + std::vector<ProfileAttributesEntry*> entries = + storage()->GetAllProfilesAttributes(); + entries[0]->SetActiveTimeToNow(); + + base::HistogramTester histogram_tester; + storage()->RecordProfilesState(); + + // There are 5 profiles all together. + histogram_tester.ExpectTotalCount("Profile.State.Name_All", 5); + histogram_tester.ExpectTotalCount( + "Profile.State.Name_LatentMultiProfileActive", 1); + histogram_tester.ExpectTotalCount( + "Profile.State.Name_LatentMultiProfileOthers", 4); + + // Other user segments get 0 records. + histogram_tester.ExpectTotalCount("Profile.State.Name_SingleProfile", 0); + histogram_tester.ExpectTotalCount("Profile.State.Name_ActiveMultiProfile", 0); +} +#endif + +TEST_F(ProfileAttributesStorageTest, ProfilesState_SingleProfile) { + EXPECT_EQ(0U, storage()->GetNumberOfProfiles()); + AddTestingProfile(); + EXPECT_EQ(1U, storage()->GetNumberOfProfiles()); + + base::HistogramTester histogram_tester; + storage()->RecordProfilesState(); + + // There is 1 profile all together. + histogram_tester.ExpectTotalCount("Profile.State.LastUsed_All", 1); + histogram_tester.ExpectTotalCount("Profile.State.LastUsed_SingleProfile", 1); + + // Other user segments get 0 records. + histogram_tester.ExpectTotalCount("Profile.State.LastUsed_ActiveMultiProfile", + 0); + histogram_tester.ExpectTotalCount( + "Profile.State.LastUsed_LatentMultiProfileActive", 0); + histogram_tester.ExpectTotalCount( + "Profile.State.LastUsed_LatentMultiProfileOthers", 0); +}
diff --git a/chrome/browser/profiles/profile_metrics.cc b/chrome/browser/profiles/profile_metrics.cc index 0b3b9253..a845e9f 100644 --- a/chrome/browser/profiles/profile_metrics.cc +++ b/chrome/browser/profiles/profile_metrics.cc
@@ -31,7 +31,10 @@ namespace { -const int kMaximumDaysOfDisuse = 4 * 7; // Should be integral number of weeks. +#if !defined(OS_ANDROID) +constexpr base::TimeDelta kProfileActivityThreshold = + base::TimeDelta::FromDays(28); // Should be integral number of weeks. +#endif enum class ProfileType { ORIGINAL = 0, // Refers to the original/default profile @@ -61,17 +64,6 @@ return metric; } -bool HasProfileBeenActiveSince(const ProfileAttributesEntry* entry, - const base::Time& active_limit) { -#if !defined(OS_ANDROID) - // TODO(mlerman): iOS and Android should set an ActiveTime in the - // ProfileAttributesStorage. (see ProfileManager::OnBrowserSetLastActive) - if (entry->GetActiveTime() < active_limit) - return false; -#endif - return true; -} - } // namespace // This enum is used for histograms. Do not change existing values. Append new @@ -139,6 +131,17 @@ NUM_PROFILE_AVATAR_METRICS }; +// static +bool ProfileMetrics::IsProfileActive(const ProfileAttributesEntry* entry) { +#if !defined(OS_ANDROID) + // TODO(mlerman): iOS and Android should set an ActiveTime in the + // ProfileAttributesStorage. (see ProfileManager::OnBrowserSetLastActive) + if (base::Time::Now() - entry->GetActiveTime() > kProfileActivityThreshold) + return false; +#endif + return true; +} + void ProfileMetrics::CountProfileInformation(ProfileAttributesStorage* storage, profile_metrics::Counts* counts) { size_t number_of_profiles = storage->GetNumberOfProfiles(); @@ -148,14 +151,10 @@ if (!number_of_profiles) return; - // Maximum age for "active" profile is 4 weeks. - base::Time oldest = base::Time::Now() - - base::TimeDelta::FromDays(kMaximumDaysOfDisuse); - std::vector<ProfileAttributesEntry*> entries = storage->GetAllProfilesAttributes(); for (ProfileAttributesEntry* entry : entries) { - if (!HasProfileBeenActiveSince(entry, oldest)) { + if (!IsProfileActive(entry)) { counts->unused++; } else { counts->active++;
diff --git a/chrome/browser/profiles/profile_metrics.h b/chrome/browser/profiles/profile_metrics.h index b57b1a18..5ddf02f 100644 --- a/chrome/browser/profiles/profile_metrics.h +++ b/chrome/browser/profiles/profile_metrics.h
@@ -12,6 +12,7 @@ #include "build/build_config.h" class Profile; +class ProfileAttributesEntry; class ProfileAttributesStorage; namespace base { @@ -121,6 +122,9 @@ }; #endif // defined(OS_ANDROID) + // Returns whether profile |entry| is considered active for metrics. + static bool IsProfileActive(const ProfileAttributesEntry* entry); + // Count and return summary information about the profiles currently in the // |storage|. This information is returned in the output variable |counts|. static void CountProfileInformation(ProfileAttributesStorage* storage,
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.css b/chrome/browser/resources/chromeos/login/oobe_eula.css index ddc0995..c52e0dc 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.css +++ b/chrome/browser/resources/chromeos/login/oobe_eula.css
@@ -13,6 +13,10 @@ min-height: 300px; } +#additionalChromeToSFrame { + height: 300px; +} + #installationSettings, #logging { font-size: 13px;
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.html b/chrome/browser/resources/chromeos/login/oobe_eula.html index 69af9c8..e6794e8e 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.html +++ b/chrome/browser/resources/chromeos/login/oobe_eula.html
@@ -1,10 +1,11 @@ <!-- Copyright 2016 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> - -<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> <dom-module id="oobe-eula-md"> <template> @@ -34,10 +35,12 @@ on-contentload="onFrameLoad_"> </webview> <div id="footer-more" class="layout vertical"> - <a href="#" id="additionalTerms" on-tap="onAdditionalTermsClicked_"> + <a href="#" id="additionalTerms" on-tap="onAdditionalTermsClicked_" + class="oobe-local-link"> [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]] </a> <a id="installationSettings" href="#" + class="oobe-local-link" on-tap="onInstallationSettingsClicked_"> [[i18nDynamic(locale, 'eulaSystemInstallationSettings')]] </a> @@ -109,10 +112,18 @@ on-tap="onInstallationSettingsCloseClicked_"></oobe-text-button> </div> </oobe-dialog> - <oobe-help-dialog id="additional-tos"> - <webview slot="content" role="document" class="flex oobe-tos-webview" - id="additionalChromeToS"> + <cr-dialog id="additional-tos" ignore-popstate + on-close="focusAdditionalTermsLink_" + on-cancel="focusAdditionalTermsLink_"> + <div slot="title"> + [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]] + </div> + <webview slot="body" role="document" class="flex oobe-tos-webview" + id="additionalChromeToSFrame"> </webview> - </oobe-help-dialog> + <oobe-text-button slot="button-container" inverse + on-click="hideToSDialog_" text-key="oobeModalDialogClose"> + </oobe-text-button> + </cr-dialog> </template> </dom-module>
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.js b/chrome/browser/resources/chromeos/login/oobe_eula.js index b1eaff4..a0125d9 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.js +++ b/chrome/browser/resources/chromeos/login/oobe_eula.js
@@ -129,7 +129,8 @@ const additionalToSUrl = loadTimeData.getString('eulaAdditionalToSOnlineUrl'); this.screen.loadEulaToWebview_( - this.$.additionalChromeToS, additionalToSUrl, true /* clear_anchors */); + this.$.additionalChromeToSFrame, additionalToSUrl, + true /* clear_anchors */); this.i18nUpdateLocale(); }, @@ -151,8 +152,27 @@ this.screen.onUsageStatsClicked_(this.$.usageStats.checked); }, + /** + * @private + */ onAdditionalTermsClicked_() { - this.$['additional-tos'].showDialog(); + this.$['additional-tos'].showModal(); + }, + + /** + * On-click event handler for close button of the additional ToS dialog. + * + * @private + */ + hideToSDialog_() { + this.$['additional-tos'].close(); + }, + + /** + * @private + */ + focusAdditionalTermsLink_() { + this.$.additionalTerms.focus(); }, /**
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html index c964daac..7728638 100644 --- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html +++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
@@ -51,9 +51,8 @@ } } </style> - <div id="safetyCheckParent" class="settings-box first two-line" tabindex="0" - aria-label="[[getParentAriaLabel_(parentStatus_)]]"> - <iron-icon icon="[[getParentIcon_(parentStatus_)]]" + <div id="safetyCheckParent" class="settings-box first two-line"> + <iron-icon icon="[[getParentIcon_(parentStatus_)]]" aria-hidden="true" src="[[getParentIconSrc_(parentStatus_)]]" class$="[[getParentIconClass_(parentStatus_)]]"> </iron-icon> @@ -81,9 +80,8 @@ </div> <iron-collapse id="safetyCheckCollapse" opened="[[shouldShowChildren_(parentStatus_)]]"> - <div class="settings-box two-line" tabindex="0" - aria-label="[[getUpdatesAriaLabel_(updatesDisplayString_)]]"> - <iron-icon icon="[[getUpdatesIcon_(updatesStatus_)]]" + <div class="settings-box two-line"> + <iron-icon icon="[[getUpdatesIcon_(updatesStatus_)]]" aria-hidden="true" src="[[getUpdatesIconSrc_(updatesStatus_)]]" class$="[[getUpdatesIconClass_(updatesStatus_)]]"> </iron-icon> @@ -104,16 +102,16 @@ </template> <template is="dom-if" if="[[shouldShowUpdatesManagedIcon_(updatesStatus_)]]" restamp> - <iron-icon id="safetyCheckUpdatesManagedIcon" - icon="cr20:domain"> + <iron-icon id="safetyCheckUpdatesManagedIcon" icon="cr20:domain" + aria-hidden="true"> </iron-icon> </template> </div> - <div class="settings-box two-line" tabindex="0" - aria-label="[[getPasswordsAriaLabel_(passwordsDisplayString_)]]"> + <div class="settings-box two-line"> <iron-icon icon="[[getPasswordsIcon_(passwordsStatus_)]]" src="[[getPasswordsIconSrc_(passwordsStatus_)]]" - class$="[[getPasswordsIconClass_(passwordsStatus_)]]"> + class$="[[getPasswordsIconClass_(passwordsStatus_)]]" + aria-hidden="true"> </iron-icon> <div class="start settings-box-text"> <div>$i18n{passwords}</div> @@ -131,11 +129,11 @@ </cr-button> </template> </div> - <div class="settings-box two-line" tabindex="0" - aria-label="[[getSafeBrowsingAriaLabel_(safeBrowsingDisplayString_)]]"> + <div class="settings-box two-line"> <iron-icon icon="[[getSafeBrowsingIcon_(safeBrowsingStatus_)]]" src="[[getSafeBrowsingIconSrc_(safeBrowsingStatus_)]]" - class$="[[getSafeBrowsingIconClass_(safeBrowsingStatus_)]]"> + class$="[[getSafeBrowsingIconClass_(safeBrowsingStatus_)]]" + aria-hidden="true"> </iron-icon> <div class="start settings-box-text"> <div>$i18n{safeBrowsingSectionLabel}</div> @@ -155,15 +153,16 @@ <template is="dom-if" if="[[shouldShowSafeBrowsingManagedIcon_(safeBrowsingStatus_)]]" restamp> - <iron-icon id="safetyCheckSafeBrowsingManagedIcon" icon="cr20:domain"> + <iron-icon id="safetyCheckSafeBrowsingManagedIcon" icon="cr20:domain" + aria-hidden="true"> </iron-icon> </template> </div> - <div class="settings-box two-line" tabindex="0" - aria-label="[[getExtensionsAriaLabel_(extensionsDisplayString_)]]"> + <div class="settings-box two-line"> <iron-icon icon="[[getExtensionsIcon_(extensionsStatus_)]]" src="[[getExtensionsIconSrc_(extensionsStatus_)]]" - class$="[[getExtensionsIconClass_(extensionsStatus_)]]"> + class$="[[getExtensionsIconClass_(extensionsStatus_)]]" + aria-hidden="true"> </iron-icon> <div class="start settings-box-text"> <div>$i18n{safetyCheckExtensionsPrimaryLabel}</div> @@ -184,7 +183,8 @@ <template is="dom-if" if="[[shouldShowExtensionsManagedIcon_(extensionsStatus_)]]" restamp> - <iron-icon id="safetyCheckExtensionsManagedIcon" icon="cr20:domain"> + <iron-icon id="safetyCheckExtensionsManagedIcon" icon="cr20:domain" + aria-hidden="true"> </iron-icon> </template> </div>
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.js b/chrome/browser/resources/settings/safety_check_page/safety_check_page.js index dd74e9c3..ea417748 100644 --- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.js +++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.js
@@ -363,15 +363,6 @@ this.focusParent_(); }, - /** - * @private - * @return {string} - */ - getParentAriaLabel_: function() { - return this.i18n('safetyCheckSectionTitle') + ': ' + - this.parentDisplayString_; - }, - /** @private */ focusParent_() { const parent = /** @type {!Element} */ (this.$$('#safetyCheckParent')); @@ -463,15 +454,6 @@ /** * @private - * @return {string} - */ - getUpdatesAriaLabel_: function() { - return this.i18n('safetyCheckUpdatesPrimaryLabel') + ': ' + - this.updatesDisplayString_; - }, - - /** - * @private * @return {boolean} */ shouldShowPasswordsButton_: function() { @@ -505,15 +487,6 @@ /** * @private - * @return {string} - */ - getPasswordsAriaLabel_: function() { - return this.i18n('passwords') + ': ' + this.passwordsDisplayString_; - }, - - - /** - * @private * @return {?string} */ getPasswordsIconSrc_: function() { @@ -618,15 +591,6 @@ } }, - /** - * @private - * @return {string} - */ - getSafeBrowsingAriaLabel_: function() { - return this.i18n('safeBrowsingSectionLabel') + ': ' + - this.safeBrowsingDisplayString_; - }, - /** @private */ onSafeBrowsingButtonClick_: function() { settings.Router.getInstance().navigateTo(settings.routes.SECURITY); @@ -725,15 +689,6 @@ * @private * @return {string} */ - getExtensionsAriaLabel_: function() { - return this.i18n('safetyCheckExtensionsPrimaryLabel') + ': ' + - this.extensionsDisplayString_; - }, - - /** - * @private - * @return {string} - */ getExtensionsButtonClass_: function() { switch (this.extensionsStatus_) { case settings.SafetyCheckExtensionsStatus
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc index ffb4e77f..3fef1f1 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
@@ -387,34 +387,34 @@ // TODO(domfc): Add "Learn more" button on scan failure. if (is_warning()) { // Include the Ok and Cancel buttons if there is a bypassable warning. - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL | + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK); - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, GetCancelButtonText()); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&DeepScanningDialogViews::CancelButtonCallback, weak_ptr_factory_.GetWeakPtr())); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, GetBypassWarningButtonText()); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&DeepScanningDialogViews::AcceptButtonCallback, weak_ptr_factory_.GetWeakPtr())); } else if (is_failure() || is_pending()) { // Include the Cancel button when the scan is pending or failing. - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, GetCancelButtonText()); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&DeepScanningDialogViews::CancelButtonCallback, weak_ptr_factory_.GetWeakPtr())); } else { // Include no buttons otherwise. - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } }
diff --git a/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc b/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc index b7b9201..b2cf72ec 100644 --- a/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc +++ b/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc
@@ -26,6 +26,8 @@ #include "content/public/test/url_loader_interceptor.h" #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/base/clipboard/clipboard_monitor.h" +#include "ui/base/clipboard/clipboard_observer.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/codec/png_codec.h" #include "ui/gfx/skia_util.h" @@ -39,6 +41,21 @@ const char kHistogramName[] = "Sharing.RemoteCopyHandleMessageResult"; const char kTestImageUrl[] = "https://foo.com/image.png"; +class ClipboardObserver : public ui::ClipboardObserver { + public: + explicit ClipboardObserver(base::RepeatingClosure callback) + : callback_(callback) {} + ClipboardObserver(const ClipboardObserver&) = delete; + ClipboardObserver& operator=(const ClipboardObserver&) = delete; + ~ClipboardObserver() override = default; + + // ui::ClipboardObserver: + void OnClipboardDataChanged() override { callback_.Run(); } + + private: + base::RepeatingClosure callback_; +}; + class RemoteCopyMessageHandlerTest : public SharedClipboardTestBase { public: RemoteCopyMessageHandlerTest() @@ -170,9 +187,8 @@ IsImageSourceAllowed(image_url, "https://bar.com,https://foo.com")); } -// Times out on all platforms. https://crbug.com/1060869 TEST_F(RemoteCopyMessageHandlerTest, - DISABLED_NoProgressNotificationWithoutProgressFlag) { + NoProgressNotificationWithoutProgressFlag) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeaturesAndParameters( {{kRemoteCopyReceiver, @@ -183,11 +199,13 @@ base::DoNothing()); EXPECT_FALSE(HasProgressNotification()); + + // Calling GetDefaultStoragePartition creates tasks that need to run before + // the ScopedFeatureList is destroyed. See crbug.com/1060869 + task_environment_.RunUntilIdle(); } -// Times out on all platforms. https://crbug.com/1060869 -TEST_F(RemoteCopyMessageHandlerTest, - DISABLED_ProgressNotificationWithProgressFlag) { +TEST_F(RemoteCopyMessageHandlerTest, ProgressNotificationWithProgressFlag) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeaturesAndParameters( {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}}, @@ -208,25 +226,33 @@ IDS_SHARING_REMOTE_COPY_NOTIFICATION_PREPARING_DOWNLOAD), notification.progress_status()); EXPECT_EQ(-1, notification.progress()); + + // Calling GetDefaultStoragePartition creates tasks that need to run before + // the ScopedFeatureList is destroyed. See crbug.com/1060869 + task_environment_.RunUntilIdle(); } -// Times out on all platforms. https://crbug.com/1060869 -TEST_F(RemoteCopyMessageHandlerTest, - DISABLED_ImageNotificationWithoutProgressFlag) { +TEST_F(RemoteCopyMessageHandlerTest, ImageNotificationWithoutProgressFlag) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeaturesAndParameters( {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}}}, {kRemoteCopyProgressNotification}); + base::RunLoop run_loop; + ClipboardObserver observer(run_loop.QuitClosure()); + ui::ClipboardMonitor::GetInstance()->AddObserver(&observer); + message_handler_->OnMessage(CreateMessageWithImage(kTestImageUrl), base::DoNothing()); // There should not be a progress notification without the flag set. EXPECT_FALSE(HasProgressNotification()); - // Let tasks run until the image is decoded and written to the clipboard. - task_environment_.RunUntilIdle(); + // Let tasks run until the image is decoded, written to the clipboard and the + // image notification is shown. + run_loop.Run(); + ui::ClipboardMonitor::GetInstance()->RemoveObserver(&observer); // Expect the image to be in the clipboard now. SkBitmap image = GetClipboardImage(); @@ -235,27 +261,33 @@ // Expect an image notification showing the image. auto notification = GetImageNotification(); EXPECT_FALSE(notification.image().IsEmpty()); + + // Calling GetDefaultStoragePartition creates tasks that need to run before + // the ScopedFeatureList is destroyed. See crbug.com/1060869 + task_environment_.RunUntilIdle(); } -// Times out on all platforms. https://crbug.com/1060869 -TEST_F(RemoteCopyMessageHandlerTest, - DISABLED_ImageNotificationWithProgressFlag) { +TEST_F(RemoteCopyMessageHandlerTest, ImageNotificationWithProgressFlag) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeaturesAndParameters( {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}}, {kRemoteCopyProgressNotification, {}}}, {}); + base::RunLoop run_loop; + ClipboardObserver observer(run_loop.QuitClosure()); + ui::ClipboardMonitor::GetInstance()->AddObserver(&observer); + message_handler_->OnMessage(CreateMessageWithImage(kTestImageUrl), base::DoNothing()); // There should be a progress notification with the flag set. EXPECT_TRUE(HasProgressNotification()); - // Let tasks run until the image is decoded and written to the clipboard. - // TODO(knollr): Test updates to the progress notitification during the - // download. - task_environment_.RunUntilIdle(); + // Let tasks run until the image is decoded, written to the clipboard and the + // image notification is shown. + run_loop.Run(); + ui::ClipboardMonitor::GetInstance()->RemoveObserver(&observer); // After finishing the transfer there should be no progress notification. EXPECT_FALSE(HasProgressNotification()); @@ -267,10 +299,13 @@ // Expect an image notification showing the image. auto notification = GetImageNotification(); EXPECT_FALSE(notification.image().IsEmpty()); + + // Calling GetDefaultStoragePartition creates tasks that need to run before + // the ScopedFeatureList is destroyed. See crbug.com/1060869 + task_environment_.RunUntilIdle(); } -// Times out on all platforms. https://crbug.com/1060869 -TEST_F(RemoteCopyMessageHandlerTest, DISABLED_CancelProgressNotification) { +TEST_F(RemoteCopyMessageHandlerTest, CancelProgressNotification) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeaturesAndParameters( {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}}, @@ -296,14 +331,17 @@ EXPECT_FALSE(HasImageNotification()); } -// Times out on all platforms. https://crbug.com/1060869 -TEST_F(RemoteCopyMessageHandlerTest, DISABLED_DismissProgressNotification) { +TEST_F(RemoteCopyMessageHandlerTest, DismissProgressNotification) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeaturesAndParameters( {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}}, {kRemoteCopyProgressNotification, {}}}, {}); + base::RunLoop run_loop; + ClipboardObserver observer(run_loop.QuitClosure()); + ui::ClipboardMonitor::GetInstance()->AddObserver(&observer); + message_handler_->OnMessage(CreateMessageWithImage(kTestImageUrl), base::DoNothing()); auto notification = GetProgressNotification(); @@ -316,8 +354,14 @@ // The progress notification should now be closed. EXPECT_FALSE(HasProgressNotification()); - // Let tasks run until the image is decoded and written to the clipboard. - task_environment_.RunUntilIdle(); + // Let tasks run until the image is decoded, written to the clipboard and the + // image notification is shown. + run_loop.Run(); + ui::ClipboardMonitor::GetInstance()->RemoveObserver(&observer); EXPECT_TRUE(HasImageNotification()); + + // Calling GetDefaultStoragePartition creates tasks that need to run before + // the ScopedFeatureList is destroyed. See crbug.com/1060869 + task_environment_.RunUntilIdle(); }
diff --git a/chrome/browser/sharing/sharing_device_registration.cc b/chrome/browser/sharing/sharing_device_registration.cc index eeb1f74c..cbf2e580 100644 --- a/chrome/browser/sharing/sharing_device_registration.cc +++ b/chrome/browser/sharing/sharing_device_registration.cc
@@ -337,7 +337,13 @@ } bool SharingDeviceRegistration::IsPeerConnectionSupported() const { +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ + defined(OS_CHROMEOS) return base::FeatureList::IsEnabled(kSharingPeerConnectionReceiver); +#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || + // defined(OS_CHROMEOS) + + return false; } void SharingDeviceRegistration::SetEnabledFeaturesForTesting(
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc index a0b771c..086c1a0 100644 --- a/chrome/browser/sharing/sharing_service.cc +++ b/chrome/browser/sharing/sharing_service.cc
@@ -30,6 +30,8 @@ SharingMessageSender::DelegateType GetSendDelegateType( const syncer::DeviceInfo& device, const chrome_browser_sharing::SharingMessage& message) { +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ + defined(OS_CHROMEOS) // Messages other than SharedClipboard are always sent via FCM. if (message.payload_case() != chrome_browser_sharing::SharingMessage::kSharedClipboardMessage) { @@ -54,6 +56,11 @@ // logic once we wrap up the experiment and e.g. only send messages over a // certain size via WebRTC. return SharingMessageSender::DelegateType::kWebRtc; +#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || + // defined(OS_CHROMEOS) + + // Only FCM is supported for non desktop OS. + return SharingMessageSender::DelegateType::kFCM; } } // namespace
diff --git a/chrome/browser/sharing/webrtc/webrtc_flags.cc b/chrome/browser/sharing/webrtc/webrtc_flags.cc index 294d8a2..7e097c7b 100644 --- a/chrome/browser/sharing/webrtc/webrtc_flags.cc +++ b/chrome/browser/sharing/webrtc/webrtc_flags.cc
@@ -4,8 +4,12 @@ #include "chrome/browser/sharing/webrtc/webrtc_flags.h" +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ + defined(OS_CHROMEOS) const base::Feature kSharingPeerConnectionReceiver{ "SharingPeerConnectionReceiver", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kSharingPeerConnectionSender{ "SharingPeerConnectionSender", base::FEATURE_ENABLED_BY_DEFAULT}; +#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || + // defined(OS_CHROMEOS)
diff --git a/chrome/browser/sharing/webrtc/webrtc_flags.h b/chrome/browser/sharing/webrtc/webrtc_flags.h index f1c5133..c1dc0be 100644 --- a/chrome/browser/sharing/webrtc/webrtc_flags.h +++ b/chrome/browser/sharing/webrtc/webrtc_flags.h
@@ -6,11 +6,16 @@ #define CHROME_BROWSER_SHARING_WEBRTC_WEBRTC_FLAGS_H_ #include "base/feature_list.h" +#include "build/build_config.h" +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ + defined(OS_CHROMEOS) // Feature flag to enable receiving PeerConnection requests. extern const base::Feature kSharingPeerConnectionReceiver; // Feature flag to enable sending SharingMessage using PeerConnection. extern const base::Feature kSharingPeerConnectionSender; +#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || + // defined(OS_CHROMEOS) #endif // CHROME_BROWSER_SHARING_WEBRTC_WEBRTC_FLAGS_H_
diff --git a/chrome/browser/signin/account_consistency_mode_manager.cc b/chrome/browser/signin/account_consistency_mode_manager.cc index 306c6d0..50ad925 100644 --- a/chrome/browser/signin/account_consistency_mode_manager.cc +++ b/chrome/browser/signin/account_consistency_mode_manager.cc
@@ -33,35 +33,8 @@ // Preference indicating that the Dice migraton has happened. const char kDiceMigrationCompletePref[] = "signin.DiceMigrationComplete"; -const char kDiceMigrationStatusHistogram[] = "Signin.DiceMigrationStatus"; - const char kAllowBrowserSigninArgument[] = "allow-browser-signin"; -// Used for UMA histogram kDiceMigrationStatusHistogram. -// Do not remove or re-order values. -enum class DiceMigrationStatus { - kEnabled, - kDisabledReadyForMigration, - kDisabledNotReadyForMigration, - kDisabled, - - // This is the last value. New values should be inserted above. - kDiceMigrationStatusCount -}; - -DiceMigrationStatus GetDiceMigrationStatus( - AccountConsistencyMethod account_consistency) { - switch (account_consistency) { - case AccountConsistencyMethod::kDice: - return DiceMigrationStatus::kEnabled; - case AccountConsistencyMethod::kDisabled: - return DiceMigrationStatus::kDisabled; - case AccountConsistencyMethod::kMirror: - NOTREACHED(); - return DiceMigrationStatus::kDisabled; - } -} - bool IsBrowserSigninAllowedByCommandLine() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(kAllowBrowserSigninArgument)) { @@ -110,10 +83,6 @@ // were created before Dice. if (profile_->IsNewProfile()) SetDiceMigrationCompleted(); - - UMA_HISTOGRAM_ENUMERATION(kDiceMigrationStatusHistogram, - GetDiceMigrationStatus(account_consistency_), - DiceMigrationStatus::kDiceMigrationStatusCount); #endif DCHECK_EQ(account_consistency_, ComputeAccountConsistencyMethod(profile_));
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc index c025542..7b85b1e 100644 --- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc +++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
@@ -350,7 +350,7 @@ sync_error_handler_.reset(); } -syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncData( +syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncDataForTesting( syncer::ModelType type) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_EQ(syncer::DICTIONARY, type);
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h index 7ea9991..61e2e8a5 100644 --- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h +++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
@@ -154,7 +154,7 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> sync_error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc index 1b75004..385d13f 100644 --- a/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc +++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
@@ -300,13 +300,14 @@ SpellcheckServiceFactory::GetForContext( &profile_)->GetCustomDictionary(); - syncer::SyncDataList data = dictionary->GetAllSyncData(syncer::DICTIONARY); + syncer::SyncDataList data = + dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY); EXPECT_TRUE(data.empty()); EXPECT_TRUE(dictionary->AddWord("bar")); EXPECT_TRUE(dictionary->AddWord("foo")); - data = dictionary->GetAllSyncData(syncer::DICTIONARY); + data = dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY); EXPECT_EQ(2UL, data.size()); std::vector<std::string> words; words.push_back("bar"); @@ -321,7 +322,7 @@ EXPECT_TRUE(dictionary->RemoveWord("bar")); EXPECT_TRUE(dictionary->RemoveWord("foo")); - data = dictionary->GetAllSyncData(syncer::DICTIONARY); + data = dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY); EXPECT_TRUE(data.empty()); } @@ -338,25 +339,25 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords - 1, dictionary->GetWords().size()); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords - 1, - dictionary->GetAllSyncData(syncer::DICTIONARY).size()); + dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); dictionary->AddWord("baz"); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, dictionary->GetWords().size()); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - dictionary->GetAllSyncData(syncer::DICTIONARY).size()); + dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); dictionary->AddWord("bar"); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords + 1, dictionary->GetWords().size()); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - dictionary->GetAllSyncData(syncer::DICTIONARY).size()); + dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); dictionary->AddWord("snafoo"); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords + 2, dictionary->GetWords().size()); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - dictionary->GetAllSyncData(syncer::DICTIONARY).size()); + dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, ProcessSyncChanges) { @@ -455,17 +456,18 @@ Apply(*custom_dictionary2, change2); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -515,17 +517,18 @@ EXPECT_TRUE(custom_dictionary->GetWords().empty()); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -563,17 +566,18 @@ Apply(*custom_dictionary, change); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_FALSE(custom_dictionary->IsSyncing()); @@ -582,10 +586,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigAndServerFull) { @@ -616,17 +622,18 @@ custom_dictionary2->GetWords().size()); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_FALSE(custom_dictionary->IsSyncing()); @@ -635,10 +642,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, ServerTooBig) { @@ -687,10 +696,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords + 1, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigToStartSyncing) { @@ -715,17 +726,18 @@ custom_dictionary2->AddWord("baz"); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_FALSE(custom_dictionary->IsSyncing()); @@ -734,10 +746,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigToContiueSyncing) { @@ -759,17 +773,18 @@ Apply(*custom_dictionary, change); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -786,10 +801,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, LoadAfterSyncStart) { @@ -807,17 +824,18 @@ custom_dictionary->AddWord("foo"); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -830,8 +848,12 @@ EXPECT_EQ(2UL, custom_dictionary->GetWords().size()); EXPECT_EQ(2UL, custom_dictionary2->GetWords().size()); - EXPECT_EQ(2UL, custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(2UL, custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + 2UL, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + 2UL, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, LoadAfterSyncStartTooBigToSync) { @@ -849,17 +871,18 @@ custom_dictionary->AddWord("foo"); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -877,10 +900,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, LoadDuplicatesAfterSync) { @@ -902,17 +927,18 @@ Apply(*custom_dictionary, change); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -926,10 +952,12 @@ EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords / 2, custom_dictionary2->GetWords().size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords / 2, - custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size()); - EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords / 2, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords / 2, + custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); + EXPECT_EQ( + spellcheck::kMaxSyncableDictionaryWords / 2, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size()); } TEST_F(SpellcheckCustomDictionaryTest, DictionaryLoadNotification) { @@ -1024,17 +1052,18 @@ custom_dictionary2->AddObserver(&observer2); int error_counter = 0; - EXPECT_FALSE(custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - custom_dictionary2->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - custom_dictionary2)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE( + custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + custom_dictionary2)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); @@ -1074,18 +1103,18 @@ Apply(*custom_dictionary, change); int error_counter = 0; - EXPECT_FALSE( - custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - server_custom_dictionary->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - server_custom_dictionary)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE(custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + server_custom_dictionary->GetAllSyncDataForTesting( + syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + server_custom_dictionary)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_TRUE(custom_dictionary->IsSyncing()); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords, @@ -1120,18 +1149,18 @@ // Associate the server and the client. int error_counter = 0; - EXPECT_FALSE( - client_custom_dictionary - ->MergeDataAndStartSyncing( - syncer::DICTIONARY, - server_custom_dictionary->GetAllSyncData(syncer::DICTIONARY), - std::unique_ptr<syncer::SyncChangeProcessor>( - new syncer::SyncChangeProcessorWrapperForTest( - server_custom_dictionary)), - std::unique_ptr<syncer::SyncErrorFactory>( - new SyncErrorFactoryStub(&error_counter))) - .error() - .IsSet()); + EXPECT_FALSE(client_custom_dictionary + ->MergeDataAndStartSyncing( + syncer::DICTIONARY, + server_custom_dictionary->GetAllSyncDataForTesting( + syncer::DICTIONARY), + std::unique_ptr<syncer::SyncChangeProcessor>( + new syncer::SyncChangeProcessorWrapperForTest( + server_custom_dictionary)), + std::unique_ptr<syncer::SyncErrorFactory>( + new SyncErrorFactoryStub(&error_counter))) + .error() + .IsSet()); EXPECT_EQ(0, error_counter); EXPECT_FALSE(client_custom_dictionary->IsSyncing()); EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords * 2,
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc index ba7b902..5406c3f4 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -39,22 +39,6 @@ using content::NavigationEntry; -// static -void SupervisedUserNavigationObserver::MaybeCreateForWebContents( - content::WebContents* web_contents) { - DCHECK(web_contents); - Profile* user_profile = - Profile::FromBrowserContext(web_contents->GetBrowserContext()); - if (!user_profile->IsSupervised()) - return; - - if (!FromWebContents(web_contents)) { - web_contents->SetUserData( - UserDataKey(), - base::WrapUnique(new SupervisedUserNavigationObserver(web_contents))); - } -} - SupervisedUserNavigationObserver::~SupervisedUserNavigationObserver() { supervised_user_service_->RemoveObserver(this); }
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.h b/chrome/browser/supervised_user/supervised_user_navigation_observer.h index 16e2960..f7a4d78 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_observer.h +++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.h
@@ -40,10 +40,6 @@ public SupervisedUserServiceObserver, public supervised_user::mojom::SupervisedUserCommands { public: - // Creates SupervisedUserNavigationObserver if the profile is a child user. - static void MaybeCreateForWebContents(content::WebContents* web_contents); - static void CreateForWebContents(content::WebContents* web_contents) = delete; - ~SupervisedUserNavigationObserver() override; const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>&
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service.cc b/chrome/browser/supervised_user/supervised_user_settings_service.cc index 5967f4e..42524db 100644 --- a/chrome/browser/supervised_user/supervised_user_settings_service.cc +++ b/chrome/browser/supervised_user/supervised_user_settings_service.cc
@@ -336,7 +336,7 @@ error_handler_.reset(); } -SyncDataList SupervisedUserSettingsService::GetAllSyncData( +SyncDataList SupervisedUserSettingsService::GetAllSyncDataForTesting( ModelType type) const { DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); SyncDataList data;
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service.h b/chrome/browser/supervised_user/supervised_user_settings_service.h index c40f7d1..072ea1ae 100644 --- a/chrome/browser/supervised_user/supervised_user_settings_service.h +++ b/chrome/browser/supervised_user/supervised_user_settings_service.h
@@ -133,7 +133,7 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc b/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc index 762e49a0b..9a961c56 100644 --- a/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc +++ b/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc
@@ -302,8 +302,8 @@ } // It should also show up in local Sync data. - syncer::SyncDataList sync_data = - settings_service_.GetAllSyncData(syncer::SUPERVISED_USER_SETTINGS); + syncer::SyncDataList sync_data = settings_service_.GetAllSyncDataForTesting( + syncer::SUPERVISED_USER_SETTINGS); EXPECT_EQ(3u, sync_data.size()); for (const syncer::SyncData& sync_data_item : sync_data) VerifySyncDataItem(sync_data_item); @@ -317,7 +317,7 @@ EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type()); VerifySyncDataItem(change.sync_data()); - sync_data = settings_service_.GetAllSyncData( + sync_data = settings_service_.GetAllSyncDataForTesting( syncer::SUPERVISED_USER_SETTINGS); EXPECT_EQ(4u, sync_data.size()); for (const syncer::SyncData& sync_data_item : sync_data) @@ -333,7 +333,7 @@ EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type()); VerifySyncDataItem(change.sync_data()); - sync_data = settings_service_.GetAllSyncData( + sync_data = settings_service_.GetAllSyncDataForTesting( syncer::SUPERVISED_USER_SETTINGS); EXPECT_EQ(4u, sync_data.size()); for (const syncer::SyncData& sync_data_item : sync_data) @@ -347,7 +347,7 @@ EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type()); VerifySyncDataItem(change.sync_data()); - sync_data = settings_service_.GetAllSyncData( + sync_data = settings_service_.GetAllSyncDataForTesting( syncer::SUPERVISED_USER_SETTINGS); EXPECT_EQ(4u, sync_data.size()); for (const syncer::SyncData& sync_data_item : sync_data)
diff --git a/chrome/browser/supervised_user/supervised_user_whitelist_service.cc b/chrome/browser/supervised_user/supervised_user_whitelist_service.cc index 57ef85f0..38fdf38 100644 --- a/chrome/browser/supervised_user/supervised_user_whitelist_service.cc +++ b/chrome/browser/supervised_user/supervised_user_whitelist_service.cc
@@ -213,29 +213,6 @@ DCHECK_EQ(syncer::SUPERVISED_USER_WHITELISTS, type); } -syncer::SyncDataList SupervisedUserWhitelistService::GetAllSyncData( - syncer::ModelType type) const { - syncer::SyncDataList sync_data; - const base::DictionaryValue* whitelists = - prefs_->GetDictionary(prefs::kSupervisedUserWhitelists); - for (base::DictionaryValue::Iterator it(*whitelists); !it.IsAtEnd(); - it.Advance()) { - const std::string& id = it.key(); - const base::DictionaryValue* dict = nullptr; - it.value().GetAsDictionary(&dict); - std::string name; - bool result = dict->GetString(kName, &name); - DCHECK(result); - sync_pb::EntitySpecifics specifics; - sync_pb::ManagedUserWhitelistSpecifics* whitelist = - specifics.mutable_managed_user_whitelist(); - whitelist->set_id(id); - whitelist->set_name(name); - sync_data.push_back(syncer::SyncData::CreateLocalData(id, name, specifics)); - } - return sync_data; -} - syncer::SyncError SupervisedUserWhitelistService::ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) {
diff --git a/chrome/browser/supervised_user/supervised_user_whitelist_service.h b/chrome/browser/supervised_user/supervised_user_whitelist_service.h index 740e571b..4b6b8a1 100644 --- a/chrome/browser/supervised_user/supervised_user_whitelist_service.h +++ b/chrome/browser/supervised_user/supervised_user_whitelist_service.h
@@ -85,7 +85,6 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc b/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc index aed02c54..75731ee 100644 --- a/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc +++ b/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc
@@ -264,18 +264,3 @@ CheckFinalStateAndPreferences(); } - -TEST_F(SupervisedUserWhitelistServiceTest, GetAllSyncData) { - PrepareInitialStateAndPreferences(); - - syncer::SyncDataList sync_data = - service_->GetAllSyncData(syncer::SUPERVISED_USER_WHITELISTS); - ASSERT_EQ(2u, sync_data.size()); - const sync_pb::ManagedUserWhitelistSpecifics* whitelist = - FindWhitelist(sync_data, "aaaa"); - ASSERT_TRUE(whitelist); - EXPECT_EQ("Whitelist A", whitelist->name()); - whitelist = FindWhitelist(sync_data, "bbbb"); - ASSERT_TRUE(whitelist); - EXPECT_EQ("Whitelist B", whitelist->name()); -}
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc index 4d7b8ad..81a3efa 100644 --- a/chrome/browser/sync/chrome_sync_client.cc +++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -65,7 +65,6 @@ #include "components/invalidation/impl/invalidation_switches.h" #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/password_manager/core/browser/password_store.h" -#include "components/password_manager/core/browser/sync/password_model_worker.h" #include "components/search_engines/template_url_service.h" #include "components/send_tab_to_self/send_tab_to_self_sync_service.h" #include "components/spellcheck/spellcheck_buildflags.h" @@ -79,8 +78,6 @@ #include "components/sync/driver/sync_util.h" #include "components/sync/driver/syncable_service_based_model_type_controller.h" #include "components/sync/engine/passive_model_worker.h" -#include "components/sync/engine/sequenced_model_worker.h" -#include "components/sync/engine/ui_model_worker.h" #include "components/sync/model/model_type_store.h" #include "components/sync/model/model_type_store_service.h" #include "components/sync/model_impl/forwarding_model_type_controller_delegate.h" @@ -586,11 +583,6 @@ ->GetWhitelistService() ->AsWeakPtr(); #endif // BUILDFLAG(ENABLE_SUPERVISED_USERS) - case syncer::PASSWORDS: { - return profile_password_store_.get() - ? profile_password_store_->GetPasswordSyncableService() - : nullptr; - } #if defined(OS_CHROMEOS) case syncer::ARC_PACKAGE: return arc::ArcPackageSyncableService::Get(profile_)->AsWeakPtr(); @@ -674,19 +666,8 @@ ChromeSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) { DCHECK_CURRENTLY_ON(BrowserThread::UI); switch (group) { - case syncer::GROUP_UI: - return new syncer::UIModelWorker( - base::CreateSingleThreadTaskRunner({BrowserThread::UI})); case syncer::GROUP_PASSIVE: return new syncer::PassiveModelWorker(); - case syncer::GROUP_PASSWORD: { - // Note: This is only used for the directory implementation of passwords, - // not for USS, but only USS supports the account password store. So we - // can safely ignore the account store here. - if (!profile_password_store_.get()) - return nullptr; - return new PasswordModelWorker(profile_password_store_); - } default: return nullptr; }
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc index 7b5d5e7..922ae1c 100644 --- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc +++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -104,7 +104,8 @@ } #endif // OS_CHROMEOS - // Common types. + // Common types. This excludes PASSWORDS because the password store factory + // is null for testing and hence no controller gets instantiated. datatypes.push_back(syncer::AUTOFILL); datatypes.push_back(syncer::AUTOFILL_PROFILE); datatypes.push_back(syncer::AUTOFILL_WALLET_DATA); @@ -112,12 +113,6 @@ datatypes.push_back(syncer::BOOKMARKS); datatypes.push_back(syncer::DEVICE_INFO); datatypes.push_back(syncer::HISTORY_DELETE_DIRECTIVES); - if (!base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) { - // Password store factory is null for testing. For directory - // implementation, a controller was added anyway. For USS, no controller - // gets added, and hence the type isn't available. - datatypes.push_back(syncer::PASSWORDS); - } datatypes.push_back(syncer::PREFERENCES); datatypes.push_back(syncer::PRIORITY_PREFERENCES); datatypes.push_back(syncer::SESSIONS);
diff --git a/chrome/browser/sync/test/integration/encryption_helper.cc b/chrome/browser/sync/test/integration/encryption_helper.cc index b2ca172f..7f2c095 100644 --- a/chrome/browser/sync/test/integration/encryption_helper.cc +++ b/chrome/browser/sync/test/integration/encryption_helper.cc
@@ -13,6 +13,8 @@ #include "components/sync/driver/profile_sync_service.h" #include "components/sync/driver/sync_client.h" #include "components/sync/engine/sync_engine_switches.h" +#include "components/sync/nigori/cryptographer_impl.h" +#include "components/sync/nigori/nigori_key_bag.h" #include "testing/gtest/include/gtest/gtest.h" namespace encryption_helper { @@ -33,36 +35,46 @@ InitCustomPassphraseCryptographerFromNigori( const sync_pb::NigoriSpecifics& nigori, const std::string& passphrase) { - auto cryptographer = std::make_unique<syncer::DirectoryCryptographer>(); + std::unique_ptr<syncer::CryptographerImpl> cryptographer; sync_pb::EncryptedData keybag = nigori.encryption_keybag(); - cryptographer->SetPendingKeys(keybag); std::string decoded_salt; switch (syncer::ProtoKeyDerivationMethodToEnum( nigori.custom_passphrase_key_derivation_method())) { case syncer::KeyDerivationMethod::PBKDF2_HMAC_SHA1_1003: - EXPECT_TRUE(cryptographer->DecryptPendingKeys( - {syncer::KeyDerivationParams::CreateForPbkdf2(), passphrase})); + cryptographer = + syncer::CryptographerImpl::FromSingleKeyForTesting(passphrase); break; case syncer::KeyDerivationMethod::SCRYPT_8192_8_11: EXPECT_TRUE(base::Base64Decode( nigori.custom_passphrase_key_derivation_salt(), &decoded_salt)); - EXPECT_TRUE(cryptographer->DecryptPendingKeys( - {syncer::KeyDerivationParams::CreateForScrypt(decoded_salt), - passphrase})); + cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting( + passphrase, + syncer::KeyDerivationParams::CreateForScrypt(decoded_salt)); break; case syncer::KeyDerivationMethod::UNSUPPORTED: // This test cannot pass since we wouldn't know how to decrypt data // encrypted using an unsupported method. ADD_FAILURE() << "Unsupported key derivation method encountered: " << nigori.custom_passphrase_key_derivation_method(); + return syncer::CryptographerImpl::CreateEmpty(); } + std::string decrypted_keys_str; + EXPECT_TRUE(cryptographer->DecryptToString(nigori.encryption_keybag(), + &decrypted_keys_str)); + + sync_pb::NigoriKeyBag decrypted_keys; + EXPECT_TRUE(decrypted_keys.ParseFromString(decrypted_keys_str)); + + syncer::NigoriKeyBag key_bag = + syncer::NigoriKeyBag::CreateFromProto(decrypted_keys); + + cryptographer->EmplaceKeysFrom(key_bag); return cryptographer; } -sync_pb::NigoriSpecifics CreateCustomPassphraseNigori( - const syncer::KeyParams& params) { +sync_pb::NigoriSpecifics CreateCustomPassphraseNigori(const KeyParams& params) { syncer::KeyDerivationMethod method = params.derivation_params.method(); sync_pb::NigoriSpecifics nigori; @@ -100,27 +112,27 @@ // keybag using a key derived from that passphrase). However, in some migrated // states, the keybag might also additionally contain an old, pre-migration // key. - syncer::DirectoryCryptographer cryptographer; - bool add_key_result = cryptographer.AddKey(params); - DCHECK(add_key_result); - bool get_keys_result = - cryptographer.GetKeys(nigori.mutable_encryption_keybag()); - DCHECK(get_keys_result); + auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting( + params.password, params.derivation_params); + sync_pb::CryptographerData proto = cryptographer->ToProto(); + bool encrypt_result = cryptographer->Encrypt( + proto.key_bag(), nigori.mutable_encryption_keybag()); + DCHECK(encrypt_result); return nigori; } sync_pb::EntitySpecifics GetEncryptedBookmarkEntitySpecifics( const sync_pb::BookmarkSpecifics& bookmark_specifics, - const syncer::KeyParams& key_params) { + const KeyParams& key_params) { sync_pb::EntitySpecifics new_specifics; sync_pb::EntitySpecifics wrapped_entity_specifics; *wrapped_entity_specifics.mutable_bookmark() = bookmark_specifics; - syncer::DirectoryCryptographer cryptographer; - bool add_key_result = cryptographer.AddKey(key_params); - DCHECK(add_key_result); - bool encrypt_result = cryptographer.Encrypt( + auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting( + key_params.password, key_params.derivation_params); + + bool encrypt_result = cryptographer->Encrypt( wrapped_entity_specifics, new_specifics.mutable_encrypted()); DCHECK(encrypt_result);
diff --git a/chrome/browser/sync/test/integration/encryption_helper.h b/chrome/browser/sync/test/integration/encryption_helper.h index 5809d1af..1f4b04d 100644 --- a/chrome/browser/sync/test/integration/encryption_helper.h +++ b/chrome/browser/sync/test/integration/encryption_helper.h
@@ -12,12 +12,21 @@ #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/status_change_checker.h" #include "components/sync/driver/trusted_vault_client.h" +#include "components/sync/nigori/nigori.h" #include "components/sync/protocol/nigori_specifics.pb.h" -#include "components/sync/syncable/directory_cryptographer.h" #include "components/sync/test/fake_server/fake_server.h" +namespace syncer { +class Cryptographer; +} // namespace syncer + namespace encryption_helper { +struct KeyParams { + syncer::KeyDerivationParams derivation_params; + std::string password; +}; + // Given a |fake_server|, fetches its Nigori node and writes it to the // proto pointed to by |nigori|. Returns false if the server does not contain // exactly one Nigori node. @@ -42,12 +51,11 @@ // provided BookmarkSpecifics and encrypted using the given |key_params|. sync_pb::EntitySpecifics GetEncryptedBookmarkEntitySpecifics( const sync_pb::BookmarkSpecifics& specifics, - const syncer::KeyParams& key_params); + const KeyParams& key_params); // Creates a NigoriSpecifics that describes encryption using a custom passphrase // with the given key parameters. -sync_pb::NigoriSpecifics CreateCustomPassphraseNigori( - const syncer::KeyParams& params); +sync_pb::NigoriSpecifics CreateCustomPassphraseNigori(const KeyParams& params); } // namespace encryption_helper
diff --git a/chrome/browser/sync/test/integration/password_manager_sync_test.cc b/chrome/browser/sync/test/integration/password_manager_sync_test.cc index f836f9b9..3df15c76 100644 --- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc +++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -67,12 +67,10 @@ class PasswordManagerSyncTest : public SyncTest { public: PasswordManagerSyncTest() : SyncTest(SINGLE_CLIENT) { - feature_list_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - password_manager::features:: - kEnablePasswordsAccountStorage}, - /*disabled_features=*/{}); + feature_list_.InitAndEnableFeature( + password_manager::features::kEnablePasswordsAccountStorage); } + ~PasswordManagerSyncTest() override = default; void SetUpInProcessBrowserTestFixture() override {
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc index 723bd4e..829e845f 100644 --- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -11,7 +11,7 @@ #include "components/sync/driver/profile_sync_service.h" #include "components/sync/driver/sync_driver_switches.h" #include "components/sync/engine/sync_engine_switches.h" -#include "components/sync/nigori/cryptographer.h" +#include "components/sync/nigori/cryptographer_impl.h" #include "content/public/test/test_launcher.h" #include "crypto/ec_private_key.h" #include "testing/gmock/include/gmock/gmock.h" @@ -26,6 +26,7 @@ using encryption_helper::GetEncryptedBookmarkEntitySpecifics; using encryption_helper::GetServerNigori; using encryption_helper::InitCustomPassphraseCryptographerFromNigori; +using encryption_helper::KeyParams; using encryption_helper::SetNigoriInFakeServer; using fake_server::FakeServer; using sync_pb::EncryptedData; @@ -33,7 +34,6 @@ using sync_pb::SyncEntity; using syncer::Cryptographer; using syncer::KeyDerivationParams; -using syncer::KeyParams; using syncer::LoopbackServerEntity; using syncer::ModelType; using syncer::ModelTypeSet; @@ -107,7 +107,8 @@ const std::vector<ServerBookmarksEqualityChecker::ExpectedBookmark>& expected_bookmarks, const KeyParams& key_params) { - auto cryptographer = CreateCryptographerWithKeyParams(key_params); + auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting( + key_params.password, key_params.derivation_params); return ServerBookmarksEqualityChecker(GetSyncService(), GetFakeServer(), expected_bookmarks, cryptographer.get()) @@ -160,16 +161,6 @@ return InitCustomPassphraseCryptographerFromNigori(nigori, passphrase); } - // A cryptographer initialized with the given KeyParams has not "seen" the - // server-side Nigori, and so any data decryptable by such a cryptographer - // does not depend on external info. - std::unique_ptr<Cryptographer> CreateCryptographerWithKeyParams( - const KeyParams& key_params) { - auto cryptographer = std::make_unique<syncer::DirectoryCryptographer>(); - cryptographer->AddKey(key_params); - return cryptographer; - } - void InjectEncryptedServerBookmark(const std::string& title, const GURL& url, const KeyParams& key_params) { @@ -189,18 +180,8 @@ public testing::WithParamInterface<bool> { public: SingleClientCustomPassphraseSyncTestWithUssTests() { - if (GetParam()) { - // USS Nigori requires USS implementations to be enabled for all - // datatypes. - override_features_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori}, - /*disabled_features=*/{}); - } else { - // We test Directory Nigori with default values of USS feature flags of - // other datatypes. - override_features_.InitAndDisableFeature(switches::kSyncUSSNigori); - } + override_features_.InitWithFeatureState(switches::kSyncUSSNigori, + GetParam()); } ~SingleClientCustomPassphraseSyncTestWithUssTests() override = default; @@ -458,8 +439,7 @@ // key derivation method in ShouldLoadUSSCustomPassphraseInDirectoryMode, // once USS implementation support it for new passphrases. feature_list_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori}, + /*enabled_features=*/{switches::kSyncUSSNigori}, /*disabled_features=*/{ switches::kSyncUseScryptForNewCustomPassphrases}); } else { @@ -508,8 +488,7 @@ // when kSyncUSSNigori was disabled, without providing it again once // kSyncUSSNigori is enabled. feature_list_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori}, + /*enabled_features=*/{switches::kSyncUSSNigori}, /*disabled_features=*/{}); } }
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc index 015d6de..08d2408 100644 --- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -37,15 +37,11 @@ namespace { using encryption_helper::GetServerNigori; +using encryption_helper::KeyParams; using encryption_helper::SetNigoriInFakeServer; using testing::NotNull; using testing::SizeIs; -struct KeyParams { - syncer::KeyDerivationParams derivation_params; - std::string password; -}; - MATCHER_P(IsDataEncryptedWith, key_params, "") { const sync_pb::EncryptedData& encrypted_data = arg; std::unique_ptr<syncer::Nigori> nigori = syncer::Nigori::CreateByDerivation( @@ -225,18 +221,8 @@ public testing::WithParamInterface<bool> { public: SingleClientNigoriSyncTestWithUssTests() : SyncTest(SINGLE_CLIENT) { - if (GetParam()) { - // USS Nigori requires USS implementations to be enabled for all - // datatypes. - override_features_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori}, - /*disabled_features=*/{}); - } else { - // We test Directory Nigori with default values of USS feature flags of - // other datatypes. - override_features_.InitAndDisableFeature(switches::kSyncUSSNigori); - } + override_features_.InitWithFeatureState(switches::kSyncUSSNigori, + GetParam()); } ~SingleClientNigoriSyncTestWithUssTests() override = default; @@ -272,14 +258,8 @@ class SingleClientKeystoreKeysMigrationSyncTest : public SyncTest { public: SingleClientKeystoreKeysMigrationSyncTest() : SyncTest(SINGLE_CLIENT) { - if (content::IsPreTest()) { - override_features_.InitAndDisableFeature(switches::kSyncUSSNigori); - } else { - override_features_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori}, - /*disabled_features=*/{}); - } + override_features_.InitWithFeatureState(switches::kSyncUSSNigori, + !content::IsPreTest()); } ~SingleClientKeystoreKeysMigrationSyncTest() override = default; @@ -546,8 +526,7 @@ // USS Nigori requires USS implementations to be enabled for all // datatypes. override_features_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori, + /*enabled_features=*/{switches::kSyncUSSNigori, switches::kSyncSupportTrustedVaultPassphrase, features::kSyncEncryptionKeysWebApi}, /*disabled_features=*/{});
diff --git a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc index fec09c64..d39a306d 100644 --- a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
@@ -7,7 +7,6 @@ #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/sync/test/integration/encryption_helper.h" -#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/passwords_helper.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/secondary_account_helper.h" @@ -20,7 +19,6 @@ #include "components/signin/public/identity_manager/identity_test_utils.h" #include "components/sync/base/time.h" #include "components/sync/driver/profile_sync_service.h" -#include "components/sync/driver/sync_driver_switches.h" #include "components/sync/syncable/directory_cryptographer.h" #include "content/public/test/test_launcher.h" @@ -74,17 +72,16 @@ } }; -class SingleClientPasswordsSyncTest : public FeatureToggler, public SyncTest { +class SingleClientPasswordsSyncTest : public SyncTest { public: - SingleClientPasswordsSyncTest() - : FeatureToggler(switches::kSyncUSSPasswords), SyncTest(SINGLE_CLIENT) {} + SingleClientPasswordsSyncTest() : SyncTest(SINGLE_CLIENT) {} ~SingleClientPasswordsSyncTest() override {} private: DISALLOW_COPY_AND_ASSIGN(SingleClientPasswordsSyncTest); }; -IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, Sanity) { +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, Sanity) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; PasswordForm form = CreateTestPasswordForm(0); @@ -101,7 +98,7 @@ // Verifies that committed passwords contain the appropriate proto fields, and // in particular lack some others that could potentially contain unencrypted // data. In this test, custom passphrase is NOT set. -IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, CommitWithoutCustomPassphrase) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; @@ -126,7 +123,7 @@ // Same as above but with custom passphrase set, which requires to prune commit // data even further. -IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, CommitWithCustomPassphrase) { SetEncryptionPassphraseForClient(/*index=*/0, "hunter2"); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; @@ -150,7 +147,7 @@ // Tests the scenario when a syncing user enables a custom passphrase. PASSWORDS // should be recommitted with the new encryption key. -IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, ReencryptsDataWhenPassphraseIsSet) { ASSERT_TRUE(SetupSync()); ASSERT_TRUE(ServerNigoriChecker(GetSyncService(0), fake_server_.get(), @@ -201,7 +198,7 @@ EXPECT_NE(new_encryption_key_name, prior_encryption_key_name); } -IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, PRE_PersistProgressMarkerOnRestart) { ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; PasswordForm form = CreateTestPasswordForm(0); @@ -218,7 +215,7 @@ /*REMOTE_NON_INITIAL_UPDATE=*/4)); } -IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, PersistProgressMarkerOnRestart) { base::HistogramTester histogram_tester; ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; @@ -246,80 +243,11 @@ /*REMOTE_NON_INITIAL_UPDATE=*/4)); } -INSTANTIATE_TEST_SUITE_P(USS, - SingleClientPasswordsSyncTest, - ::testing::Values(false, true)); - -class SingleClientPasswordsSyncUssMigratorTest : public SyncTest { - public: - SingleClientPasswordsSyncUssMigratorTest() : SyncTest(SINGLE_CLIENT) {} - ~SingleClientPasswordsSyncUssMigratorTest() override {} - - private: - DISALLOW_COPY_AND_ASSIGN(SingleClientPasswordsSyncUssMigratorTest); -}; - -class SingleClientPasswordsSyncUssMigratorTestWithUssTransition - : public SingleClientPasswordsSyncUssMigratorTest { - public: - SingleClientPasswordsSyncUssMigratorTestWithUssTransition() { - if (content::IsPreTest()) - feature_list_.InitAndDisableFeature(switches::kSyncUSSPasswords); - else - feature_list_.InitAndEnableFeature(switches::kSyncUSSPasswords); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Creates and syncs two passwords before USS being enabled. -IN_PROC_BROWSER_TEST_F( - SingleClientPasswordsSyncUssMigratorTestWithUssTransition, - PRE_ExerciseUssMigrator) { - ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - AddLogin(GetPasswordStore(0), CreateTestPasswordForm(0)); - AddLogin(GetPasswordStore(0), CreateTestPasswordForm(1)); - ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); - ASSERT_EQ(2, GetPasswordCount(0)); -} - -// Now that local passwords, the local sync directory and the sever are -// populated with two passwords, USS is enabled for passwords. -IN_PROC_BROWSER_TEST_F( - SingleClientPasswordsSyncUssMigratorTestWithUssTransition, - ExerciseUssMigrator) { - base::HistogramTester histogram_tester; - ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; - ASSERT_EQ(2, GetPasswordCount(0)); -#if defined(OS_CHROMEOS) - // signin::SetRefreshTokenForPrimaryAccount() is needed on ChromeOS in order - // to get a non-empty refresh token on startup. - GetClient(0)->SignInPrimaryAccount(); -#endif // defined(OS_CHROMEOS) - ASSERT_TRUE(GetClient(0)->AwaitSyncSetupCompletion()); - ASSERT_EQ(2, GetPasswordCount(0)); - - EXPECT_EQ(1, histogram_tester.GetBucketCount( - "Sync.USSMigrationSuccess", - static_cast<int>( - syncer::ModelTypeHistogramValue(syncer::PASSWORDS)))); - EXPECT_THAT( - histogram_tester.GetAllSamples("Sync.USSMigrationEntityCount.PASSWORD"), - ElementsAre(base::Bucket(/*min=*/2, /*count=*/1))); - EXPECT_THAT(histogram_tester.GetAllSamples("Sync.DataTypeStartFailures2"), - IsEmpty()); - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD", - /*REMOTE_INITIAL_UPDATE=*/5)); -} - class SingleClientPasswordsWithAccountStorageSyncTest : public SyncTest { public: SingleClientPasswordsWithAccountStorageSyncTest() : SyncTest(SINGLE_CLIENT) { feature_list_.InitWithFeatures( - /*enabled_features=*/{switches::kSyncUSSPasswords, - password_manager::features:: + /*enabled_features=*/{password_manager::features:: kEnablePasswordsAccountStorage}, /*disabled_features=*/{}); }
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc index 0e66ee9..1730465 100644 --- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -14,13 +14,11 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" -#include "chrome/browser/sync/test/integration/feature_toggler.h" #include "chrome/browser/sync/test/integration/passwords_helper.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" -#include "components/sync/driver/sync_driver_switches.h" #include "components/sync/engine/cycle/sync_cycle_snapshot.h" #include "components/sync/engine/model_safe_worker.h" @@ -42,10 +40,9 @@ static const char* kValidPassphrase = "passphrase!"; -class TwoClientPasswordsSyncTest : public FeatureToggler, public SyncTest { +class TwoClientPasswordsSyncTest : public SyncTest { public: - TwoClientPasswordsSyncTest() - : FeatureToggler(switches::kSyncUSSPasswords), SyncTest(TWO_CLIENT) {} + TwoClientPasswordsSyncTest() : SyncTest(TWO_CLIENT) {} ~TwoClientPasswordsSyncTest() override {} @@ -53,7 +50,7 @@ DISALLOW_COPY_AND_ASSIGN(TwoClientPasswordsSyncTest); }; -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ENABLED(Add)) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(Add)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(SamePasswordFormsChecker().Wait()); @@ -66,7 +63,7 @@ ASSERT_EQ(1, GetPasswordCount(1)); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ENABLED(Race)) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(Race)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordForms()); @@ -81,7 +78,7 @@ ASSERT_TRUE(SamePasswordFormsChecker().Wait()); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, MergeWithTheMostRecent) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, MergeWithTheMostRecent) { // Setup the test to have Form 0 and Form 1 added on both clients. Form 0 is // more recent on Client 0, and Form 1 is more recent on Client 1. They should // be merged such that recent passwords are chosen. @@ -125,7 +122,7 @@ } } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(SetPassphraseAndAddPassword)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; @@ -146,7 +143,7 @@ ASSERT_TRUE(SamePasswordFormsChecker().Wait()); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, Update) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Update) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); @@ -167,7 +164,7 @@ ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, AddTwice) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, AddTwice) { // Password store supports adding the same form twice, so this is testing this // behaviour. ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; @@ -191,7 +188,7 @@ ASSERT_EQ(1, GetPasswordCount(1)); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, Delete) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Delete) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); @@ -214,7 +211,7 @@ ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, SetPassphraseAndThenSetupSync) { ASSERT_TRUE(SetupClients()); @@ -247,7 +244,7 @@ ASSERT_TRUE(SamePasswordFormsChecker().Wait()); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ONLY(DeleteTwo)) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ONLY(DeleteTwo)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordForms()); @@ -278,7 +275,7 @@ ASSERT_EQ(init_password_count - 2, GetPasswordCount(0)); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, DeleteAll) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, DeleteAll) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); @@ -298,7 +295,7 @@ ASSERT_EQ(0, GetVerifierPasswordCount()); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ENABLED(Merge)) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(Merge)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordForms()); @@ -314,7 +311,7 @@ ASSERT_EQ(3, GetPasswordCount(0)); } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ONLY(TwoClientAddPass)) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ONLY(TwoClientAddPass)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; // All profiles should sync same passwords. @@ -339,7 +336,7 @@ } } -IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, AddImmediatelyAfterDelete) { +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, AddImmediatelyAfterDelete) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier()); base::HistogramTester histogram_tester; @@ -364,7 +361,3 @@ 1, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD", /*LOCAL_DELETION=*/0)); } - -INSTANTIATE_TEST_SUITE_P(USS, - TwoClientPasswordsSyncTest, - ::testing::Values(false, true));
diff --git a/chrome/browser/themes/theme_syncable_service.cc b/chrome/browser/themes/theme_syncable_service.cc index b6bc5c36..5b8e9fa 100644 --- a/chrome/browser/themes/theme_syncable_service.cc +++ b/chrome/browser/themes/theme_syncable_service.cc
@@ -122,7 +122,7 @@ sync_error_handler_.reset(); } -syncer::SyncDataList ThemeSyncableService::GetAllSyncData( +syncer::SyncDataList ThemeSyncableService::GetAllSyncDataForTesting( syncer::ModelType type) const { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK_EQ(type, syncer::THEMES);
diff --git a/chrome/browser/themes/theme_syncable_service.h b/chrome/browser/themes/theme_syncable_service.h index 635adfd..4fc5ea3 100644 --- a/chrome/browser/themes/theme_syncable_service.h +++ b/chrome/browser/themes/theme_syncable_service.h
@@ -43,7 +43,7 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/themes/theme_syncable_service_unittest.cc b/chrome/browser/themes/theme_syncable_service_unittest.cc index 2eb58226..de11187 100644 --- a/chrome/browser/themes/theme_syncable_service_unittest.cc +++ b/chrome/browser/themes/theme_syncable_service_unittest.cc
@@ -512,12 +512,12 @@ theme_specifics.autogenerated_theme().color()); } -TEST_F(ThemeSyncableServiceTest, GetAllSyncData_Extension) { +TEST_F(ThemeSyncableServiceTest, GetAllSyncDataForTesting_Extension) { // Set up theme service to use custom theme. fake_theme_service_->SetTheme(theme_extension_.get()); syncer::SyncDataList data_list = - theme_sync_service_->GetAllSyncData(syncer::THEMES); + theme_sync_service_->GetAllSyncDataForTesting(syncer::THEMES); ASSERT_EQ(1u, data_list.size()); const sync_pb::ThemeSpecifics& theme_specifics = @@ -530,13 +530,13 @@ theme_specifics.custom_theme_update_url()); } -TEST_F(ThemeSyncableServiceTest, GetAllSyncData_Autogenerated) { +TEST_F(ThemeSyncableServiceTest, GetAllSyncDataForTesting_Autogenerated) { // Set up theme service to use autogenerated theme. fake_theme_service_->BuildAutogeneratedThemeFromColor( SkColorSetRGB(0, 0, 100)); syncer::SyncDataList data_list = - theme_sync_service_->GetAllSyncData(syncer::THEMES); + theme_sync_service_->GetAllSyncDataForTesting(syncer::THEMES); ASSERT_EQ(1u, data_list.size()); const sync_pb::ThemeSpecifics& theme_specifics = @@ -836,7 +836,7 @@ fake_theme_service_->SetTheme(theme_extension_.get()); syncer::SyncDataList data_list = - theme_sync_service_->GetAllSyncData(syncer::THEMES); + theme_sync_service_->GetAllSyncDataForTesting(syncer::THEMES); ASSERT_EQ(0u, data_list.size()); }
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc index 74c146a3..e498afc 100644 --- a/chrome/browser/ui/app_list/app_list_syncable_service.cc +++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -966,10 +966,7 @@ sync_error_handler_.reset(); } -syncer::SyncDataList AppListSyncableService::GetAllSyncData( - syncer::ModelType type) const { - DCHECK_EQ(syncer::APP_LIST, type); - +syncer::SyncDataList AppListSyncableService::GetAllSyncDataForTesting() const { VLOG(2) << this << ": GetAllSyncData: " << sync_items_.size(); syncer::SyncDataList list; for (auto iter = sync_items_.begin(); iter != sync_items_.end(); ++iter) {
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.h b/chrome/browser/ui/app_list/app_list_syncable_service.h index 3527587..9551e68 100644 --- a/chrome/browser/ui/app_list/app_list_syncable_service.h +++ b/chrome/browser/ui/app_list/app_list_syncable_service.h
@@ -184,7 +184,7 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting() const; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc index 13aaedb..7c65898 100644 --- a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc +++ b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
@@ -204,20 +204,6 @@ pending_uninstall_items_.clear(); } -syncer::SyncDataList ArcPackageSyncableService::GetAllSyncData( - syncer::ModelType type) const { - DCHECK_EQ(type, syncer::ARC_PACKAGE); - - syncer::SyncDataList list; - for (const auto& item : sync_items_) - list.emplace_back(GetSyncDataFromSyncItem(item.second.get())); - - for (const auto& item : pending_install_items_) - list.emplace_back(GetSyncDataFromSyncItem(item.second.get())); - - return list; -} - syncer::SyncError ArcPackageSyncableService::ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) {
diff --git a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h index 71c91cf3..dcc2d9cb 100644 --- a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h +++ b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h
@@ -62,7 +62,6 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc index c7ff038..87eb84f 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -337,8 +337,7 @@ app_list_syncable_service_ = app_list::AppListSyncableServiceFactory::GetForProfile(profile()); - StartAppSyncService( - app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST)); + StartAppSyncService(app_list_syncable_service_->GetAllSyncDataForTesting()); std::string error; extension_chrome_ = Extension::Create(base::FilePath(), Manifest::UNPACKED, @@ -1443,7 +1442,7 @@ // Persist pin state, we don't have active pin for ARC apps yet, but pin // model should have it. syncer::SyncDataList copy_sync_list = - app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST); + app_list_syncable_service_->GetAllSyncDataForTesting(); ResetLauncherController(); SendPinChanges(syncer::SyncChangeList(), true); @@ -1476,7 +1475,7 @@ GetPinnedAppStatus()); app_service_test().WaitForAppService(); - copy_sync_list = app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST); + copy_sync_list = app_list_syncable_service_->GetAllSyncDataForTesting(); ResetLauncherController(); ResetPinModel(); @@ -4452,7 +4451,7 @@ EXPECT_EQ("Chrome, App1, App2", GetPinnedAppStatus()); syncer::SyncDataList copy_sync_list = - app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST); + app_list_syncable_service_->GetAllSyncDataForTesting(); app_list_syncable_service_->StopSyncing(syncer::APP_LIST); RecreateLauncherController()->Init();
diff --git a/chrome/browser/ui/ash/network/enrollment_dialog_view.cc b/chrome/browser/ui/ash/network/enrollment_dialog_view.cc index 48bf366..0084402 100644 --- a/chrome/browser/ui/ash/network/enrollment_dialog_view.cc +++ b/chrome/browser/ui/ash/network/enrollment_dialog_view.cc
@@ -91,7 +91,7 @@ target_uri_(target_uri), connect_(connect), added_cert_(false) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_BUTTON)); set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 6f2b63b1..a6cb7b3 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1729,8 +1729,12 @@ } void Browser::ActivateContents(WebContents* contents) { - tab_strip_model_->ActivateTabAt( - tab_strip_model_->GetIndexOfWebContents(contents)); + // A WebContents can ask to activate after it's been removed from the + // TabStripModel. See https://crbug.com/1060986 + int index = tab_strip_model_->GetIndexOfWebContents(contents); + if (index == TabStripModel::kNoTab) + return; + tab_strip_model_->ActivateTabAt(index); window_->Activate(); }
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc index c2f1745..7a4e099 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -131,7 +131,10 @@ SupervisedUserNavigationObserver* navigation_observer = SupervisedUserNavigationObserver::FromWebContents(web_contents_); - // TODO(1048643) The check on |navigation_observer| should be a DCHECK. + // TODO(crbug.com/1061427): If the profile is supervised, + // |navigation_observer| should always be non-null. Investigate why some users + // run into null pointers here and ultimately replace the condition below with + // a DCHECK. This is a workaround to avoid reported crashes. if (!navigation_observer) return nullptr; @@ -151,9 +154,10 @@ if (ProfileIsSupervised()) { const auto* blocked_navigations = GetBlockedNavigations(); - // TODO(1048643) If profile is supervised, |blocked_navigations| should not - // be nullptr. This is a work around to check if the crash reported in the - // bug was caused by the violation of the invariant. + // TODO(crbug.com/1061427): If the profile is supervised, + // |blocked_navigations| should always be non-null. Investigate why some + // users run into null pointers here and ultimately replace the condition + // below with a DCHECK. This is a workaround to avoid reported crashes. if (blocked_navigations && !blocked_navigations->empty()) return true; }
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index fe1dc6fc..e37e00e 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -427,7 +427,7 @@ #endif #if BUILDFLAG(ENABLE_SUPERVISED_USERS) - SupervisedUserNavigationObserver::MaybeCreateForWebContents(web_contents); + SupervisedUserNavigationObserver::CreateForWebContents(web_contents); #endif // --- Section 4: The warning ---
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc index 64e8061f..c1212d8 100644 --- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc +++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -82,8 +82,8 @@ : views::BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), browser_(browser) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DONE)); DialogDelegate::SetExtraView(::CreateExtraView(this)); set_margins(gfx::Insets());
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc index 1881a123..f017ad5 100644 --- a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc +++ b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc
@@ -34,7 +34,7 @@ void AppDialogView::InitializeView(const gfx::ImageSkia& image, const base::string16& heading_text) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); ChromeLayoutProvider* provider = ChromeLayoutProvider::Get(); SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal,
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc index f2f98c84..daa1b686 100644 --- a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc +++ b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
@@ -68,11 +68,11 @@ : apps::UninstallDialog::UiBase(image, uninstall_dialog), app_type_(app_type), app_name_(app_name) { - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( &AppUninstallDialogView::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &AppUninstallDialogView::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &AppUninstallDialogView::OnDialogAccepted, base::Unretained(this))); InitializeView(profile, app_type, app_id); @@ -153,7 +153,7 @@ void AppUninstallDialogView::InitializeView(Profile* profile, apps::mojom::AppType app_type, const std::string& app_id) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_APP_BUTTON)); @@ -270,7 +270,7 @@ shortcut_ = app_info->shortcut; if (shortcut_) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON)); } else {
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc index 442f896..4ba7197 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
@@ -81,7 +81,7 @@ const base::Closure& close_callback) : dialog_body_(AddChildView(std::move(dialog_body))), close_callback_(close_callback) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } ~BaseDialogContainer() override {}
diff --git a/chrome/browser/ui/views/arc_app_dialog_view.cc b/chrome/browser/ui/views/arc_app_dialog_view.cc index 09b36c7..51863c5a 100644 --- a/chrome/browser/ui/views/arc_app_dialog_view.cc +++ b/chrome/browser/ui/views/arc_app_dialog_view.cc
@@ -103,12 +103,12 @@ app_id_(app_id), window_title_(window_title), confirm_callback_(std::move(confirm_callback)) { - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, confirm_button_text); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, confirm_button_text); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_button_text); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &ArcAppDialogView::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &ArcAppDialogView::OnDialogCancelled, base::Unretained(this))); ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc index 9de71b1..4a676d3 100644 --- a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc +++ b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
@@ -78,16 +78,16 @@ Profile* profile, DataRemovalConfirmationCallback confirm_callback) : profile_(profile), confirm_callback_(std::move(confirm_callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ARC_DATA_REMOVAL_CONFIRMATION_OK_BUTTON)); auto run_callback = [](DataRemovalConfirmationDialog* dialog, bool accept) { std::move(dialog->confirm_callback_).Run(accept); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), false)); ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc index 9c1cf7c4..d7b37f2 100644 --- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc +++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
@@ -469,10 +469,10 @@ controller_->GetVerificationResult(); bool has_ok = result != AutofillClient::PERMANENT_FAILURE && result != AutofillClient::NETWORK_ERROR; - DialogDelegate::set_buttons(has_ok ? ui::DIALOG_BUTTON_OK | + DialogDelegate::SetButtons(has_ok ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, controller_->GetOkButtonLabel()); }
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc index b38a1ed..cf2863d2 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc
@@ -49,15 +49,15 @@ : LocationBarBubbleDelegateView(anchor_view, web_contents), controller_(controller) { DCHECK(controller); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_AUTOFILL_LOCAL_CARD_MIGRATION_BUBBLE_BUTTON_LABEL)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&LocalCardMigrationBubbleViews::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&LocalCardMigrationBubbleViews::OnDialogAccepted, base::Unretained(this))); }
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc index 4913783e..af0fd863 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc
@@ -351,17 +351,17 @@ LocalCardMigrationDialogController* controller, content::WebContents* web_contents) : controller_(controller), web_contents_(web_contents) { - DialogDelegate::set_buttons(controller_->AllCardsInvalid() + DialogDelegate::SetButtons(controller_->AllCardsInvalid() ? ui::DIALOG_BUTTON_OK : ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, GetOkButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, GetOkButtonLabel()); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, GetCancelButtonLabel()); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&LocalCardMigrationDialogView::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &LocalCardMigrationDialogView::OnDialogAccepted, base::Unretained(this))); set_close_on_deactivate(false); set_margins(gfx::Insets());
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc index b263a02a..701fbe9 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc
@@ -35,8 +35,8 @@ LocalCardMigrationDialogController* controller, content::WebContents* web_contents) : controller_(controller), web_contents_(web_contents) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetCancelCallback( base::BindOnce(&LocalCardMigrationDialogController::OnDoneButtonClicked, base::Unretained(controller_))); set_close_on_deactivate(false);
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc index bba6991..d22374d 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc
@@ -54,13 +54,13 @@ SaveCardBubbleController* controller) : LocationBarBubbleDelegateView(anchor_view, web_contents), controller_(controller) { - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, controller->GetAcceptButtonText()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, controller->GetDeclineButtonText()); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &SaveCardBubbleViews::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &SaveCardBubbleViews::OnDialogAccepted, base::Unretained(this))); DCHECK(controller); chrome::RecordDialogCreation(chrome::DialogIdentifier::SAVE_CARD);
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc index 26bf7d2b..c0c915bd 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc
@@ -16,7 +16,7 @@ content::WebContents* web_contents, SaveCardBubbleController* controller) : SaveCardBubbleViews(anchor_view, web_contents, controller) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } std::unique_ptr<views::View>
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc index 81b828d..d0788350 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc
@@ -40,7 +40,7 @@ content::WebContents* web_contents, SaveCardBubbleController* controller) : SaveCardBubbleViews(anchor_view, web_contents, controller) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); DialogDelegate::SetExtraView(CreateManageCardsButton(this)); DialogDelegate::SetFootnoteView(CreateSigninPromoView()); }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc index 962b007..bdee8852 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -65,7 +65,7 @@ content::WebContents* web_contents, SaveCardBubbleController* controller) : SaveCardBubbleViews(anchor_view, web_contents, controller) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); legal_message_view_ = DialogDelegate::SetFootnoteView( CreateLegalMessageView(controller->GetLegalMessageLines(), this)); if (legal_message_view_)
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc index 5910eb3f..8cde052 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc
@@ -29,7 +29,7 @@ SaveCardBubbleController* controller) : SaveCardBubbleViews(anchor_view, web_contents, controller) { // The BubbleSyncPromoView takes care of buttons. - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } SaveCardSignInPromoBubbleViews::~SaveCardSignInPromoBubbleViews() = default;
diff --git a/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc index dcc93996..c9c0f0a 100644 --- a/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc
@@ -20,10 +20,10 @@ controller_(controller) { DCHECK(controller_); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_UPI_PROMPT_ACCEPT)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_UPI_PROMPT_REJECT)); }
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc index 86c5448..a21d99ef6 100644 --- a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc +++ b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc
@@ -27,14 +27,14 @@ VirtualCardSelectionDialogViewImpl::VirtualCardSelectionDialogViewImpl( VirtualCardSelectionDialogController* controller) : controller_(controller) { - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, controller_->GetOkButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, controller_->GetCancelButtonLabel()); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::Bind(&VirtualCardSelectionDialogController::OnOkButtonClicked, base::Unretained(controller_))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::Bind(&VirtualCardSelectionDialogController::OnCancelButtonClicked, base::Unretained(controller_))); }
diff --git a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc index 54c6c3d..02c35dd 100644 --- a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc +++ b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc
@@ -32,11 +32,11 @@ AddChildView(CreateSheetViewForAutofillWebAuthn(std::move(model))); sheet_view_->ReInitChildViews(); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, model_->GetAcceptButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, model_->GetCancelButtonLabel()); - DialogDelegate::set_buttons(model_->IsAcceptButtonVisible() + DialogDelegate::SetButtons(model_->IsAcceptButtonVisible() ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_CANCEL); @@ -139,12 +139,12 @@ void WebauthnDialogViewImpl::RefreshContent() { sheet_view_->ReInitChildViews(); sheet_view_->InvalidateLayout(); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, model_->GetAcceptButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, model_->GetCancelButtonLabel()); DCHECK(model_->IsCancelButtonVisible()); - DialogDelegate::set_buttons(model_->IsAcceptButtonVisible() + DialogDelegate::SetButtons(model_->IsAcceptButtonVisible() ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_CANCEL);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc index b9a9d6f5..ff43d7e 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -229,15 +229,15 @@ profile_(profile), url_(url), newly_bookmarked_(newly_bookmarked) { - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DONE)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK)); DialogDelegate::SetExtraView(CreateEditButton(this)); DialogDelegate::SetFootnoteView(CreateSigninPromoView()); - DialogDelegate::set_cancel_callback(base::Bind( + DialogDelegate::SetCancelCallback(base::Bind( &BookmarkBubbleView::OnDialogCancelled, base::Unretained(this))); chrome::RecordDialogCreation(chrome::DialogIdentifier::BOOKMARK);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc index 64121910..29b5055 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
@@ -71,7 +71,7 @@ DCHECK(profile); DCHECK(bb_model_); DCHECK(bb_model_->client()->CanBeEditedByUser(parent)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_SAVE)); if (show_tree_) { new_folder_button_ = DialogDelegate::SetExtraView(
diff --git a/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc b/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc index f5a31202..76b593f 100644 --- a/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc +++ b/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc
@@ -58,7 +58,7 @@ DCHECK(dialog_controller_); DCHECK(cleaner_controller_); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CHROME_CLEANUP_PROMPT_REMOVE_BUTTON_LABEL)); details_button_ = @@ -66,13 +66,13 @@ this, l10n_util::GetStringUTF16( IDS_CHROME_CLEANUP_PROMPT_DETAILS_BUTTON_LABEL))); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&ChromeCleanerDialog::HandleDialogInteraction, base::Unretained(this), DialogInteractionResult::kAccept)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&ChromeCleanerDialog::HandleDialogInteraction, base::Unretained(this), DialogInteractionResult::kCancel)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&ChromeCleanerDialog::HandleDialogInteraction, base::Unretained(this), DialogInteractionResult::kClose));
diff --git a/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc b/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc index 6afd4e6..97a7607 100644 --- a/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc +++ b/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc
@@ -49,7 +49,7 @@ DCHECK(dialog_controller_); DialogDelegate::set_draggable(true); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_CHROME_CLEANUP_REBOOT_PROMPT_RESTART_BUTTON_LABEL)); @@ -65,13 +65,13 @@ (std::exchange(*controller, nullptr)->*(fn))(); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(close_callback, base::Unretained(&dialog_controller_), &Controller::Accept)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(close_callback, base::Unretained(&dialog_controller_), &Controller::Cancel)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(close_callback, base::Unretained(&dialog_controller_), &Controller::Close));
diff --git a/chrome/browser/ui/views/collected_cookies_views.cc b/chrome/browser/ui/views/collected_cookies_views.cc index 03bec1ec..6abfaca 100644 --- a/chrome/browser/ui/views/collected_cookies_views.cc +++ b/chrome/browser/ui/views/collected_cookies_views.cc
@@ -345,8 +345,8 @@ CollectedCookiesViews::CollectedCookiesViews(content::WebContents* web_contents) : web_contents_(web_contents) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DONE)); views::GridLayout* layout = SetLayoutManager(std::make_unique<views::GridLayout>());
diff --git a/chrome/browser/ui/views/confirm_bubble_views.cc b/chrome/browser/ui/views/confirm_bubble_views.cc index b2a0e3f..f10e7815 100644 --- a/chrome/browser/ui/views/confirm_bubble_views.cc +++ b/chrome/browser/ui/views/confirm_bubble_views.cc
@@ -40,14 +40,14 @@ ConfirmBubbleViews::ConfirmBubbleViews( std::unique_ptr<ConfirmBubbleModel> model) : model_(std::move(model)), help_button_(nullptr) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, model_->GetButtonLabel(ui::DIALOG_BUTTON_OK)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, model_->GetButtonLabel(ui::DIALOG_BUTTON_CANCEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &ConfirmBubbleModel::Accept, base::Unretained(model_.get()))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &ConfirmBubbleModel::Cancel, base::Unretained(model_.get()))); help_button_ = DialogDelegate::SetExtraView(::CreateExtraView(this));
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc index 5bbb76d0..c817c73 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.cc +++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -380,12 +380,12 @@ DCHECK(content_setting_bubble_model_); const base::string16& done_text = content_setting_bubble_model_->bubble_content().done_button_text; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, done_text.empty() ? l10n_util::GetStringUTF16(IDS_DONE) : done_text); DialogDelegate::SetExtraView(CreateHelpAndManageView()); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&ContentSettingBubbleModel::OnDoneButtonClicked, base::Unretained(content_setting_bubble_model_.get()))); }
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc index 51cd96c..fbd98fb 100644 --- a/chrome/browser/ui/views/create_application_shortcut_view.cc +++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -44,7 +44,7 @@ const extensions::Extension* app, const base::Callback<void(bool)>& close_callback) : profile_(profile), close_callback_(close_callback) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_COMMIT)); set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
diff --git a/chrome/browser/ui/views/critical_notification_bubble_view.cc b/chrome/browser/ui/views/critical_notification_bubble_view.cc index c7e650b..019f529 100644 --- a/chrome/browser/ui/views/critical_notification_bubble_view.cc +++ b/chrome/browser/ui/views/critical_notification_bubble_view.cc
@@ -36,15 +36,15 @@ CriticalNotificationBubbleView::CriticalNotificationBubbleView( views::View* anchor_view) : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CRITICAL_NOTIFICATION_RESTART)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_CANCEL)); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&CriticalNotificationBubbleView::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&CriticalNotificationBubbleView::OnDialogCancelled, base::Unretained(this))); set_close_on_deactivate(false);
diff --git a/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc b/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc index c9fe5a8a..1b492f3 100644 --- a/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
@@ -162,7 +162,7 @@ // In the initial state (CONFIGURING), there are no buttons and hence no set // labels. - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } CrostiniAnsibleSoftwareConfigView::~CrostiniAnsibleSoftwareConfigView() { @@ -173,14 +173,14 @@ void CrostiniAnsibleSoftwareConfigView::OnStateChanged() { progress_bar_->SetVisible(state_ == State::CONFIGURING); subtext_label_->SetText(GetSubtextLabel()); - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( state_ == State::CONFIGURING ? ui::DIALOG_BUTTON_NONE : (state_ == State::ERROR ? ui::DIALOG_BUTTON_OK : ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)); // The cancel button, even when present, always uses the default text. - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, state_ == State::ERROR ? l10n_util::GetStringUTF16(IDS_APP_OK)
diff --git a/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc b/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc index 382e5f4..143b52f 100644 --- a/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc
@@ -67,10 +67,10 @@ CrostiniAppRestartView::CrostiniAppRestartView(const ash::ShelfID& id, int64_t display_id) : id_(id), display_id_(display_id) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CROSTINI_APP_RESTART_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_CROSTINI_NOT_NOW_BUTTON));
diff --git a/chrome/browser/ui/views/crostini/crostini_force_close_view.cc b/chrome/browser/ui/views/crostini/crostini_force_close_view.cc index ea37670..d2ab3330 100644 --- a/chrome/browser/ui/views/crostini/crostini_force_close_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_force_close_view.cc
@@ -80,7 +80,7 @@ base::OnceClosure force_close_callback) : app_name_(base::UTF8ToUTF16(app_name)), force_close_callback_(std::move(force_close_callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CROSTINI_FORCE_CLOSE_ACCEPT_BUTTON));
diff --git a/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc b/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc index 779283a..6cd9d7af 100644 --- a/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc
@@ -50,7 +50,7 @@ CrostiniPackageInstallFailureView::CrostiniPackageInstallFailureView( const std::string& error_message) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); views::LayoutProvider* provider = views::LayoutProvider::Get(); SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical,
diff --git a/chrome/browser/ui/views/crostini/crostini_recovery_view.cc b/chrome/browser/ui/views/crostini/crostini_recovery_view.cc index be842c3..0d2e143 100644 --- a/chrome/browser/ui/views/crostini/crostini_recovery_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_recovery_view.cc
@@ -142,11 +142,11 @@ display_id_(display_id), callback_(std::move(callback)), weak_ptr_factory_(this) { - set_buttons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CROSTINI_RECOVERY_RESTART_BUTTON)); - set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_CROSTINI_RECOVERY_TERMINAL_BUTTON));
diff --git a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc index 4a5d0bf..41edfe7 100644 --- a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc
@@ -61,7 +61,7 @@ bool CrostiniUninstallerView::Accept() { state_ = State::UNINSTALLING; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); message_label_->SetText( l10n_util::GetStringUTF16(IDS_CROSTINI_UNINSTALLER_UNINSTALLING_MESSAGE)); @@ -101,7 +101,7 @@ CrostiniUninstallerView::CrostiniUninstallerView(Profile* profile) : profile_(profile) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CROSTINI_UNINSTALLER_UNINSTALL_BUTTON)); @@ -128,7 +128,7 @@ void CrostiniUninstallerView::HandleError(const base::string16& error_message) { state_ = State::ERROR; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL); message_label_->SetVisible(true); message_label_->SetText(error_message); progress_bar_->SetVisible(false);
diff --git a/chrome/browser/ui/views/crostini/crostini_update_component_view.cc b/chrome/browser/ui/views/crostini/crostini_update_component_view.cc index 355fa8e..b0eb8fa 100644 --- a/chrome/browser/ui/views/crostini/crostini_update_component_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_update_component_view.cc
@@ -68,7 +68,7 @@ } CrostiniUpdateComponentView::CrostiniUpdateComponentView() { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); views::LayoutProvider* provider = views::LayoutProvider::Get(); SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc b/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc index 1124a43..5f1fadc9 100644 --- a/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc
@@ -114,7 +114,7 @@ CrostiniUpdateFilesystemView::CrostiniUpdateFilesystemView() { constexpr int kDialogSpacingVertical = 32; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); views::LayoutProvider* provider = views::LayoutProvider::Get(); SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/crypto_module_password_dialog_view.cc b/chrome/browser/ui/views/crypto_module_password_dialog_view.cc index d02dc48..8857655 100644 --- a/chrome/browser/ui/views/crypto_module_password_dialog_view.cc +++ b/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
@@ -25,16 +25,16 @@ const std::string& hostname, const CryptoModulePasswordCallback& callback) : callback_(callback) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](CryptoModulePasswordDialogView* dialog) { dialog->callback_.Run( base::UTF16ToUTF8(dialog->password_entry_->GetText())); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce(callback_, std::string())); + DialogDelegate::SetCancelCallback(base::BindOnce(callback_, std::string())); set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType( views::TEXT, views::CONTROL)); Init(hostname, slot_name, reason);
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc index a857f22..bb9337d 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -63,7 +63,7 @@ DesktopMediaPickerViews* parent, std::vector<std::unique_ptr<DesktopMediaList>> source_lists) : parent_(parent), modality_(params.modality) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DESKTOP_MEDIA_PICKER_SHARE)); const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/download/download_danger_prompt_views.cc b/chrome/browser/ui/views/download/download_danger_prompt_views.cc index 24d8059..4f7c93d2 100644 --- a/chrome/browser/ui/views/download/download_danger_prompt_views.cc +++ b/chrome/browser/ui/views/download/download_danger_prompt_views.cc
@@ -83,9 +83,9 @@ done_(done) { // Note that this prompt is asking whether to cancel a dangerous download, so // the accept path is titled "Cancel". - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CANCEL)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, show_context_ ? l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD) : l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD_AGAIN)); @@ -98,9 +98,9 @@ // Note that the presentational concept of "Accept/Cancel" is inverted from // the model's concept of ACCEPT/CANCEL. In the UI, the safe path is "Accept" // and the dangerous path is "Cancel". - DialogDelegate::set_accept_callback(make_done_callback(CANCEL)); - DialogDelegate::set_cancel_callback(make_done_callback(ACCEPT)); - DialogDelegate::set_close_callback(make_done_callback(DISMISS)); + DialogDelegate::SetAcceptCallback(make_done_callback(CANCEL)); + DialogDelegate::SetCancelCallback(make_done_callback(ACCEPT)); + DialogDelegate::SetCloseCallback(make_done_callback(DISMISS)); download_->AddObserver(this);
diff --git a/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc b/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc index c6ac8cda..3dcf624 100644 --- a/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc +++ b/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc
@@ -35,11 +35,11 @@ : download_count_(download_count), app_modal_(app_modal), callback_(callback) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label( + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ABANDON_DOWNLOAD_DIALOG_EXIT_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_ABANDON_DOWNLOAD_DIALOG_CONTINUE_BUTTON)); SetLayoutManager(std::make_unique<views::FillLayout>()); @@ -51,9 +51,9 @@ // means "continue the download". dialog->callback_.Run(accept); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), false)); int message_id = 0;
diff --git a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc index 9a4f5cc..f0f90ed7 100644 --- a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc
@@ -43,9 +43,9 @@ DCHECK(chooser_controller); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, chooser_controller->GetOkButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, chooser_controller->GetCancelButtonLabel()); device_chooser_content_view_ = @@ -56,13 +56,13 @@ DialogDelegate::SetExtraView(device_chooser_content_view_->CreateExtraView()); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&DeviceChooserContentView::Accept, base::Unretained(device_chooser_content_view_))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&DeviceChooserContentView::Cancel, base::Unretained(device_chooser_content_view_))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&DeviceChooserContentView::Close, base::Unretained(device_chooser_content_view_)));
diff --git a/chrome/browser/ui/views/extensions/extension_dialog.cc b/chrome/browser/ui/views/extensions/extension_dialog.cc index aaa8d9b..445459f 100644 --- a/chrome/browser/ui/views/extensions/extension_dialog.cc +++ b/chrome/browser/ui/views/extensions/extension_dialog.cc
@@ -180,7 +180,7 @@ std::unique_ptr<extensions::ExtensionViewHost> host, ExtensionDialogObserver* observer) : host_(std::move(host)), observer_(observer) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::set_use_custom_frame(false); AddRef(); // Balanced in DeleteDelegate();
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc index 79c5e51..9b6239fc 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -208,8 +208,8 @@ int buttons = prompt_->GetDialogButtons(); DCHECK(buttons & ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_buttons(buttons); + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtons(buttons); DialogDelegate::set_draggable(true); if (prompt_->has_webstore_data()) { auto store_link = std::make_unique<views::Link>( @@ -223,9 +223,9 @@ l10n_util::GetStringUTF16(IDS_EXTENSION_WITHHOLD_PERMISSIONS))); } - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, prompt_->GetAcceptButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, prompt_->GetAbortButtonLabel()); set_close_on_deactivate(false); CreateContents();
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index b6c693f..15308db 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -187,7 +187,7 @@ model_(std::move(model)), icon_(model_->MakeIconOfSize(kMaxIconSize)) { chrome::RecordDialogCreation(chrome::DialogIdentifier::EXTENSION_INSTALLED); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); if (model_->show_sign_in_promo()) { DialogDelegate::SetFootnoteView( CreateSigninPromoView(browser->profile(), this));
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc index b98ab3f..3f0ed84 100644 --- a/chrome/browser/ui/views/extensions/extension_popup.cc +++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -188,7 +188,7 @@ host_(std::move(host)), extension_registry_observer_(this), show_action_(show_action) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::set_use_round_corners(false); set_margins(gfx::Insets());
diff --git a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc index be50dee..a6801c0 100644 --- a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
@@ -204,7 +204,7 @@ skia::ImageOperations::ResizeMethod::RESIZE_GOOD, gfx::Size(extension_misc::EXTENSION_ICON_SMALL, extension_misc::EXTENSION_ICON_SMALL))) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc index f5bd963..9013434 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -91,7 +91,7 @@ browser_->tab_strip_model()->AddObserver(this); set_margins(gfx::Insets(0)); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); EnableUpDownKeyboardAccelerators();
diff --git a/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc b/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc index e1ed3d21..e7c121d 100644 --- a/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc +++ b/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc
@@ -79,9 +79,9 @@ auxiliary_button_(nullptr), confirm_available_(false), accepted_(false) { - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, controller_->GetAcceptButtonText()); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](MediaGalleriesDialogViews* dialog) { dialog->accepted_ = true; }, base::Unretained(this)));
diff --git a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc index a71c120..bf1a6b8 100644 --- a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc
@@ -100,11 +100,11 @@ extension_misc::EXTENSION_ICON_SMALL))), callback_(std::move(callback)), dialog_is_bubble_(anchor_view != nullptr) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_EXTENSIONS_PRINTING_API_PRINT_REQUEST_ALLOW)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( IDS_EXTENSIONS_PRINTING_API_PRINT_REQUEST_DENY)); @@ -112,9 +112,9 @@ auto run_callback = [](PrintJobConfirmationDialogView* dialog, bool accept) { std::move(dialog->callback_).Run(accept); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), false)); ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc b/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc index af31c5b..9e8d663 100644 --- a/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc
@@ -63,12 +63,12 @@ bool writable, const base::Callback<void(ui::DialogButton)>& callback) : callback_(callback) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label( + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_DIALOG_ALLOW_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_DIALOG_DENY_BUTTON)); @@ -77,9 +77,9 @@ ui::DialogButton button) { dialog->callback_.Run(button); }; - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( run_callback, base::Unretained(this), ui::DIALOG_BUTTON_OK)); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( run_callback, base::Unretained(this), ui::DIALOG_BUTTON_CANCEL)); DCHECK(!callback_.is_null());
diff --git a/chrome/browser/ui/views/external_protocol_dialog.cc b/chrome/browser/ui/views/external_protocol_dialog.cc index 3f299ad..4fef48b 100644 --- a/chrome/browser/ui/views/external_protocol_dialog.cc +++ b/chrome/browser/ui/views/external_protocol_dialog.cc
@@ -73,21 +73,21 @@ url_(url), program_name_(program_name), initiating_origin_(initiating_origin) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label( + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringFUTF16(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT, program_name_)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_CANCEL_BUTTON_TEXT)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &ExternalProtocolDialog::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &ExternalProtocolHandler::RecordHandleStateMetrics, false /* checkbox_selected */, ExternalProtocolHandler::BLOCK)); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( &ExternalProtocolHandler::RecordHandleStateMetrics, false /* checkbox_selected */, ExternalProtocolHandler::BLOCK));
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc index 80e85f8..5cf2c2dc 100644 --- a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc +++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
@@ -114,7 +114,7 @@ set_margins(gfx::Insets()); set_title_margins(gfx::Insets()); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_color(background_color);
diff --git a/chrome/browser/ui/views/first_run_dialog.cc b/chrome/browser/ui/views/first_run_dialog.cc index a3f2160..9cd1d70b 100644 --- a/chrome/browser/ui/views/first_run_dialog.cc +++ b/chrome/browser/ui/views/first_run_dialog.cc
@@ -68,7 +68,7 @@ } FirstRunDialog::FirstRunDialog(Profile* profile) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); DialogDelegate::SetExtraView( std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE))) ->set_callback(base::BindRepeating(&platform_util::OpenExternal,
diff --git a/chrome/browser/ui/views/folder_upload_confirmation_view.cc b/chrome/browser/ui/views/folder_upload_confirmation_view.cc index a4dd724..419c29f 100644 --- a/chrome/browser/ui/views/folder_upload_confirmation_view.cc +++ b/chrome/browser/ui/views/folder_upload_confirmation_view.cc
@@ -22,21 +22,21 @@ std::vector<ui::SelectedFileInfo> selected_files) : callback_(std::move(callback)), selected_files_(std::move(selected_files)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CONFIRM_FILE_UPLOAD_OK_BUTTON)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](FolderUploadConfirmationView* dialog) { std::move(dialog->callback_).Run(dialog->selected_files_); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( [](FolderUploadConfirmationView* dialog) { std::move(dialog->callback_).Run({}); }, base::Unretained(this))); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( [](FolderUploadConfirmationView* dialog) { std::move(dialog->callback_).Run({}); },
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index 5dd65c8..e3b65ee 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -1067,7 +1067,7 @@ } // TODO(): Flaky crash on Chrome OS debug. -#if defined(OS_CHROMEOS) && !defined(NDEBUG) +#if defined(OS_CHROMEOS) #define MAYBE_BrowserCommandFocusToolbarGeolocation \ DISABLED_BrowserCommandFocusToolbarGeolocation #else
diff --git a/chrome/browser/ui/views/global_error_bubble_view.cc b/chrome/browser/ui/views/global_error_bubble_view.cc index 7220ce0..56e9a3e 100644 --- a/chrome/browser/ui/views/global_error_bubble_view.cc +++ b/chrome/browser/ui/views/global_error_bubble_view.cc
@@ -80,22 +80,22 @@ // error_ is a WeakPtr, but it's always non-null during construction. DCHECK(error_); - DialogDelegate::set_default_button(error_->GetDefaultDialogButton()); - DialogDelegate::set_buttons( + DialogDelegate::SetDefaultButton(error_->GetDefaultDialogButton()); + DialogDelegate::SetButtons( !error_->GetBubbleViewCancelButtonLabel().empty() ? (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL) : ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, error_->GetBubbleViewAcceptButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, error_->GetBubbleViewCancelButtonLabel()); // Note that error is already a WeakPtr, so these callbacks will simply do // nothing if they are invoked after its destruction. - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &GlobalErrorWithStandardBubble::BubbleViewAcceptButtonPressed, error, base::Unretained(browser_))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &GlobalErrorWithStandardBubble::BubbleViewCancelButtonPressed, error, base::Unretained(browser_)));
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc index 1cb5a4dd..a8f548e 100644 --- a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc
@@ -158,7 +158,7 @@ service_(service), active_sessions_view_( AddChildView(std::make_unique<MediaNotificationListView>())) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DCHECK(service_); }
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.cc b/chrome/browser/ui/views/hats/hats_bubble_view.cc index 332cb55..b02db2aa 100644 --- a/chrome/browser/ui/views/hats/hats_bubble_view.cc +++ b/chrome/browser/ui/views/hats/hats_bubble_view.cc
@@ -101,10 +101,10 @@ consent_callback_(std::move(consent_callback)) { chrome::RecordDialogCreation(chrome::DialogIdentifier::HATS_BUBBLE); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_HATS_BUBBLE_OK_LABEL)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_NO_THANKS)); set_close_on_deactivate(false); set_parent_window(parent_view); @@ -112,9 +112,9 @@ auto run_callback = [](HatsBubbleView* bubble, bool accept) { std::move(bubble->consent_callback_).Run(accept); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), false)); ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/hung_renderer_view.cc b/chrome/browser/ui/views/hung_renderer_view.cc index 9034050..aa2401e1 100644 --- a/chrome/browser/ui/views/hung_renderer_view.cc +++ b/chrome/browser/ui/views/hung_renderer_view.cc
@@ -287,19 +287,19 @@ hung_pages_table_model_.get(), columns, views::ICON_AND_TEXT, true); hung_pages_table_ = hung_pages_table.get(); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetPluralStringFUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_END, hung_pages_table_model_->RowCount())); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_WAIT)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &HungRendererDialogView::RestartHangTimer, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &HungRendererDialogView::ForceCrashHungRenderer, base::Unretained(this))); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( &HungRendererDialogView::RestartHangTimer, base::Unretained(this))); DialogModelChanged();
diff --git a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc index 822a3f7a9..45ea4a99 100644 --- a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc +++ b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
@@ -80,7 +80,7 @@ response_callback_(callback) { BrowserList::AddObserver(this); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](ImeWarningBubbleView* bubble) { const bool never_show = bubble->never_show_checkbox_->GetChecked(); std::move(bubble->response_callback_) @@ -89,7 +89,7 @@ : ImeWarningBubblePermissionStatus::GRANTED); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( [](ImeWarningBubbleView* bubble) { std::move(bubble->response_callback_) .Run(ImeWarningBubblePermissionStatus::DENIED);
diff --git a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc index b6d00e9..763fd2e 100644 --- a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc +++ b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
@@ -46,7 +46,7 @@ ImportLockDialogView::ImportLockDialogView( const base::Callback<void(bool)>& callback) : callback_(callback) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_IMPORTER_LOCK_OK)); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc index 09329b02..553bde3 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -280,23 +280,23 @@ icon_view_(icon_view), icon_type_(icon_type), initiating_origin_(initiating_origin) { - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( show_stay_in_chrome_ ? (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL) : ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( icon_type_ == PageActionIconType::kClickToCall ? IDS_BROWSER_SHARING_CLICK_TO_CALL_DIALOG_CALL_BUTTON_LABEL : IDS_INTENT_PICKER_BUBBLE_VIEW_OPEN)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_INTENT_PICKER_BUBBLE_VIEW_STAY_IN_CHROME)); - DialogDelegate::set_accept_callback(base::Bind( + DialogDelegate::SetAcceptCallback(base::Bind( &IntentPickerBubbleView::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::Bind( + DialogDelegate::SetCancelCallback(base::Bind( &IntentPickerBubbleView::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_close_callback(base::Bind( + DialogDelegate::SetCloseCallback(base::Bind( &IntentPickerBubbleView::OnDialogClosed, base::Unretained(this))); // Click to call bubbles need to be closed after navigation if the main frame
diff --git a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc index 3fdb2c527..a5c445493 100644 --- a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc +++ b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc
@@ -65,28 +65,28 @@ default_prompt_text_(default_prompt_text), dialog_callback_(std::move(dialog_callback)), dialog_force_closed_callback_(std::move(dialog_force_closed_callback)) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_OK); const bool is_alert = dialog_type == content::JAVASCRIPT_DIALOG_TYPE_ALERT; - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( // Alerts only have an OK button, no Cancel, because there is no choice // being made. is_alert ? ui::DIALOG_BUTTON_OK : (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](JavaScriptTabModalDialogViewViews* dialog) { if (dialog->dialog_callback_) std::move(dialog->dialog_callback_) .Run(true, dialog->message_box_view_->GetInputText()); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( [](JavaScriptTabModalDialogViewViews* dialog) { if (dialog->dialog_callback_) std::move(dialog->dialog_callback_).Run(false, base::string16()); }, base::Unretained(this))); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( [](JavaScriptTabModalDialogViewViews* dialog) { if (dialog->dialog_force_closed_callback_) std::move(dialog->dialog_force_closed_callback_).Run();
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc index 9c40f4b..4b0c0c6 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -103,7 +103,7 @@ : LocationBarBubbleDelegateView(anchor_view, web_contents), controller_(controller) { controller_observer_.Add(controller); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } CookieControlsBubbleView::~CookieControlsBubbleView() = default; @@ -152,17 +152,17 @@ extra_view_->SetVisible(false); } - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, intermediate_step_ == IntermediateStep::kTurnOffButton ? l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON) : l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_ON_BUTTON)); - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( (intermediate_step_ == IntermediateStep::kTurnOffButton || status_ == CookieControlsStatus::kDisabledForSite) ? ui::DIALOG_BUTTON_OK : ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &CookieControlsBubbleView::OnDialogAccepted, base::Unretained(this))); DialogModelChanged();
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc index 86998cbd..04120c1 100644 --- a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
@@ -283,7 +283,7 @@ immersive_mode_controller_(immersive_mode_controller), session_id_( chrome::FindBrowserWithWebContents(web_contents)->session_id()) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_notify_enter_exit_on_child(true); if (immersive_mode_controller_)
diff --git a/chrome/browser/ui/views/login_handler_views.cc b/chrome/browser/ui/views/login_handler_views.cc index c20e45983..d700b49 100644 --- a/chrome/browser/ui/views/login_handler_views.cc +++ b/chrome/browser/ui/views/login_handler_views.cc
@@ -86,10 +86,10 @@ const base::string16& explanation, LoginHandler::LoginModelData* login_model_data) : handler_(handler), login_view_(nullptr), widget_(nullptr) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_LOGIN_DIALOG_OK_BUTTON_LABEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( [](Dialog* dialog) { if (!dialog->handler_) return; @@ -97,7 +97,7 @@ dialog->login_view_->GetPassword()); }, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( [](Dialog* dialog) { if (!dialog->handler_) return;
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_view.cc index adccb54..078fc73e1 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
@@ -265,7 +265,7 @@ controller_(controller), profile_(profile), metrics_(start_time, activation_location, profile) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); sources_button_ = DialogDelegate::SetExtraView(CreateSourcesButton(this)); ShowNoSinksView(); }
diff --git a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc index 99dbf6f8..0c39ea8 100644 --- a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc
@@ -91,13 +91,13 @@ Browser* browser) : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), browser_(browser) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_CLOUD_SERVICES_DIALOG_ENABLE)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_CLOUD_SERVICES_DIALOG_CANCEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &CloudServicesDialogView::OnDialogAccepted, base::Unretained(this))); set_close_on_deactivate(false); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc index 1d365ae..ec299f0 100644 --- a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc
@@ -101,19 +101,19 @@ dialog_title_( l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_REMOTING_DIALOG_TITLE)) { DCHECK(pref_service_); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_MEDIA_ROUTER_REMOTING_DIALOG_OPTIMIZE_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( IDS_MEDIA_ROUTER_REMOTING_DIALOG_CANCEL_BUTTON)); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&MediaRemotingDialogView::ReportPermission, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&MediaRemotingDialogView::ReportPermission, base::Unretained(this), false));
diff --git a/chrome/browser/ui/views/message_box_dialog.cc b/chrome/browser/ui/views/message_box_dialog.cc index 3317d6f..634095c 100644 --- a/chrome/browser/ui/views/message_box_dialog.cc +++ b/chrome/browser/ui/views/message_box_dialog.cc
@@ -217,17 +217,17 @@ message_box_view_(new views::MessageBoxView( views::MessageBoxView::InitParams(message))), is_system_modal_(is_system_modal) { - DialogDelegate::set_buttons(type_ == chrome::MESSAGE_BOX_TYPE_QUESTION + DialogDelegate::SetButtons(type_ == chrome::MESSAGE_BOX_TYPE_QUESTION ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_OK); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &MessageBoxDialog::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&MessageBoxDialog::Done, base::Unretained(this), chrome::MESSAGE_BOX_RESULT_NO)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&MessageBoxDialog::Done, base::Unretained(this), chrome::MESSAGE_BOX_RESULT_NO)); @@ -238,14 +238,14 @@ ? l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL) : l10n_util::GetStringUTF16(IDS_OK); } - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, ok_text); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, ok_text); // Only MESSAGE_BOX_TYPE_QUESTION has a Cancel button. if (type_ == chrome::MESSAGE_BOX_TYPE_QUESTION) { base::string16 cancel_text = no_text; if (cancel_text.empty()) cancel_text = l10n_util::GetStringUTF16(IDS_CANCEL); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, cancel_text); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_text); } if (!checkbox_text.empty())
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc index 79c892f..8127f46d 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
@@ -83,7 +83,7 @@ base::ScopedClosureRunner fullscreen_block) : callback_(std::move(callback)), fullscreen_block_(std::move(fullscreen_block)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_NATIVE_FILE_SYSTEM_DIRECTORY_ACCESS_ALLOW_BUTTON)); @@ -98,13 +98,13 @@ permissions::PermissionAction result) { std::move(dialog->callback_).Run(result); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), permissions::PermissionAction::GRANTED)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), permissions::PermissionAction::DISMISSED)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(run_callback, base::Unretained(this), permissions::PermissionAction::DISMISSED));
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc index 2ed214ab..427ad08 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
@@ -72,7 +72,7 @@ const Request& request, base::OnceCallback<void(permissions::PermissionAction result)> callback) : request_(request), callback_(std::move(callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(GetButtonLabel(request_))); @@ -80,13 +80,13 @@ permissions::PermissionAction result) { std::move(dialog->callback_).Run(result); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), permissions::PermissionAction::GRANTED)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(run_callback, base::Unretained(this), permissions::PermissionAction::DISMISSED)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(run_callback, base::Unretained(this), permissions::PermissionAction::DISMISSED));
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc index ae8db228..fd937ff 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
@@ -69,7 +69,7 @@ bool is_directory, base::OnceCallback<void(SensitiveDirectoryResult)> callback) : is_directory_(is_directory), callback_(std::move(callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( is_directory_ ? IDS_NATIVE_FILE_SYSTEM_RESTRICTED_DIRECTORY_BUTTON @@ -79,10 +79,10 @@ SensitiveDirectoryResult result) { std::move(dialog->callback_).Run(result); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(run_callback, base::Unretained(this), SensitiveDirectoryResult::kTryAgain)); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( run_callback, base::Unretained(this), SensitiveDirectoryResult::kAbort)); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc index 3b27174..73e1606 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
@@ -308,12 +308,12 @@ std::move(usage_.readable_directories)), writable_paths_model_(std::move(usage_.writable_files), std::move(usage_.writable_directories)) { - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DONE)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_NATIVE_FILE_SYSTEM_USAGE_REMOVE_ACCESS)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&NativeFileSystemUsageBubbleView::OnDialogCancelled, base::Unretained(this))); }
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc index c4bb044f..35f559c 100644 --- a/chrome/browser/ui/views/network_profile_bubble_view.cc +++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -54,7 +54,7 @@ : BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), navigator_(navigator), profile_(profile) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); auto* learn_more = DialogDelegate::SetExtraView( std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE))); learn_more->set_callback(base::BindRepeating(
diff --git a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc index 4fbb09a3..ad29ffb 100644 --- a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc +++ b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
@@ -34,9 +34,9 @@ DCHECK(template_url_service); DCHECK(match_.SupportsDeletion()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_REMOVE)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_CANCEL)); auto* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc index abbe8282..8f17dbc2f 100644 --- a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc +++ b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
@@ -153,14 +153,14 @@ : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), auto_update_enabled_(auto_update_enabled), navigator_(navigator) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(auto_update_enabled_ ? IDS_REINSTALL_APP : IDS_REENABLE_UPDATES)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &OutdatedUpgradeBubbleView::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&base::RecordAction, base::UserMetricsAction("OutdatedUpgradeBubble.Later"))); chrome::RecordDialogCreation(chrome::DialogIdentifier::OUTDATED_UPGRADE);
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc index 397dc77..ef61d91c 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc
@@ -49,7 +49,7 @@ g_shown_bubble_type = type; g_page_info_bubble = this; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_parent_window(parent_window); if (!anchor_view)
diff --git a/chrome/browser/ui/views/parent_permission_dialog_view.cc b/chrome/browser/ui/views/parent_permission_dialog_view.cc index 025e56b..5be2d79f 100644 --- a/chrome/browser/ui/views/parent_permission_dialog_view.cc +++ b/chrome/browser/ui/views/parent_permission_dialog_view.cc
@@ -205,12 +205,12 @@ std::unique_ptr<Params> params, ParentPermissionDialogView::DoneCallback done_callback) : params_(std::move(params)), done_callback_(std::move(done_callback)) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_OK); DialogDelegate::set_draggable(true); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_PARENT_PERMISSION_PROMPT_APPROVE_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_PARENT_PERMISSION_PROMPT_CANCEL_BUTTON)); }
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc index 14c99c3..fe80ab0a 100644 --- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
@@ -88,8 +88,8 @@ : controller_(controller), web_contents_(web_contents) { DCHECK(controller); DCHECK(web_contents); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ACCOUNT_CHOOSER_SIGN_IN)); set_close_on_deactivate(false); @@ -105,7 +105,7 @@ void AccountChooserDialogView::ShowAccountChooser() { // It isn't known until after the creation of this dialog whether the sign-in // button should be shown, so always reset the button state here. - DialogDelegate::set_buttons(controller_->ShouldShowSignInButton() + DialogDelegate::SetButtons(controller_->ShouldShowSignInButton() ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_CANCEL);
diff --git a/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc b/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc index 8e6635c..cea3da5 100644 --- a/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc
@@ -22,10 +22,10 @@ CredentialManagerDialogController* controller, content::WebContents* web_contents) : controller_(controller), web_contents_(web_contents) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_AUTO_SIGNIN_FIRST_RUN_OK)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_TURN_OFF)); using ControllerCallbackFn = void (CredentialManagerDialogController::*)(); @@ -35,10 +35,10 @@ (dialog->controller_->*func)(); } }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(call_controller, base::Unretained(this), &CredentialManagerDialogController::OnAutoSigninOK)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(call_controller, base::Unretained(this), &CredentialManagerDialogController::OnAutoSigninTurnOff));
diff --git a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc index 29b4dc43..23a370c 100644 --- a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
@@ -80,13 +80,13 @@ DCHECK(controller); DCHECK(web_contents); - DialogDelegate::set_buttons(controller->ShouldShowCancelButton() + DialogDelegate::SetButtons(controller->ShouldShowCancelButton() ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, controller_->GetAcceptButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, controller_->GetCancelButtonLabel()); using ControllerClosureFn = void (CredentialLeakDialogController::*)(void); @@ -102,13 +102,13 @@ (std::exchange(*controller, nullptr)->*(fn))(); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(close_callback, base::Unretained(&controller_), &CredentialLeakDialogController::OnAcceptDialog)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(close_callback, base::Unretained(&controller_), &CredentialLeakDialogController::OnCancelDialog)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(close_callback, base::Unretained(&controller_), &CredentialLeakDialogController::OnCloseDialog)); }
diff --git a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc index 68b9231a..56b421be 100644 --- a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc +++ b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc
@@ -36,7 +36,7 @@ SetLayoutManager(std::make_unique<views::FillLayout>()); const autofill::PasswordForm& form = controller_.pending_password(); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_margins( ChromeLayoutProvider::Get()->GetInsetsMetric(views::INSETS_DIALOG));
diff --git a/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc b/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc index fdb48bc..689a271 100644 --- a/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc +++ b/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc
@@ -30,7 +30,7 @@ : PasswordBubbleControllerBase::DisplayReason::kUserAction) { SetLayoutManager(std::make_unique<views::FillLayout>()); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); auto label = std::make_unique<views::StyledLabel>( controller_.save_confirmation_text(), this);
diff --git a/chrome/browser/ui/views/passwords/password_items_view.cc b/chrome/browser/ui/views/passwords/password_items_view.cc index e0da42d..c7d7f27 100644 --- a/chrome/browser/ui/views/passwords/password_items_view.cc +++ b/chrome/browser/ui/views/passwords/password_items_view.cc
@@ -220,7 +220,7 @@ anchor_view, /*easily_dismissable=*/true), controller_(PasswordsModelDelegateFromWebContents(web_contents)) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); DialogDelegate::SetExtraView(CreateManageButton(this)); if (controller_.local_credentials().empty()) {
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc index abcb6cb..529e5c22 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -308,7 +308,7 @@ } DialogDelegate::SetFootnoteView(CreateFooterView()); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &PasswordSaveUpdateView::OnDialogCancelled, base::Unretained(this))); UpdateDialogButtons(); } @@ -475,17 +475,17 @@ void PasswordSaveUpdateView::UpdateDialogButtons() { if (sign_in_promo_) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); return; } - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(controller_.IsCurrentStateUpdate() ? IDS_PASSWORD_MANAGER_UPDATE_BUTTON : IDS_PASSWORD_MANAGER_SAVE_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( is_update_bubble_ ? IDS_PASSWORD_MANAGER_CANCEL_BUTTON
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc index 101fc03..61ca9d2 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
@@ -392,9 +392,9 @@ (dialog->controller_.*func)(); }; - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( button_clicked, base::Unretained(this), &Controller::OnSaveClicked)); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( button_clicked, base::Unretained(this), is_update_bubble_ ? &Controller::OnNopeUpdateClicked : &Controller::OnNeverForThisSiteClicked)); @@ -525,14 +525,14 @@ } void PasswordSaveUpdateWithAccountStoreView::UpdateDialogButtons() { - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(controller_.IsCurrentStateUpdate() ? IDS_PASSWORD_MANAGER_UPDATE_BUTTON : IDS_PASSWORD_MANAGER_SAVE_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( is_update_bubble_ ? IDS_PASSWORD_MANAGER_CANCEL_BUTTON
diff --git a/chrome/browser/ui/views/payments/order_summary_view_controller.cc b/chrome/browser/ui/views/payments/order_summary_view_controller.cc index 7d817fc4eb..2c982b3 100644 --- a/chrome/browser/ui/views/payments/order_summary_view_controller.cc +++ b/chrome/browser/ui/views/payments/order_summary_view_controller.cc
@@ -143,7 +143,10 @@ OrderSummaryViewController::CreatePrimaryButton() { std::unique_ptr<views::Button> button( views::MdTextButton::CreateSecondaryUiBlueButton( - this, l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON))); + this, state()->selected_app() && state()->selected_app()->type() != + PaymentApp::Type::AUTOFILL + ? l10n_util::GetStringUTF16(IDS_PAYMENTS_CONTINUE_BUTTON) + : l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON))); button->set_tag(static_cast<int>(PaymentRequestCommonTags::PAY_BUTTON_TAG)); button->SetID(static_cast<int>(DialogViewID::PAY_BUTTON)); pay_button_ = button.get();
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc index 55721cf..52794057 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -50,6 +50,7 @@ #include "ui/gfx/animation/test_animation_delegate.h" #include "ui/gfx/geometry/point.h" #include "ui/views/controls/button/button.h" +#include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/label.h" #include "ui/views/controls/styled_label.h" @@ -767,6 +768,13 @@ return button->GetEnabled(); } +base::string16 PaymentRequestBrowserTestBase::GetPrimaryButtonLabel() const { + return static_cast<views::MdTextButton*>( + delegate_->dialog_view()->GetViewByID( + static_cast<int>(DialogViewID::PAY_BUTTON))) + ->GetText(); +} + void PaymentRequestBrowserTestBase::WaitForAnimation() { WaitForAnimation(delegate_->dialog_view()); }
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h index f951a32..8880d4c 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h +++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
@@ -241,6 +241,8 @@ bool IsPayButtonEnabled(); + base::string16 GetPrimaryButtonLabel() const; + // Sets proper animation delegates and waits for animation to finish. void WaitForAnimation(); void WaitForAnimation(PaymentRequestDialogView* dialog_view);
diff --git a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc index 47ce46a..baed14a 100644 --- a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc +++ b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
@@ -63,7 +63,7 @@ : request_(request), observer_for_testing_(observer) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); request->spec()->AddObserver(this); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc index 84dd5012..89433ad2 100644 --- a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
@@ -862,7 +862,6 @@ // Make sure that the metrics that required the Payment Request to be shown // are not logged. - histogram_tester.ExpectTotalCount("PaymentRequest.SelectedPaymentMethod", 0); histogram_tester.ExpectTotalCount("PaymentRequest.NumberOfSelectionAdds", 0); histogram_tester.ExpectTotalCount("PaymentRequest.NumberOfSelectionChanges", 0);
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc index 7f99dc51..399c48b3 100644 --- a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc +++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
@@ -369,6 +369,15 @@ DISALLOW_COPY_AND_ASSIGN(PaymentSheetRowBuilder); }; +// The primary button should show "Continue" when the selected payment app is +// non-autofill. +base::string16 CalculatePrimaryButtonLabel(const PaymentRequestState* state) { + return state->selected_app() && + state->selected_app()->type() != PaymentApp::Type::AUTOFILL + ? l10n_util::GetStringUTF16(IDS_PAYMENTS_CONTINUE_BUTTON) + : l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON); +} + } // namespace PaymentSheetViewController::PaymentSheetViewController( @@ -398,7 +407,7 @@ PaymentSheetViewController::CreatePrimaryButton() { std::unique_ptr<views::Button> button( views::MdTextButton::CreateSecondaryUiBlueButton( - this, l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON))); + this, CalculatePrimaryButtonLabel(state()))); button->set_tag(static_cast<int>(PaymentRequestCommonTags::PAY_BUTTON_TAG)); button->SetID(static_cast<int>(DialogViewID::PAY_BUTTON)); button->SetEnabled(state()->is_ready_to_pay()); @@ -575,6 +584,8 @@ void PaymentSheetViewController::UpdatePayButtonState(bool enabled) { primary_button()->SetEnabled(enabled); + static_cast<views::MdTextButton*>(primary_button()) + ->SetText(CalculatePrimaryButtonLabel(state())); } // Creates the Order Summary row, which contains an "Order Summary" label,
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc index 338167e..609bfcc 100644 --- a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
@@ -14,6 +14,7 @@ #include "components/strings/grit/components_strings.h" #include "net/dns/mock_host_resolver.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/l10n/l10n_util.h" namespace payments { @@ -22,7 +23,7 @@ class PaymentSheetViewControllerNoShippingTest : public PaymentRequestBrowserTestBase { protected: - PaymentSheetViewControllerNoShippingTest() {} + PaymentSheetViewControllerNoShippingTest() = default; private: DISALLOW_COPY_AND_ASSIGN(PaymentSheetViewControllerNoShippingTest); @@ -48,6 +49,11 @@ InvokePaymentRequestUI(); EXPECT_TRUE(IsPayButtonEnabled()); + + // When an autofill payment app is selected the primary button should have + // "Pay" label. + EXPECT_EQ(l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON), + GetPrimaryButtonLabel()); } // With only an unsupported card (Amex) in the database, the pay button should @@ -220,6 +226,11 @@ // Payment button should be enabled with blank autofill profiles since the // payment handler supports shipping delegation. EXPECT_TRUE(IsPayButtonEnabled()); + + // When a 3rd party payment app is selected the primary button should have + // "Continue" label. + EXPECT_EQ(l10n_util::GetStringUTF16(IDS_PAYMENTS_CONTINUE_BUTTON), + GetPrimaryButtonLabel()); } // Payment sheet view skips showing contact section when the selected instrument
diff --git a/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc b/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc index d84ccde..6c7986a8 100644 --- a/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc +++ b/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc
@@ -89,9 +89,9 @@ // | Get help | // ------------------------------------ - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, chooser_controller->GetOkButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, chooser_controller->GetCancelButtonLabel()); SetLayoutManager(std::make_unique<views::FillLayout>()); @@ -109,15 +109,15 @@ if (reason.has_value() && dialog->bubble_reference_) dialog->bubble_reference_->CloseBubble(reason.value()); }; - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( closure_callback, base::Unretained(this), &DeviceChooserContentView::Accept, base::make_optional<BubbleCloseReason>(BUBBLE_CLOSE_ACCEPTED))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( closure_callback, base::Unretained(this), &DeviceChooserContentView::Cancel, base::make_optional<BubbleCloseReason>(BUBBLE_CLOSE_CANCELED))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(closure_callback, base::Unretained(this), &DeviceChooserContentView::Close, base::nullopt));
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc index 7085cf1..d27ebe2 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc
@@ -47,21 +47,21 @@ // To prevent permissions being accepted accidentally, and as a security // measure against crbug.com/619429, permission prompts should not be accepted // as the default action. - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_PERMISSION_DENY)); set_close_on_deactivate(false); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&permissions::PermissionPrompt::Delegate::Accept, base::Unretained(delegate))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&permissions::PermissionPrompt::Delegate::Deny, base::Unretained(delegate))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&permissions::PermissionPrompt::Delegate::Closing, base::Unretained(delegate)));
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc index f9b89a2..509315e 100644 --- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc +++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
@@ -528,14 +528,14 @@ SetBigImage(); int buttons = GetCurrentDialogButtons(); - DialogDelegate::set_buttons(buttons); + DialogDelegate::SetButtons(buttons); if (buttons & ui::DIALOG_BUTTON_OK) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, GetCurrentDialogButtonLabel(ui::DIALOG_BUTTON_OK)); } if (buttons & ui::DIALOG_BUTTON_CANCEL) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, GetCurrentDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL)); }
diff --git a/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc b/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc index 55b478c..a9695d6 100644 --- a/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc +++ b/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc
@@ -93,15 +93,15 @@ EnterpriseStartupDialog::DialogResultCallback callback) : callback_(std::move(callback)) { DialogDelegate::set_draggable(true); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); DialogDelegate::SetExtraView(CreateLogoView()); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&EnterpriseStartupDialogView::RunDialogCallback, base::Unretained(this), true)); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&EnterpriseStartupDialogView::RunDialogCallback, base::Unretained(this), false)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&EnterpriseStartupDialogView::RunDialogCallback, base::Unretained(this), false)); SetBorder(views::CreateEmptyBorder(GetDialogInsets())); @@ -140,7 +140,7 @@ ui::NativeTheme::kColorId_AlertSeverityHigh))); if (accept_button) { - // TODO(ellyjones): This should use DialogDelegate::set_button_label() + // TODO(ellyjones): This should use DialogDelegate::SetButtonLabel() // instead of changing the button text directly - this might break the // dialog's layout. GetOkButton()->SetText(*accept_button);
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index 512c187..8d32bb0f 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -356,7 +356,7 @@ close_bubble_helper_(this, browser) { DCHECK(!g_profile_bubble_); g_profile_bubble_ = this; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); // TODO(tluk): Remove when fixing https://crbug.com/822075 // The sign in webview will be clipped on the bottom corners without these // margins, see related bug <http://crbug.com/593203>.
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc index 5e7d783..c7c981f 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc +++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -90,14 +90,14 @@ : signin_view_controller_(signin_view_controller), browser_(browser), reauth_callback_(std::move(reauth_callback)) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - DialogDelegate::set_accept_callback( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetAcceptCallback( base::BindOnce(&SigninViewControllerFakeReauthDelegateView::OnAccept, base::Unretained(this))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&SigninViewControllerFakeReauthDelegateView::OnCancel, base::Unretained(this))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&SigninViewControllerFakeReauthDelegateView::OnClose, base::Unretained(this))); DisplayModal(); @@ -278,7 +278,7 @@ DCHECK(browser_->tab_strip_model()->GetActiveWebContents()) << "A tab must be active to present the sign-in modal dialog."; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); web_contents_->SetDelegate(this);
diff --git a/chrome/browser/ui/views/profiles/user_manager_view.cc b/chrome/browser/ui/views/profiles/user_manager_view.cc index 4dcaa4a..a7ea26f 100644 --- a/chrome/browser/ui/views/profiles/user_manager_view.cc +++ b/chrome/browser/ui/views/profiles/user_manager_view.cc
@@ -67,7 +67,7 @@ const std::string& email_address, const GURL& url) : parent_(parent), web_view_(web_view), email_address_(email_address) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::set_use_custom_frame(false); AddChildView(web_view_); @@ -294,7 +294,7 @@ : web_view_(nullptr), delegate_(nullptr), user_manager_started_showing_(base::Time()) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::set_use_custom_frame(false); keep_alive_ = std::make_unique<ScopedKeepAlive>( KeepAliveOrigin::USER_MANAGER_VIEW, KeepAliveRestartOption::DISABLED);
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc index c9eb40e9..004e334f 100644 --- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc +++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
@@ -75,7 +75,7 @@ controller_(controller) { DCHECK(controller); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } QRCodeGeneratorBubble::~QRCodeGeneratorBubble() = default;
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc index eda986da..fb67525 100644 --- a/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc +++ b/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc
@@ -145,12 +145,12 @@ detection_time, base::BindRepeating(&RelaunchRecommendedBubbleView::UpdateWindowTitle, base::Unretained(this))) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_RELAUNCH_ACCEPT_BUTTON)); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&base::RecordAction, base::UserMetricsAction("RelaunchRecommended_Close")));
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc index 8128a52..e6547079 100644 --- a/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc +++ b/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc
@@ -112,11 +112,11 @@ deadline, base::BindRepeating(&RelaunchRequiredDialogView::UpdateWindowTitle, base::Unretained(this))) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_button_label( + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_RELAUNCH_ACCEPT_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_RELAUNCH_REQUIRED_CANCEL_BUTTON)); SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc index 810113d0..1cb184d 100644 --- a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc +++ b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
@@ -35,16 +35,16 @@ base::OnceClosure cancel_callback, base::OnceClosure open_now_callback) : open_now_callback_(std::move(open_now_callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_DEEP_SCANNING_TIMED_OUT_DIALOG_ACCEPT_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( IDS_DEEP_SCANNING_TIMED_OUT_DIALOG_CANCEL_BUTTON)); - DialogDelegate::set_accept_callback(std::move(accept_callback)); - DialogDelegate::set_cancel_callback(std::move(cancel_callback)); + DialogDelegate::SetAcceptCallback(std::move(accept_callback)); + DialogDelegate::SetCancelCallback(std::move(cancel_callback)); auto open_now_button = views::MdTextButton::CreateSecondaryUiButton( this, l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_OPEN_NOW_BUTTON));
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc index 0d14b8e..035f29b 100644 --- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc +++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
@@ -155,14 +155,14 @@ if (password_type.account_type() != ReusedPasswordAccountType::SAVED_PASSWORD || show_check_passwords) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK | - ui::DIALOG_BUTTON_CANCEL); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | + ui::DIALOG_BUTTON_CANCEL); } else { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); } - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, - GetOkButtonLabel(password_type_)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, + GetOkButtonLabel(password_type_)); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_PAGE_INFO_IGNORE_PASSWORD_WARNING_BUTTON)); @@ -177,16 +177,15 @@ }, base::Unretained(&done_callback_), value); }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( (password_type_.account_type() != ReusedPasswordAccountType::SAVED_PASSWORD || show_check_passwords) - ? make_done_callback(WarningAction::CHANGE_PASSWORD) : base::DoNothing()); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( make_done_callback(WarningAction::IGNORE_WARNING)); - DialogDelegate::set_close_callback(make_done_callback(WarningAction::CLOSE)); + DialogDelegate::SetCloseCallback(make_done_callback(WarningAction::CLOSE)); // |service| maybe NULL in tests. if (service_)
diff --git a/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc b/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc index 401dc975..d571840 100644 --- a/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc +++ b/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc
@@ -42,13 +42,13 @@ base::OnceClosure open_now_callback) : web_contents_(web_contents), open_now_callback_(std::move(open_now_callback)) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_ACCEPT_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_CANCEL_BUTTON)); - DialogDelegate::set_accept_callback(std::move(accept_callback)); + DialogDelegate::SetAcceptCallback(std::move(accept_callback)); auto open_now_button = views::MdTextButton::CreateSecondaryUiButton( this, l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_OPEN_NOW_BUTTON));
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc index a804823..49f1ccc7 100644 --- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc +++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
@@ -42,7 +42,7 @@ : LocationBarBubbleDelegateView(anchor_view, web_contents), web_contents_(web_contents), controller_(controller) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DCHECK(controller); }
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view.cc b/chrome/browser/ui/views/session_crashed_bubble_view.cc index d520b7e..0a642e9d 100644 --- a/chrome/browser/ui/views/session_crashed_bubble_view.cc +++ b/chrome/browser/ui/views/session_crashed_bubble_view.cc
@@ -185,22 +185,22 @@ SessionStartupPref::GetStartupPref(browser_->profile()); // Offer the option to open the startup pages using the cancel button, but // only when the user has selected the URLS option, and set at least one url. - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( (session_startup_pref.type == SessionStartupPref::URLS && !session_startup_pref.urls.empty()) ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_RESTORE_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_STARTUP_PAGES_BUTTON)); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&SessionCrashedBubbleView::RestorePreviousSession, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &SessionCrashedBubbleView::OpenStartupPages, base::Unretained(this))); set_close_on_deactivate(false);
diff --git a/chrome/browser/ui/views/settings_reset_prompt_dialog.cc b/chrome/browser/ui/views/settings_reset_prompt_dialog.cc index 76047ba..f0be6b0 100644 --- a/chrome/browser/ui/views/settings_reset_prompt_dialog.cc +++ b/chrome/browser/ui/views/settings_reset_prompt_dialog.cc
@@ -39,16 +39,16 @@ : browser_(nullptr), controller_(controller) { DCHECK(controller_); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_SETTINGS_RESET_PROMPT_ACCEPT_BUTTON_LABEL)); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&safe_browsing::SettingsResetPromptController::Accept, base::Unretained(controller_))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&safe_browsing::SettingsResetPromptController::Cancel, base::Unretained(controller_))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&safe_browsing::SettingsResetPromptController::Close, base::Unretained(controller_)));
diff --git a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc index d42c3bc..c184f97 100644 --- a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc +++ b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
@@ -180,7 +180,7 @@ SharingDialogData data) : LocationBarBubbleDelegateView(anchor_view, web_contents), data_(std::move(data)) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::SetFootnoteView( CreateHelpOrOriginView(data_, web_contents, this)); set_close_on_main_frame_origin_navigation(true);
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc index 6f39790..27e14ce5 100644 --- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc +++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
@@ -59,12 +59,12 @@ set_parent_window( platform_util::GetViewForWindow(browser->window()->GetNativeWindow())); } - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL)); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &StoragePressureBubbleView::OnDialogAccepted, base::Unretained(this))); }
diff --git a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc index 37a3411..923b08d 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc +++ b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc
@@ -126,10 +126,10 @@ advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); DialogDelegate::SetExtraView(std::move(advanced_link)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON));
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc index 18f1239..a8f34f7 100644 --- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc +++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
@@ -52,13 +52,13 @@ username_(username), delegate_(std::move(delegate)), prompt_for_new_profile_(prompt_for_new_profile) { - DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_button_label( + DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(prompt_for_new_profile_ ? IDS_ENTERPRISE_SIGNIN_CREATE_NEW_PROFILE : IDS_ENTERPRISE_SIGNIN_CONTINUE)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_ENTERPRISE_SIGNIN_CANCEL)); @@ -76,11 +76,11 @@ dialog->delegate_.reset(); } }; - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(notify_delegate, base::Unretained(this), prompt_for_new_profile_ ? &Delegate::OnSigninWithNewProfile : &Delegate::OnContinueSignin)); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( notify_delegate, base::Unretained(this), &Delegate::OnCancelSignin)); chrome::RecordDialogCreation(
diff --git a/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc b/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc index bfbc92a8..8350d07f 100644 --- a/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc +++ b/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc
@@ -32,25 +32,25 @@ std::unique_ptr<TabModalConfirmDialogDelegate> delegate, content::WebContents* web_contents) : delegate_(std::move(delegate)) { - DialogDelegate::set_buttons(delegate_->GetDialogButtons()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtons(delegate_->GetDialogButtons()); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, delegate_->GetAcceptButtonTitle()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, delegate_->GetCancelButtonTitle()); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&TabModalConfirmDialogDelegate::Accept, base::Unretained(delegate_.get()))); - DialogDelegate::set_cancel_callback( + DialogDelegate::SetCancelCallback( base::BindOnce(&TabModalConfirmDialogDelegate::Cancel, base::Unretained(delegate_.get()))); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&TabModalConfirmDialogDelegate::Close, base::Unretained(delegate_.get()))); base::Optional<int> default_button = delegate_->GetDefaultDialogButton(); if (bool(default_button)) - DialogDelegate::set_default_button(*default_button); + DialogDelegate::SetDefaultButton(*default_button); views::MessageBoxView::InitParams init_params(delegate_->GetDialogMessage()); init_params.inter_row_vertical_spacing =
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc index 730b137..46cde38 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -101,7 +101,7 @@ set_margins(gfx::Insets()); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); const base::string16 title = browser_->tab_strip_model() ->group_model() @@ -109,7 +109,7 @@ ->visual_data() ->title(); title_at_opening_ = title; - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( &TabGroupEditorBubbleView::OnBubbleClose, base::Unretained(this))); const auto* layout_provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc index 58cdc33..697dbbc 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -386,7 +386,7 @@ TabHoverCardBubbleView::TabHoverCardBubbleView(Tab* tab) : BubbleDialogDelegateView(tab, views::BubbleBorder::TOP_LEFT) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); // We'll do all of our own layout inside the bubble, so no need to inset this // view inside the client view.
diff --git a/chrome/browser/ui/views/task_manager_view.cc b/chrome/browser/ui/views/task_manager_view.cc index 3e87569..3265a36 100644 --- a/chrome/browser/ui/views/task_manager_view.cc +++ b/chrome/browser/ui/views/task_manager_view.cc
@@ -286,15 +286,15 @@ tab_table_parent_(nullptr), is_always_on_top_(false) { DialogDelegate::set_use_custom_frame(false); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); - DialogDelegate::set_button_label( + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL)); // Avoid calling Accept() when closing the dialog, since Accept() here means // "kill task" (!). // TODO(ellyjones): Remove this once the Accept() override is removed from // this class. - DialogDelegate::set_close_callback(base::DoNothing()); + DialogDelegate::SetCloseCallback(base::DoNothing()); Init(); chrome::RecordDialogCreation(chrome::DialogIdentifier::TASK_MANAGER);
diff --git a/chrome/browser/ui/views/toolbar/home_button.cc b/chrome/browser/ui/views/toolbar/home_button.cc index 37d484e..d1bca14 100644 --- a/chrome/browser/ui/views/toolbar/home_button.cc +++ b/chrome/browser/ui/views/toolbar/home_button.cc
@@ -88,7 +88,7 @@ browser_(browser), undo_value_is_ntp_(undo_value_is_ntp), undo_url_(undo_url) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_margins( ChromeLayoutProvider::Get()->GetInsetsMetric(views::INSETS_DIALOG)); chrome::RecordDialogCreation(chrome::DialogIdentifier::HOME_PAGE_UNDO);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc index 93fcba05..fef5619f 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc
@@ -41,20 +41,20 @@ buttons |= ui::DIALOG_BUTTON_OK; if (!cancel_text.empty()) buttons |= ui::DIALOG_BUTTON_CANCEL; - DialogDelegate::set_buttons(buttons); - DialogDelegate::set_default_button(delegate_->GetDefaultDialogButton()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, ok_text); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, cancel_text); + DialogDelegate::SetButtons(buttons); + DialogDelegate::SetDefaultButton(delegate_->GetDefaultDialogButton()); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, ok_text); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_text); DialogDelegate::SetExtraView(CreateExtraInfoView()); - DialogDelegate::set_accept_callback(base::BindOnce( + DialogDelegate::SetAcceptCallback(base::BindOnce( &ToolbarActionsBarBubbleViews::NotifyDelegateOfClose, base::Unretained(this), ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE)); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &ToolbarActionsBarBubbleViews::NotifyDelegateOfClose, base::Unretained(this), ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION)); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( &ToolbarActionsBarBubbleViews::NotifyDelegateOfClose, base::Unretained(this), ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION));
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc index 7e59e10..7df689a 100644 --- a/chrome/browser/ui/views/translate/translate_bubble_view.cc +++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -654,7 +654,7 @@ if (web_contents) // web_contents can be null in unit_tests. mouse_handler_ = std::make_unique<WebContentMouseHandler>(this, web_contents); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); DialogDelegate::SetFootnoteView(CreateWordmarkView(bubble_ui_model_)); chrome::RecordDialogCreation(chrome::DialogIdentifier::TRANSLATE); }
diff --git a/chrome/browser/ui/views/uninstall_view.cc b/chrome/browser/ui/views/uninstall_view.cc index 468a1886..d1a730e 100644 --- a/chrome/browser/ui/views/uninstall_view.cc +++ b/chrome/browser/ui/views/uninstall_view.cc
@@ -28,14 +28,14 @@ browsers_combo_(NULL), user_selection_(*user_selection), quit_closure_(quit_closure) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_UNINSTALL_BUTTON_TEXT)); - DialogDelegate::set_accept_callback( + DialogDelegate::SetAcceptCallback( base::BindOnce(&UninstallView::OnDialogAccepted, base::Unretained(this))); - DialogDelegate::set_cancel_callback(base::BindOnce( + DialogDelegate::SetCancelCallback(base::BindOnce( &UninstallView::OnDialogCancelled, base::Unretained(this))); - DialogDelegate::set_close_callback(base::BindOnce( + DialogDelegate::SetCloseCallback(base::BindOnce( &UninstallView::OnDialogCancelled, base::Unretained(this))); set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType( views::TEXT, views::TEXT));
diff --git a/chrome/browser/ui/views/update_recommended_message_box.cc b/chrome/browser/ui/views/update_recommended_message_box.cc index 79fe5720..06e78fb 100644 --- a/chrome/browser/ui/views/update_recommended_message_box.cc +++ b/chrome/browser/ui/views/update_recommended_message_box.cc
@@ -35,9 +35,9 @@ // UpdateRecommendedMessageBox, private: UpdateRecommendedMessageBox::UpdateRecommendedMessageBox() { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_RELAUNCH_AND_UPDATE)); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_NOT_NOW)); base::string16 update_message; #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc index fd7ec909..0948d4d8 100644 --- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc +++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
@@ -86,7 +86,7 @@ web_app_info_(std::move(web_app_info)), callback_(std::move(callback)) { DCHECK(web_app_info_); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_INSTALL_PWA_BUTTON_LABEL)); base::TrimWhitespace(web_app_info_->title, base::TRIM_ALL,
diff --git a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc index 9c5b04a..b9b280a 100644 --- a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc +++ b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
@@ -44,7 +44,7 @@ chrome::AppInstallationAcceptanceCallback callback) : web_app_info_(std::move(web_app_info)), callback_(std::move(callback)) { DCHECK(web_app_info_); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_BUTTON_LABEL)); const ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc index 3627ba1..b3b7e58 100644 --- a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc +++ b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
@@ -65,7 +65,7 @@ std::make_unique<WebAppInfoImageSource>(kIconSizeInDip, icon_bitmaps), image_size); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc index 804d99d4..803e84e 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -73,7 +73,7 @@ DCHECK(!model_->should_dialog_be_closed()); model_->AddObserver(this); - DialogDelegate::set_close_callback( + DialogDelegate::SetCloseCallback( base::BindOnce(&AuthenticatorRequestDialogView::OnDialogClosing, base::Unretained(this))); @@ -313,13 +313,13 @@ buttons |= ui::DIALOG_BUTTON_OK; if (sheet()->model()->IsCancelButtonVisible()) buttons |= ui::DIALOG_BUTTON_CANCEL; - DialogDelegate::set_buttons(buttons); - DialogDelegate::set_default_button((buttons & ui::DIALOG_BUTTON_OK) + DialogDelegate::SetButtons(buttons); + DialogDelegate::SetDefaultButton((buttons & ui::DIALOG_BUTTON_OK) ? ui::DIALOG_BUTTON_OK : ui::DIALOG_BUTTON_NONE); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, sheet_->model()->GetAcceptButtonLabel()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, sheet_->model()->GetCancelButtonLabel()); // Whether to show the `Choose another option` button, or other dialog
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc b/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc index 77abe22e..ff42bc9e 100644 --- a/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
@@ -29,11 +29,11 @@ } // namespace ConfirmSignoutDialog::ConfirmSignoutDialog() { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( IDS_ADD_SUPERVISION_EXIT_DIALOG_SIGNOUT_BUTTON_LABEL)); - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16( IDS_ADD_SUPERVISION_EXIT_DIALOG_CANCEL_BUTTON_LABEL));
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc index 3509b31..5889a94 100644 --- a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
@@ -332,7 +332,7 @@ VerifyDisplayString( event, "Updates are managed by <a target=\"_blank\" " - "href=\"https://support.google.com/accounts/answer/6208960\">your " + "href=\"https://support.google.com/chrome?p=your_administrator\">your " "administrator</a>"); } @@ -360,9 +360,8 @@ VerifyDisplayString( event, "Browser didn't update, something went wrong. <a target=\"_blank\" " - "href=\"https://support.google.com/chrome/answer/111996\">Fix " - "Browser " - "update problems and failed updates.</a>"); + "href=\"https://support.google.com/chrome?p=fix_chrome_updates\">Fix " + "Browser update problems and failed updates.</a>"); } TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_Enabled) { @@ -410,7 +409,7 @@ VerifyDisplayString( event, "<a target=\"_blank\" " - "href=\"https://support.google.com/accounts/answer/6208960\">Your " + "href=\"https://support.google.com/chrome?p=your_administrator\">Your " "administrator</a> has turned off Safe Browsing"); }
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc index ff2d9382..413a9b42 100644 --- a/chrome/common/url_constants.cc +++ b/chrome/common/url_constants.cc
@@ -35,11 +35,8 @@ const char kChromeBetaForumURL[] = "https://support.google.com/chrome/?p=beta_forum"; -// TODO(https://crbug.com/1015841): Replace answer number with p-link once the -// p-link has been created. -// https://bugs.chromium.org/p/chromium/issues/detail?id=679462 const char kChromeFixUpdateProblems[] = - "https://support.google.com/chrome/answer/111996"; + "https://support.google.com/chrome?p=fix_chrome_updates"; // TODO: replace w/link after marketing provides it. const char kChromeReleaseNotesURL[] = @@ -273,11 +270,8 @@ "https://support.google.com/installer/?product=" "{8A69D345-D564-463c-AFF1-A69D9E530F96}&error="; -// TODO(https://crbug.com/1015841): Replace answer number with p-link once the -// p-link has been created. -// https://bugs.chromium.org/p/chromium/issues/detail?id=679462 const char kWhoIsMyAdministratorHelpURL[] = - "https://support.google.com/accounts/answer/6208960"; + "https://support.google.com/chrome?p=your_administrator"; #if defined(OS_ANDROID) const char kAndroidAppScheme[] = "android-app";
diff --git a/chrome/test/data/page_load_metrics/blank_with_positioned_iframe_writer.html b/chrome/test/data/page_load_metrics/blank_with_positioned_iframe_writer.html new file mode 100644 index 0000000..164e289 --- /dev/null +++ b/chrome/test/data/page_load_metrics/blank_with_positioned_iframe_writer.html
@@ -0,0 +1,27 @@ +<html> +<body> +<script> +// Creates an iframe element with an absolute x and y position and dimensions +// width and height. The iframe element is appended to the body element. +// Make sure the caller has a body element! +function createIframeAtRect(frame_id, x, y, width, height) { + let frame = document.createElement('iframe'); + frame.id = frame_id; + frame.style.border = "0px none transparent"; + frame.style.overflow = "hidden"; + frame.style.position = "absolute"; + frame.style.left = x; + frame.style.top = y; + frame.scrolling = "no"; + frame.frameborder="0"; + frame.allowTransparency="true"; + frame.width = width; + frame.height = height; + document.body.appendChild(frame); + return frame; +} +</script> +</body> +</html> + +
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index f5f9d19..7790f98 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -62,7 +62,7 @@ ]), }; -TEST_F('CrSettingsCheckboxTest', 'All', function() { +TEST_F('CrSettingsCheckboxTest', 'DISABLED_All', function() { mocha.run(); }); @@ -394,7 +394,7 @@ ]), }; -TEST_F('CrSettingsPasswordsCheckTest', 'All', function() { +TEST_F('CrSettingsPasswordsCheckTest', 'DISABLED_All', function() { mocha.run(); }); @@ -1643,7 +1643,7 @@ ]), }; -TEST_F('CrSettingsSiteDataTest', 'All', function() { +TEST_F('CrSettingsSiteDataTest', 'DISABLED_All', function() { mocha.run(); });
diff --git a/chrome/test/payments/payment_request_test_controller_desktop.cc b/chrome/test/payments/payment_request_test_controller_desktop.cc index cfdf351..cfee9fe0f 100644 --- a/chrome/test/payments/payment_request_test_controller_desktop.cc +++ b/chrome/test/payments/payment_request_test_controller_desktop.cc
@@ -127,9 +127,9 @@ PaymentRequestWebContentsManager* manager = PaymentRequestWebContentsManager::GetOrCreateForWebContents( web_contents); - manager->CreatePaymentRequest(web_contents->GetMainFrame(), - web_contents, std::move(delegate), - std::move(receiver), observer_for_test); + manager->CreatePaymentRequest(render_frame_host, web_contents, + std::move(delegate), std::move(receiver), + observer_for_test); }, observer_converter_.get(), is_incognito_, valid_ssl_, prefs_.get())); }
diff --git a/chrome/updater/app/app_update_all.cc b/chrome/updater/app/app_update_all.cc index 389895168..22aac99 100644 --- a/chrome/updater/app/app_update_all.cc +++ b/chrome/updater/app/app_update_all.cc
@@ -25,6 +25,7 @@ void Initialize() override; scoped_refptr<Configurator> config_; + std::unique_ptr<UpdateService> update_service_; }; void AppUpdateAll::Initialize() { @@ -33,9 +34,12 @@ // AppUpdateAll triggers an update of all registered applications. void AppUpdateAll::FirstTaskRun() { - CreateUpdateService(config_)->UpdateAll(base::BindOnce( + update_service_ = CreateUpdateService(config_); + update_service_->UpdateAll(base::BindOnce( [](base::OnceCallback<void(int)> quit, update_client::Error error) { - VLOG(0) << "UpdateAll complete: error = " << static_cast<int>(error); + const int err = static_cast<int>(error); + VLOG(0) << "UpdateAll complete: error = " << err << "/0x" << std::hex + << err; std::move(quit).Run(static_cast<int>(error)); }, base::BindOnce(&AppUpdateAll::Shutdown, this)));
diff --git a/chrome/updater/update_apps_win.cc b/chrome/updater/update_apps_win.cc index 355b133..2a28990 100644 --- a/chrome/updater/update_apps_win.cc +++ b/chrome/updater/update_apps_win.cc
@@ -17,7 +17,7 @@ if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSingleProcessSwitch)) return std::make_unique<UpdateServiceInProcess>(config); else - return std::make_unique<UpdateServiceOutOfProcess>(); + return UpdateServiceOutOfProcess::CreateInstance(); } } // namespace updater
diff --git a/chrome/updater/update_service.h b/chrome/updater/update_service.h index 4074227..f8455ef 100644 --- a/chrome/updater/update_service.h +++ b/chrome/updater/update_service.h
@@ -21,7 +21,8 @@ // All functions and callbacks must be called on the same sequence. class UpdateService { public: - typedef update_client::Error Result; + using Result = update_client::Error; + // Possible states for updating an app. enum class UpdateState { // This value represents the absence of a state. No update request has
diff --git a/chrome/updater/win/update_service_out_of_process.cc b/chrome/updater/win/update_service_out_of_process.cc index 82df517..e8f25e1 100644 --- a/chrome/updater/win/update_service_out_of_process.cc +++ b/chrome/updater/win/update_service_out_of_process.cc
@@ -4,8 +4,26 @@ #include "chrome/updater/win/update_service_out_of_process.h" +#include <windows.h> +#include <wrl/client.h> + +#include <memory> +#include <utility> + +#include "base/bind.h" #include "base/callback.h" #include "base/logging.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "chrome/updater/server/win/updater_idl.h" + +namespace { + +static constexpr base::TaskTraits kComClientTraits = { + base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}; + +} // namespace namespace updater { @@ -15,6 +33,17 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } +std::unique_ptr<UpdateServiceOutOfProcess> +UpdateServiceOutOfProcess::CreateInstance() { + struct Creator : public UpdateServiceOutOfProcess {}; + auto instance = std::make_unique<Creator>(); + instance->com_task_runner_ = + base::ThreadPool::CreateCOMSTATaskRunner(kComClientTraits); + if (!instance->com_task_runner_) + return nullptr; + return instance; +} + void UpdateServiceOutOfProcess::RegisterApp( const RegistrationRequest& request, base::OnceCallback<void(const RegistrationResponse&)> callback) { @@ -31,7 +60,9 @@ // TODO(sorin) the updater must be run with "--single-process" until // crbug.com/1053729 is resolved. - NOTREACHED(); + com_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&UpdateServiceOutOfProcess::UpdateAllOnSTA, + base::Unretained(this), std::move(callback))); } void UpdateServiceOutOfProcess::Update(const std::string& app_id, @@ -45,4 +76,33 @@ NOTREACHED(); } +void UpdateServiceOutOfProcess::UpdateAllOnSTA( + base::OnceCallback<void(Result)> callback) { + DCHECK(com_task_runner_->BelongsToCurrentThread()); + + Microsoft::WRL::ComPtr<IUnknown> server; + HRESULT hr = ::CoCreateInstance(CLSID_UpdaterClass, nullptr, + CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&server)); + if (FAILED(hr)) { + VLOG(2) << "Failed to instantiate the update server. " << std::hex << hr; + std::move(callback).Run(static_cast<Result>(hr)); + return; + } + + Microsoft::WRL::ComPtr<IUpdater> updater; + hr = server.As(&updater); + if (FAILED(hr)) { + VLOG(2) << "Failed to query the updater interface. " << std::hex << hr; + std::move(callback).Run(static_cast<Result>(hr)); + return; + } + + hr = updater->UpdateAll(); + if (FAILED(hr)) { + VLOG(2) << "Failed to call IUpdater::UpdateAll" << std::hex << hr; + std::move(callback).Run(static_cast<Result>(hr)); + return; + } +} + } // namespace updater
diff --git a/chrome/updater/win/update_service_out_of_process.h b/chrome/updater/win/update_service_out_of_process.h index e0256810..2287316 100644 --- a/chrome/updater/win/update_service_out_of_process.h +++ b/chrome/updater/win/update_service_out_of_process.h
@@ -5,12 +5,18 @@ #ifndef CHROME_UPDATER_WIN_UPDATE_SERVICE_OUT_OF_PROCESS_H_ #define CHROME_UPDATER_WIN_UPDATE_SERVICE_OUT_OF_PROCESS_H_ +#include <memory> #include <string> #include "base/callback_forward.h" +#include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" #include "chrome/updater/update_service.h" +namespace base { +class SingleThreadTaskRunner; +} // namespace base + namespace update_client { enum class Error; } // namespace update_client @@ -23,12 +29,13 @@ // All functions and callbacks must be called on the same sequence. class UpdateServiceOutOfProcess : public UpdateService { public: - UpdateServiceOutOfProcess(); UpdateServiceOutOfProcess(const UpdateServiceOutOfProcess&) = delete; UpdateServiceOutOfProcess& operator=(const UpdateServiceOutOfProcess&) = delete; ~UpdateServiceOutOfProcess() override; + static std::unique_ptr<UpdateServiceOutOfProcess> CreateInstance(); + // Overrides for updater::UpdateService. // Update-checks all registered applications. Calls |callback| once the // operation is complete. @@ -42,7 +49,12 @@ base::OnceCallback<void(Result)> done) override; private: + UpdateServiceOutOfProcess(); + void UpdateAllOnSTA(base::OnceCallback<void(Result)> callback); + SEQUENCE_CHECKER(sequence_checker_); + + scoped_refptr<base::SingleThreadTaskRunner> com_task_runner_; }; } // namespace updater
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index e82f8f2a..c7112ef 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -12972.0.0 \ No newline at end of file +12973.0.0 \ No newline at end of file
diff --git a/chromeos/components/print_management/resources/BUILD.gn b/chromeos/components/print_management/resources/BUILD.gn index fba0ab3..993c3b7 100644 --- a/chromeos/components/print_management/resources/BUILD.gn +++ b/chromeos/components/print_management/resources/BUILD.gn
@@ -31,7 +31,7 @@ } group("polymer3_elements") { - deps = [ + public_deps = [ ":print_management_module", ":scanning_ui_module", ]
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt index 1ca1e9c..d54acddd 100644 --- a/chromeos/profiles/airmont.afdo.newest.txt +++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-airmont-82-4072.0-1583751487-benchmark-82.0.4081.0-r1-redacted.afdo.xz \ No newline at end of file +chromeos-chrome-amd64-airmont-82-4072.0-1583751487-benchmark-82.0.4082.0-r1-redacted.afdo.xz \ No newline at end of file
diff --git a/chromeos/resources/BUILD.gn b/chromeos/resources/BUILD.gn index 335a928..823bd74 100644 --- a/chromeos/resources/BUILD.gn +++ b/chromeos/resources/BUILD.gn
@@ -138,8 +138,6 @@ source = "../components/print_management/resources/print_management_resources.grd" - source_is_generated = true - deps = [ "../components/print_management/resources:polymer3_elements" ] outputs = [
diff --git a/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc b/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc index 1ae0474..17f8578 100644 --- a/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc +++ b/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc
@@ -85,7 +85,8 @@ for (const auto& remote_device : test_devices_) { bool should_be_host = host_device != base::nullopt && - host_device->GetDeviceId() == remote_device.GetDeviceId(); + host_device->GetDeviceId() == remote_device.GetDeviceId() && + host_device->instance_id() == remote_device.instance_id(); GetMutableRemoteDevice(remote_device)->software_features[host_type] = should_be_host ? multidevice::SoftwareFeatureState::kEnabled
diff --git a/components/autofill/core/common/signatures_util.cc b/components/autofill/core/common/signatures_util.cc index cf342fa1..3d6a98df 100644 --- a/components/autofill/core/common/signatures_util.cc +++ b/components/autofill/core/common/signatures_util.cc
@@ -9,18 +9,21 @@ #include "base/hash/sha1.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" #include "components/autofill/core/common/autofill_util.h" #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/form_field_data.h" #include "url/gurl.h" +using base::UTF16ToUTF8; + namespace autofill { namespace { // Returns a copy of |input| without >= 5 consecutive digits. std::string StripDigitsIfRequired(const base::string16& input) { - std::string input_utf8 = base::UTF16ToUTF8(input); + std::string input_utf8 = UTF16ToUTF8(input); std::string result; result.reserve(input_utf8.length()); @@ -43,6 +46,19 @@ } // namespace +// If a form name was set by Chrome, we should ignore it when calculating +// the form signature. +std::string GetDOMFormName(const std::string& form_name) { +#if defined(OS_IOS) + // In case of an empty form name, the synthetic name is created. Ignore it. + return (StartsWith(form_name, "gChrome~form~", base::CompareCase::SENSITIVE) + ? std::string() + : form_name); +#else + return form_name; +#endif +} + FormSignature CalculateFormSignature(const FormData& form_data) { const GURL& target_url = form_data.action; const GURL& source_url = form_data.url; @@ -67,9 +83,9 @@ } } - std::string form_string = scheme + "://" + host + "&" + - base::UTF16ToUTF8(form_data.name) + - form_signature_field_names; + std::string form_name = GetDOMFormName(UTF16ToUTF8(form_data.name)); + std::string form_string = + scheme + "://" + host + "&" + form_name + form_signature_field_names; return StrToHash64Bit(form_string); } @@ -77,7 +93,7 @@ FieldSignature CalculateFieldSignatureByNameAndType( const base::string16& field_name, const std::string& field_type) { - std::string name = base::UTF16ToUTF8(field_name); + std::string name = UTF16ToUTF8(field_name); std::string field_string = name + "&" + field_type; return StrToHash32Bit(field_string); }
diff --git a/components/autofill_assistant/browser/actions/prompt_action.cc b/components/autofill_assistant/browser/actions/prompt_action.cc index 23890eb6..7d64511 100644 --- a/components/autofill_assistant/browser/actions/prompt_action.cc +++ b/components/autofill_assistant/browser/actions/prompt_action.cc
@@ -135,6 +135,7 @@ for (int i = 0; i < proto_.prompt().choices_size(); i++) { auto& choice_proto = proto_.prompt().choices(i); UserAction user_action(choice_proto.chip(), choice_proto.direct_action(), + /* enabled = */ true, /* identifier = */ std::string()); if (!user_action.has_triggers()) continue;
diff --git a/components/autofill_assistant/browser/actions/show_form_action.cc b/components/autofill_assistant/browser/actions/show_form_action.cc index ce8391e..ca6897ea 100644 --- a/components/autofill_assistant/browser/actions/show_form_action.cc +++ b/components/autofill_assistant/browser/actions/show_form_action.cc
@@ -48,7 +48,7 @@ // Show "Continue" chip. UserAction user_action = UserAction(proto_.show_form().chip(), proto_.show_form().direct_action(), - /* identifier = */ std::string()); + /* enabled = */ true, /* identifier = */ std::string()); if (user_action.chip().empty()) { user_action.chip().text = l10n_util::GetStringUTF8(IDS_AUTOFILL_ASSISTANT_PAYMENT_INFO_CONFIRM);
diff --git a/components/autofill_assistant/browser/basic_interactions.cc b/components/autofill_assistant/browser/basic_interactions.cc index d2a25808..4f737d55f 100644 --- a/components/autofill_assistant/browser/basic_interactions.cc +++ b/components/autofill_assistant/browser/basic_interactions.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "components/autofill_assistant/browser/basic_interactions.h" +#include <algorithm> #include "base/bind_helpers.h" #include "base/i18n/time_formatting.h" #include "base/strings/string_number_conversions.h" @@ -361,6 +362,59 @@ return true; } +bool BasicInteractions::ToggleUserAction(const ToggleUserActionProto& proto) { + auto user_actions_value = delegate_->GetUserModel()->GetValue( + proto.user_actions_model_identifier()); + if (!user_actions_value.has_value()) { + DVLOG(2) << "Error evaluating " << __func__ << ": " + << proto.user_actions_model_identifier() << " not found in model"; + return false; + } + if (!user_actions_value->has_user_actions()) { + DVLOG(2) << "Error evaluating " << __func__ + << ": expected user_actions_model_identifier to contain user " + "actions, but was " + << *user_actions_value; + return false; + } + + auto enabled_value = + delegate_->GetUserModel()->GetValue(proto.enabled_model_identifier()); + if (!enabled_value.has_value()) { + DVLOG(2) << "Error evaluating " << __func__ << ": " + << proto.enabled_model_identifier() << " not found in model"; + return false; + } + if (enabled_value->booleans().values_size() != 1) { + DVLOG(2) << "Error evaluating " << __func__ + << ": expected enabled_model_identifier to contain a single bool, " + "but was " + << *enabled_value; + return false; + } + + auto user_action_it = std::find_if( + user_actions_value->user_actions().values().cbegin(), + user_actions_value->user_actions().values().cend(), + [&](const UserActionProto& user_action) { + return user_action.identifier() == proto.user_action_identifier(); + }); + if (user_action_it == user_actions_value->user_actions().values().cend()) { + DVLOG(2) << "Error evaluating " << __func__ << ": " + << proto.user_action_identifier() << " not found in " + << *user_actions_value; + return false; + } + auto user_action_index = + user_action_it - user_actions_value->user_actions().values().cbegin(); + user_actions_value->mutable_user_actions() + ->mutable_values(user_action_index) + ->set_enabled(enabled_value->booleans().values(0)); + delegate_->GetUserModel()->SetValue(proto.user_actions_model_identifier(), + *user_actions_value); + return true; +} + bool BasicInteractions::EndAction(const EndActionProto& proto) { CHECK(end_action_callback_) << "Failed to EndAction: no callback set"; std::move(end_action_callback_)
diff --git a/components/autofill_assistant/browser/basic_interactions.h b/components/autofill_assistant/browser/basic_interactions.h index d4e73bc..d9354ed 100644 --- a/components/autofill_assistant/browser/basic_interactions.h +++ b/components/autofill_assistant/browser/basic_interactions.h
@@ -39,6 +39,9 @@ // true on success, false on error. bool SetUserActions(const SetUserActionsProto& proto); + // Enables or disables a user action. Returns true on success, false on error. + bool ToggleUserAction(const ToggleUserActionProto& proto); + // Ends the current action. Can only be called during a ShowGenericUiAction. bool EndAction(const EndActionProto& proto);
diff --git a/components/autofill_assistant/browser/basic_interactions_unittest.cc b/components/autofill_assistant/browser/basic_interactions_unittest.cc index 5867ea7..18e74fbe 100644 --- a/components/autofill_assistant/browser/basic_interactions_unittest.cc +++ b/components/autofill_assistant/browser/basic_interactions_unittest.cc
@@ -13,6 +13,11 @@ namespace autofill_assistant { +using ::testing::ElementsAre; +using ::testing::Eq; +using ::testing::Property; +using ::testing::StrEq; + namespace { DateProto CreateDateProto(int year, int month, int day) { DateProto proto; @@ -347,4 +352,72 @@ EXPECT_EQ(user_model_.GetValue("result"), SimpleValue(true)); } +TEST_F(BasicInteractionsTest, ToggleUserAction) { + ToggleUserActionProto proto; + ValueProto user_actions_value; + UserActionProto cancel_user_action; + cancel_user_action.set_identifier("cancel_identifier"); + cancel_user_action.mutable_chip()->set_type(ChipType::CANCEL_ACTION); + cancel_user_action.mutable_chip()->set_text("Cancel"); + *user_actions_value.mutable_user_actions()->add_values() = cancel_user_action; + UserActionProto done_user_action; + done_user_action.set_identifier("done_identifier"); + done_user_action.mutable_chip()->set_type(ChipType::HIGHLIGHTED_ACTION); + done_user_action.mutable_chip()->set_text("Done"); + *user_actions_value.mutable_user_actions()->add_values() = done_user_action; + user_model_.SetValue("chips", user_actions_value); + user_model_.SetValue("enabled", SimpleValue(false)); + + // Missing fields. + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + proto.set_user_actions_model_identifier("chips"); + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + proto.set_enabled_model_identifier("enabled"); + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + proto.set_user_action_identifier("done_identifier"); + EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto)); + + // Wrong value types/sizes. + user_model_.SetValue("chips", SimpleValue(3)); + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + user_model_.SetValue("chips", user_actions_value); + user_model_.SetValue("enabled", SimpleValue(2)); + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + ValueProto multi_bool; + multi_bool.mutable_booleans()->add_values(true); + multi_bool.mutable_booleans()->add_values(false); + user_model_.SetValue("enabled", multi_bool); + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + user_model_.SetValue("enabled", SimpleValue(false)); + EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto)); + + // Wrong user action identifier. + proto.set_user_action_identifier("wrong"); + EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto)); + proto.set_user_action_identifier("cancel_identifier"); + EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto)); + + // Check changes to values. + user_model_.SetValue("chips", user_actions_value); + user_model_.SetValue("enabled", SimpleValue(false)); + proto.set_user_action_identifier("done_identifier"); + EXPECT_THAT( + user_model_.GetValue("chips")->user_actions().values(), + ElementsAre(AllOf(Property(&UserActionProto::identifier, + StrEq("cancel_identifier")), + Property(&UserActionProto::enabled, Eq(true))), + AllOf(Property(&UserActionProto::identifier, + StrEq("done_identifier")), + Property(&UserActionProto::enabled, Eq(true))))); + EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto)); + EXPECT_THAT( + user_model_.GetValue("chips")->user_actions().values(), + ElementsAre(AllOf(Property(&UserActionProto::identifier, + StrEq("cancel_identifier")), + Property(&UserActionProto::enabled, Eq(true))), + AllOf(Property(&UserActionProto::identifier, + StrEq("done_identifier")), + Property(&UserActionProto::enabled, Eq(false))))); +} + } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/interactions.proto b/components/autofill_assistant/browser/interactions.proto index 5cf00ff..c599309 100644 --- a/components/autofill_assistant/browser/interactions.proto +++ b/components/autofill_assistant/browser/interactions.proto
@@ -36,6 +36,7 @@ EndActionProto end_action = 6; ShowCalendarPopupProto show_calendar_popup = 7; SetTextProto set_text = 8; + ToggleUserActionProto toggle_user_action = 9; } } @@ -198,6 +199,17 @@ optional string model_identifier = 1; } +// Enables or disables a single user action. Modifies the value in-place. +message ToggleUserActionProto { + // Input and output. Should point to a list of user actions to modify. + optional string user_actions_model_identifier = 1; + // The identifier of the specific user action to modify. + optional string user_action_identifier = 2; + // Whether the user action should be enabled or disabled. Should point to a + // single boolean. + optional string enabled_model_identifier = 3; +} + // Ends the generic Ui action (this is usually tied to a chip). // // This behaves exactly the same as tapping a regular chip would in any other
diff --git a/components/autofill_assistant/browser/model.proto b/components/autofill_assistant/browser/model.proto index fc705cb..75ee3c41 100644 --- a/components/autofill_assistant/browser/model.proto +++ b/components/autofill_assistant/browser/model.proto
@@ -248,6 +248,9 @@ // A unique identifier for this user action. optional string identifier = 3; + + // Whether this action is enabled or not. + optional bool enabled = 4 [default = true]; } message DateProto {
diff --git a/components/autofill_assistant/browser/user_action.cc b/components/autofill_assistant/browser/user_action.cc index 312b93c..4e63a9b 100644 --- a/components/autofill_assistant/browser/user_action.cc +++ b/components/autofill_assistant/browser/user_action.cc
@@ -15,12 +15,6 @@ std::move(callback).Run(); } -// void Intercept(base::OnceCallback<void(UserAction::Callback, const -// TriggerContext&)> interceptor, UserAction::Callback original, -// std::unique_ptr<TriggerContext>) { -// std::move(interceptor).Run(std::move(original), context); -// } - } // namespace UserAction::UserAction(UserAction&& other) = default; @@ -32,13 +26,16 @@ UserAction::UserAction(const UserActionProto& action) : chip_(action.chip()), direct_action_(action.direct_action()), + enabled_(action.enabled()), identifier_(action.identifier()) {} UserAction::UserAction(const ChipProto& chip_proto, const DirectActionProto& direct_action_proto, + bool enabled, const std::string& identifier) : chip_(chip_proto), direct_action_(direct_action_proto), + enabled_(enabled), identifier_(identifier) {} void UserAction::SetCallback(base::OnceCallback<void()> callback) {
diff --git a/components/autofill_assistant/browser/user_action.h b/components/autofill_assistant/browser/user_action.h index 9ec6a14..88a4c88 100644 --- a/components/autofill_assistant/browser/user_action.h +++ b/components/autofill_assistant/browser/user_action.h
@@ -35,6 +35,7 @@ UserAction(const UserActionProto& action); UserAction(const ChipProto& chip, const DirectActionProto& direct_action, + bool enabled, const std::string& identifier); // Returns true if the action has no trigger, that is, there is no chip and no
diff --git a/components/autofill_assistant/browser/value_util.cc b/components/autofill_assistant/browser/value_util.cc index 2827a21..77c5f95 100644 --- a/components/autofill_assistant/browser/value_util.cc +++ b/components/autofill_assistant/browser/value_util.cc
@@ -120,7 +120,8 @@ const UserActionProto& value_b) { return value_a.chip() == value_b.chip() && value_a.direct_action() == value_b.direct_action() && - value_a.identifier() == value_b.identifier(); + value_a.identifier() == value_b.identifier() && + value_a.enabled() == value_b.enabled(); } // Compares two |DateProto| instances and returns true if they exactly match.
diff --git a/components/autofill_assistant/browser/value_util_unittest.cc b/components/autofill_assistant/browser/value_util_unittest.cc index a2ac622..4c977ad 100644 --- a/components/autofill_assistant/browser/value_util_unittest.cc +++ b/components/autofill_assistant/browser/value_util_unittest.cc
@@ -149,6 +149,28 @@ EXPECT_TRUE(value_a == value_b); } +TEST_F(ValueUtilTest, UserActionComparison) { + ValueProto user_actions_value; + UserActionProto user_action_a; + user_action_a.set_identifier("identifier"); + user_action_a.mutable_chip()->set_type(ChipType::HIGHLIGHTED_ACTION); + user_action_a.mutable_chip()->set_text("text"); + UserActionProto user_action_b = user_action_a; + + ValueProto value_a; + *value_a.mutable_user_actions()->add_values() = user_action_a; + ValueProto value_b; + *value_b.mutable_user_actions()->add_values() = user_action_b; + EXPECT_TRUE(value_a == value_b); + + value_b.mutable_user_actions()->mutable_values(0)->set_enabled(false); + EXPECT_FALSE(value_a == value_b); + + value_b = value_a; + value_b.mutable_user_actions()->mutable_values(0)->set_identifier("test"); + EXPECT_FALSE(value_a == value_b); +} + TEST_F(ValueUtilTest, AreAllValuesOfType) { ValueProto value_a; ValueProto value_b;
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc index 73a4c661..eb19d30 100644 --- a/components/browser_sync/profile_sync_components_factory_impl.cc +++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -21,7 +21,6 @@ #include "components/history/core/browser/sync/history_delete_directives_model_type_controller.h" #include "components/history/core/browser/sync/typed_url_model_type_controller.h" #include "components/password_manager/core/browser/password_store.h" -#include "components/password_manager/core/browser/sync/password_data_type_controller.h" #include "components/password_manager/core/browser/sync/password_model_type_controller.h" #include "components/prefs/pref_service.h" #include "components/reading_list/features/reading_list_switches.h" @@ -260,24 +259,17 @@ // Password sync is enabled by default. Register unless explicitly // disabled. if (!disabled_types.Has(syncer::PASSWORDS)) { - if (base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) { - if (profile_password_store_) { - // |profile_password_store_| can be null in tests. - controllers.push_back( - std::make_unique<password_manager::PasswordModelTypeController>( - profile_password_store_->CreateSyncControllerDelegate(), - account_password_store_ - ? account_password_store_->CreateSyncControllerDelegate() - : nullptr, - sync_client_->GetPrefService(), - sync_client_->GetIdentityManager(), sync_service, - sync_client_->GetPasswordStateChangedCallback())); - } - } else { - controllers.push_back(std::make_unique<PasswordDataTypeController>( - dump_stack, sync_service, sync_client_, - sync_client_->GetPasswordStateChangedCallback(), - profile_password_store_)); + if (profile_password_store_) { + // |profile_password_store_| can be null in tests. + controllers.push_back( + std::make_unique<password_manager::PasswordModelTypeController>( + profile_password_store_->CreateSyncControllerDelegate(), + account_password_store_ + ? account_password_store_->CreateSyncControllerDelegate() + : nullptr, + sync_client_->GetPrefService(), + sync_client_->GetIdentityManager(), sync_service, + sync_client_->GetPasswordStateChangedCallback())); } }
diff --git a/components/history/core/browser/sync/delete_directive_handler.cc b/components/history/core/browser/sync/delete_directive_handler.cc index 19a9870..7e24352 100644 --- a/components/history/core/browser/sync/delete_directive_handler.cc +++ b/components/history/core/browser/sync/delete_directive_handler.cc
@@ -458,14 +458,6 @@ sync_processor_.reset(); } -syncer::SyncDataList DeleteDirectiveHandler::GetAllSyncData( - syncer::ModelType type) const { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); - // TODO(akalin): Keep track of existing delete directives. - return syncer::SyncDataList(); -} - syncer::SyncError DeleteDirectiveHandler::ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) {
diff --git a/components/history/core/browser/sync/delete_directive_handler.h b/components/history/core/browser/sync/delete_directive_handler.h index 60cb15c..7685081 100644 --- a/components/history/core/browser/sync/delete_directive_handler.h +++ b/components/history/core/browser/sync/delete_directive_handler.h
@@ -73,7 +73,6 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/components/javascript_dialogs/views/app_modal_dialog_view_views.cc b/components/javascript_dialogs/views/app_modal_dialog_view_views.cc index 9ca3815..92397fd 100644 --- a/components/javascript_dialogs/views/app_modal_dialog_view_views.cc +++ b/components/javascript_dialogs/views/app_modal_dialog_view_views.cc
@@ -39,14 +39,14 @@ l10n_util::GetStringUTF16(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION)); } - DialogDelegate::set_buttons( + DialogDelegate::SetButtons( controller_->javascript_dialog_type() == content::JAVASCRIPT_DIALOG_TYPE_ALERT ? ui::DIALOG_BUTTON_OK : (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)); if (controller_->is_before_unload_dialog()) { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16( controller_->is_reload()
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index ca5b41e..43da144c 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -683,7 +683,7 @@ void MetricsWebContentsObserver::OnTimingUpdated( content::RenderFrameHost* render_frame_host, mojom::PageLoadTimingPtr timing, - mojom::PageLoadMetadataPtr metadata, + mojom::FrameMetadataPtr metadata, mojom::PageLoadFeaturesPtr new_features, const std::vector<mojom::ResourceDataUpdatePtr>& resources, mojom::FrameRenderDataUpdatePtr render_data, @@ -702,6 +702,8 @@ // any of the errors below for main frames. Thus, we track occurrences of // all errors below, rather than returning early after encountering an // error. + // TODO(crbug/1061090): Update page load metrics IPC validation to ues + // mojo::ReportBadMessage. bool error = false; if (!committed_load_) { RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); @@ -713,6 +715,14 @@ error = true; } + if (!metadata->intersection_update.is_null()) { + mojo::ReportBadMessage( + "page_load_metrics.mojom.FrameMetadata does not report an " + "intersection " + "update for the main frame. "); + error = true; + } + if (error) return; } else if (!committed_load_) { @@ -729,7 +739,7 @@ void MetricsWebContentsObserver::UpdateTiming( mojom::PageLoadTimingPtr timing, - mojom::PageLoadMetadataPtr metadata, + mojom::FrameMetadataPtr metadata, mojom::PageLoadFeaturesPtr new_features, std::vector<mojom::ResourceDataUpdatePtr> resources, mojom::FrameRenderDataUpdatePtr render_data,
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h index a260826..6b36c86 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.h +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h
@@ -158,7 +158,7 @@ void OnTimingUpdated( content::RenderFrameHost* render_frame_host, mojom::PageLoadTimingPtr timing, - mojom::PageLoadMetadataPtr metadata, + mojom::FrameMetadataPtr metadata, mojom::PageLoadFeaturesPtr new_features, const std::vector<mojom::ResourceDataUpdatePtr>& resources, mojom::FrameRenderDataUpdatePtr render_data, @@ -180,7 +180,7 @@ // page_load_metrics::mojom::PageLoadMetrics implementation. void UpdateTiming( mojom::PageLoadTimingPtr timing, - mojom::PageLoadMetadataPtr metadata, + mojom::FrameMetadataPtr metadata, mojom::PageLoadFeaturesPtr new_features, std::vector<mojom::ResourceDataUpdatePtr> resources, mojom::FrameRenderDataUpdatePtr render_data,
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc index 036f3ead..0e7413e 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
@@ -105,7 +105,7 @@ content::RenderFrameHost* render_frame_host) { observer()->OnTimingUpdated( render_frame_host, previous_timing_->Clone(), - mojom::PageLoadMetadataPtr(base::in_place), + mojom::FrameMetadataPtr(base::in_place), mojom::PageLoadFeaturesPtr(base::in_place), std::vector<mojom::ResourceDataUpdatePtr>(), mojom::FrameRenderDataUpdatePtr(base::in_place), timing.Clone(), @@ -129,7 +129,7 @@ previous_timing_ = timing.Clone(); observer()->OnTimingUpdated( render_frame_host, timing.Clone(), - mojom::PageLoadMetadataPtr(base::in_place), + mojom::FrameMetadataPtr(base::in_place), mojom::PageLoadFeaturesPtr(base::in_place), std::vector<mojom::ResourceDataUpdatePtr>(), mojom::FrameRenderDataUpdatePtr(base::in_place),
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc index 6b432652..b927215b 100644 --- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc +++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc
@@ -109,7 +109,7 @@ const mojom::PageLoadTiming& timing, content::RenderFrameHost* rfh) { SimulatePageLoadTimingUpdate( - timing, mojom::PageLoadMetadata(), mojom::PageLoadFeatures(), + timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), mojom::DeferredResourceCounts(), rfh); } @@ -124,7 +124,7 @@ content::RenderFrameHost* rfh) { auto timing = page_load_metrics::mojom::PageLoadTimingPtr(base::in_place); page_load_metrics::InitPageLoadTimingForTest(timing.get()); - SimulatePageLoadTimingUpdate(*timing, mojom::PageLoadMetadata(), + SimulatePageLoadTimingUpdate(*timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), cpu_timing, mojom::DeferredResourceCounts(), rfh); @@ -132,7 +132,7 @@ void PageLoadMetricsObserverTester::SimulateTimingAndMetadataUpdate( const mojom::PageLoadTiming& timing, - const mojom::PageLoadMetadata& metadata) { + const mojom::FrameMetadata& metadata) { SimulatePageLoadTimingUpdate( timing, metadata, mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), @@ -140,7 +140,7 @@ } void PageLoadMetricsObserverTester::SimulateMetadataUpdate( - const mojom::PageLoadMetadata& metadata, + const mojom::FrameMetadata& metadata, content::RenderFrameHost* rfh) { mojom::PageLoadTiming timing; InitPageLoadTimingForTest(&timing); @@ -153,7 +153,7 @@ void PageLoadMetricsObserverTester::SimulateFeaturesUpdate( const mojom::PageLoadFeatures& new_features) { SimulatePageLoadTimingUpdate( - mojom::PageLoadTiming(), mojom::PageLoadMetadata(), new_features, + mojom::PageLoadTiming(), mojom::FrameMetadata(), new_features, mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), mojom::DeferredResourceCounts(), web_contents()->GetMainFrame()); } @@ -169,13 +169,13 @@ mojom::PageLoadTiming timing; InitPageLoadTimingForTest(&timing); SimulatePageLoadTimingUpdate( - timing, mojom::PageLoadMetadata(), mojom::PageLoadFeatures(), render_data, + timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), render_data, mojom::CpuTiming(), mojom::DeferredResourceCounts(), rfh); } void PageLoadMetricsObserverTester::SimulatePageLoadTimingUpdate( const mojom::PageLoadTiming& timing, - const mojom::PageLoadMetadata& metadata, + const mojom::FrameMetadata& metadata, const mojom::PageLoadFeatures& new_features, const mojom::FrameRenderDataUpdate& render_data, const mojom::CpuTiming& cpu_timing, @@ -205,7 +205,7 @@ InitPageLoadTimingForTest(timing.get()); metrics_web_contents_observer_->OnTimingUpdated( render_frame_host, std::move(timing), - mojom::PageLoadMetadataPtr(base::in_place), + mojom::FrameMetadataPtr(base::in_place), mojom::PageLoadFeaturesPtr(base::in_place), resources, mojom::FrameRenderDataUpdatePtr(base::in_place), mojom::CpuTimingPtr(base::in_place),
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h index 449d9180..50f90161 100644 --- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h +++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h
@@ -36,7 +36,7 @@ namespace mojom { class FrameRenderDataUpdate; class PageLoadFeatures; -class PageLoadMetadata; +class FrameMetadata; class PageLoadTiming; } // namespace mojom @@ -92,8 +92,8 @@ void SimulateCpuTimingUpdate(const mojom::CpuTiming& cpu_timing, content::RenderFrameHost* rfh); void SimulateTimingAndMetadataUpdate(const mojom::PageLoadTiming& timing, - const mojom::PageLoadMetadata& metadata); - void SimulateMetadataUpdate(const mojom::PageLoadMetadata& metadata, + const mojom::FrameMetadata& metadata); + void SimulateMetadataUpdate(const mojom::FrameMetadata& metadata, content::RenderFrameHost* rfh); void SimulateFeaturesUpdate(const mojom::PageLoadFeatures& new_features); void SimulateResourceDataUseUpdate( @@ -161,7 +161,7 @@ private: void SimulatePageLoadTimingUpdate( const mojom::PageLoadTiming& timing, - const mojom::PageLoadMetadata& metadata, + const mojom::FrameMetadata& metadata, const mojom::PageLoadFeatures& new_features, const mojom::FrameRenderDataUpdate& render_data, const mojom::CpuTiming& cpu_timing,
diff --git a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc index 9da7543..c11215f0 100644 --- a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc +++ b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc
@@ -60,10 +60,9 @@ case WebFeature::kDownloadInSandbox: rfh->AddMessageToConsole( blink::mojom::ConsoleMessageLevel::kWarning, - "[Deprecation] Download in sandbox is deprecated and will be removed " - "in M81. You may consider adding 'allow-downloads' to the sandbox " - "attribute list. See " - "https://www.chromestatus.com/feature/5706745674465280 for more " + "Download is disallowed. The frame initiating or instantiating the " + "download is sandboxed, but the flag ‘allow-downloads’ is not set. " + "See https://www.chromestatus.com/feature/5706745674465280 for more " "details."); return; case WebFeature::kDownloadInAdFrameWithoutUserGesture:
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.h b/components/page_load_metrics/browser/page_load_metrics_observer.h index 7cd04e7..4d97d3c4 100644 --- a/components/page_load_metrics/browser/page_load_metrics_observer.h +++ b/components/page_load_metrics/browser/page_load_metrics_observer.h
@@ -362,6 +362,15 @@ const content::WebContentsObserver::MediaPlayerInfo& video_type, content::RenderFrameHost* render_frame_host) {} + // Invoked when a frame's intersections with page elements changes and an + // update is received. The main_frame_document_intersection_rect + // returns an empty rect for out of view subframes and does not send updates + // for the main frame. + // TODO(crbug/1048175): Expose intersections to observers via shared delegate. + virtual void OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const mojom::FrameIntersectionUpdate& intersection_update) {} + // Invoked when the UMA metrics subsystem is persisting metrics as the // application goes into the background, on platforms where the browser // process may be killed after backgrounding (Android). Implementers should
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h index c493e52..9f2091f9 100644 --- a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h +++ b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
@@ -19,7 +19,7 @@ namespace page_load_metrics { namespace mojom { -class PageLoadMetadata; +class FrameMetadata; } // namespace mojom struct UserInitiatedInfo; @@ -91,10 +91,12 @@ // Extra information supplied to the page load metrics system from the // renderer for the main frame. - virtual const mojom::PageLoadMetadata& GetMainFrameMetadata() const = 0; + virtual const mojom::FrameMetadata& GetMainFrameMetadata() const = 0; - // PageLoadMetadata for subframes of the current page load. - virtual const mojom::PageLoadMetadata& GetSubframeMetadata() const = 0; + // FrameMetadata for subframes of the current page load. This contains + // aggregate information across all subframes. Non-aggregatable information + // such as subframe intersections is initialized to defaults. + virtual const mojom::FrameMetadata& GetSubframeMetadata() const = 0; virtual const PageRenderData& GetPageRenderData() const = 0; virtual const PageRenderData& GetMainFrameRenderData() const = 0; virtual const ui::ScopedVisibilityTracker& GetVisibilityTracker() const = 0;
diff --git a/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc b/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc index 7e0d82f..539d1ea 100644 --- a/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc +++ b/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc
@@ -35,6 +35,11 @@ expected_frame_sizes_.insert(size); } +void PageLoadMetricsTestWaiter::AddMainFrameDocumentIntersectionExpectation( + const gfx::Rect& rect) { + expected_main_frame_intersection_ = rect; +} + void PageLoadMetricsTestWaiter::AddSubFrameExpectation(TimingField field) { CHECK_NE(field, TimingField::kLoadTimingInfo) << "LOAD_TIMING_INFO should only be used as a page-level expectation"; @@ -97,7 +102,7 @@ const page_load_metrics::mojom::PageLoadTiming& timing) { if (ExpectationsSatisfied()) return; - const page_load_metrics::mojom::PageLoadMetadata& metadata = + const page_load_metrics::mojom::FrameMetadata& metadata = subframe_rfh ? GetDelegateForCommittedLoad().GetSubframeMetadata() : GetDelegateForCommittedLoad().GetMainFrameMetadata(); TimingFieldBitSet matched_bits = GetMatchedBits(timing, metadata); @@ -183,6 +188,19 @@ run_loop_->Quit(); } +void PageLoadMetricsTestWaiter::OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const page_load_metrics::mojom::FrameIntersectionUpdate& + frame_intersection_update) { + if (expected_main_frame_intersection_ && + expected_main_frame_intersection_ == + frame_intersection_update.main_frame_document_intersection_rect) { + expected_main_frame_intersection_.reset(); + } + if (ExpectationsSatisfied() && run_loop_) + run_loop_->Quit(); +} + void PageLoadMetricsTestWaiter::OnDidFinishSubFrameNavigation( content::NavigationHandle* navigation_handle) { if (SubframeNavigationExpectationsSatisfied()) @@ -206,7 +224,7 @@ PageLoadMetricsTestWaiter::TimingFieldBitSet PageLoadMetricsTestWaiter::GetMatchedBits( const page_load_metrics::mojom::PageLoadTiming& timing, - const page_load_metrics::mojom::PageLoadMetadata& metadata) { + const page_load_metrics::mojom::FrameMetadata& metadata) { PageLoadMetricsTestWaiter::TimingFieldBitSet matched_bits; if (timing.document_timing->load_event_start) matched_bits.Set(TimingField::kLoadEvent); @@ -283,7 +301,8 @@ WebFeaturesExpectationsSatisfied() && SubframeNavigationExpectationsSatisfied() && SubframeDataExpectationsSatisfied() && expected_frame_sizes_.empty() && - CpuTimeExpectationsSatisfied(); + CpuTimeExpectationsSatisfied() && + !expected_main_frame_intersection_.has_value(); } PageLoadMetricsTestWaiter::WaiterMetricsObserver::~WaiterMetricsObserver() = @@ -331,6 +350,15 @@ } void PageLoadMetricsTestWaiter::WaiterMetricsObserver:: + OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const page_load_metrics::mojom::FrameIntersectionUpdate& + frame_intersection_update) { + if (waiter_) + waiter_->OnFrameIntersectionUpdate(rfh, frame_intersection_update); +} + +void PageLoadMetricsTestWaiter::WaiterMetricsObserver:: OnDidFinishSubFrameNavigation( content::NavigationHandle* navigation_handle) { if (waiter_)
diff --git a/components/page_load_metrics/browser/page_load_metrics_test_waiter.h b/components/page_load_metrics/browser/page_load_metrics_test_waiter.h index 728d9b1d..9a05ec6 100644 --- a/components/page_load_metrics/browser/page_load_metrics_test_waiter.h +++ b/components/page_load_metrics/browser/page_load_metrics_test_waiter.h
@@ -46,6 +46,11 @@ // size update of |size|. void AddFrameSizeExpectation(const gfx::Size& size); + // Add a main frame document intersection expectation. Expects that a frame + // receives an intersection update with a main frame document intersection + // of |rect|. Subsequent calls overwrite unmet expectations. + void AddMainFrameDocumentIntersectionExpectation(const gfx::Rect& rect); + // Add a single WebFeature expectation. void AddWebFeatureExpectation(blink::mojom::WebFeature web_feature); @@ -127,6 +132,10 @@ content::NavigationHandle* navigation_handle) override; void FrameSizeChanged(content::RenderFrameHost* render_frame_host, const gfx::Size& frame_size) override; + void OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const page_load_metrics::mojom::FrameIntersectionUpdate& + frame_intersection_update) override; private: const base::WeakPtr<PageLoadMetricsTestWaiter> waiter_; @@ -169,7 +178,7 @@ static TimingFieldBitSet GetMatchedBits( const page_load_metrics::mojom::PageLoadTiming& timing, - const page_load_metrics::mojom::PageLoadMetadata& metadata); + const page_load_metrics::mojom::FrameMetadata& metadata); // Updates observed page fields when a timing update is received by the // MetricsWebContentsObserver. Stops waiting if expectations are satsfied @@ -204,6 +213,11 @@ void FrameSizeChanged(content::RenderFrameHost* render_frame_host, const gfx::Size& frame_size); + void OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const page_load_metrics::mojom::FrameIntersectionUpdate& + frame_intersection_update); + void OnDidFinishSubFrameNavigation( content::NavigationHandle* navigation_handle); @@ -237,6 +251,10 @@ std::set<gfx::Size, FrameSizeComparator> expected_frame_sizes_; std::set<gfx::Size, FrameSizeComparator> observed_frame_sizes_; + // Expectation for the main frame document intersection. Has a value when + // an expectation has not been met. + base::Optional<gfx::Rect> expected_main_frame_intersection_; + int current_complete_resources_ = 0; int64_t current_network_bytes_ = 0;
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc index f20a98f9..d71204c 100644 --- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc +++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
@@ -408,8 +408,8 @@ navigation_start_(navigation_handle->NavigationStart()), current_merged_page_timing_(CreatePageLoadTiming()), pending_merged_page_timing_(CreatePageLoadTiming()), - main_frame_metadata_(mojom::PageLoadMetadata::New()), - subframe_metadata_(mojom::PageLoadMetadata::New()) {} + main_frame_metadata_(mojom::FrameMetadata::New()), + subframe_metadata_(mojom::FrameMetadata::New()) {} PageLoadMetricsUpdateDispatcher::~PageLoadMetricsUpdateDispatcher() { ShutDown(); @@ -431,7 +431,7 @@ void PageLoadMetricsUpdateDispatcher::UpdateMetrics( content::RenderFrameHost* render_frame_host, mojom::PageLoadTimingPtr new_timing, - mojom::PageLoadMetadataPtr new_metadata, + mojom::FrameMetadataPtr new_metadata, mojom::PageLoadFeaturesPtr new_features, const std::vector<mojom::ResourceDataUpdatePtr>& resources, mojom::FrameRenderDataUpdatePtr render_data, @@ -543,11 +543,41 @@ void PageLoadMetricsUpdateDispatcher::UpdateSubFrameMetadata( content::RenderFrameHost* render_frame_host, - mojom::PageLoadMetadataPtr subframe_metadata) { + mojom::FrameMetadataPtr subframe_metadata) { // Merge the subframe loading behavior flags with any we've already observed, // possibly from other subframes. subframe_metadata_->behavior_flags |= subframe_metadata->behavior_flags; client_->OnSubframeMetadataChanged(render_frame_host, *subframe_metadata); + + // Handle intersection updates if included in the metadata. + if (subframe_metadata->intersection_update.is_null()) { + return; + } + + // Do not notify intersections for untracked loads, + // subframe_navigation_start_offset_ excludes untracked loads. + // TODO(crbug/1061091): Document definition of untracked loads in page load + // metrics. + const int frame_tree_node_id = render_frame_host->GetFrameTreeNodeId(); + if (subframe_navigation_start_offset_.find(frame_tree_node_id) == + subframe_navigation_start_offset_.end()) { + return; + } + + auto existing_intersection_it = + frame_intersection_updates_.find(render_frame_host->GetFrameTreeNodeId()); + + // Check if we already have a frame intersection update for the frame, + // dispatch updates for the first frame intersection update or if + // the intersection has changed. + if (existing_intersection_it == frame_intersection_updates_.end() || + !existing_intersection_it->second.Equals( + *subframe_metadata->intersection_update)) { + frame_intersection_updates_[frame_tree_node_id] = + *subframe_metadata->intersection_update; + client_->OnFrameIntersectionUpdate(render_frame_host, + *subframe_metadata->intersection_update); + } } void PageLoadMetricsUpdateDispatcher::UpdateMainFrameTiming( @@ -593,7 +623,7 @@ } void PageLoadMetricsUpdateDispatcher::UpdateMainFrameMetadata( - mojom::PageLoadMetadataPtr new_metadata) { + mojom::FrameMetadataPtr new_metadata) { if (main_frame_metadata_->Equals(*new_metadata)) return;
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h index f470eb9..5739c01 100644 --- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h +++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
@@ -110,7 +110,7 @@ virtual void OnMainFrameMetadataChanged() = 0; virtual void OnSubframeMetadataChanged( content::RenderFrameHost* rfh, - const mojom::PageLoadMetadata& metadata) = 0; + const mojom::FrameMetadata& metadata) = 0; virtual void OnSubFrameRenderDataChanged( content::RenderFrameHost* rfh, const mojom::FrameRenderDataUpdate& render_data) = 0; @@ -122,6 +122,9 @@ const std::vector<mojom::ResourceDataUpdatePtr>& resources) = 0; virtual void UpdateFrameCpuTiming(content::RenderFrameHost* rfh, const mojom::CpuTiming& timing) = 0; + virtual void OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const mojom::FrameIntersectionUpdate& frame_intersection_update) = 0; virtual void OnNewDeferredResourceCounts( const mojom::DeferredResourceCounts& new_deferred_resource_data) = 0; }; @@ -136,7 +139,7 @@ void UpdateMetrics( content::RenderFrameHost* render_frame_host, mojom::PageLoadTimingPtr new_timing, - mojom::PageLoadMetadataPtr new_metadata, + mojom::FrameMetadataPtr new_metadata, mojom::PageLoadFeaturesPtr new_features, const std::vector<mojom::ResourceDataUpdatePtr>& resources, mojom::FrameRenderDataUpdatePtr render_data, @@ -158,10 +161,10 @@ return *(current_merged_page_timing_.get()); } - const mojom::PageLoadMetadata& main_frame_metadata() const { + const mojom::FrameMetadata& main_frame_metadata() const { return *(main_frame_metadata_.get()); } - const mojom::PageLoadMetadata& subframe_metadata() const { + const mojom::FrameMetadata& subframe_metadata() const { return *(subframe_metadata_.get()); } const PageRenderData& page_render_data() const { return page_render_data_; } @@ -178,9 +181,9 @@ void UpdateFrameCpuTiming(content::RenderFrameHost* render_frame_host, mojom::CpuTimingPtr new_timing); - void UpdateMainFrameMetadata(mojom::PageLoadMetadataPtr new_metadata); + void UpdateMainFrameMetadata(mojom::FrameMetadataPtr new_metadata); void UpdateSubFrameMetadata(content::RenderFrameHost* render_frame_host, - mojom::PageLoadMetadataPtr subframe_metadata); + mojom::FrameMetadataPtr subframe_metadata); void UpdatePageRenderData(const mojom::FrameRenderDataUpdate& render_data); void UpdateMainFrameRenderData( @@ -214,12 +217,19 @@ mojom::PageLoadTimingPtr current_merged_page_timing_; mojom::PageLoadTimingPtr pending_merged_page_timing_; - mojom::PageLoadMetadataPtr main_frame_metadata_; - mojom::PageLoadMetadataPtr subframe_metadata_; + // TODO(crbug/1058393): Replace aggregate frame metadata with a separate + // struct instead of using mojo. + mojom::FrameMetadataPtr main_frame_metadata_; + mojom::FrameMetadataPtr subframe_metadata_; PageRenderData page_render_data_; PageRenderData main_frame_render_data_; + // The last main frame document intersection dispatched to page load metrics + // observers. + std::map<FrameTreeNodeId, mojom::FrameIntersectionUpdate> + frame_intersection_updates_; + // Navigation start offsets for the most recently committed document in each // frame. std::map<FrameTreeNodeId, base::TimeDelta> subframe_navigation_start_offset_;
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc index 0cd62a85..a6bc3758 100644 --- a/components/page_load_metrics/browser/page_load_tracker.cc +++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -667,7 +667,7 @@ void PageLoadTracker::OnSubframeMetadataChanged( content::RenderFrameHost* rfh, - const mojom::PageLoadMetadata& metadata) { + const mojom::FrameMetadata& metadata) { for (const auto& observer : observers_) { observer->OnLoadingBehaviorObserved(rfh, metadata.behavior_flags); } @@ -711,6 +711,14 @@ } } +void PageLoadTracker::OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const mojom::FrameIntersectionUpdate& frame_intersection_update) { + for (const auto& observer : observers_) { + observer->OnFrameIntersectionUpdate(rfh, frame_intersection_update); + } +} + content::WebContents* PageLoadTracker::GetWebContents() const { return web_contents_; } @@ -770,11 +778,11 @@ return page_end_time; } -const mojom::PageLoadMetadata& PageLoadTracker::GetMainFrameMetadata() const { +const mojom::FrameMetadata& PageLoadTracker::GetMainFrameMetadata() const { return metrics_update_dispatcher_.main_frame_metadata(); } -const mojom::PageLoadMetadata& PageLoadTracker::GetSubframeMetadata() const { +const mojom::FrameMetadata& PageLoadTracker::GetSubframeMetadata() const { return metrics_update_dispatcher_.subframe_metadata(); }
diff --git a/components/page_load_metrics/browser/page_load_tracker.h b/components/page_load_metrics/browser/page_load_tracker.h index bcc83a9..555bf9c 100644 --- a/components/page_load_metrics/browser/page_load_tracker.h +++ b/components/page_load_metrics/browser/page_load_tracker.h
@@ -188,9 +188,8 @@ content::RenderFrameHost* rfh, const mojom::FrameRenderDataUpdate& render_data) override; void OnMainFrameMetadataChanged() override; - void OnSubframeMetadataChanged( - content::RenderFrameHost* rfh, - const mojom::PageLoadMetadata& metadata) override; + void OnSubframeMetadataChanged(content::RenderFrameHost* rfh, + const mojom::FrameMetadata& metadata) override; void UpdateFeaturesUsage( content::RenderFrameHost* rfh, const mojom::PageLoadFeatures& new_features) override; @@ -201,6 +200,9 @@ const mojom::DeferredResourceCounts& new_deferred_resource_data) override; void UpdateFrameCpuTiming(content::RenderFrameHost* rfh, const mojom::CpuTiming& timing) override; + void OnFrameIntersectionUpdate( + content::RenderFrameHost* rfh, + const mojom::FrameIntersectionUpdate& frame_intersection_update) override; // PageLoadMetricsDelegate implementation: content::WebContents* GetWebContents() const override; @@ -217,8 +219,8 @@ PageEndReason GetPageEndReason() const override; const UserInitiatedInfo& GetPageEndUserInitiatedInfo() const override; base::Optional<base::TimeDelta> GetPageEndTime() const override; - const mojom::PageLoadMetadata& GetMainFrameMetadata() const override; - const mojom::PageLoadMetadata& GetSubframeMetadata() const override; + const mojom::FrameMetadata& GetMainFrameMetadata() const override; + const mojom::FrameMetadata& GetSubframeMetadata() const override; const PageRenderData& GetPageRenderData() const override; const PageRenderData& GetMainFrameRenderData() const override; const ui::ScopedVisibilityTracker& GetVisibilityTracker() const override;
diff --git a/components/page_load_metrics/common/BUILD.gn b/components/page_load_metrics/common/BUILD.gn index 40345f3..5605576 100644 --- a/components/page_load_metrics/common/BUILD.gn +++ b/components/page_load_metrics/common/BUILD.gn
@@ -46,6 +46,7 @@ public_deps = [ "//mojo/public/mojom/base", "//third_party/blink/public/mojom:web_feature_mojo_bindings", + "//ui/gfx/geometry/mojom", "//url/mojom:url_mojom_origin", ] }
diff --git a/components/page_load_metrics/common/DEPS b/components/page_load_metrics/common/DEPS index 258a310..10b3f566 100644 --- a/components/page_load_metrics/common/DEPS +++ b/components/page_load_metrics/common/DEPS
@@ -2,4 +2,5 @@ "+base", "+net/base", "+third_party/blink/public", -] \ No newline at end of file + "+ui/gfx/geometry", +]
diff --git a/components/page_load_metrics/common/page_load_metrics.mojom b/components/page_load_metrics/common/page_load_metrics.mojom index bc5e2eb..a4718e6 100644 --- a/components/page_load_metrics/common/page_load_metrics.mojom +++ b/components/page_load_metrics/common/page_load_metrics.mojom
@@ -4,6 +4,7 @@ module page_load_metrics.mojom; +import "ui/gfx/geometry/mojom/geometry.mojom"; import "mojo/public/mojom/base/time.mojom"; import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; import "third_party/blink/public/mojom/use_counter/css_property_id.mojom"; @@ -144,9 +145,23 @@ // If you add additional members, also be sure to update page_load_timing.h. }; -struct PageLoadMetadata { +// FrameIntersectionUpdate contains a frame's intersections with other elements +// in a page load. +struct FrameIntersectionUpdate { + // The frame's current intersection rect with the main frame document in the + // coordinate system of the main frame's viewport. The intersection rect is + // an empty rect when there is no intersection with the main frame. No + // rect is returned for the main frame. This is only set the first time an + // intersection changes and is null otherwise. + gfx.mojom.Rect? main_frame_document_intersection_rect; +}; + +struct FrameMetadata { // These are packed blink::LoadingBehaviorFlag enums. int32 behavior_flags = 0; + + // The frame's intersection with page elements. + FrameIntersectionUpdate? intersection_update; }; // PageLoadFeatures contains a list of features newly observed by use counter. @@ -262,8 +277,12 @@ // Sent from renderer to browser process when the PageLoadTiming for the // associated frame changed. interface PageLoadMetrics { + // Called when an update is ready to be sent from renderer to browser. + // UpdateTiming calls are buffered, and contain all updates that have been + // received in the last buffer window. Some of the update data may be empty. + // Only called when at least one change has been observed within the frame. UpdateTiming(PageLoadTiming page_load_timing, - PageLoadMetadata page_load_metadata, + FrameMetadata frame_metadata, PageLoadFeatures new_features, array<ResourceDataUpdate> resources, FrameRenderDataUpdate render_data,
diff --git a/components/page_load_metrics/renderer/DEPS b/components/page_load_metrics/renderer/DEPS index c6d293a..8b9c4a8 100644 --- a/components/page_load_metrics/renderer/DEPS +++ b/components/page_load_metrics/renderer/DEPS
@@ -7,6 +7,7 @@ "+services/network/public/cpp", "+services/network/public/mojom", "+third_party/blink/public", + "+ui/gfx/geometry", "+url", ]
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.cc b/components/page_load_metrics/renderer/fake_page_timing_sender.cc index 14a4f66..a19c5b1 100644 --- a/components/page_load_metrics/renderer/fake_page_timing_sender.cc +++ b/components/page_load_metrics/renderer/fake_page_timing_sender.cc
@@ -17,7 +17,7 @@ void FakePageTimingSender::SendTiming( const mojom::PageLoadTimingPtr& timing, - const mojom::PageLoadMetadataPtr& metadata, + const mojom::FrameMetadataPtr& metadata, mojom::PageLoadFeaturesPtr new_features, std::vector<mojom::ResourceDataUpdatePtr> resources, const mojom::FrameRenderDataUpdate& render_data, @@ -27,7 +27,7 @@ render_data, cpu_timing, new_deferred_resource_data); } -FakePageTimingSender::PageTimingValidator::PageTimingValidator() {} +FakePageTimingSender::PageTimingValidator::PageTimingValidator() = default; FakePageTimingSender::PageTimingValidator::~PageTimingValidator() { VerifyExpectedTimings(); @@ -120,9 +120,18 @@ actual_render_data_.layout_shift_delta); } +void FakePageTimingSender::PageTimingValidator:: + VerifyExpectedFrameIntersectionUpdate() const { + if (!expected_frame_intersection_update_.is_null()) { + EXPECT_FALSE(actual_frame_intersection_update_.is_null()); + EXPECT_TRUE(expected_frame_intersection_update_->Equals( + *actual_frame_intersection_update_)); + } +} + void FakePageTimingSender::PageTimingValidator::UpdateTiming( const mojom::PageLoadTimingPtr& timing, - const mojom::PageLoadMetadataPtr& metadata, + const mojom::FrameMetadataPtr& metadata, const mojom::PageLoadFeaturesPtr& new_features, const std::vector<mojom::ResourceDataUpdatePtr>& resources, const mojom::FrameRenderDataUpdate& render_data, @@ -145,11 +154,13 @@ actual_css_properties_.insert(css_property_id); } actual_render_data_.layout_shift_delta = render_data.layout_shift_delta; + actual_frame_intersection_update_ = metadata->intersection_update.Clone(); VerifyExpectedTimings(); VerifyExpectedCpuTimings(); VerifyExpectedFeatures(); VerifyExpectedCssProperties(); VerifyExpectedRenderData(); + VerifyExpectedFrameIntersectionUpdate(); } } // namespace page_load_metrics
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.h b/components/page_load_metrics/renderer/fake_page_timing_sender.h index 0e74280..9c432596 100644 --- a/components/page_load_metrics/renderer/fake_page_timing_sender.h +++ b/components/page_load_metrics/renderer/fake_page_timing_sender.h
@@ -68,6 +68,11 @@ expected_render_data_ = render_data; } + void UpdateExpectFrameIntersectionUpdate( + const mojom::FrameIntersectionUpdate& frame_intersection_update) { + expected_frame_intersection_update_ = frame_intersection_update.Clone(); + } + // Forces verification that actual features sent through SendTiming match // expected features provided via ExpectPageLoadFeatures. void VerifyExpectedFeatures() const; @@ -75,6 +80,7 @@ // match expected CSS properties provided via ExpectPageLoadCSSProperties. void VerifyExpectedCssProperties() const; void VerifyExpectedRenderData() const; + void VerifyExpectedFrameIntersectionUpdate() const; const std::vector<mojom::PageLoadTimingPtr>& expected_timings() const { return expected_timings_; @@ -85,7 +91,7 @@ void UpdateTiming( const mojom::PageLoadTimingPtr& timing, - const mojom::PageLoadMetadataPtr& metadata, + const mojom::FrameMetadataPtr& metadata, const mojom::PageLoadFeaturesPtr& new_features, const std::vector<mojom::ResourceDataUpdatePtr>& resources, const mojom::FrameRenderDataUpdate& render_data, @@ -103,6 +109,8 @@ std::set<blink::mojom::CSSSampleId> actual_css_properties_; mojom::FrameRenderDataUpdate expected_render_data_; mojom::FrameRenderDataUpdate actual_render_data_; + mojom::FrameIntersectionUpdatePtr expected_frame_intersection_update_; + mojom::FrameIntersectionUpdatePtr actual_frame_intersection_update_; DISALLOW_COPY_AND_ASSIGN(PageTimingValidator); }; @@ -110,7 +118,7 @@ ~FakePageTimingSender() override; void SendTiming( const mojom::PageLoadTimingPtr& timing, - const mojom::PageLoadMetadataPtr& metadata, + const mojom::FrameMetadataPtr& metadata, mojom::PageLoadFeaturesPtr new_features, std::vector<mojom::ResourceDataUpdatePtr> resources, const mojom::FrameRenderDataUpdate& render_data,
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc index 8b0f33c..e04911bd 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -16,6 +16,7 @@ #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/loader/resource_type_util.h" +#include "third_party/blink/public/platform/web_rect.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_document_loader.h" #include "third_party/blink/public/web/web_local_frame.h" @@ -43,10 +44,10 @@ render_frame->GetRemoteAssociatedInterfaces()->GetInterface( &page_load_metrics_); } - ~MojoPageTimingSender() override {} + ~MojoPageTimingSender() override = default; void SendTiming( const mojom::PageLoadTimingPtr& timing, - const mojom::PageLoadMetadataPtr& metadata, + const mojom::FrameMetadataPtr& metadata, mojom::PageLoadFeaturesPtr new_features, std::vector<mojom::ResourceDataUpdatePtr> resources, const mojom::FrameRenderDataUpdate& render_data, @@ -278,6 +279,13 @@ ad_request_ids_.insert(request_id); } +void MetricsRenderFrameObserver::OnMainFrameDocumentIntersectionChanged( + const blink::WebRect& main_frame_document_intersection) { + if (page_timing_metrics_sender_) + page_timing_metrics_sender_->OnMainFrameDocumentIntersectionChanged( + main_frame_document_intersection); +} + void MetricsRenderFrameObserver::MaybeSetCompletedBeforeFCP(int request_id) { if (HasNoRenderFrame()) return;
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h index 82bd4414..559167c 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -17,6 +17,7 @@ #include "content/public/renderer/render_frame_observer.h" #include "third_party/blink/public/common/loader/loading_behavior_flag.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" +#include "third_party/blink/public/platform/web_rect.h" #include "third_party/blink/public/web/web_local_frame_client.h" class GURL; @@ -87,6 +88,9 @@ void OnAdResourceTrackerGoingAway() override; void OnAdResourceObserved(int request_id) override; + void OnMainFrameDocumentIntersectionChanged( + const blink::WebRect& main_frame_document_intersection) override; + protected: // The relative and monotonic page load timings. struct Timing {
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc index f354e96..aefb357 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -17,6 +17,7 @@ #include "components/page_load_metrics/renderer/page_timing_sender.h" #include "services/network/public/cpp/url_loader_completion_status.h" #include "services/network/public/mojom/url_response_head.mojom.h" +#include "ui/gfx/geometry/rect.h" namespace page_load_metrics { @@ -36,9 +37,8 @@ timer_(std::move(timer)), last_timing_(std::move(initial_timing)), last_cpu_timing_(mojom::CpuTiming::New()), - metadata_(mojom::PageLoadMetadata::New()), + metadata_(mojom::FrameMetadata::New()), new_features_(mojom::PageLoadFeatures::New()), - render_data_(), new_deferred_resource_data_(mojom::DeferredResourceCounts::New()), buffer_timer_delay_ms_(kBufferTimerDelayMillis), metadata_recorder_(initial_monotonic_timing) { @@ -206,6 +206,13 @@ modified_resources_.insert(resource_it.first->second.get()); } +void PageTimingMetricsSender::OnMainFrameDocumentIntersectionChanged( + const blink::WebRect& main_frame_document_intersection) { + metadata_->intersection_update = mojom::FrameIntersectionUpdate::New( + gfx::Rect(main_frame_document_intersection)); + EnsureSendTimer(); +} + void PageTimingMetricsSender::UpdateResourceMetadata( int resource_id, bool reported_as_ad_resource, @@ -288,6 +295,7 @@ std::move(new_deferred_resource_data_)); new_deferred_resource_data_ = mojom::DeferredResourceCounts::New(); new_features_ = mojom::PageLoadFeatures::New(); + metadata_->intersection_update.reset(); last_cpu_timing_->task_time = base::TimeDelta(); modified_resources_.clear(); render_data_.layout_shift_delta = 0;
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.h b/components/page_load_metrics/renderer/page_timing_metrics_sender.h index 6427613..b379d322 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender.h +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
@@ -69,6 +69,8 @@ int request_id, int64_t encoded_body_length, const std::string& mime_type); + void OnMainFrameDocumentIntersectionChanged( + const blink::WebRect& intersect_rect); // Updates the timing information. Buffers |timing| to be sent over mojo // sometime 'soon'. @@ -102,7 +104,7 @@ // The the sender keep track of metadata as it comes in, because the sender is // scoped to a single committed load. - mojom::PageLoadMetadataPtr metadata_; + mojom::FrameMetadataPtr metadata_; // A list of newly observed features during page load, to be sent to the // browser. mojom::PageLoadFeaturesPtr new_features_;
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc index 8848a89..6ee825a 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc
@@ -389,4 +389,21 @@ validator_.VerifyExpectedRenderData(); } +TEST_F(PageTimingMetricsSenderTest, SendFrameIntersectionUpdate) { + mojom::PageLoadTiming timing; + InitPageLoadTimingForTest(&timing); + metrics_sender_->Update(timing.Clone(), + PageTimingMetadataRecorder::MonotonicTiming()); + validator_.ExpectPageLoadTiming(timing); + + metrics_sender_->OnMainFrameDocumentIntersectionChanged( + blink::WebRect(0, 0, 1, 1)); + mojom::FrameIntersectionUpdate frame_intersection_update( + gfx::Rect(0, 0, 1, 1)); + validator_.UpdateExpectFrameIntersectionUpdate(frame_intersection_update); + + metrics_sender_->mock_timer()->Fire(); + validator_.VerifyExpectedFrameIntersectionUpdate(); +} + } // namespace page_load_metrics
diff --git a/components/page_load_metrics/renderer/page_timing_sender.h b/components/page_load_metrics/renderer/page_timing_sender.h index 597e457..38190a2 100644 --- a/components/page_load_metrics/renderer/page_timing_sender.h +++ b/components/page_load_metrics/renderer/page_timing_sender.h
@@ -13,10 +13,10 @@ // timing through IPC. class PageTimingSender { public: - virtual ~PageTimingSender() {} + virtual ~PageTimingSender() = default; virtual void SendTiming( const mojom::PageLoadTimingPtr& timing, - const mojom::PageLoadMetadataPtr& metadata, + const mojom::FrameMetadataPtr& metadata, mojom::PageLoadFeaturesPtr new_features, std::vector<mojom::ResourceDataUpdatePtr> resources, const mojom::FrameRenderDataUpdate& render_data,
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 42be50e..b91ce442 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -204,16 +204,10 @@ "statistics_table.h", "store_metrics_reporter.cc", "store_metrics_reporter.h", - "sync/password_data_type_controller.cc", - "sync/password_data_type_controller.h", "sync/password_model_type_controller.cc", "sync/password_model_type_controller.h", - "sync/password_model_worker.cc", - "sync/password_model_worker.h", "sync/password_sync_bridge.cc", "sync/password_sync_bridge.h", - "sync/password_syncable_service.cc", - "sync/password_syncable_service.h", "sync_credentials_filter.cc", "sync_credentials_filter.h", "ui/bulk_leak_check_service_adapter.cc", @@ -574,7 +568,6 @@ "statistics_table_unittest.cc", "store_metrics_reporter_unittest.cc", "sync/password_sync_bridge_unittest.cc", - "sync/password_syncable_service_unittest.cc", "sync_credentials_filter_unittest.cc", "sync_username_test_base.cc", "sync_username_test_base.h",
diff --git a/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc b/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc index ef4e4a3e..1ec20b5 100644 --- a/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc +++ b/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc
@@ -334,7 +334,7 @@ mock_affiliation_service_ = service.get(); password_store_ = new TestPasswordStore; - password_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + password_store_->Init(nullptr); match_helper_.reset( new AffiliatedMatchHelper(password_store_.get(), std::move(service)));
diff --git a/components/password_manager/core/browser/credential_manager_impl_unittest.cc b/components/password_manager/core/browser/credential_manager_impl_unittest.cc index 6697b44..f38893c 100644 --- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc +++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -198,7 +198,7 @@ void SetUp() override { store_ = new TestPasswordStore; - store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store_->Init(nullptr); client_.reset( new testing::NiceMock<MockPasswordManagerClient>(store_.get())); cm_service_impl_.reset(new CredentialManagerImpl(client_.get()));
diff --git a/components/password_manager/core/browser/field_info_manager_unittest.cc b/components/password_manager/core/browser/field_info_manager_unittest.cc index 85813a95..51f2181f 100644 --- a/components/password_manager/core/browser/field_info_manager_unittest.cc +++ b/components/password_manager/core/browser/field_info_manager_unittest.cc
@@ -38,7 +38,7 @@ test_data_.push_back({102u, 1u, SINGLE_USERNAME, Time::FromTimeT(10)}); store_ = new MockPasswordStore; - store_->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr); + store_->Init(/*prefs=*/nullptr); EXPECT_CALL(*store_, GetAllFieldInfoImpl()); field_info_manager_ = std::make_unique<FieldInfoManagerImpl>(store_); task_environment_.RunUntilIdle();
diff --git a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc index d646268..bfb9a0b2 100644 --- a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc +++ b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
@@ -197,7 +197,7 @@ kTestHttpURL, GURL(kTestHttpURL)) { mock_store_ = new MockPasswordStore; - mock_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + mock_store_->Init(nullptr); client_.set_store(mock_store_.get()); if (!GetParam()) {
diff --git a/components/password_manager/core/browser/http_auth_manager_unittest.cc b/components/password_manager/core/browser/http_auth_manager_unittest.cc index ff55fea..6874807 100644 --- a/components/password_manager/core/browser/http_auth_manager_unittest.cc +++ b/components/password_manager/core/browser/http_auth_manager_unittest.cc
@@ -100,8 +100,7 @@ protected: void SetUp() override { store_ = new testing::StrictMock<MockPasswordStore>; - ASSERT_TRUE( - store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); + ASSERT_TRUE(store_->Init(nullptr)); ON_CALL(client_, GetProfilePasswordStore()) .WillByDefault(Return(store_.get()));
diff --git a/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc b/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc index 4dd19f84..a4024a6 100644 --- a/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc +++ b/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc
@@ -140,7 +140,7 @@ base::ASCIIToUTF16("pass1")}; base::test::TaskEnvironment task_environment; - ASSERT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); + ASSERT_TRUE(store_->Init(nullptr)); TestCase test = GetParam(); SCOPED_TRACE(testing::Message() << "is_hsts_enabled=" << test.is_hsts_enabled @@ -252,8 +252,7 @@ base::test::TaskEnvironment task_environment; auto password_store = base::MakeRefCounted<TestPasswordStore>(); - ASSERT_TRUE(password_store->Init(syncer::SyncableService::StartSyncFlare(), - nullptr)); + ASSERT_TRUE(password_store->Init(nullptr)); double last_time = (base::Time::Now() - base::TimeDelta::FromMinutes(10)).ToDoubleT();
diff --git a/components/password_manager/core/browser/http_password_store_migrator_unittest.cc b/components/password_manager/core/browser/http_password_store_migrator_unittest.cc index a40ccaab..689de82 100644 --- a/components/password_manager/core/browser/http_password_store_migrator_unittest.cc +++ b/components/password_manager/core/browser/http_password_store_migrator_unittest.cc
@@ -120,7 +120,7 @@ HttpPasswordStoreMigratorTest() : mock_store_(new testing::StrictMock<MockPasswordStore>), client_(mock_store_.get()) { - mock_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + mock_store_->Init(nullptr); } ~HttpPasswordStoreMigratorTest() override {
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc index 07e6569..fab35d6 100644 --- a/components/password_manager/core/browser/leak_detection_delegate.cc +++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -98,7 +98,7 @@ CredentialLeakType leak_type = CreateLeakType( is_saved, is_reused, IsSyncing(client_->GetPasswordSyncState() == SYNCING_NORMAL_ENCRYPTION)); - client_->NotifyUserCredentialsWereLeaked(leak_type, url); + client_->NotifyUserCredentialsWereLeaked(leak_type, url, username); } void LeakDetectionDelegate::OnError(LeakDetectionError error) {
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc index 17b695ac..d3c0dd6 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
@@ -68,7 +68,7 @@ protected: void SetUp() override { store_ = new testing::StrictMock<MockPasswordStore>; - CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); + CHECK(store_->Init(nullptr)); delegate_helper_ = std::make_unique<LeakDetectionDelegateHelper>(store_, callback_.Get());
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc index 3933d5a..f303641 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -62,8 +62,10 @@ MOCK_CONST_METHOD0(IsIncognito, bool()); MOCK_CONST_METHOD0(GetPrefs, PrefService*()); - MOCK_METHOD2(NotifyUserCredentialsWereLeaked, - void(password_manager::CredentialLeakType, const GURL&)); + MOCK_METHOD3(NotifyUserCredentialsWereLeaked, + void(password_manager::CredentialLeakType, + const GURL&, + const base::string16& username)); MOCK_CONST_METHOD0(GetProfilePasswordStore, PasswordStore*()); }; @@ -77,7 +79,7 @@ class LeakDetectionDelegateTest : public testing::Test { public: LeakDetectionDelegateTest() { - mock_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + mock_store_->Init(nullptr); auto mock_factory = std::make_unique<testing::StrictMock<MockLeakDetectionCheckFactory>>(); mock_factory_ = mock_factory.get(); @@ -293,7 +295,7 @@ NotifyUserCredentialsWereLeaked( password_manager::CreateLeakType( IsSaved(false), IsReused(false), IsSyncing(false)), - form.origin)); + form.origin, form.username_value)); delegate_interface->OnLeakDetectionDone( /*is_leaked=*/true, form.origin, form.username_value, form.password_value); @@ -317,7 +319,8 @@ Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); delegate().StartLeakCheck(form); - EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked(_, form.origin)); + EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked(_, form.origin, + form.username_value)); delegate_interface->OnLeakDetectionDone( /*is_leaked=*/true, form.origin, form.username_value, form.password_value);
diff --git a/components/password_manager/core/browser/mock_password_store.cc b/components/password_manager/core/browser/mock_password_store.cc index c88b29a..1279df124 100644 --- a/components/password_manager/core/browser/mock_password_store.cc +++ b/components/password_manager/core/browser/mock_password_store.cc
@@ -18,8 +18,7 @@ return base::SequencedTaskRunnerHandle::Get(); } -bool MockPasswordStore::InitOnBackgroundSequence( - const syncer::SyncableService::StartSyncFlare& flare) { +bool MockPasswordStore::InitOnBackgroundSequence() { return true; }
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h index 8e5c66e53..11f2a3b 100644 --- a/components/password_manager/core/browser/mock_password_store.h +++ b/components/password_manager/core/browser/mock_password_store.h
@@ -126,8 +126,7 @@ // PasswordStore: scoped_refptr<base::SequencedTaskRunner> CreateBackgroundTaskRunner() const override; - bool InitOnBackgroundSequence( - const syncer::SyncableService::StartSyncFlare& flare) override; + bool InitOnBackgroundSequence() override; }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc index 67703118..9dbd37d 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc +++ b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
@@ -124,13 +124,11 @@ kTestHttpURL, GURL(kTestHttpURL)) { profile_mock_store_ = new MockPasswordStore; - profile_mock_store_->Init(syncer::SyncableService::StartSyncFlare(), - /*prefs=*/nullptr); + profile_mock_store_->Init(/*prefs=*/nullptr); client_.set_profile_store(profile_mock_store_.get()); account_mock_store_ = new MockPasswordStore; - account_mock_store_->Init(syncer::SyncableService::StartSyncFlare(), - /*prefs=*/nullptr); + account_mock_store_->Init(/*prefs=*/nullptr); client_.set_account_store(account_mock_store_.get()); form_fetcher_ = std::make_unique<MultiStoreFormFetcher>(
diff --git a/components/password_manager/core/browser/password_manager_client.cc b/components/password_manager/core/browser/password_manager_client.cc index 06380bb..3ec5d778 100644 --- a/components/password_manager/core/browser/password_manager_client.cc +++ b/components/password_manager/core/browser/password_manager_client.cc
@@ -56,7 +56,8 @@ void PasswordManagerClient::NotifyUserCredentialsWereLeaked( password_manager::CredentialLeakType leak_type, - const GURL& origin) {} + const GURL& origin, + const base::string16& username) {} void PasswordManagerClient::TriggerReauthForAccount( const CoreAccountId& account_id, @@ -72,6 +73,10 @@ return false; } +bool PasswordManagerClient::WasCredentialLeakDialogShown() const { + return false; +} + net::CertStatus PasswordManagerClient::GetMainFrameCertStatus() const { return 0; }
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h index 9f38f38..3f7ee0fa 100644 --- a/components/password_manager/core/browser/password_manager_client.h +++ b/components/password_manager/core/browser/password_manager_client.h
@@ -232,7 +232,8 @@ // Informs the embedder that user credentials were leaked. virtual void NotifyUserCredentialsWereLeaked(CredentialLeakType leak_type, - const GURL& origin); + const GURL& origin, + const base::string16& username); // Requests a reauth for the given |account_id| and triggers the // |reauth_callback| with ReauthSucceeded(true) if reauthentication succeeded. @@ -256,6 +257,11 @@ // Returns true if last navigation page had HTTP error i.e 5XX or 4XX virtual bool WasLastNavigationHTTPError() const; + // Returns true if a credential leak dialog was shown. Used by Autofill + // Assistance to verify a password change intent. TODO(b/151391231): Remove + // when proper intent signing is implemented. + virtual bool WasCredentialLeakDialogShown() const; + // Obtains the cert status for the main frame. virtual net::CertStatus GetMainFrameCertStatus() const;
diff --git a/components/password_manager/core/browser/password_manager_onboarding_unittest.cc b/components/password_manager/core/browser/password_manager_onboarding_unittest.cc index 5597300..63cc640 100644 --- a/components/password_manager/core/browser/password_manager_onboarding_unittest.cc +++ b/components/password_manager/core/browser/password_manager_onboarding_unittest.cc
@@ -42,7 +42,7 @@ void SetUp() override { store_ = new TestPasswordStore; - store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store_->Init(nullptr); prefs_.reset(new TestingPrefServiceSimple()); prefs_->registry()->RegisterIntegerPref(
diff --git a/components/password_manager/core/browser/password_manager_test_utils.h b/components/password_manager/core/browser/password_manager_test_utils.h index e058e3d1..451f5bac 100644 --- a/components/password_manager/core/browser/password_manager_test_utils.h +++ b/components/password_manager/core/browser/password_manager_test_utils.h
@@ -30,7 +30,7 @@ template <class Context, class Store> scoped_refptr<RefcountedKeyedService> BuildPasswordStore(Context* context) { scoped_refptr<password_manager::PasswordStore> store(new Store); - if (!store->Init(syncer::SyncableService::StartSyncFlare(), nullptr)) + if (!store->Init(nullptr)) return nullptr; return store; } @@ -45,7 +45,7 @@ Context* context) { scoped_refptr<password_manager::PasswordStore> store( new Store(std::forward<Args>(args)...)); - if (!store->Init(syncer::SyncableService::StartSyncFlare(), nullptr)) + if (!store->Init(nullptr)) return nullptr; return store; }
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 77284f1f..33eb222 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -304,7 +304,7 @@ void SetUp() override { store_ = new testing::StrictMock<MockPasswordStore>; EXPECT_CALL(*store_, ReportMetrics(_, _, _)).Times(AnyNumber()); - CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); + CHECK(store_->Init(nullptr)); ON_CALL(client_, GetProfilePasswordStore()) .WillByDefault(Return(store_.get()));
diff --git a/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc b/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc index 7b5bc51..6f641a8 100644 --- a/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc +++ b/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc
@@ -40,10 +40,10 @@ class PasswordReuseDetectionManagerTest : public ::testing::Test { public: - PasswordReuseDetectionManagerTest() {} + PasswordReuseDetectionManagerTest() = default; void SetUp() override { store_ = new testing::StrictMock<MockPasswordStore>; - CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr)); + CHECK(store_->Init(nullptr)); } void TearDown() override { store_->ShutdownOnUIThread();
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index 6d23d1e..ca3d6ed 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -35,10 +35,8 @@ #include "components/password_manager/core/browser/password_store_consumer.h" #include "components/password_manager/core/browser/statistics_table.h" #include "components/password_manager/core/browser/sync/password_sync_bridge.h" -#include "components/password_manager/core/browser/sync/password_syncable_service.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" -#include "components/sync/driver/sync_driver_switches.h" #include "components/sync/model_impl/client_tag_based_model_type_processor.h" #include "components/sync/model_impl/proxy_model_type_controller_delegate.h" @@ -143,8 +141,7 @@ shutdown_called_(false), init_status_(InitStatus::kUnknown) {} -bool PasswordStore::Init(const syncer::SyncableService::StartSyncFlare& flare, - PrefService* prefs, +bool PasswordStore::Init(PrefService* prefs, base::RepeatingClosure sync_enabled_or_disabled_cb) { main_task_runner_ = base::SequencedTaskRunnerHandle::Get(); DCHECK(main_task_runner_); @@ -160,7 +157,7 @@ "passwords", "PasswordStore::InitOnBackgroundSequence", this); base::PostTaskAndReplyWithResult( background_task_runner_.get(), FROM_HERE, - base::BindOnce(&PasswordStore::InitOnBackgroundSequence, this, flare), + base::BindOnce(&PasswordStore::InitOnBackgroundSequence, this), base::BindOnce(&PasswordStore::OnInitCompleted, this)); } @@ -480,13 +477,6 @@ #endif } -base::WeakPtr<syncer::SyncableService> -PasswordStore::GetPasswordSyncableService() { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - DCHECK(syncable_service_); - return syncable_service_->AsWeakPtr(); -} - std::unique_ptr<syncer::ProxyModelTypeControllerDelegate> PasswordStore::CreateSyncControllerDelegate() { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); @@ -638,19 +628,12 @@ {base::MayBlock(), base::TaskPriority::USER_VISIBLE}); } -bool PasswordStore::InitOnBackgroundSequence( - const syncer::SyncableService::StartSyncFlare& flare) { +bool PasswordStore::InitOnBackgroundSequence() { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - if (base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) { - sync_bridge_.reset(new PasswordSyncBridge( - std::make_unique<syncer::ClientTagBasedModelTypeProcessor>( - syncer::PASSWORDS, base::DoNothing()), - /*password_store_sync=*/this, sync_enabled_or_disabled_cb_)); - } else { - DCHECK(!syncable_service_); - syncable_service_.reset(new PasswordSyncableService(this)); - syncable_service_->InjectStartSyncFlare(flare); - } + sync_bridge_.reset(new PasswordSyncBridge( + std::make_unique<syncer::ClientTagBasedModelTypeProcessor>( + syncer::PASSWORDS, base::DoNothing()), + /*password_store_sync=*/this, sync_enabled_or_disabled_cb_)); #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED) reuse_detector_ = new PasswordReuseDetector; @@ -703,8 +686,6 @@ DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); if (!changes.empty()) { observers_->Notify(FROM_HERE, &Observer::OnLoginsChanged, changes); - if (syncable_service_) - syncable_service_->ActOnPasswordStoreChanges(changes); if (sync_bridge_) sync_bridge_->ActOnPasswordStoreChanges(changes); @@ -1228,7 +1209,6 @@ void PasswordStore::DestroyOnBackgroundSequence() { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - syncable_service_.reset(); sync_bridge_.reset(); #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index 759a4e1f..2b7f639 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -24,7 +24,6 @@ #include "components/password_manager/core/browser/compromised_credentials_table.h" #include "components/password_manager/core/browser/password_store_change.h" #include "components/password_manager/core/browser/password_store_sync.h" -#include "components/sync/model/syncable_service.h" #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED) #include "components/password_manager/core/browser/hash_password_manager.h" @@ -43,8 +42,7 @@ namespace syncer { class ModelTypeControllerDelegate; class ProxyModelTypeControllerDelegate; -class SyncableService; -} +} // namespace syncer using StateSubscription = base::CallbackList<void(const std::string& username)>::Subscription; @@ -60,7 +58,6 @@ class PasswordStoreConsumer; class CompromisedCredentialsConsumer; class PasswordStoreSigninNotifier; -class PasswordSyncableService; class PasswordSyncBridge; struct FieldInfo; struct InteractionsStats; @@ -79,7 +76,7 @@ // this manner. If this deferred initialization fails, all subsequent method // calls should fail without side effects, return no data, and send no // notifications. PasswordStoreSync is a hidden base class because only -// PasswordSyncableService needs to access these methods. +// PasswordSyncBridge needs to access these methods. class PasswordStore : protected PasswordStoreSync, public RefcountedKeyedService { public: @@ -133,7 +130,6 @@ // Always call this too on the UI thread. bool Init( - const syncer::SyncableService::StartSyncFlare& flare, PrefService* prefs, base::RepeatingClosure sync_enabled_or_disabled_cb = base::DoNothing()); @@ -319,8 +315,6 @@ // Returns true iff initialization was successful. virtual bool IsAbleToSavePasswords() const; - base::WeakPtr<syncer::SyncableService> GetPasswordSyncableService(); - // For sync codebase only: instantiates a proxy controller delegate to // interact with PasswordSyncBridge. Must be called from the UI thread. std::unique_ptr<syncer::ProxyModelTypeControllerDelegate> @@ -443,11 +437,10 @@ virtual scoped_refptr<base::SequencedTaskRunner> CreateBackgroundTaskRunner() const; - // Creates PasswordSyncableService and PasswordReuseDetector instances on the + // Creates PasswordSyncBridge and PasswordReuseDetector instances on the // background sequence. Subclasses can add more logic. Returns true on // success. - virtual bool InitOnBackgroundSequence( - const syncer::SyncableService::StartSyncFlare& flare); + virtual bool InitOnBackgroundSequence(); // Methods below will be run in PasswordStore's own sequence. // Synchronous implementation that reports usage metrics. @@ -797,8 +790,6 @@ base::MakeRefCounted<base::ObserverListThreadSafe< DatabaseCompromisedCredentialsObserver>>(); - // Either of two below would actually be set based on a feature flag. - std::unique_ptr<PasswordSyncableService> syncable_service_; std::unique_ptr<PasswordSyncBridge> sync_bridge_; base::RepeatingClosure sync_enabled_or_disabled_cb_;
diff --git a/components/password_manager/core/browser/password_store_default.cc b/components/password_manager/core/browser/password_store_default.cc index 41a094e..0d1f379 100644 --- a/components/password_manager/core/browser/password_store_default.cc +++ b/components/password_manager/core/browser/password_store_default.cc
@@ -30,19 +30,18 @@ ScheduleTask(base::BindOnce(&PasswordStoreDefault::ResetLoginDB, this)); } -bool PasswordStoreDefault::InitOnBackgroundSequence( - const syncer::SyncableService::StartSyncFlare& flare) { +bool PasswordStoreDefault::InitOnBackgroundSequence() { DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); DCHECK(login_db_); bool success = true; if (!login_db_->Init()) { login_db_.reset(); - // The initialization should be continued, because PasswordSyncableService + // The initialization should be continued, because PasswordSyncBridge // has to be initialized even if database initialization failed. success = false; LOG(ERROR) << "Could not create/open login database."; } - return PasswordStore::InitOnBackgroundSequence(flare) && success; + return PasswordStore::InitOnBackgroundSequence() && success; } void PasswordStoreDefault::ReportMetricsImpl(
diff --git a/components/password_manager/core/browser/password_store_default.h b/components/password_manager/core/browser/password_store_default.h index 456d8d8c..430b954 100644 --- a/components/password_manager/core/browser/password_store_default.h +++ b/components/password_manager/core/browser/password_store_default.h
@@ -33,8 +33,7 @@ ~PasswordStoreDefault() override; // Opens |login_db_| on the background sequence. - bool InitOnBackgroundSequence( - const syncer::SyncableService::StartSyncFlare& flare) override; + bool InitOnBackgroundSequence() override; // Implements PasswordStore interface. void ReportMetricsImpl(const std::string& sync_username,
diff --git a/components/password_manager/core/browser/password_store_default_unittest.cc b/components/password_manager/core/browser/password_store_default_unittest.cc index 2fb9da7..0be0cec 100644 --- a/components/password_manager/core/browser/password_store_default_unittest.cc +++ b/components/password_manager/core/browser/password_store_default_unittest.cc
@@ -144,7 +144,7 @@ std::unique_ptr<LoginDatabase> database) { scoped_refptr<PasswordStoreDefault> store( new PasswordStoreDefault(std::move(database))); - store->Init(syncer::SyncableService::StartSyncFlare(), &prefs_); + store->Init(&prefs_); return store; }
diff --git a/components/password_manager/core/browser/password_store_factory_util.h b/components/password_manager/core/browser/password_store_factory_util.h index eaef85ac4..e1162d41 100644 --- a/components/password_manager/core/browser/password_store_factory_util.h +++ b/components/password_manager/core/browser/password_store_factory_util.h
@@ -14,7 +14,6 @@ #include "components/password_manager/core/browser/login_database.h" #include "components/password_manager/core/browser/password_store.h" #include "components/sync/driver/sync_service.h" -#include "components/sync/model/syncable_service.h" #include "services/network/public/cpp/shared_url_loader_factory.h" namespace network {
diff --git a/components/password_manager/core/browser/password_store_sync.h b/components/password_manager/core/browser/password_store_sync.h index b03d1062..c07fad13d 100644 --- a/components/password_manager/core/browser/password_store_sync.h +++ b/components/password_manager/core/browser/password_store_sync.h
@@ -89,7 +89,7 @@ kMaxValue = kDbError, }; -// PasswordStore interface for PasswordSyncableService. It provides access to +// PasswordStore interface for PasswordSyncBridge. It provides access to // synchronous methods of PasswordStore which shouldn't be accessible to other // classes. These methods are to be called on the PasswordStore background // thread only.
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index d12a983..0380659 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -36,7 +36,6 @@ #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" -#include "components/sync/driver/sync_driver_switches.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -123,16 +122,6 @@ MOCK_METHOD0(UnsubscribeFromSigninEvents, void()); }; -class StartSyncFlareMock { - public: - StartSyncFlareMock() = default; - - MOCK_METHOD1(StartSyncFlare, void(syncer::ModelType)); - - private: - DISALLOW_COPY_AND_ASSIGN(StartSyncFlareMock); -}; - } // namespace class PasswordStoreTest : public testing::Test { @@ -179,7 +168,7 @@ TEST_F(PasswordStoreTest, IgnoreOldWwwGoogleLogins) { scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); const time_t cutoff = 1325376000; // 00:00 Jan 1 2012 UTC const time_t last_usage_time = 1546300800; // 00:00 Jan 1 2019 UTC @@ -268,26 +257,6 @@ store->ShutdownOnUIThread(); } -TEST_F(PasswordStoreTest, StartSyncFlare) { - // This test isn't relevant for USS code path. - if (base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) - return; - scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - StartSyncFlareMock mock; - store->Init( - base::Bind(&StartSyncFlareMock::StartSyncFlare, base::Unretained(&mock)), - nullptr); - - PasswordForm form; - form.origin = GURL("http://accounts.google.com/LoginAuth"); - form.signon_realm = "http://accounts.google.com/"; - EXPECT_CALL(mock, StartSyncFlare(syncer::PASSWORDS)); - store->AddLogin(form); - WaitForPasswordStore(); - - store->ShutdownOnUIThread(); -} - TEST_F(PasswordStoreTest, UpdateLoginPrimaryKeyFields) { /* clang-format off */ static const PasswordFormData kTestCredentials[] = { @@ -308,7 +277,7 @@ /* clang-format on */ scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::unique_ptr<PasswordForm> old_form( FillPasswordFormWithData(kTestCredentials[0])); @@ -359,7 +328,7 @@ /* clang-format on */ scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::unique_ptr<PasswordForm> test_form( FillPasswordFormWithData(kTestCredential)); @@ -391,7 +360,7 @@ base::Time::FromTimeT(1), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials); @@ -433,7 +402,7 @@ kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), base::Time::FromTimeT(1), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials); @@ -475,7 +444,7 @@ kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), base::Time::FromTimeT(1), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials); @@ -519,7 +488,7 @@ base::Time::FromTimeT(1), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddDatabaseCompromisedCredentialsObserver(&observer); // Expect a notification after adding a credential. @@ -546,7 +515,7 @@ base::Time::FromTimeT(1), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials); WaitForPasswordStore(); @@ -580,7 +549,7 @@ base::Time::FromTimeT(1), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials); WaitForPasswordStore(); @@ -625,7 +594,7 @@ /* clang-format on */ scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::vector<std::unique_ptr<PasswordForm>> all_credentials; for (size_t i = 0; i < base::size(kTestCredentials); ++i) { @@ -724,7 +693,7 @@ }}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::vector<std::unique_ptr<PasswordForm>> all_credentials; for (const auto& i : kTestCredentials) { @@ -891,7 +860,7 @@ << test_remove_and_add_login); scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max(), base::Closure()); @@ -988,7 +957,7 @@ L"", L"", nullptr, L"", true, 1}}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::vector<std::unique_ptr<PasswordForm>> all_credentials; for (const auto& test_credential : kTestCredentials) { @@ -1038,7 +1007,7 @@ L"", L"", nullptr, tested_password, true, 1}}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::vector<std::unique_ptr<PasswordForm>> all_credentials; for (const auto& test_credential : kTestCredentials) { @@ -1093,7 +1062,7 @@ L"", L"", nullptr, L"", true, 1}}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::vector<std::unique_ptr<PasswordForm>> all_credentials; for (const auto& test_credential : kTestCredentials) { @@ -1168,7 +1137,7 @@ kTestUnrelatedWebOrigin2, "", L"", L"", L"", L"username", L"", true, 1}}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); std::vector<std::unique_ptr<PasswordForm>> all_credentials; for (const auto& test_credential : kTestCredentials) { @@ -1213,7 +1182,7 @@ "https://facebook.com", "", L"", L"", L"", L"", L"topsecret", true, 1}}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); for (const auto& test_credentials : kTestCredentials) { auto credentials = FillPasswordFormWithData(test_credentials); @@ -1257,7 +1226,7 @@ prefs.registry()->RegisterListPref(prefs::kPasswordHashDataList, PrefRegistry::NO_REGISTRATION_FLAGS); ASSERT_FALSE(prefs.HasPrefPath(prefs::kSyncPasswordHash)); - store->Init(syncer::SyncableService::StartSyncFlare(), &prefs); + store->Init(&prefs); const base::string16 sync_password = base::ASCIIToUTF16("password"); const base::string16 input = base::ASCIIToUTF16("123password"); @@ -1415,7 +1384,7 @@ prefs.registry()->RegisterListPref(prefs::kPasswordHashDataList, PrefRegistry::NO_REGISTRATION_FLAGS); ASSERT_FALSE(prefs.HasPrefPath(prefs::kSyncPasswordHash)); - store->Init(syncer::SyncableService::StartSyncFlare(), &prefs); + store->Init(&prefs); // Hash does not exist yet. base::HistogramTester histogram_tester; @@ -1449,7 +1418,7 @@ prefs.registry()->RegisterListPref(prefs::kPasswordHashDataList, PrefRegistry::NO_REGISTRATION_FLAGS); ASSERT_FALSE(prefs.HasPrefPath(prefs::kSyncPasswordHash)); - store->Init(syncer::SyncableService::StartSyncFlare(), &prefs); + store->Init(&prefs); // Hash does not exist yet. base::HistogramTester histogram_tester; @@ -1493,7 +1462,7 @@ base::Time::FromTimeT(2), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials); store->AddCompromisedCredentials(compromised_credentials2); @@ -1530,7 +1499,7 @@ base::Time::FromTimeT(300), CompromiseType::kLeaked}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddCompromisedCredentials(compromised_credentials1); store->AddCompromisedCredentials(compromised_credentials2); @@ -1567,7 +1536,7 @@ FieldInfo field_info2{1002 /*form_signature*/, 10 /* field_signature */, autofill::PASSWORD, base::Time::FromTimeT(2)}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddFieldInfo(field_info1); store->AddFieldInfo(field_info2); @@ -1590,7 +1559,7 @@ autofill::PASSWORD, base::Time::FromTimeT(300)}; scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore(); - store->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store->Init(nullptr); store->AddFieldInfo(field_info1); store->AddFieldInfo(field_info2);
diff --git a/components/password_manager/core/browser/sync/password_data_type_controller.cc b/components/password_manager/core/browser/sync/password_data_type_controller.cc deleted file mode 100644 index 5d6ef22..0000000 --- a/components/password_manager/core/browser/sync/password_data_type_controller.cc +++ /dev/null
@@ -1,62 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/password_manager/core/browser/sync/password_data_type_controller.h" - -#include "base/bind.h" -#include "base/metrics/histogram.h" -#include "components/password_manager/core/browser/password_store.h" -#include "components/sync/driver/sync_client.h" -#include "components/sync/driver/sync_service.h" - -namespace browser_sync { - -PasswordDataTypeController::PasswordDataTypeController( - const base::RepeatingClosure& dump_stack, - syncer::SyncService* sync_service, - syncer::SyncClient* sync_client, - const base::RepeatingClosure& state_changed_callback, - const scoped_refptr<password_manager::PasswordStore>& password_store) - : AsyncDirectoryTypeController(syncer::PASSWORDS, - dump_stack, - sync_service, - sync_client, - syncer::GROUP_PASSWORD, - nullptr), - state_changed_callback_(state_changed_callback), - password_store_(password_store) {} - -PasswordDataTypeController::~PasswordDataTypeController() {} - -bool PasswordDataTypeController::PostTaskOnModelThread( - const base::Location& from_here, - base::OnceClosure task) { - DCHECK(CalledOnValidThread()); - if (!password_store_) - return false; - return password_store_->ScheduleTask(std::move(task)); -} - -bool PasswordDataTypeController::StartModels() { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(MODEL_STARTING, state()); - - sync_service()->AddObserver(this); - - OnStateChanged(sync_service()); - - return !!password_store_; -} - -void PasswordDataTypeController::StopModels() { - DCHECK(CalledOnValidThread()); - sync_service()->RemoveObserver(this); -} - -void PasswordDataTypeController::OnStateChanged(syncer::SyncService* sync) { - DCHECK(CalledOnValidThread()); - state_changed_callback_.Run(); -} - -} // namespace browser_sync
diff --git a/components/password_manager/core/browser/sync/password_data_type_controller.h b/components/password_manager/core/browser/sync/password_data_type_controller.h deleted file mode 100644 index 6e847490..0000000 --- a/components/password_manager/core/browser/sync/password_data_type_controller.h +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_DATA_TYPE_CONTROLLER_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_DATA_TYPE_CONTROLLER_H_ - -#include <string> - -#include "base/macros.h" -#include "components/sync/driver/async_directory_type_controller.h" -#include "components/sync/driver/sync_service_observer.h" - -namespace password_manager { -class PasswordStore; -} - -namespace syncer { -class SyncClient; -class SyncService; -} - -namespace browser_sync { - -// A class that manages the startup and shutdown of password sync. -class PasswordDataTypeController : public syncer::AsyncDirectoryTypeController, - public syncer::SyncServiceObserver { - public: - // |dump_stack| is called when an unrecoverable error occurs. - PasswordDataTypeController( - const base::RepeatingClosure& dump_stack, - syncer::SyncService* sync_service, - syncer::SyncClient* sync_client, - const base::RepeatingClosure& state_changed_callback, - const scoped_refptr<password_manager::PasswordStore>& password_store); - ~PasswordDataTypeController() override; - - protected: - // AsyncDirectoryTypeController interface. - bool PostTaskOnModelThread(const base::Location& from_here, - base::OnceClosure task) override; - bool StartModels() override; - void StopModels() override; - - // syncer::SyncServiceObserver: - void OnStateChanged(syncer::SyncService* sync) override; - - private: - const base::RepeatingClosure state_changed_callback_; - scoped_refptr<password_manager::PasswordStore> password_store_; - - DISALLOW_COPY_AND_ASSIGN(PasswordDataTypeController); -}; - -} // namespace browser_sync - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_DATA_TYPE_CONTROLLER_H_
diff --git a/components/password_manager/core/browser/sync/password_model_worker.cc b/components/password_manager/core/browser/sync/password_model_worker.cc deleted file mode 100644 index 9314d1c6..0000000 --- a/components/password_manager/core/browser/sync/password_model_worker.cc +++ /dev/null
@@ -1,47 +0,0 @@ -// Copyright (c) 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/password_manager/core/browser/sync/password_model_worker.h" - -#include <utility> - -#include "base/bind.h" -#include "components/password_manager/core/browser/password_store.h" - -namespace browser_sync { - -PasswordModelWorker::PasswordModelWorker( - const scoped_refptr<password_manager::PasswordStore>& password_store) - : password_store_(password_store) { - DCHECK(password_store); -} - -syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() { - return syncer::GROUP_PASSWORD; -} - -bool PasswordModelWorker::IsOnModelSequence() { - // Ideally PasswordStore would expose a way to check whether this is the - // thread it does work on. Since it doesn't, just return true to bypass a - // CHECK in the sync code. - return true; -} - -PasswordModelWorker::~PasswordModelWorker() {} - -void PasswordModelWorker::ScheduleWork(base::OnceClosure work) { - base::AutoLock lock(password_store_lock_); - if (password_store_) { - password_store_->ScheduleTask(std::move(work)); - } -} - -void PasswordModelWorker::RequestStop() { - ModelSafeWorker::RequestStop(); - - base::AutoLock lock(password_store_lock_); - password_store_ = nullptr; -} - -} // namespace browser_sync
diff --git a/components/password_manager/core/browser/sync/password_model_worker.h b/components/password_manager/core/browser/sync/password_model_worker.h deleted file mode 100644 index 6c43209..0000000 --- a/components/password_manager/core/browser/sync/password_model_worker.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright (c) 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_WORKER_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_WORKER_H_ - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "components/sync/engine/model_safe_worker.h" - -namespace password_manager { -class PasswordStore; -} - -namespace browser_sync { - -// A syncer::ModelSafeWorker for password models that accepts requests -// from the syncapi that need to be fulfilled on the password thread, -// which is the DB thread on Linux and Windows. -class PasswordModelWorker : public syncer::ModelSafeWorker { - public: - PasswordModelWorker( - const scoped_refptr<password_manager::PasswordStore>& password_store); - - // syncer::ModelSafeWorker implementation. - syncer::ModelSafeGroup GetModelSafeGroup() override; - bool IsOnModelSequence() override; - void RequestStop() override; - - private: - ~PasswordModelWorker() override; - - void ScheduleWork(base::OnceClosure work) override; - - // |password_store_| is used on password thread but released on UI thread. - // Protected by |password_store_lock_|. - base::Lock password_store_lock_; - scoped_refptr<password_manager::PasswordStore> password_store_; - DISALLOW_COPY_AND_ASSIGN(PasswordModelWorker); -}; - -} // namespace browser_sync - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_WORKER_H_
diff --git a/components/password_manager/core/browser/sync/password_syncable_service.cc b/components/password_manager/core/browser/sync/password_syncable_service.cc deleted file mode 100644 index bad5601..0000000 --- a/components/password_manager/core/browser/sync/password_syncable_service.cc +++ /dev/null
@@ -1,558 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/password_manager/core/browser/sync/password_syncable_service.h" - -#include <algorithm> -#include <iterator> -#include <memory> -#include <utility> - -#include "base/auto_reset.h" -#include "base/location.h" -#include "base/metrics/histogram_functions.h" -#include "base/metrics/histogram_macros.h" -#include "base/strings/utf_string_conversions.h" -#include "build/build_config.h" -#include "components/autofill/core/common/password_form.h" -#include "components/password_manager/core/browser/password_manager_metrics_util.h" -#include "components/password_manager/core/browser/password_store_sync.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/model/sync_change_processor.h" -#include "components/sync/model/sync_error_factory.h" -#include "net/base/escape.h" - -namespace password_manager { - -// Converts the |password| into a SyncData object. -syncer::SyncData SyncDataFromPassword(const autofill::PasswordForm& password); - -// Extracts the |PasswordForm| data from sync's protobuf format. -autofill::PasswordForm PasswordFromSpecifics( - const sync_pb::PasswordSpecificsData& password); - -// Returns the unique tag that will serve as the sync identifier for the -// |password| entry. -std::string MakePasswordSyncTag(const sync_pb::PasswordSpecificsData& password); -std::string MakePasswordSyncTag(const autofill::PasswordForm& password); - -namespace { - -// Returns true iff |password_specifics| and |password_specifics| are equal -// memberwise. -bool AreLocalAndSyncPasswordsEqual( - const sync_pb::PasswordSpecificsData& password_specifics, - const autofill::PasswordForm& password_form) { - return ( - static_cast<int>(password_form.scheme) == password_specifics.scheme() && - password_form.signon_realm == password_specifics.signon_realm() && - password_form.origin.spec() == password_specifics.origin() && - password_form.action.spec() == password_specifics.action() && - base::UTF16ToUTF8(password_form.username_element) == - password_specifics.username_element() && - base::UTF16ToUTF8(password_form.password_element) == - password_specifics.password_element() && - base::UTF16ToUTF8(password_form.username_value) == - password_specifics.username_value() && - base::UTF16ToUTF8(password_form.password_value) == - password_specifics.password_value() && - password_form.date_last_used.ToDeltaSinceWindowsEpoch() - .InMicroseconds() == password_specifics.date_last_used() && - password_form.date_created.ToInternalValue() == - password_specifics.date_created() && - password_form.blacklisted_by_user == password_specifics.blacklisted() && - static_cast<int>(password_form.type) == password_specifics.type() && - password_form.times_used == password_specifics.times_used() && - base::UTF16ToUTF8(password_form.display_name) == - password_specifics.display_name() && - password_form.icon_url.spec() == password_specifics.avatar_url() && - url::Origin::Create(GURL(password_specifics.federation_url())) - .Serialize() == password_form.federation_origin.Serialize()); -} - -syncer::SyncChange::SyncChangeType GetSyncChangeType( - PasswordStoreChange::Type type) { - switch (type) { - case PasswordStoreChange::ADD: - return syncer::SyncChange::ACTION_ADD; - case PasswordStoreChange::UPDATE: - return syncer::SyncChange::ACTION_UPDATE; - case PasswordStoreChange::REMOVE: - return syncer::SyncChange::ACTION_DELETE; - } - NOTREACHED(); - return syncer::SyncChange::ACTION_INVALID; -} - -// Creates a PasswordForm from |specifics| and |sync_time|, appends it to -// |entries|. -void AppendPasswordFromSpecifics( - const sync_pb::PasswordSpecificsData& specifics, - base::Time sync_time, - std::vector<std::unique_ptr<autofill::PasswordForm>>* entries) { - entries->push_back(std::make_unique<autofill::PasswordForm>( - PasswordFromSpecifics(specifics))); - entries->back()->date_synced = sync_time; -} - -} // namespace - -struct PasswordSyncableService::SyncEntries { - std::vector<std::unique_ptr<autofill::PasswordForm>>* EntriesForChangeType( - syncer::SyncChange::SyncChangeType type) { - switch (type) { - case syncer::SyncChange::ACTION_ADD: - return &new_entries; - case syncer::SyncChange::ACTION_UPDATE: - return &updated_entries; - case syncer::SyncChange::ACTION_DELETE: - return &deleted_entries; - case syncer::SyncChange::ACTION_INVALID: - return nullptr; - } - NOTREACHED(); - return nullptr; - } - - // List that contains the entries that are known only to sync. - std::vector<std::unique_ptr<autofill::PasswordForm>> new_entries; - - // List that contains the entries that are known to both sync and the local - // database but have updates in sync. They need to be updated in the local - // database. - std::vector<std::unique_ptr<autofill::PasswordForm>> updated_entries; - - // The list of entries to be deleted from the local database. - std::vector<std::unique_ptr<autofill::PasswordForm>> deleted_entries; -}; - -PasswordSyncableService::PasswordSyncableService( - PasswordStoreSync* password_store) - : password_store_(password_store), is_processing_sync_changes_(false) {} - -PasswordSyncableService::~PasswordSyncableService() = default; - -void PasswordSyncableService::WaitUntilReadyToSync(base::OnceClosure done) { - // PasswordStore becomes ready upon construction. - std::move(done).Run(); -} - -syncer::SyncMergeResult PasswordSyncableService::MergeDataAndStartSyncing( - syncer::ModelType type, - const syncer::SyncDataList& initial_sync_data, - std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, - std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(syncer::PASSWORDS, type); - base::AutoReset<bool> processing_changes(&is_processing_sync_changes_, true); - syncer::SyncMergeResult merge_result(type); - - // We add all the db entries as |new_local_entries| initially. During model - // association entries that match a sync entry will be removed and this list - // will only contain entries that are not in sync. - std::vector<std::unique_ptr<autofill::PasswordForm>> password_entries; - PasswordEntryMap new_local_entries; - if (!ReadFromPasswordStore(&password_entries, &new_local_entries)) { - if (!ShouldRecoverPasswordsDuringMerge()) { - merge_result.set_error(sync_error_factory->CreateAndUploadError( - FROM_HERE, "Failed to get passwords from store.")); - metrics_util::LogPasswordSyncState(metrics_util::NOT_SYNCING_FAILED_READ); - return merge_result; - } - - // On MacOS it may happen that some passwords cannot be decrypted due to - // modification of encryption key in Keychain (https://crbug.com/730625). - // Delete those logins from the store, they should be automatically updated - // with Sync data. - DatabaseCleanupResult cleanup_result = - password_store_->DeleteUndecryptableLogins(); - - if (cleanup_result == DatabaseCleanupResult::kEncryptionUnavailable) { - merge_result.set_error(sync_error_factory->CreateAndUploadError( - FROM_HERE, "Failed to get encryption key during database cleanup.")); - metrics_util::LogPasswordSyncState( - metrics_util::NOT_SYNCING_FAILED_DECRYPTION); - return merge_result; - } - - if (cleanup_result != DatabaseCleanupResult::kSuccess) { - merge_result.set_error(sync_error_factory->CreateAndUploadError( - FROM_HERE, "Failed to cleanup database.")); - metrics_util::LogPasswordSyncState( - metrics_util::NOT_SYNCING_FAILED_CLEANUP); - return merge_result; - } - - // Try to read all entries again. If deletion of passwords which couldn't - // be deleted didn't help, return an error. - password_entries.clear(); - new_local_entries.clear(); - if (!ReadFromPasswordStore(&password_entries, &new_local_entries)) { - merge_result.set_error(sync_error_factory->CreateAndUploadError( - FROM_HERE, "Failed to get passwords from store.")); - metrics_util::LogPasswordSyncState(metrics_util::NOT_SYNCING_FAILED_READ); - return merge_result; - } - } - - if (password_entries.size() != new_local_entries.size()) { - merge_result.set_error(sync_error_factory->CreateAndUploadError( - FROM_HERE, - "There are passwords with identical sync tags in the database.")); - metrics_util::LogPasswordSyncState( - metrics_util::NOT_SYNCING_DUPLICATE_TAGS); - return merge_result; - } - merge_result.set_num_items_before_association(new_local_entries.size()); - - SyncEntries sync_entries; - // Changes from password db that need to be propagated to sync. - syncer::SyncChangeList updated_db_entries; - for (auto sync_iter = initial_sync_data.begin(); - sync_iter != initial_sync_data.end(); ++sync_iter) { - CreateOrUpdateEntry(*sync_iter, &new_local_entries, &sync_entries, - &updated_db_entries); - } - - for (auto it = new_local_entries.begin(); it != new_local_entries.end(); - ++it) { - updated_db_entries.push_back( - syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD, - SyncDataFromPassword(*it->second))); - } - - WriteToPasswordStore(sync_entries, /*is_merge=*/true); - merge_result.set_error( - sync_processor->ProcessSyncChanges(FROM_HERE, updated_db_entries)); - if (merge_result.error().IsSet()) { - metrics_util::LogPasswordSyncState(metrics_util::NOT_SYNCING_SERVER_ERROR); - return merge_result; - } - - merge_result.set_num_items_after_association( - merge_result.num_items_before_association() + - sync_entries.new_entries.size()); - merge_result.set_num_items_added(sync_entries.new_entries.size()); - merge_result.set_num_items_modified(sync_entries.updated_entries.size()); - merge_result.set_num_items_deleted(sync_entries.deleted_entries.size()); - - // Save |sync_processor_| only if the whole procedure succeeded. In case of - // failure Sync shouldn't receive any updates from the PasswordStore. - sync_error_factory_ = std::move(sync_error_factory); - sync_processor_ = std::move(sync_processor); - - metrics_util::LogPasswordSyncState(metrics_util::SYNCING_OK); - return merge_result; -} - -void PasswordSyncableService::StopSyncing(syncer::ModelType type) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(syncer::PASSWORDS, type); - - sync_processor_.reset(); - sync_error_factory_.reset(); -} - -syncer::SyncDataList PasswordSyncableService::GetAllSyncData( - syncer::ModelType type) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(syncer::PASSWORDS, type); - std::vector<std::unique_ptr<autofill::PasswordForm>> password_entries; - ReadFromPasswordStore(&password_entries, nullptr); - - syncer::SyncDataList sync_data; - sync_data.reserve(password_entries.size()); - std::transform(password_entries.begin(), password_entries.end(), - std::back_inserter(sync_data), - [](const std::unique_ptr<autofill::PasswordForm>& form) { - return SyncDataFromPassword(*form); - }); - return sync_data; -} - -syncer::SyncError PasswordSyncableService::ProcessSyncChanges( - const base::Location& from_here, - const syncer::SyncChangeList& change_list) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::AutoReset<bool> processing_changes(&is_processing_sync_changes_, true); - SyncEntries sync_entries; - base::Time time_now = base::Time::Now(); - - for (auto it = change_list.begin(); it != change_list.end(); ++it) { - const sync_pb::EntitySpecifics& specifics = it->sync_data().GetSpecifics(); - std::vector<std::unique_ptr<autofill::PasswordForm>>* entries = - sync_entries.EntriesForChangeType(it->change_type()); - if (!entries) { - return sync_error_factory_->CreateAndUploadError( - FROM_HERE, "Failed to process sync changes for passwords datatype."); - } - AppendPasswordFromSpecifics( - specifics.password().client_only_encrypted_data(), time_now, entries); - } - - WriteToPasswordStore(sync_entries, /*is_merge=*/false); - return syncer::SyncError(); -} - -void PasswordSyncableService::ActOnPasswordStoreChanges( - const PasswordStoreChangeList& local_changes) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (!sync_processor_) { - if (!flare_.is_null()) { - flare_.Run(syncer::PASSWORDS); - flare_.Reset(); - } - return; - } - - // ActOnPasswordStoreChanges() can be called from ProcessSyncChanges(). Do - // nothing in this case. - if (is_processing_sync_changes_) - return; - syncer::SyncChangeList sync_changes; - for (auto it = local_changes.begin(); it != local_changes.end(); ++it) { - syncer::SyncData data = - (it->type() == PasswordStoreChange::REMOVE - ? syncer::SyncData::CreateLocalDelete( - MakePasswordSyncTag(it->form()), syncer::PASSWORDS) - : SyncDataFromPassword(it->form())); - sync_changes.push_back( - syncer::SyncChange(FROM_HERE, GetSyncChangeType(it->type()), data)); - } - sync_processor_->ProcessSyncChanges(FROM_HERE, sync_changes); -} - -void PasswordSyncableService::InjectStartSyncFlare( - const syncer::SyncableService::StartSyncFlare& flare) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - flare_ = flare; -} - -bool PasswordSyncableService::ReadFromPasswordStore( - std::vector<std::unique_ptr<autofill::PasswordForm>>* password_entries, - PasswordEntryMap* passwords_entry_map) const { - DCHECK(password_entries); - std::vector<std::unique_ptr<autofill::PasswordForm>> autofillable_entries; - std::vector<std::unique_ptr<autofill::PasswordForm>> blacklist_entries; - if (!password_store_->FillAutofillableLogins(&autofillable_entries) || - !password_store_->FillBlacklistLogins(&blacklist_entries)) { - return false; - } - password_entries->resize(autofillable_entries.size() + - blacklist_entries.size()); - std::move(autofillable_entries.begin(), autofillable_entries.end(), - password_entries->begin()); - std::move(blacklist_entries.begin(), blacklist_entries.end(), - password_entries->begin() + autofillable_entries.size()); - - if (!passwords_entry_map) - return true; - - PasswordEntryMap& entry_map = *passwords_entry_map; - for (const auto& form : *password_entries) { - autofill::PasswordForm* password_form = form.get(); - entry_map[MakePasswordSyncTag(*password_form)] = password_form; - } - - return true; -} - -void PasswordSyncableService::WriteToPasswordStore(const SyncEntries& entries, - bool is_merge) { - PasswordStoreChangeList changes; - - for (const std::unique_ptr<autofill::PasswordForm>& form : - entries.new_entries) { - AddLoginError add_login_error; - PasswordStoreChangeList new_changes = - password_store_->AddLoginSync(*form, &add_login_error); - changes.insert(changes.end(), new_changes.begin(), new_changes.end()); - if (is_merge) { - base::UmaHistogramEnumeration( - "PasswordManager.MergeSyncData.AddLoginSyncError", add_login_error); - } else { - base::UmaHistogramEnumeration( - "PasswordManager.ApplySyncChanges.AddLoginSyncError", - add_login_error); - } - } - - for (const std::unique_ptr<autofill::PasswordForm>& form : - entries.updated_entries) { - UpdateLoginError update_login_error; - PasswordStoreChangeList new_changes = - password_store_->UpdateLoginSync(*form, &update_login_error); - if (is_merge) { - base::UmaHistogramEnumeration( - "PasswordManager.MergeSyncData.UpdateLoginSyncError", - update_login_error); - } else { - base::UmaHistogramEnumeration( - "PasswordManager.ApplySyncChanges.UpdateLoginSyncError", - update_login_error); - } - changes.insert(changes.end(), new_changes.begin(), new_changes.end()); - } - - for (const std::unique_ptr<autofill::PasswordForm>& form : - entries.deleted_entries) { - PasswordStoreChangeList new_changes = - password_store_->RemoveLoginSync(*form); - changes.insert(changes.end(), new_changes.begin(), new_changes.end()); - } - - // We have to notify password store observers of the change by hand since - // we use internal password store interfaces to make changes synchronously. - password_store_->NotifyLoginsChanged(changes); -} - -// static -void PasswordSyncableService::CreateOrUpdateEntry( - const syncer::SyncData& data, - PasswordEntryMap* unmatched_data_from_password_db, - SyncEntries* sync_entries, - syncer::SyncChangeList* updated_db_entries) { - const sync_pb::EntitySpecifics& specifics = data.GetSpecifics(); - const sync_pb::PasswordSpecificsData& password_specifics( - specifics.password().client_only_encrypted_data()); - std::string tag = MakePasswordSyncTag(password_specifics); - - // Check whether the data from sync is already in the password store. - auto existing_local_entry_iter = unmatched_data_from_password_db->find(tag); - base::Time time_now = base::Time::Now(); - if (existing_local_entry_iter == unmatched_data_from_password_db->end()) { - // The sync data is not in the password store, so we need to create it in - // the password store. Add the entry to the new_entries list. - AppendPasswordFromSpecifics(password_specifics, time_now, - &sync_entries->new_entries); - } else { - // The entry is in password store. If the entries are not identical, then - // the entries need to be merged. - // If the passwords differ, take the one that was created more recently. - const autofill::PasswordForm& password_form = - *existing_local_entry_iter->second; - if (!AreLocalAndSyncPasswordsEqual(password_specifics, password_form)) { - if (base::Time::FromInternalValue(password_specifics.date_created()) < - password_form.date_created) { - updated_db_entries->push_back( - syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_UPDATE, - SyncDataFromPassword(password_form))); - } else { - AppendPasswordFromSpecifics(password_specifics, time_now, - &sync_entries->updated_entries); - } - } - // Remove the entry from the entry map to indicate a match has been found. - // Entries that remain in the map at the end of associating all sync entries - // will be treated as additions that need to be propagated to sync. - unmatched_data_from_password_db->erase(existing_local_entry_iter); - } -} - -// Whether we should try to recover undecryptable local passwords by deleting -// the local copy, to be replaced by the remote version coming from Sync during -// merge. -bool PasswordSyncableService::ShouldRecoverPasswordsDuringMerge() const { - // Delete the local undecryptable copy under the following conditions: - // 1. This is MacOS only. - // 2. The more general feature kDeleteCorruptedPasswords is disabled. - // kDeleteCorruptedPasswords takes cares of deleting undecryptable entities - // for Sync and non-Sync users upon reading from the LoginDatabase. -#if defined(OS_MACOSX) && !defined(OS_IOS) - return !base::FeatureList::IsEnabled(features::kDeleteCorruptedPasswords); -#else - return false; -#endif -} - -syncer::SyncData SyncDataFromPassword( - const autofill::PasswordForm& password_form) { - sync_pb::EntitySpecifics password_data; - sync_pb::PasswordSpecificsData* password_specifics = - password_data.mutable_password()->mutable_client_only_encrypted_data(); -#define CopyEnumField(field) \ - password_specifics->set_##field(static_cast<int>(password_form.field)) -#define CopyField(field) password_specifics->set_##field(password_form.field) -#define CopyStringField(field) \ - password_specifics->set_##field(base::UTF16ToUTF8(password_form.field)) - CopyEnumField(scheme); - CopyField(signon_realm); - password_specifics->set_origin(password_form.origin.spec()); - password_specifics->set_action(password_form.action.spec()); - CopyStringField(username_element); - CopyStringField(password_element); - CopyStringField(username_value); - CopyStringField(password_value); - password_specifics->set_date_last_used( - password_form.date_last_used.ToDeltaSinceWindowsEpoch().InMicroseconds()); - password_specifics->set_date_created( - password_form.date_created.ToInternalValue()); - password_specifics->set_blacklisted(password_form.blacklisted_by_user); - CopyEnumField(type); - CopyField(times_used); - CopyStringField(display_name); - password_specifics->set_avatar_url(password_form.icon_url.spec()); - password_specifics->set_federation_url( - password_form.federation_origin.opaque() - ? std::string() - : password_form.federation_origin.Serialize()); -#undef CopyStringField -#undef CopyField -#undef CopyEnumField - - std::string tag = MakePasswordSyncTag(*password_specifics); - return syncer::SyncData::CreateLocalData(tag, tag, password_data); -} - -autofill::PasswordForm PasswordFromSpecifics( - const sync_pb::PasswordSpecificsData& password) { - autofill::PasswordForm new_password; - new_password.scheme = - static_cast<autofill::PasswordForm::Scheme>(password.scheme()); - new_password.signon_realm = password.signon_realm(); - new_password.origin = GURL(password.origin()); - new_password.action = GURL(password.action()); - new_password.username_element = - base::UTF8ToUTF16(password.username_element()); - new_password.password_element = - base::UTF8ToUTF16(password.password_element()); - new_password.username_value = base::UTF8ToUTF16(password.username_value()); - new_password.password_value = base::UTF8ToUTF16(password.password_value()); - if (password.has_date_last_used()) { - new_password.date_last_used = base::Time::FromDeltaSinceWindowsEpoch( - base::TimeDelta::FromMicroseconds(password.date_last_used())); - } else if (password.preferred()) { - // For legacy passwords that don't have the |date_last_used| field set, we - // should set it similar to the logic in login database migration. - new_password.date_last_used = - base::Time::FromDeltaSinceWindowsEpoch(base::TimeDelta::FromDays(1)); - } - new_password.date_created = - base::Time::FromInternalValue(password.date_created()); - new_password.blacklisted_by_user = password.blacklisted(); - new_password.type = - static_cast<autofill::PasswordForm::Type>(password.type()); - new_password.times_used = password.times_used(); - new_password.display_name = base::UTF8ToUTF16(password.display_name()); - new_password.icon_url = GURL(password.avatar_url()); - new_password.federation_origin = - url::Origin::Create(GURL(password.federation_url())); - return new_password; -} - -std::string MakePasswordSyncTag( - const sync_pb::PasswordSpecificsData& password) { - return MakePasswordSyncTag(PasswordFromSpecifics(password)); -} - -std::string MakePasswordSyncTag(const autofill::PasswordForm& password) { - return (net::EscapePath(password.origin.spec()) + "|" + - net::EscapePath(base::UTF16ToUTF8(password.username_element)) + "|" + - net::EscapePath(base::UTF16ToUTF8(password.username_value)) + "|" + - net::EscapePath(base::UTF16ToUTF8(password.password_element)) + "|" + - net::EscapePath(password.signon_realm)); -} - -} // namespace password_manager
diff --git a/components/password_manager/core/browser/sync/password_syncable_service.h b/components/password_manager/core/browser/sync/password_syncable_service.h deleted file mode 100644 index 409838d..0000000 --- a/components/password_manager/core/browser/sync/password_syncable_service.h +++ /dev/null
@@ -1,118 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_ -#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_ - -#include <map> -#include <memory> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "base/sequence_checker.h" -#include "components/password_manager/core/browser/password_store_change.h" -#include "components/sync/model/sync_change.h" -#include "components/sync/model/sync_data.h" -#include "components/sync/model/sync_error.h" -#include "components/sync/model/syncable_service.h" -#include "components/sync/protocol/password_specifics.pb.h" -#include "components/sync/protocol/sync.pb.h" - -namespace autofill { -struct PasswordForm; -} - -namespace syncer { -class SyncErrorFactory; -} - -namespace password_manager { - -class PasswordStoreSync; - -// The implementation of the SyncableService API for passwords. -class PasswordSyncableService : public syncer::SyncableService { - public: - // Since the constructed |PasswordSyncableService| is typically owned by the - // |password_store|, the constructor doesn't take ownership of the - // |password_store|. - explicit PasswordSyncableService(PasswordStoreSync* password_store); - ~PasswordSyncableService() override; - - // syncer::SyncableService: - void WaitUntilReadyToSync(base::OnceClosure done) override; - syncer::SyncMergeResult MergeDataAndStartSyncing( - syncer::ModelType type, - const syncer::SyncDataList& initial_sync_data, - std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, - std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; - void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; - syncer::SyncError ProcessSyncChanges( - const base::Location& from_here, - const syncer::SyncChangeList& change_list) override; - - // Notifies the Sync engine of changes to the password database. - void ActOnPasswordStoreChanges(const PasswordStoreChangeList& changes); - - // Provides a StartSyncFlare to the SyncableService. See - // chrome/browser/sync/glue/sync_start_util.h for more. - void InjectStartSyncFlare( - const syncer::SyncableService::StartSyncFlare& flare); - - private: - // Map from password sync tag to password form. - typedef std::map<std::string, autofill::PasswordForm*> PasswordEntryMap; - - struct SyncEntries; - - // Retrieves the entries from password db and fills both |password_entries| - // and |passwords_entry_map|. |passwords_entry_map| can be NULL. - bool ReadFromPasswordStore( - std::vector<std::unique_ptr<autofill::PasswordForm>>* password_entries, - PasswordEntryMap* passwords_entry_map) const; - - // Uses the |PasswordStore| APIs to change entries. - void WriteToPasswordStore(const SyncEntries& entries, bool is_merge); - - // Examines |data|, an entry in sync db, and updates |sync_entries| or - // |updated_db_entries| accordingly. An element is removed from - // |unmatched_data_from_password_db| if its tag is identical to |data|'s. - static void CreateOrUpdateEntry( - const syncer::SyncData& data, - PasswordEntryMap* unmatched_data_from_password_db, - SyncEntries* sync_entries, - syncer::SyncChangeList* updated_db_entries); - - // Returns true if corrupted passwords should be deleted from the local - // database when merging data. - // This is true if the feature DeleteCorruptedPasswords is disabled, as it - // recovers both Sync and non-Sync users internally in LoginDatabase. - bool ShouldRecoverPasswordsDuringMerge() const; - - // The factory that creates sync errors. |SyncError| has rich data - // suitable for debugging. - std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory_; - - // |sync_processor_| will mirror the |PasswordStore| changes in the sync db. - std::unique_ptr<syncer::SyncChangeProcessor> sync_processor_; - - // The password store that adds/updates/deletes password entries. Not owned. - PasswordStoreSync* const password_store_; - - // A signal activated by this class to start sync as soon as possible. - syncer::SyncableService::StartSyncFlare flare_; - - // True if processing sync changes is in progress. - bool is_processing_sync_changes_; - - SEQUENCE_CHECKER(sequence_checker_); - - DISALLOW_COPY_AND_ASSIGN(PasswordSyncableService); -}; - -} // namespace password_manager - -#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_
diff --git a/components/password_manager/core/browser/sync/password_syncable_service_unittest.cc b/components/password_manager/core/browser/sync/password_syncable_service_unittest.cc deleted file mode 100644 index fec1c9f..0000000 --- a/components/password_manager/core/browser/sync/password_syncable_service_unittest.cc +++ /dev/null
@@ -1,784 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/password_manager/core/browser/sync/password_syncable_service.h" - -#include <algorithm> -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/bind.h" -#include "base/location.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/task_environment.h" -#include "build/build_config.h" -#include "components/password_manager/core/browser/mock_password_store.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/model/sync_change_processor.h" -#include "components/sync/model/sync_change_processor_wrapper_for_test.h" -#include "components/sync/model/sync_error.h" -#include "components/sync/model/sync_error_factory_mock.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using syncer::SyncChange; -using syncer::SyncData; -using syncer::SyncDataList; -using syncer::SyncError; -using testing::_; -using testing::AnyNumber; -using testing::DoAll; -using testing::ElementsAre; -using testing::IgnoreResult; -using testing::Invoke; -using testing::IsEmpty; -using testing::Matches; -using testing::Return; -using testing::SetArgPointee; -using testing::UnorderedElementsAre; - -namespace password_manager { - -// Defined in the implementation file corresponding to this test. -syncer::SyncData SyncDataFromPassword(const autofill::PasswordForm& password); -autofill::PasswordForm PasswordFromSpecifics( - const sync_pb::PasswordSpecificsData& password); -std::string MakePasswordSyncTag(const sync_pb::PasswordSpecificsData& password); -std::string MakePasswordSyncTag(const autofill::PasswordForm& password); - -namespace { - -// PasswordForm values for tests. -constexpr autofill::PasswordForm::Type kArbitraryType = - autofill::PasswordForm::Type::kGenerated; -constexpr char kIconUrl[] = "https://fb.com/Icon"; -constexpr char kDisplayName[] = "Agent Smith"; -constexpr char kFederationUrl[] = "https://fb.com/"; -constexpr char kPassword[] = "abcdef"; -constexpr char kSignonRealm[] = "abc"; -constexpr char kSignonRealm2[] = "def"; -constexpr char kSignonRealm3[] = "xyz"; -constexpr int kTimesUsed = 5; -constexpr char kUsername[] = "godzilla"; - -typedef std::vector<SyncChange> SyncChangeList; - -const sync_pb::PasswordSpecificsData& GetPasswordSpecifics( - const syncer::SyncData& sync_data) { - return sync_data.GetSpecifics().password().client_only_encrypted_data(); -} - -MATCHER(HasDateSynced, "") { - return !arg.date_synced.is_null() && !arg.date_synced.is_max(); -} - -MATCHER_P(PasswordIs, form, "") { - sync_pb::PasswordSpecificsData actual_password = - GetPasswordSpecifics(SyncDataFromPassword(arg)); - sync_pb::PasswordSpecificsData expected_password = - GetPasswordSpecifics(SyncDataFromPassword(form)); - if (expected_password.scheme() == actual_password.scheme() && - expected_password.signon_realm() == actual_password.signon_realm() && - expected_password.origin() == actual_password.origin() && - expected_password.action() == actual_password.action() && - expected_password.username_element() == - actual_password.username_element() && - expected_password.password_element() == - actual_password.password_element() && - expected_password.username_value() == actual_password.username_value() && - expected_password.password_value() == actual_password.password_value() && - expected_password.date_last_used() == actual_password.date_last_used() && - expected_password.date_created() == actual_password.date_created() && - expected_password.blacklisted() == actual_password.blacklisted() && - expected_password.type() == actual_password.type() && - expected_password.times_used() == actual_password.times_used() && - expected_password.display_name() == actual_password.display_name() && - expected_password.avatar_url() == actual_password.avatar_url() && - expected_password.federation_url() == actual_password.federation_url()) - return true; - - *result_listener << "Password protobuf does not match; expected:\n" - << form << '\n' - << "actual:" << '\n' - << arg; - return false; -} - -MATCHER_P2(SyncChangeIs, change_type, password, "") { - const SyncData& data = arg.sync_data(); - autofill::PasswordForm form = - PasswordFromSpecifics(GetPasswordSpecifics(data)); - return (arg.change_type() == change_type && - syncer::SyncDataLocal(data).GetTag() == - MakePasswordSyncTag(password) && - (change_type == SyncChange::ACTION_DELETE || - Matches(PasswordIs(password))(form))); -} - -// The argument is std::vector<autofill::PasswordForm*>*. The caller is -// responsible for the lifetime of all the password forms. -ACTION_P(AppendForm, form) { - arg0->push_back(std::make_unique<autofill::PasswordForm>(form)); - return true; -} - -// Creates a sync data consisting of password specifics. The sign on realm is -// set to |signon_realm|. -SyncData CreateSyncData(const std::string& signon_realm) { - sync_pb::EntitySpecifics password_data; - sync_pb::PasswordSpecificsData* password_specifics = - password_data.mutable_password()->mutable_client_only_encrypted_data(); - password_specifics->set_signon_realm(signon_realm); - password_specifics->set_type( - static_cast<int>(autofill::PasswordForm::Type::kGenerated)); - password_specifics->set_times_used(3); - password_specifics->set_display_name("Mr. X"); - password_specifics->set_avatar_url("https://accounts.google.com/Icon"); - password_specifics->set_federation_url("https://google.com"); - password_specifics->set_username_value("kingkong"); - password_specifics->set_password_value("sicrit"); - - std::string tag = MakePasswordSyncTag(*password_specifics); - return syncer::SyncData::CreateLocalData(tag, tag, password_data); -} - -SyncChange CreateSyncChange(const autofill::PasswordForm& password, - SyncChange::SyncChangeType type) { - SyncData data = SyncDataFromPassword(password); - return SyncChange(FROM_HERE, type, data); -} - -// Mock implementation of SyncChangeProcessor. -class MockSyncChangeProcessor : public syncer::SyncChangeProcessor { - public: - MockSyncChangeProcessor() {} - - MOCK_METHOD2(ProcessSyncChanges, - SyncError(const base::Location&, const SyncChangeList& list)); - SyncDataList GetAllSyncData(syncer::ModelType type) const override { - NOTREACHED(); - return SyncDataList(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(MockSyncChangeProcessor); -}; - -// Convenience wrapper around a PasswordSyncableService and PasswordStore -// pair. -class PasswordSyncableServiceWrapper { - public: - PasswordSyncableServiceWrapper() { - password_store_ = new testing::StrictMock<MockPasswordStore>; - password_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); - service_.reset( - new PasswordSyncableService(password_store_->GetSyncInterface())); - - ON_CALL(*password_store_, AddLoginImpl(HasDateSynced(), _)) - .WillByDefault([](const autofill::PasswordForm& form, - password_manager::AddLoginError* error) { - if (error) { - *error = AddLoginError::kNone; - } - return PasswordStoreChangeList(); - }); - ON_CALL(*password_store_, RemoveLoginImpl(_)) - .WillByDefault(Return(PasswordStoreChangeList())); - ON_CALL(*password_store_, UpdateLoginImpl(HasDateSynced(), _)) - .WillByDefault([](const autofill::PasswordForm& form, - password_manager::UpdateLoginError* error) { - if (error) { - *error = UpdateLoginError::kNone; - } - return PasswordStoreChangeList(); - }); - EXPECT_CALL(*password_store(), NotifyLoginsChanged(_)).Times(AnyNumber()); - } - - ~PasswordSyncableServiceWrapper() { password_store_->ShutdownOnUIThread(); } - - MockPasswordStore* password_store() { return password_store_.get(); } - - PasswordSyncableService* service() { return service_.get(); } - - private: - scoped_refptr<MockPasswordStore> password_store_; - std::unique_ptr<PasswordSyncableService> service_; - - DISALLOW_COPY_AND_ASSIGN(PasswordSyncableServiceWrapper); -}; - -class PasswordSyncableServiceTest : public testing::Test { - public: - PasswordSyncableServiceTest() - : processor_(new testing::StrictMock<MockSyncChangeProcessor>) { - ON_CALL(*processor_, ProcessSyncChanges(_, _)) - .WillByDefault(Return(SyncError())); - } - MockPasswordStore* password_store() { return wrapper_.password_store(); } - PasswordSyncableService* service() { return wrapper_.service(); } - - MOCK_METHOD1(StartSyncFlare, void(syncer::ModelType)); - - protected: - std::unique_ptr<MockSyncChangeProcessor> processor_; - - private: - // Used by the password store. - base::test::TaskEnvironment task_environment_; - PasswordSyncableServiceWrapper wrapper_; -}; - -// Both sync and password db have data that are not present in the other. -TEST_F(PasswordSyncableServiceTest, AdditionsInBoth) { - autofill::PasswordForm form; - form.signon_realm = kSignonRealm; - form.username_value = base::ASCIIToUTF16(kUsername); - form.password_value = base::ASCIIToUTF16(kPassword); - - SyncDataList list; - list.push_back(CreateSyncData(kSignonRealm2)); - autofill::PasswordForm new_from_sync = - PasswordFromSpecifics(GetPasswordSpecifics(list.back())); - - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(new_from_sync), _)); - EXPECT_CALL(*processor_, - ProcessSyncChanges( - _, ElementsAre(SyncChangeIs(SyncChange::ACTION_ADD, form)))); - - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, list, std::move(processor_), - std::unique_ptr<syncer::SyncErrorFactory>()); -} - -// Sync has data that is not present in the password db. -TEST_F(PasswordSyncableServiceTest, AdditionOnlyInSync) { - SyncDataList list; - list.push_back(CreateSyncData(kSignonRealm)); - autofill::PasswordForm new_from_sync = - PasswordFromSpecifics(GetPasswordSpecifics(list.back())); - - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(Return(true)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(new_from_sync), _)); - EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty())); - - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, list, std::move(processor_), - std::unique_ptr<syncer::SyncErrorFactory>()); -} - -// Passwords db has data that is not present in sync. -TEST_F(PasswordSyncableServiceTest, AdditionOnlyInPasswordStore) { - autofill::PasswordForm form; - form.signon_realm = kSignonRealm; - form.times_used = kTimesUsed; - form.type = kArbitraryType; - form.display_name = base::ASCIIToUTF16(kDisplayName); - form.icon_url = GURL(kIconUrl); - form.federation_origin = url::Origin::Create(GURL(kFederationUrl)); - form.username_value = base::ASCIIToUTF16(kUsername); - form.password_value = base::ASCIIToUTF16(kPassword); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - - EXPECT_CALL(*processor_, - ProcessSyncChanges( - _, ElementsAre(SyncChangeIs(SyncChange::ACTION_ADD, form)))); - - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(), std::move(processor_), - std::unique_ptr<syncer::SyncErrorFactory>()); -} - -// Both passwords db and sync contain the same data. -TEST_F(PasswordSyncableServiceTest, BothInSync) { - autofill::PasswordForm form; - form.signon_realm = kSignonRealm; - form.times_used = kTimesUsed; - form.type = kArbitraryType; - form.username_value = base::ASCIIToUTF16(kUsername); - form.password_value = base::ASCIIToUTF16(kPassword); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - - EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty())); - - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(1, SyncDataFromPassword(form)), - std::move(processor_), std::unique_ptr<syncer::SyncErrorFactory>()); -} - -// Both passwords db and sync have the same data but they need to be merged -// as some fields of the data differ. -TEST_F(PasswordSyncableServiceTest, Merge) { - autofill::PasswordForm form1; - form1.signon_realm = kSignonRealm; - form1.action = GURL("http://pie.com"); - form1.date_created = base::Time::Now(); - form1.date_last_used = form1.date_created; - form1.username_value = base::ASCIIToUTF16(kUsername); - form1.password_value = base::ASCIIToUTF16(kPassword); - - autofill::PasswordForm form2(form1); - form2.date_created = form1.date_created + base::TimeDelta::FromDays(1); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form1)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - EXPECT_CALL(*password_store(), UpdateLoginImpl(PasswordIs(form2), _)); - EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty())); - - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(1, SyncDataFromPassword(form2)), - std::move(processor_), std::unique_ptr<syncer::SyncErrorFactory>()); -} - -// Initiate sync due to local DB changes. -TEST_F(PasswordSyncableServiceTest, PasswordStoreChanges) { - // Save the reference to the processor because |processor_| is NULL after - // MergeDataAndStartSyncing(). - MockSyncChangeProcessor& weak_processor = *processor_; - EXPECT_CALL(weak_processor, ProcessSyncChanges(_, IsEmpty())); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(Return(true)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(), std::move(processor_), - std::unique_ptr<syncer::SyncErrorFactory>()); - - autofill::PasswordForm form1; - form1.signon_realm = kSignonRealm; - autofill::PasswordForm form2; - form2.signon_realm = kSignonRealm2; - autofill::PasswordForm form3; - form3.signon_realm = kSignonRealm3; - - SyncChangeList sync_list; - sync_list.push_back(CreateSyncChange(form1, SyncChange::ACTION_ADD)); - sync_list.push_back(CreateSyncChange(form2, SyncChange::ACTION_UPDATE)); - sync_list.push_back(CreateSyncChange(form3, SyncChange::ACTION_DELETE)); - - PasswordStoreChangeList list; - list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form1)); - list.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form2)); - list.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form3)); - EXPECT_CALL( - weak_processor, - ProcessSyncChanges( - _, ElementsAre(SyncChangeIs(SyncChange::ACTION_ADD, form1), - SyncChangeIs(SyncChange::ACTION_UPDATE, form2), - SyncChangeIs(SyncChange::ACTION_DELETE, form3)))); - service()->ActOnPasswordStoreChanges(list); -} - -// Process all types of changes from sync. -TEST_F(PasswordSyncableServiceTest, ProcessSyncChanges) { - autofill::PasswordForm updated_form; - updated_form.signon_realm = kSignonRealm; - updated_form.action = GURL("http://foo.com"); - updated_form.date_created = base::Time::Now(); - updated_form.username_value = base::ASCIIToUTF16(kUsername); - updated_form.password_value = base::ASCIIToUTF16(kPassword); - autofill::PasswordForm deleted_form; - deleted_form.signon_realm = kSignonRealm2; - deleted_form.action = GURL("http://bar.com"); - deleted_form.blacklisted_by_user = true; - - SyncData add_data = CreateSyncData(kSignonRealm3); - autofill::PasswordForm new_from_sync = - PasswordFromSpecifics(GetPasswordSpecifics(add_data)); - - SyncChangeList list; - list.push_back( - SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD, add_data)); - list.push_back( - CreateSyncChange(updated_form, syncer::SyncChange::ACTION_UPDATE)); - list.push_back( - CreateSyncChange(deleted_form, syncer::SyncChange::ACTION_DELETE)); - EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(new_from_sync), _)); - EXPECT_CALL(*password_store(), UpdateLoginImpl(PasswordIs(updated_form), _)); - EXPECT_CALL(*password_store(), RemoveLoginImpl(PasswordIs(deleted_form))); - service()->ProcessSyncChanges(FROM_HERE, list); -} - -// Retrives sync data from the model. -TEST_F(PasswordSyncableServiceTest, GetAllSyncData) { - autofill::PasswordForm form1; - form1.signon_realm = kSignonRealm; - form1.action = GURL("http://foo.com"); - form1.times_used = kTimesUsed; - form1.type = kArbitraryType; - form1.display_name = base::ASCIIToUTF16(kDisplayName); - form1.icon_url = GURL(kIconUrl); - form1.federation_origin = url::Origin::Create(GURL(kFederationUrl)); - form1.username_value = base::ASCIIToUTF16(kUsername); - form1.password_value = base::ASCIIToUTF16(kPassword); - autofill::PasswordForm form2; - form2.signon_realm = kSignonRealm2; - form2.action = GURL("http://bar.com"); - form2.blacklisted_by_user = true; - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form1)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)) - .WillOnce(AppendForm(form2)); - - SyncDataList actual_list = service()->GetAllSyncData(syncer::PASSWORDS); - std::vector<autofill::PasswordForm> actual_form_list; - for (auto it = actual_list.begin(); it != actual_list.end(); ++it) { - actual_form_list.push_back( - PasswordFromSpecifics(GetPasswordSpecifics(*it))); - } - EXPECT_THAT(actual_form_list, - UnorderedElementsAre(PasswordIs(form1), PasswordIs(form2))); -} - -// Creates 2 PasswordSyncableService instances, merges the content of the first -// one to the second one and back. -TEST_F(PasswordSyncableServiceTest, MergeDataAndPushBack) { - autofill::PasswordForm form1; - form1.signon_realm = kSignonRealm; - form1.action = GURL("http://foo.com"); - form1.username_value = base::ASCIIToUTF16(kUsername); - form1.password_value = base::ASCIIToUTF16(kPassword); - - PasswordSyncableServiceWrapper other_service_wrapper; - autofill::PasswordForm form2; - form2.signon_realm = kSignonRealm2; - form2.action = GURL("http://bar.com"); - form2.username_value = base::ASCIIToUTF16(kUsername); - form2.password_value = base::ASCIIToUTF16(kPassword); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form1)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - EXPECT_CALL(*other_service_wrapper.password_store(), - FillAutofillableLogins(_)) - .WillOnce(AppendForm(form2)); - EXPECT_CALL(*other_service_wrapper.password_store(), FillBlacklistLogins(_)) - .WillOnce(Return(true)); - // This method reads all passwords from the database. Make sure that the - // database is not read twice if there was no problem getting all the - // passwords during the first read. - EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()).Times(0); - - EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(form2), _)); - EXPECT_CALL(*other_service_wrapper.password_store(), - AddLoginImpl(PasswordIs(form1), _)); - - syncer::SyncDataList other_service_data = - other_service_wrapper.service()->GetAllSyncData(syncer::PASSWORDS); - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, other_service_data, - std::make_unique<syncer::SyncChangeProcessorWrapperForTest>( - other_service_wrapper.service()), - std::unique_ptr<syncer::SyncErrorFactory>()); -} - -// Calls ActOnPasswordStoreChanges without SyncChangeProcessor. StartSyncFlare -// should be called. -TEST_F(PasswordSyncableServiceTest, StartSyncFlare) { - autofill::PasswordForm form; - form.signon_realm = kSignonRealm; - form.username_value = base::ASCIIToUTF16(kUsername); - form.password_value = base::ASCIIToUTF16(kPassword); - PasswordStoreChangeList list; - list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); - - // No flare and no SyncChangeProcessor, the call shouldn't crash. - service()->ActOnPasswordStoreChanges(list); - - // Set the flare. It should be called as there is no SyncChangeProcessor. - service()->InjectStartSyncFlare(base::Bind( - &PasswordSyncableServiceTest::StartSyncFlare, base::Unretained(this))); - EXPECT_CALL(*this, StartSyncFlare(syncer::PASSWORDS)); - service()->ActOnPasswordStoreChanges(list); -} - -// Start syncing with an error. Subsequent password store updates shouldn't be -// propagated to Sync. -TEST_F(PasswordSyncableServiceTest, FailedReadFromPasswordStore) { - std::unique_ptr<syncer::SyncErrorFactoryMock> error_factory( - new syncer::SyncErrorFactoryMock); - syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, - "Failed to get passwords from store.", - syncer::PASSWORDS); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(Return(false)); -#if defined(OS_MACOSX) && !defined(OS_IOS) - EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()) - .WillOnce(Return(DatabaseCleanupResult::kDatabaseUnavailable)); -#endif - EXPECT_CALL(*error_factory, CreateAndUploadError(_, _)) - .WillOnce(Return(error)); - // ActOnPasswordStoreChanges() below shouldn't generate any changes for Sync. - // |processor_| will be destroyed in MergeDataAndStartSyncing(). - EXPECT_CALL(*processor_, ProcessSyncChanges(_, _)).Times(0); - syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, syncer::SyncDataList(), std::move(processor_), - std::move(error_factory)); - EXPECT_TRUE(result.error().IsSet()); - - autofill::PasswordForm form; - form.signon_realm = kSignonRealm; - PasswordStoreChangeList list; - list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); - service()->ActOnPasswordStoreChanges(list); -} -class PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords - : public PasswordSyncableServiceTest { - public: - PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords() { - scoped_feature_list_.InitAndDisableFeature( - features::kDeleteCorruptedPasswords); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -#if defined(OS_MACOSX) && !defined(OS_IOS) -// Test that passwords are recovered for Sync users using the older logic (i.e. -// recover passwords only for Sync users) when the feature for deleting -// corrupted passwords for all users is disabled. -TEST_F(PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords, - RecoverPasswordsOnlyForSyncUsers) { - EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty())); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .Times(2) - .WillOnce(Return(false)) - .WillOnce(Return(true)); - EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()) - .WillOnce(Return(DatabaseCleanupResult::kSuccess)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - - syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(), std::move(processor_), nullptr); - EXPECT_FALSE(result.error().IsSet()); -} -#endif - -class PasswordSyncableServiceTestWithDeleteCorruptedPasswords - : public PasswordSyncableServiceTest { - public: - PasswordSyncableServiceTestWithDeleteCorruptedPasswords() { - scoped_feature_list_.InitAndEnableFeature( - features::kDeleteCorruptedPasswords); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -// Test that passwords are not recovered when merging data if the feature for -// deleting passwords for all users is enabled. -TEST_F(PasswordSyncableServiceTestWithDeleteCorruptedPasswords, - PasswordRecoveryForAllUsersEnabled) { - auto error_factory = std::make_unique<syncer::SyncErrorFactoryMock>(); - syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, - "Failed to get passwords from store.", - syncer::PASSWORDS); - EXPECT_CALL(*error_factory, CreateAndUploadError(_, _)) - .WillOnce(Return(error)); - - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(Return(false)); - EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()).Times(0); - - syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(), std::move(processor_), - std::move(error_factory)); - EXPECT_TRUE(result.error().IsSet()); -} - -#if defined(OS_MACOSX) && !defined(OS_IOS) -// Database cleanup fails because encryption is unavailable. -TEST_F(PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords, - FailedDeleteUndecryptableLogins) { - auto error_factory = std::make_unique<syncer::SyncErrorFactoryMock>(); - syncer::SyncError error( - FROM_HERE, syncer::SyncError::DATATYPE_ERROR, - "Failed to get encryption key during database cleanup.", - syncer::PASSWORDS); - EXPECT_CALL(*error_factory, CreateAndUploadError(_, _)) - .WillOnce(Return(error)); - - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(Return(false)); - EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()) - .WillOnce(Return(DatabaseCleanupResult::kEncryptionUnavailable)); - - syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, SyncDataList(), std::move(processor_), - std::move(error_factory)); - EXPECT_TRUE(result.error().IsSet()); -} -#endif - -// Start syncing with an error in ProcessSyncChanges. Subsequent password store -// updates shouldn't be propagated to Sync. -TEST_F(PasswordSyncableServiceTest, FailedProcessSyncChanges) { - autofill::PasswordForm form; - form.signon_realm = kSignonRealm; - form.username_value = base::ASCIIToUTF16(kUsername); - form.password_value = base::ASCIIToUTF16(kPassword); - std::unique_ptr<syncer::SyncErrorFactoryMock> error_factory( - new syncer::SyncErrorFactoryMock); - syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, - "There is a problem", syncer::PASSWORDS); - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(AppendForm(form)); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - - // ActOnPasswordStoreChanges() below shouldn't generate any changes for Sync. - // |processor_| will be destroyed in MergeDataAndStartSyncing(). - EXPECT_CALL(*processor_, ProcessSyncChanges(_, _)) - .Times(1) - .WillOnce(Return(error)); - syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, syncer::SyncDataList(), std::move(processor_), - std::move(error_factory)); - EXPECT_TRUE(result.error().IsSet()); - - form.signon_realm = kSignonRealm2; - PasswordStoreChangeList list; - list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); - service()->ActOnPasswordStoreChanges(list); -} - -// Serialize and deserialize empty federation_origin and make sure it's an empty -// string. -TEST_F(PasswordSyncableServiceTest, SerializeEmptyFederation) { - autofill::PasswordForm form; - EXPECT_TRUE(form.federation_origin.opaque()); - syncer::SyncData data = SyncDataFromPassword(form); - const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data); - EXPECT_TRUE(specifics.has_federation_url()); - EXPECT_EQ(std::string(), specifics.federation_url()); - - // Deserialize back. - form = PasswordFromSpecifics(specifics); - EXPECT_TRUE(form.federation_origin.opaque()); - - // Make sure that the Origins uploaded incorrectly are still deserialized - // correctly. - // crbug.com/593380. - sync_pb::PasswordSpecificsData specifics1; - specifics1.set_federation_url("null"); - form = PasswordFromSpecifics(specifics1); - EXPECT_TRUE(form.federation_origin.opaque()); -} - -// Serialize empty PasswordForm and make sure the Sync representation is -// matching the expectations -TEST_F(PasswordSyncableServiceTest, SerializeEmptyPasswordForm) { - autofill::PasswordForm form; - syncer::SyncData data = SyncDataFromPassword(form); - const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data); - EXPECT_TRUE(specifics.has_scheme()); - EXPECT_EQ(0, specifics.scheme()); - EXPECT_TRUE(specifics.has_signon_realm()); - EXPECT_EQ("", specifics.signon_realm()); - EXPECT_TRUE(specifics.has_origin()); - EXPECT_EQ("", specifics.origin()); - EXPECT_TRUE(specifics.has_action()); - EXPECT_EQ("", specifics.action()); - EXPECT_TRUE(specifics.has_username_element()); - EXPECT_EQ("", specifics.username_element()); - EXPECT_TRUE(specifics.has_username_value()); - EXPECT_EQ("", specifics.username_value()); - EXPECT_TRUE(specifics.has_password_element()); - EXPECT_EQ("", specifics.password_element()); - EXPECT_TRUE(specifics.has_password_value()); - EXPECT_EQ("", specifics.password_value()); - EXPECT_TRUE(specifics.has_date_last_used()); - EXPECT_EQ(0, specifics.date_last_used()); - EXPECT_TRUE(specifics.has_date_created()); - EXPECT_EQ(0, specifics.date_created()); - EXPECT_TRUE(specifics.has_blacklisted()); - EXPECT_FALSE(specifics.blacklisted()); - EXPECT_TRUE(specifics.has_type()); - EXPECT_EQ(0, specifics.type()); - EXPECT_TRUE(specifics.has_times_used()); - EXPECT_EQ(0, specifics.times_used()); - EXPECT_TRUE(specifics.has_display_name()); - EXPECT_EQ("", specifics.display_name()); - EXPECT_TRUE(specifics.has_avatar_url()); - EXPECT_EQ("", specifics.avatar_url()); - EXPECT_TRUE(specifics.has_federation_url()); - EXPECT_EQ("", specifics.federation_url()); -} - -// Serialize a PasswordForm with non-default member values and make sure the -// Sync representation is matching the expectations. -TEST_F(PasswordSyncableServiceTest, SerializeNonEmptyPasswordForm) { - autofill::PasswordForm form; - form.scheme = autofill::PasswordForm::Scheme::kUsernameOnly; - form.signon_realm = "http://google.com/"; - form.origin = GURL("https://google.com/origin"); - form.action = GURL("https://google.com/action"); - form.username_element = base::ASCIIToUTF16("username_element"); - form.username_value = base::ASCIIToUTF16("god@google.com"); - form.password_element = base::ASCIIToUTF16("password_element"); - form.password_value = base::ASCIIToUTF16("!@#$%^&*()"); - form.date_last_used = base::Time::FromDeltaSinceWindowsEpoch( - base::TimeDelta::FromMicroseconds(100)); - form.date_created = base::Time::FromInternalValue(100); - form.blacklisted_by_user = true; - form.type = autofill::PasswordForm::Type::kMaxValue; - form.times_used = 11; - form.display_name = base::ASCIIToUTF16("Great Peter"); - form.icon_url = GURL("https://google.com/icon"); - form.federation_origin = url::Origin::Create(GURL("https://google.com/")); - - syncer::SyncData data = SyncDataFromPassword(form); - const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data); - EXPECT_TRUE(specifics.has_scheme()); - EXPECT_EQ(static_cast<int>(autofill::PasswordForm::Scheme::kUsernameOnly), - specifics.scheme()); - EXPECT_TRUE(specifics.has_signon_realm()); - EXPECT_EQ("http://google.com/", specifics.signon_realm()); - EXPECT_TRUE(specifics.has_origin()); - EXPECT_EQ("https://google.com/origin", specifics.origin()); - EXPECT_TRUE(specifics.has_action()); - EXPECT_EQ("https://google.com/action", specifics.action()); - EXPECT_TRUE(specifics.has_username_element()); - EXPECT_EQ("username_element", specifics.username_element()); - EXPECT_TRUE(specifics.has_username_value()); - EXPECT_EQ("god@google.com", specifics.username_value()); - EXPECT_TRUE(specifics.has_password_element()); - EXPECT_EQ("password_element", specifics.password_element()); - EXPECT_TRUE(specifics.has_password_value()); - EXPECT_EQ("!@#$%^&*()", specifics.password_value()); - EXPECT_TRUE(specifics.has_date_last_used()); - EXPECT_EQ(100, specifics.date_last_used()); - EXPECT_TRUE(specifics.has_date_created()); - EXPECT_EQ(100, specifics.date_created()); - EXPECT_TRUE(specifics.has_blacklisted()); - EXPECT_TRUE(specifics.blacklisted()); - EXPECT_TRUE(specifics.has_type()); - EXPECT_EQ(static_cast<int>(autofill::PasswordForm::Type::kMaxValue), - specifics.type()); - EXPECT_TRUE(specifics.has_times_used()); - EXPECT_EQ(11, specifics.times_used()); - EXPECT_TRUE(specifics.has_display_name()); - EXPECT_EQ("Great Peter", specifics.display_name()); - EXPECT_TRUE(specifics.has_avatar_url()); - EXPECT_EQ("https://google.com/icon", specifics.avatar_url()); - EXPECT_TRUE(specifics.has_federation_url()); - EXPECT_EQ("https://google.com", specifics.federation_url()); -} - -} // namespace - -} // namespace password_manager
diff --git a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc index a31030b1d..9228c4e 100644 --- a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc +++ b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
@@ -25,7 +25,6 @@ #include "components/prefs/testing_pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/signin/public/identity_manager/identity_test_environment.h" -#include "components/sync/model/syncable_service.h" #include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -97,8 +96,7 @@ auto factory = std::make_unique<MockLeakDetectionCheckFactory>(); factory_ = factory.get(); service_.set_leak_factory(std::move(factory)); - store_->Init(syncer::SyncableService::StartSyncFlare(), - /*prefs=*/nullptr); + store_->Init(/*prefs=*/nullptr); prefs_.registry()->RegisterBooleanPref(prefs::kPasswordLeakDetectionEnabled, true); prefs_.registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled, true);
diff --git a/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc b/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc index 65daec85..248e7a2 100644 --- a/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc +++ b/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc
@@ -12,7 +12,6 @@ #include "components/password_manager/core/browser/compromised_credentials_table.h" #include "components/password_manager/core/browser/test_password_store.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" -#include "components/sync/model/syncable_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -68,9 +67,7 @@ class CompromisedCredentialsProviderTest : public ::testing::Test { protected: - CompromisedCredentialsProviderTest() { - store_->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr); - } + CompromisedCredentialsProviderTest() { store_->Init(/*prefs=*/nullptr); } ~CompromisedCredentialsProviderTest() override { store_->ShutdownOnUIThread();
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc index 1280e0b..7dd6b75 100644 --- a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc +++ b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
@@ -10,7 +10,6 @@ #include "base/test/task_environment.h" #include "components/autofill/core/common/password_form.h" #include "components/password_manager/core/browser/test_password_store.h" -#include "components/sync/model/syncable_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -37,9 +36,7 @@ class SavedPasswordsPresenterTest : public ::testing::Test { protected: - SavedPasswordsPresenterTest() { - store_->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr); - } + SavedPasswordsPresenterTest() { store_->Init(/*prefs=*/nullptr); } ~SavedPasswordsPresenterTest() override { store_->ShutdownOnUIThread();
diff --git a/components/password_manager/core/browser/votes_uploader_unittest.cc b/components/password_manager/core/browser/votes_uploader_unittest.cc index 2bc7b8a..b99bb700 100644 --- a/components/password_manager/core/browser/votes_uploader_unittest.cc +++ b/components/password_manager/core/browser/votes_uploader_unittest.cc
@@ -461,7 +461,7 @@ // Init store and expect that adding field info is called. scoped_refptr<MockPasswordStore> store = new MockPasswordStore; - store->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr); + store->Init(/*prefs=*/nullptr); #if defined(OS_ANDROID) EXPECT_CALL(*store, AddFieldInfoImpl).Times(0);
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc index ce62260b..cd531e8 100644 --- a/components/password_manager/core/common/password_manager_features.cc +++ b/components/password_manager/core/common/password_manager_features.cc
@@ -81,7 +81,7 @@ // Enables support of filling and saving on username first flow. const base::Feature kUsernameFirstFlow = {"UsernameFirstFlow", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Field trial identifier for password generation requirements. const char kGenerationRequirementsFieldTrial[] =
diff --git a/components/payments/content/payment_request_state.cc b/components/payments/content/payment_request_state.cc index 65dbd1a..29add52 100644 --- a/components/payments/content/payment_request_state.cc +++ b/components/payments/content/payment_request_state.cc
@@ -613,6 +613,7 @@ selected_app_ = nullptr; if (!available_apps_.empty() && available_apps_[0]->CanPreselect()) { selected_app_ = available_apps_[0].get(); + UpdateIsReadyToPayAndNotifyObservers(); } // Record the missing required payment fields when no complete payment
diff --git a/components/payments_strings.grdp b/components/payments_strings.grdp index ef58788..a35958e 100644 --- a/components/payments_strings.grdp +++ b/components/payments_strings.grdp
@@ -208,6 +208,9 @@ <message name="IDS_PAYMENTS_PAY_BUTTON" desc="The label for the button that finishes the payment process. Sentence-cased." formatter_data="android_java"> Pay </message> + <message name="IDS_PAYMENTS_CONTINUE_BUTTON" desc="The label for the button that continues to the payment handler window. Sentence-cased." formatter_data="android_java"> + Continue + </message> <message name="IDS_PAYMENTS_ADD_CONTACT" desc="Text on a button that lets a user add new contact details, like the user's full name, an email address or a phone number. Sentence-cased." formatter_data="android_java"> Add contact info </message> @@ -232,6 +235,9 @@ <message name="IDS_PAYMENTS_PAY_BUTTON" desc="The label for the button that finishes the payment process. Title-Cased."> Pay </message> + <message name="IDS_PAYMENTS_CONTINUE_BUTTON" desc="The label for the button that continues to the payment handler window. Title-Cased."> + Continue + </message> <message name="IDS_PAYMENTS_ADD_CONTACT" desc="Text on a button that lets a user add new contact details, like the user's full name, an email address or a phone number. Title-Cased."> Add Contact Info </message>
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc index 8d467ae..33767f2 100644 --- a/components/permissions/permission_manager.cc +++ b/components/permissions/permission_manager.cc
@@ -526,13 +526,15 @@ bool PermissionManager::IsPermissionOverridableByDevTools( content::PermissionType permission, - const url::Origin& origin) { + const base::Optional<url::Origin>& origin) { ContentSettingsType type = PermissionTypeToContentSettingSafe(permission); PermissionContextBase* context = GetPermissionContext(type); - return context && !context->IsPermissionKillSwitchOn() && - context->IsPermissionAvailableToOrigins(origin.GetURL(), - origin.GetURL()); + if (!context || context->IsPermissionKillSwitchOn()) + return false; + + return !origin || context->IsPermissionAvailableToOrigins(origin->GetURL(), + origin->GetURL()); } int PermissionManager::SubscribePermissionStatusChange( @@ -685,7 +687,7 @@ } void PermissionManager::SetPermissionOverridesForDevTools( - const url::Origin& origin, + const base::Optional<url::Origin>& optional_origin, const PermissionOverrides& overrides) { ContentSettingsTypeOverrides result; for (const auto& item : overrides) { @@ -694,6 +696,8 @@ if (content_setting != ContentSettingsType::DEFAULT) result[content_setting] = PermissionStatusToContentSetting(item.second); } + const url::Origin& origin = + optional_origin.value_or(devtools_global_overrides_origin_); devtools_permission_overrides_[origin] = std::move(result); } @@ -706,6 +710,8 @@ ContentSettingsType permission) { auto it = devtools_permission_overrides_.find(origin); if (it == devtools_permission_overrides_.end()) + it = devtools_permission_overrides_.find(devtools_global_overrides_origin_); + if (it == devtools_permission_overrides_.end()) return CONTENT_SETTING_DEFAULT; auto setting_it = it->second.find(permission);
diff --git a/components/permissions/permission_manager.h b/components/permissions/permission_manager.h index 6f1d9aa5..b685b69 100644 --- a/components/permissions/permission_manager.h +++ b/components/permissions/permission_manager.h
@@ -111,8 +111,9 @@ content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin) override; - bool IsPermissionOverridableByDevTools(content::PermissionType permission, - const url::Origin& origin) override; + bool IsPermissionOverridableByDevTools( + content::PermissionType permission, + const base::Optional<url::Origin>& origin) override; int SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, @@ -129,7 +130,7 @@ // For the given |origin|, overrides permissions that belong to |overrides|. // These permissions are in-sync with the PermissionController. void SetPermissionOverridesForDevTools( - const url::Origin& origin, + const base::Optional<url::Origin>& origin, const PermissionOverrides& overrides) override; void ResetPermissionOverridesForDevTools() override; @@ -187,6 +188,7 @@ base::flat_map<ContentSettingsType, ContentSetting>; std::map<url::Origin, ContentSettingsTypeOverrides> devtools_permission_overrides_; + url::Origin devtools_global_overrides_origin_; bool is_shutting_down_ = false;
diff --git a/components/profile_metrics/BUILD.gn b/components/profile_metrics/BUILD.gn index a17ec03..35e63969 100644 --- a/components/profile_metrics/BUILD.gn +++ b/components/profile_metrics/BUILD.gn
@@ -7,6 +7,8 @@ "browser_profile_type.h", "counts.cc", "counts.h", + "state.cc", + "state.h", ] deps = [ "//base" ]
diff --git a/components/profile_metrics/state.cc b/components/profile_metrics/state.cc new file mode 100644 index 0000000..4a748c8c --- /dev/null +++ b/components/profile_metrics/state.cc
@@ -0,0 +1,52 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/profile_metrics/state.h" + +#include "base/metrics/histogram_functions.h" + +namespace profile_metrics { + +namespace { + +std::string GetStateSuffix(StateSuffix suffix) { + switch (suffix) { + case StateSuffix::kAll: + return "_All"; + case StateSuffix::kActiveMultiProfile: + return "_ActiveMultiProfile"; + case StateSuffix::kLatentMultiProfileActive: + return "_LatentMultiProfileActive"; + case StateSuffix::kLatentMultiProfileOthers: + return "_LatentMultiProfileOthers"; + case StateSuffix::kSingleProfile: + return "_SingleProfile"; + } +} + +} // namespace + +void LogProfileAvatar(AvatarState avatar_state, StateSuffix suffix) { + base::UmaHistogramEnumeration("Profile.State.Avatar" + GetStateSuffix(suffix), + avatar_state); +} + +void LogProfileName(NameState name_state, StateSuffix suffix) { + base::UmaHistogramEnumeration("Profile.State.Name" + GetStateSuffix(suffix), + name_state); +} + +void LogProfileAccountType(UnconsentedPrimaryAccountType account_type, + StateSuffix suffix) { + base::UmaHistogramEnumeration( + "Profile.State.UnconsentedPrimaryAccountType" + GetStateSuffix(suffix), + account_type); +} + +void LogProfileDaysSinceLastUse(int days_since_last_use, StateSuffix suffix) { + base::UmaHistogramCounts1000( + "Profile.State.LastUsed" + GetStateSuffix(suffix), days_since_last_use); +} + +} // namespace profile_metrics \ No newline at end of file
diff --git a/components/profile_metrics/state.h b/components/profile_metrics/state.h new file mode 100644 index 0000000..9ab55f3f --- /dev/null +++ b/components/profile_metrics/state.h
@@ -0,0 +1,80 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PROFILE_METRICS_STATE_H_ +#define COMPONENTS_PROFILE_METRICS_STATE_H_ + +namespace profile_metrics { + +// State for a profile avatar, documenting what Chrome UI exactly shows. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class AvatarState { + // All SignedIn* states denote having a primary account (incl. unconsented, + // not necessarily syncing). + kSignedInGaia = + 0, // User has the avatar from GAIA (the default for signed-in users). + kSignedInModern = 1, // User has explicitly selected a modern avatar. + kSignedInOld = 2, // User has explicitly selected an old avatar. + kSignedOutDefault = 3, // Grey silhouette. + kSignedOutModern = 4, // User has explicitly selected a modern avatar. + kSignedOutOld = 5, // User has explicitly selected an old avatar. + kMaxValue = kSignedOutOld +}; + +// State for a profile name, documenting what Chrome UI exactly shows. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class NameState { + kGaiaName = 0, // The name of the user from Gaia. + kGaiaAndCustomName = 1, // The name of the user from Gaia and the custom + // local name specified by the user. + kGaiaAndDefaultName = 2, // Chrome shows "Person X" alongside the Gaia name + // because it is needed to resolve ambiguity. + kCustomName = 3, // Only a custom name of the profile specified by the user. + kDefaultName = 4, // Only "Person X" since there's nothing better. + kMaxValue = kDefaultName +}; + +// Type of the unconsented primary account in a profile. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class UnconsentedPrimaryAccountType { + kConsumer = 0, + kEnterprise = 1, + kChild = 2, + kSignedOut = 3, + kMaxValue = kSignedOut +}; + +// Different types of reporting for profile state. This is used as a histogram +// suffix. +enum class StateSuffix { + kAll, // Recorded for all clients and all their profiles. + kActiveMultiProfile, // Recorded for multi-profile users with >=2 active + // profiles, for all their profiles. + kLatentMultiProfileActive, // Recorded for multi-profile users with one + // active profile, only for the active profile. + kLatentMultiProfileOthers, // Recorded for multi-profile users with one + // active profile, only for the non-active + // profiles. + kSingleProfile // Recorded for single-profile users for their single profile. +}; + +// Records the state of profile's avatar. +void LogProfileAvatar(AvatarState avatar_state, StateSuffix suffix); + +// Records the state of profile's name. +void LogProfileName(NameState name_state, StateSuffix suffix); + +// Records the state of profile's UPA. +void LogProfileAccountType(UnconsentedPrimaryAccountType account_type, + StateSuffix suffix); + +// Records the days since last use of a profile. +void LogProfileDaysSinceLastUse(int days_since_last_use, StateSuffix suffix); + +} // namespace profile_metrics + +#endif // COMPONENTS_PROFILE_METRICS_STATE_H_
diff --git a/components/search_engines/template_url_service.h b/components/search_engines/template_url_service.h index cfda0d1..a1f48e9 100644 --- a/components/search_engines/template_url_service.h +++ b/components/search_engines/template_url_service.h
@@ -365,7 +365,7 @@ // Returns all syncable TemplateURLs from this model as SyncData. This should // include every search engine and no Extension keywords. - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const; // Process new search engine changes from Sync, merging them into our local // data. This may send notifications if local search engines are added, // updated or removed.
diff --git a/components/send_tab_to_self/features.cc b/components/send_tab_to_self/features.cc index 795a4949..bd1df36d 100644 --- a/components/send_tab_to_self/features.cc +++ b/components/send_tab_to_self/features.cc
@@ -16,7 +16,7 @@ "SendTabToSelfWhenSignedIn", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kSharingRenameDevices{"SharingRenameDevices", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; bool IsReceivingEnabledByUserOnThisDevice(PrefService* prefs) { // TODO(crbug.com/1015322): SyncPrefs is used directly instead of methods in
diff --git a/components/services/storage/indexed_db/scopes/leveldb_scope.cc b/components/services/storage/indexed_db/scopes/leveldb_scope.cc index 1b3cf3fd..83c31f5c 100644 --- a/components/services/storage/indexed_db/scopes/leveldb_scope.cc +++ b/components/services/storage/indexed_db/scopes/leveldb_scope.cc
@@ -492,15 +492,12 @@ read_options.fill_cache = false; const std::unique_ptr<leveldb::Iterator> it = base::WrapUnique(level_db_->db()->NewIterator(read_options)); - leveldb::Status s; const leveldb::Comparator* const comparator = level_db_->comparator(); - for (it->Seek(range.first); - (s = it->status(), s.ok()) && it->Valid() && - IsKeyBeforeEndOfRange(comparator, it->key(), range.second, true); - it->Next()) { - return false; - } - return true; + + it->Seek(range.first); + leveldb::Status s = it->status(); + return !s.ok() || !it->Valid() || + !IsKeyBeforeEndOfRange(comparator, it->key(), range.second, true); } bool LevelDBScope::IsInDeferredDeletionRange(const leveldb::Slice& key) {
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index 2c2730ef..e6bcf5d 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -79,8 +79,6 @@ "engine/passive_model_worker.h", "engine/polling_constants.cc", "engine/polling_constants.h", - "engine/sequenced_model_worker.cc", - "engine/sequenced_model_worker.h", "engine/shutdown_reason.cc", "engine/shutdown_reason.h", "engine/sync_auth_provider.h", @@ -105,8 +103,6 @@ "engine/sync_status_observer.h", "engine/sync_string_conversions.cc", "engine/sync_string_conversions.h", - "engine/ui_model_worker.cc", - "engine/ui_model_worker.h", "engine_impl/all_status.cc", "engine_impl/all_status.h", "engine_impl/apply_control_data_updates.cc", @@ -577,18 +573,15 @@ "base/user_demographics_unittest.cc", "base/weak_handle_unittest.cc", "driver/about_sync_util_unittest.cc", - "driver/async_directory_type_controller_unittest.cc", "driver/backend_migrator_unittest.cc", "driver/data_type_manager_impl_unittest.cc", "driver/file_based_trusted_vault_client_unittest.cc", - "driver/generic_change_processor_unittest.cc", "driver/glue/sync_engine_impl_unittest.cc", "driver/model_association_manager_unittest.cc", "driver/model_type_controller_unittest.cc", "driver/passphrase_type_metrics_provider_unittest.cc", "driver/profile_sync_service_startup_unittest.cc", "driver/profile_sync_service_unittest.cc", - "driver/shared_change_processor_unittest.cc", "driver/startup_controller_unittest.cc", "driver/sync_auth_manager_unittest.cc", "driver/sync_service_crypto_unittest.cc", @@ -600,9 +593,7 @@ "engine/cycle/sync_cycle_snapshot_unittest.cc", "engine/model_safe_worker_unittest.cc", "engine/net/http_bridge_unittest.cc", - "engine/sequenced_model_worker_unittest.cc", "engine/sync_backend_registrar_unittest.cc", - "engine/ui_model_worker_unittest.cc", "engine_impl/apply_control_data_updates_unittest.cc", "engine_impl/backoff_delay_provider_unittest.cc", "engine_impl/bookmark_update_preprocessing_unittest.cc",
diff --git a/components/sync/driver/BUILD.gn b/components/sync/driver/BUILD.gn index f4eddd7..548c712 100644 --- a/components/sync/driver/BUILD.gn +++ b/components/sync/driver/BUILD.gn
@@ -15,8 +15,6 @@ sources = [ "about_sync_util.cc", "about_sync_util.h", - "async_directory_type_controller.cc", - "async_directory_type_controller.h", "backend_migrator.cc", "backend_migrator.h", "configure_context.h", @@ -35,10 +33,6 @@ "directory_data_type_controller.h", "file_based_trusted_vault_client.cc", "file_based_trusted_vault_client.h", - "generic_change_processor.cc", - "generic_change_processor.h", - "generic_change_processor_factory.cc", - "generic_change_processor_factory.h", "glue/sync_engine_backend.cc", "glue/sync_engine_backend.h", "glue/sync_engine_impl.cc", @@ -53,10 +47,6 @@ "passphrase_type_metrics_provider.h", "profile_sync_service.cc", "profile_sync_service.h", - "shared_change_processor.cc", - "shared_change_processor.h", - "shared_change_processor_ref.cc", - "shared_change_processor_ref.h", "startup_controller.cc", "startup_controller.h", "sync_api_component_factory.h", @@ -162,16 +152,12 @@ static_library("test_support") { testonly = true sources = [ - "async_directory_type_controller_mock.cc", - "async_directory_type_controller_mock.h", "data_type_controller_mock.cc", "data_type_controller_mock.h", "data_type_manager_mock.cc", "data_type_manager_mock.h", "fake_data_type_controller.cc", "fake_data_type_controller.h", - "fake_generic_change_processor.cc", - "fake_generic_change_processor.h", "fake_sync_service.cc", "fake_sync_service.h", "mock_sync_service.cc",
diff --git a/components/sync/driver/async_directory_type_controller.cc b/components/sync/driver/async_directory_type_controller.cc deleted file mode 100644 index 66fb2b8..0000000 --- a/components/sync/driver/async_directory_type_controller.cc +++ /dev/null
@@ -1,270 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/async_directory_type_controller.h" - -#include <utility> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/logging.h" -#include "base/threading/sequenced_task_runner_handle.h" -#include "components/sync/base/bind_to_task_runner.h" -#include "components/sync/base/data_type_histogram.h" -#include "components/sync/base/model_type.h" -#include "components/sync/driver/configure_context.h" -#include "components/sync/driver/generic_change_processor_factory.h" -#include "components/sync/driver/sync_api_component_factory.h" -#include "components/sync/driver/sync_client.h" -#include "components/sync/driver/sync_service.h" -#include "components/sync/model/data_type_error_handler_impl.h" -#include "components/sync/model/sync_error.h" -#include "components/sync/model/sync_merge_result.h" -#include "components/sync/model/syncable_service.h" - -namespace syncer { - -SharedChangeProcessor* -AsyncDirectoryTypeController::CreateSharedChangeProcessor() { - return new SharedChangeProcessor(type()); -} - -AsyncDirectoryTypeController::AsyncDirectoryTypeController( - ModelType type, - const base::RepeatingClosure& dump_stack, - SyncService* sync_service, - SyncClient* sync_client, - ModelSafeGroup model_safe_group, - scoped_refptr<base::SequencedTaskRunner> model_thread) - : DirectoryDataTypeController(type, - dump_stack, - sync_service, - model_safe_group), - sync_client_(sync_client), - user_share_(nullptr), - processor_factory_(new GenericChangeProcessorFactory()), - state_(NOT_RUNNING), - model_thread_(std::move(model_thread)) {} - -void AsyncDirectoryTypeController::LoadModels( - const ConfigureContext& configure_context, - const ModelLoadCallback& model_load_callback) { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(configure_context.sync_mode, SyncMode::kFull) - << " for type " << ModelTypeToString(type()); - - model_load_callback_ = model_load_callback; - - if (state() != NOT_RUNNING) { - model_load_callback_.Run(type(), - SyncError(FROM_HERE, SyncError::DATATYPE_ERROR, - "Model already running", type())); - return; - } - - state_ = MODEL_STARTING; - // Since we can't be called multiple times before Stop() is called, - // |shared_change_processor_| must be null here. - DCHECK(!shared_change_processor_); - shared_change_processor_ = CreateSharedChangeProcessor(); - DCHECK(shared_change_processor_); - if (!StartModels()) { - // If we are waiting for some external service to load before associating - // or we failed to start the models, we exit early. - DCHECK(state() == MODEL_STARTING || state() == NOT_RUNNING); - return; - } - - OnModelLoaded(); -} - -void AsyncDirectoryTypeController::OnModelLoaded() { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(state_, MODEL_STARTING); - state_ = MODEL_LOADED; - model_load_callback_.Run(type(), SyncError()); -} - -bool AsyncDirectoryTypeController::StartModels() { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(state_, MODEL_STARTING); - // By default, no additional services need to be started before we can proceed - // with model association. - return true; -} - -void AsyncDirectoryTypeController::StopModels() { - DCHECK(CalledOnValidThread()); -} - -bool AsyncDirectoryTypeController::PostTaskOnModelThread( - const base::Location& from_here, - base::OnceClosure task) { - DCHECK(CalledOnValidThread()); - return model_thread_->PostTask(from_here, std::move(task)); -} - -void AsyncDirectoryTypeController::StartAssociating( - StartCallback start_callback) { - DCHECK(CalledOnValidThread()); - DCHECK(!start_callback.is_null()); - DCHECK_EQ(state_, MODEL_LOADED); - state_ = ASSOCIATING; - - user_share_ = sync_service()->GetUserShare(); - - start_callback_ = std::move(start_callback); - if (!StartAssociationAsync()) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Failed to post StartAssociation", type()); - SyncMergeResult local_merge_result(type()); - local_merge_result.set_error(error); - StartDone(ASSOCIATION_FAILED, local_merge_result, SyncMergeResult(type())); - // StartDone should have cleared the SharedChangeProcessor. - DCHECK(!shared_change_processor_); - return; - } -} - -void AsyncDirectoryTypeController::Stop(ShutdownReason shutdown_reason) { - DCHECK(CalledOnValidThread()); - - if (state() == NOT_RUNNING) - return; - - // Disconnect the change processor. At this point, the - // SyncableService can no longer interact with the Syncer, even if - // it hasn't finished MergeDataAndStartSyncing. - DisconnectSharedChangeProcessor(); - - // If we haven't finished starting, we need to abort the start. - bool service_started = state() == ASSOCIATING || state() == RUNNING; - state_ = service_started ? STOPPING : NOT_RUNNING; - StopModels(); - - if (service_started) - StopSyncableService(); - - shared_change_processor_ = nullptr; - state_ = NOT_RUNNING; -} - -DataTypeController::State AsyncDirectoryTypeController::state() const { - return state_; -} - -void AsyncDirectoryTypeController::SetGenericChangeProcessorFactoryForTest( - std::unique_ptr<GenericChangeProcessorFactory> factory) { - DCHECK_EQ(state_, NOT_RUNNING); - processor_factory_ = std::move(factory); -} - -AsyncDirectoryTypeController::AsyncDirectoryTypeController() - : DirectoryDataTypeController(UNSPECIFIED, - base::NullCallback(), - nullptr, - GROUP_PASSIVE), - sync_client_(nullptr) {} - -AsyncDirectoryTypeController::~AsyncDirectoryTypeController() {} - -void AsyncDirectoryTypeController::StartDone( - DataTypeController::ConfigureResult start_result, - const SyncMergeResult& local_merge_result, - const SyncMergeResult& syncer_merge_result) { - DCHECK(CalledOnValidThread()); - - DataTypeController::State new_state; - if (IsSuccessfulResult(start_result)) { - new_state = RUNNING; - } else { - new_state = (start_result == ASSOCIATION_FAILED ? FAILED : NOT_RUNNING); - } - - // If we failed to start up, and we haven't been stopped yet, we need to - // ensure we clean up the local service and shared change processor properly. - if (new_state != RUNNING && state() != NOT_RUNNING && state() != STOPPING) { - DisconnectSharedChangeProcessor(); - StopSyncableService(); - shared_change_processor_ = nullptr; - } - - // It's possible to have StartDone called first from the UI thread - // (due to Stop being called) and then posted from the non-UI thread. In - // this case, we drop the second call because we've already been stopped. - if (state_ == NOT_RUNNING) { - return; - } - - state_ = new_state; - if (state_ != RUNNING) { - // Start failed. - StopModels(); - RecordStartFailure(start_result); - } - - std::move(start_callback_) - .Run(start_result, local_merge_result, syncer_merge_result); -} - -void AsyncDirectoryTypeController::RecordStartFailure(ConfigureResult result) { - DCHECK(CalledOnValidThread()); - UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeStartFailures2", - ModelTypeHistogramValue(type())); -} - -void AsyncDirectoryTypeController::DisableImpl(const SyncError& error) { - DCHECK(CalledOnValidThread()); - if (model_load_callback_) { - model_load_callback_.Run(type(), error); - } -} - -bool AsyncDirectoryTypeController::StartAssociationAsync() { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(state(), ASSOCIATING); - return PostTaskOnModelThread( - FROM_HERE, - base::BindOnce( - &SharedChangeProcessor::StartAssociation, shared_change_processor_, - BindToCurrentSequence(base::BindOnce( - &AsyncDirectoryTypeController::StartDone, base::AsWeakPtr(this))), - sync_client_, processor_factory_.get(), user_share_, - CreateErrorHandler())); -} - -ChangeProcessor* AsyncDirectoryTypeController::GetChangeProcessor() const { - DCHECK(CalledOnValidThread()); - DCHECK_EQ(state_, RUNNING); - return shared_change_processor_->generic_change_processor(); -} - -void AsyncDirectoryTypeController::DisconnectSharedChangeProcessor() { - DCHECK(CalledOnValidThread()); - // |shared_change_processor_| can already be null if Stop() is - // called after StartDone(_, FAILED, _). - if (shared_change_processor_) { - shared_change_processor_->Disconnect(); - } -} - -void AsyncDirectoryTypeController::StopSyncableService() { - DCHECK(CalledOnValidThread()); - if (shared_change_processor_) { - PostTaskOnModelThread( - FROM_HERE, base::BindOnce(&SharedChangeProcessor::StopLocalService, - shared_change_processor_)); - } -} - -std::unique_ptr<DataTypeErrorHandler> -AsyncDirectoryTypeController::CreateErrorHandler() { - DCHECK(CalledOnValidThread()); - return std::make_unique<DataTypeErrorHandlerImpl>( - base::SequencedTaskRunnerHandle::Get(), dump_stack_, - base::BindRepeating(&AsyncDirectoryTypeController::DisableImpl, - base::AsWeakPtr(this))); -} - -} // namespace syncer
diff --git a/components/sync/driver/async_directory_type_controller.h b/components/sync/driver/async_directory_type_controller.h deleted file mode 100644 index 0d3eaf57..0000000 --- a/components/sync/driver/async_directory_type_controller.h +++ /dev/null
@@ -1,150 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_H_ -#define COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_H_ - -#include <memory> -#include <string> - -#include "base/compiler_specific.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/sequenced_task_runner.h" -#include "components/sync/driver/directory_data_type_controller.h" -#include "components/sync/driver/shared_change_processor.h" - -namespace syncer { - -class SyncClient; -struct UserShare; - -// Implementation for directory based datatypes that interact with their -// syncable services by posting to model thread. All interaction with datatype -// controller happens on UI thread. -class AsyncDirectoryTypeController : public DirectoryDataTypeController { - public: - // |dump_stack| is called when an unrecoverable error occurs. - AsyncDirectoryTypeController( - ModelType type, - const base::RepeatingClosure& dump_stack, - SyncService* sync_service, - SyncClient* sync_client, - ModelSafeGroup model_safe_group, - scoped_refptr<base::SequencedTaskRunner> model_thread); - ~AsyncDirectoryTypeController() override; - - // DataTypeController interface. - void LoadModels(const ConfigureContext& configure_context, - const ModelLoadCallback& model_load_callback) override; - void StartAssociating(StartCallback start_callback) override; - void Stop(ShutdownReason shutdown_reason) override; - ChangeProcessor* GetChangeProcessor() const override; - State state() const override; - - // Used by tests to override the factory used to create - // GenericChangeProcessors. - void SetGenericChangeProcessorFactoryForTest( - std::unique_ptr<GenericChangeProcessorFactory> factory); - - protected: - // For testing only. - AsyncDirectoryTypeController(); - - // Start any dependent services that need to be running before we can - // associate models. The default implementation is a no-op. - // Return value: - // True - if models are ready and association can proceed. - // False - if models are not ready. StartAssociationAsync should be called - // when the models are ready. - // Note: this is performed on the UI thread. - virtual bool StartModels(); - - // Perform any DataType controller specific state cleanup before stopping - // the datatype controller. The default implementation is a no-op. - // Note: this is performed on the UI thread. - virtual void StopModels(); - - // Posts the given task to the model thread, i.e. the thread the datatype - // lives on. Return value: True if task posted successfully, false otherwise. - // Default implementation posts task to model_thread_. Types that don't use - // TaskRunner need to override this method. - virtual bool PostTaskOnModelThread(const base::Location& from_here, - base::OnceClosure task); - - // Start up complete, update the state and invoke the callback. - virtual void StartDone(DataTypeController::ConfigureResult start_result, - const SyncMergeResult& local_merge_result, - const SyncMergeResult& syncer_merge_result); - - // Kick off the association process. - virtual bool StartAssociationAsync(); - - // Record causes of start failure. - virtual void RecordStartFailure(ConfigureResult result); - - // To allow unit tests to control thread interaction during non-ui startup - // and shutdown, use a factory method to create the SharedChangeProcessor. - virtual SharedChangeProcessor* CreateSharedChangeProcessor(); - - // If the DTC is waiting for models to load, once the models are - // loaded the datatype service will call this function on DTC to let - // us know that it is safe to start associating. - void OnModelLoaded(); - - std::unique_ptr<DataTypeErrorHandler> CreateErrorHandler() override; - - private: - // Calls Disconnect() on |shared_change_processor_|, then sets it to - // null. Must be called only by StartDoneImpl() or Stop() (on the - // UI thread) and only after a call to Start() (i.e., - // |shared_change_processor_| must be non-null). - void DisconnectSharedChangeProcessor(); - - // Posts StopLocalService() to the processor on the model type thread. - void StopSyncableService(); - - // Disable this type with the sync service. Should only be invoked in case of - // an unrecoverable error. - // Note: this is performed on the UI thread. - void DisableImpl(const SyncError& error); - - SyncClient* const sync_client_; - - // UserShare is stored in StartAssociating while on UI thread and - // passed to SharedChangeProcessor::Connect on the model thread. - UserShare* user_share_; - - // Factory is used by tests to inject custom implementation of - // GenericChangeProcessor. - std::unique_ptr<GenericChangeProcessorFactory> processor_factory_; - - // State of this datatype controller. - State state_; - - // Callbacks for use when starting the datatype. - StartCallback start_callback_; - ModelLoadCallback model_load_callback_; - - // Task runner of the model thread. Can be nullptr in which case datatype - // controller needs to override PostTaskOnModelThread(). - scoped_refptr<base::SequencedTaskRunner> model_thread_; - - // The shared change processor is the thread-safe interface to the - // datatype. We hold a reference to it from the UI thread so that - // we can call Disconnect() on it from Stop()/StartDoneImpl(). Most - // of the work is done on the backend thread. - // - // Lifetime: The SharedChangeProcessor object is created on the UI - // thread and passed on to the backend thread. This reference is - // released on the UI thread in Stop()/StartDoneImpl(), but the - // backend thread may still have references to it (which is okay, - // since we call Disconnect() before releasing the UI thread - // reference). - scoped_refptr<SharedChangeProcessor> shared_change_processor_; -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_H_
diff --git a/components/sync/driver/async_directory_type_controller_mock.cc b/components/sync/driver/async_directory_type_controller_mock.cc deleted file mode 100644 index b186fa9..0000000 --- a/components/sync/driver/async_directory_type_controller_mock.cc +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/async_directory_type_controller_mock.h" - -#include "components/sync/driver/configure_context.h" - -namespace syncer { - -AsyncDirectoryTypeControllerMock::AsyncDirectoryTypeControllerMock() {} - -AsyncDirectoryTypeControllerMock::~AsyncDirectoryTypeControllerMock() {} - -} // namespace syncer
diff --git a/components/sync/driver/async_directory_type_controller_mock.h b/components/sync/driver/async_directory_type_controller_mock.h deleted file mode 100644 index 80ce628..0000000 --- a/components/sync/driver/async_directory_type_controller_mock.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_MOCK_H_ -#define COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_MOCK_H_ - -#include <string> - -#include "components/sync/driver/async_directory_type_controller.h" -#include "components/sync/model/sync_error.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace syncer { - -class AsyncDirectoryTypeControllerMock : public AsyncDirectoryTypeController { - public: - AsyncDirectoryTypeControllerMock(); - ~AsyncDirectoryTypeControllerMock() override; - - // DataTypeController mocks. - MOCK_METHOD1(StartAssociating, void(StartCallback start_callback)); - MOCK_METHOD2(LoadModels, - void(const ConfigureContext& configure_context, - const ModelLoadCallback& model_load_callback)); - MOCK_METHOD1(Stop, void(ShutdownReason)); - MOCK_CONST_METHOD0(type, ModelType()); - MOCK_CONST_METHOD0(name, std::string()); - MOCK_CONST_METHOD0(state, State()); - - // AsyncDirectoryTypeController mocks. - MOCK_METHOD0(StartModels, bool()); - MOCK_METHOD0(StopModels, void()); - MOCK_METHOD2(PostTaskOnModelThread, - bool(const base::Location&, base::OnceClosure)); - MOCK_METHOD3(StartDone, - void(DataTypeController::ConfigureResult result, - const SyncMergeResult& local_merge_result, - const SyncMergeResult& syncer_merge_result)); - MOCK_METHOD1(RecordStartFailure, void(ConfigureResult result)); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_MOCK_H_
diff --git a/components/sync/driver/async_directory_type_controller_unittest.cc b/components/sync/driver/async_directory_type_controller_unittest.cc deleted file mode 100644 index 47a0e7e..0000000 --- a/components/sync/driver/async_directory_type_controller_unittest.cc +++ /dev/null
@@ -1,472 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/async_directory_type_controller.h" - -#include <utility> -#include <vector> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback.h" -#include "base/location.h" -#include "base/macros.h" -#include "base/run_loop.h" -#include "base/sequenced_task_runner.h" -#include "base/synchronization/waitable_event.h" -#include "base/test/task_environment.h" -#include "base/test/test_timeouts.h" -#include "base/threading/thread.h" -#include "base/threading/thread_task_runner_handle.h" -#include "components/sync/driver/async_directory_type_controller_mock.h" -#include "components/sync/driver/configure_context.h" -#include "components/sync/driver/data_type_controller_mock.h" -#include "components/sync/driver/fake_sync_service.h" -#include "components/sync/driver/generic_change_processor_factory.h" -#include "components/sync/driver/sync_client_mock.h" -#include "components/sync/engine/model_safe_worker.h" -#include "components/sync/model/fake_syncable_service.h" -#include "components/sync/model/sync_change.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace syncer { -namespace { - -using base::WaitableEvent; -using testing::_; -using testing::AtLeast; -using testing::DoAll; -using testing::InvokeWithoutArgs; -using testing::Mock; -using testing::Return; -using testing::SetArgPointee; -using testing::StrictMock; - -const ModelType kType = AUTOFILL_PROFILE; - -ACTION_P(WaitOnEvent, event) { - event->Wait(); -} - -ACTION_P(SignalEvent, event) { - event->Signal(); -} - -class SharedChangeProcessorMock : public SharedChangeProcessor { - public: - explicit SharedChangeProcessorMock(ModelType type) - : SharedChangeProcessor(type) {} - - base::WeakPtr<SyncableService> Connect( - SyncClient*, - GenericChangeProcessorFactory*, - UserShare*, - std::unique_ptr<DataTypeErrorHandler>, - const base::WeakPtr<SyncMergeResult>&) override { - return std::move(connect_return_); - } - MOCK_METHOD0(Disconnect, bool()); - MOCK_METHOD2(ProcessSyncChanges, - SyncError(const base::Location&, const SyncChangeList&)); - MOCK_CONST_METHOD2(GetAllSyncDataReturnError, - SyncError(ModelType, SyncDataList*)); - MOCK_METHOD0(GetSyncCount, int()); - MOCK_METHOD1(SyncModelHasUserCreatedNodes, bool(bool*)); - MOCK_METHOD0(CryptoReadyIfNecessary, bool()); - MOCK_CONST_METHOD1(GetDataTypeContext, bool(std::string*)); - - void SetConnectReturn(base::WeakPtr<SyncableService> service) { - connect_return_ = service; - } - - protected: - ~SharedChangeProcessorMock() override { DCHECK(!connect_return_); } - MOCK_METHOD2(OnUnrecoverableError, - void(const base::Location&, const std::string&)); - - private: - base::WeakPtr<SyncableService> connect_return_; - DISALLOW_COPY_AND_ASSIGN(SharedChangeProcessorMock); -}; - -class AsyncDirectoryTypeControllerFake : public AsyncDirectoryTypeController { - public: - AsyncDirectoryTypeControllerFake( - SyncService* sync_service, - SyncClient* sync_client, - AsyncDirectoryTypeControllerMock* mock, - SharedChangeProcessor* change_processor, - scoped_refptr<base::SequencedTaskRunner> backend_task_runner) - : AsyncDirectoryTypeController(kType, - base::NullCallback(), - sync_service, - sync_client, - GROUP_PASSWORD, - nullptr), - blocked_(false), - mock_(mock), - change_processor_(change_processor), - backend_task_runner_(backend_task_runner) {} - ~AsyncDirectoryTypeControllerFake() override {} - - // Prevent tasks from being posted on the backend thread until - // UnblockBackendTasks() is called. - void BlockBackendTasks() { blocked_ = true; } - - // Post pending tasks on the backend thread and start allowing tasks - // to be posted on the backend thread again. - void UnblockBackendTasks() { - blocked_ = false; - for (auto& entry : pending_tasks_) - PostTaskOnModelThread(entry.from_here, std::move(entry.task)); - pending_tasks_.clear(); - } - - SharedChangeProcessor* CreateSharedChangeProcessor() override { - return change_processor_.get(); - } - - std::unique_ptr<DataTypeErrorHandler> CreateErrorHandler() override { - return AsyncDirectoryTypeController::CreateErrorHandler(); - } - - protected: - bool PostTaskOnModelThread(const base::Location& from_here, - base::OnceClosure task) override { - if (blocked_) { - pending_tasks_.push_back(PendingTask(from_here, std::move(task))); - return true; - } else { - return backend_task_runner_->PostTask(from_here, std::move(task)); - } - } - - // We mock the following methods because their default implementations do - // nothing, but we still want to make sure they're called appropriately. - bool StartModels() override { return mock_->StartModels(); } - void StopModels() override { mock_->StopModels(); } - void RecordStartFailure(DataTypeController::ConfigureResult result) override { - mock_->RecordStartFailure(result); - } - - private: - struct PendingTask { - PendingTask(const base::Location& from_here, base::OnceClosure task) - : from_here(from_here), task(std::move(task)) {} - - base::Location from_here; - base::OnceClosure task; - }; - - bool blocked_; - std::vector<PendingTask> pending_tasks_; - AsyncDirectoryTypeControllerMock* mock_; - scoped_refptr<SharedChangeProcessor> change_processor_; - scoped_refptr<base::SequencedTaskRunner> backend_task_runner_; - - DISALLOW_COPY_AND_ASSIGN(AsyncDirectoryTypeControllerFake); -}; - -class SyncAsyncDirectoryTypeControllerTest : public testing::Test { - public: - SyncAsyncDirectoryTypeControllerTest() - : task_environment_( - base::test::SingleThreadTaskEnvironment::MainThreadType::UI), - backend_thread_("dbthread") {} - - void SetUp() override { - backend_thread_.Start(); - change_processor_ = new SharedChangeProcessorMock(kType); - // All of these are refcounted, so don't need to be released. - dtc_mock_ = - std::make_unique<StrictMock<AsyncDirectoryTypeControllerMock>>(); - non_ui_dtc_ = std::make_unique<AsyncDirectoryTypeControllerFake>( - &sync_service_, &sync_client_, dtc_mock_.get(), change_processor_.get(), - backend_thread_.task_runner()); - } - - void TearDown() override { backend_thread_.Stop(); } - - void WaitForDTC() { - WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); - backend_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&SyncAsyncDirectoryTypeControllerTest::SignalDone, - &done)); - done.TimedWait(TestTimeouts::action_timeout()); - if (!done.IsSignaled()) { - ADD_FAILURE() << "Timed out waiting for DB thread to finish."; - } - base::RunLoop().RunUntilIdle(); - } - - protected: - void SetStartExpectations() { - EXPECT_CALL(*dtc_mock_, StartModels()).WillOnce(Return(true)); - EXPECT_CALL(model_load_callback_, Run(_, _)); - } - - void SetAssociateExpectations() { - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr()); - EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary()) - .WillOnce(Return(true)); - EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_)) - .WillOnce(DoAll(SetArgPointee<0>(true), Return(true))); - EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _)) - .WillOnce(Return(SyncError())); - EXPECT_CALL(*change_processor_, GetSyncCount()).WillOnce(Return(0)); - } - - void SetActivateExpectations(DataTypeController::ConfigureResult result) { - EXPECT_CALL(start_callback_, Run(result, _, _)); - } - - void SetStopExpectations() { - EXPECT_CALL(*dtc_mock_, StopModels()); - EXPECT_CALL(*change_processor_, Disconnect()).WillOnce(Return(true)); - } - - void SetStartFailExpectations(DataTypeController::ConfigureResult result) { - EXPECT_CALL(*dtc_mock_, StopModels()).Times(AtLeast(1)); - EXPECT_CALL(*dtc_mock_, RecordStartFailure(result)); - EXPECT_CALL(start_callback_, Run(result, _, _)); - } - - void Start() { - non_ui_dtc_->LoadModels( - ConfigureContext(), - base::BindRepeating(&ModelLoadCallbackMock::Run, - base::Unretained(&model_load_callback_))); - non_ui_dtc_->StartAssociating(base::BindOnce( - &StartCallbackMock::Run, base::Unretained(&start_callback_))); - } - - static void SignalDone(WaitableEvent* done) { done->Signal(); } - - base::test::SingleThreadTaskEnvironment task_environment_; - base::Thread backend_thread_; - - StartCallbackMock start_callback_; - ModelLoadCallbackMock model_load_callback_; - FakeSyncService sync_service_; - testing::NiceMock<SyncClientMock> sync_client_; - // Must be destroyed after non_ui_dtc_. - FakeSyncableService syncable_service_; - std::unique_ptr<AsyncDirectoryTypeControllerFake> non_ui_dtc_; - std::unique_ptr<AsyncDirectoryTypeControllerMock> dtc_mock_; - scoped_refptr<SharedChangeProcessorMock> change_processor_; - std::unique_ptr<SyncChangeProcessor> saved_change_processor_; -}; - -TEST_F(SyncAsyncDirectoryTypeControllerTest, StartOk) { - SetStartExpectations(); - SetAssociateExpectations(); - SetActivateExpectations(DataTypeController::OK); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state()); -} - -TEST_F(SyncAsyncDirectoryTypeControllerTest, StartFirstRun) { - SetStartExpectations(); - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr()); - EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary()) - .WillOnce(Return(true)); - EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_)) - .WillOnce(DoAll(SetArgPointee<0>(false), Return(true))); - EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _)) - .WillOnce(Return(SyncError())); - SetActivateExpectations(DataTypeController::OK_FIRST_RUN); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state()); -} - -// Start the DTC and have StartModels() return false. Then, stop the -// DTC without finishing model startup. It should stop cleanly. -TEST_F(SyncAsyncDirectoryTypeControllerTest, AbortDuringStartModels) { - EXPECT_CALL(*dtc_mock_, StartModels()).WillOnce(Return(false)); - EXPECT_CALL(*dtc_mock_, StopModels()); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - non_ui_dtc_->LoadModels( - ConfigureContext(), - base::BindRepeating(&ModelLoadCallbackMock::Run, - base::Unretained(&model_load_callback_))); - WaitForDTC(); - EXPECT_EQ(DataTypeController::MODEL_STARTING, non_ui_dtc_->state()); - non_ui_dtc_->Stop(STOP_SYNC); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); -} - -// Start the DTC and have MergeDataAndStartSyncing() return an error. -// The DTC should become disabled, and the DTC should still stop -// cleanly. -TEST_F(SyncAsyncDirectoryTypeControllerTest, StartAssociationFailed) { - SetStartExpectations(); - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr()); - EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary()) - .WillOnce(Return(true)); - EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_)) - .WillOnce(DoAll(SetArgPointee<0>(true), Return(true))); - EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _)) - .WillOnce(Return(SyncError())); - SetStartFailExpectations(DataTypeController::ASSOCIATION_FAILED); - // Set up association to fail with an association failed error. - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - syncable_service_.set_merge_data_and_start_syncing_error(SyncError( - FROM_HERE, SyncError::DATATYPE_ERROR, "Sync Error", non_ui_dtc_->type())); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::FAILED, non_ui_dtc_->state()); - non_ui_dtc_->Stop(STOP_SYNC); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); -} - -TEST_F(SyncAsyncDirectoryTypeControllerTest, - StartAssociationTriggersUnrecoverableError) { - SetStartExpectations(); - SetStartFailExpectations(DataTypeController::UNRECOVERABLE_ERROR); - // Set up association to fail with an unrecoverable error. - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr()); - EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary()) - .WillRepeatedly(Return(true)); - EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_)) - .WillRepeatedly(DoAll(SetArgPointee<0>(false), Return(false))); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); -} - -TEST_F(SyncAsyncDirectoryTypeControllerTest, StartAssociationCryptoNotReady) { - SetStartExpectations(); - SetStartFailExpectations(DataTypeController::NEEDS_CRYPTO); - // Set up association to fail with a NEEDS_CRYPTO error. - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr()); - EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary()) - .WillRepeatedly(Return(false)); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); -} - -// Trigger a Stop() call when we check if the model associator has user created -// nodes. -TEST_F(SyncAsyncDirectoryTypeControllerTest, AbortDuringAssociation) { - WaitableEvent wait_for_db_thread_pause( - base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED); - WaitableEvent pause_db_thread( - base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED); - - SetStartExpectations(); - change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr()); - EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary()) - .WillOnce(Return(true)); - EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_)) - .WillOnce(DoAll(SignalEvent(&wait_for_db_thread_pause), - WaitOnEvent(&pause_db_thread), SetArgPointee<0>(true), - Return(true))); - EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _)) - .WillOnce(Return(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR, - "Disconnected.", kType))); - EXPECT_CALL(*dtc_mock_, StopModels()); - EXPECT_CALL(*change_processor_, Disconnect()) - .WillOnce(DoAll(SignalEvent(&pause_db_thread), Return(true))); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - wait_for_db_thread_pause.Wait(); - non_ui_dtc_->Stop(STOP_SYNC); - WaitForDTC(); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); -} - -// Start the DTC while the backend tasks are blocked. Then stop the DTC before -// the backend tasks get a chance to run. -TEST_F(SyncAsyncDirectoryTypeControllerTest, StartAfterSyncShutdown) { - non_ui_dtc_->BlockBackendTasks(); - - SetStartExpectations(); - // We don't expect StopSyncing to be called because local_service_ will never - // have been set. - SetStopExpectations(); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - non_ui_dtc_->Stop(STOP_SYNC); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Mock::VerifyAndClearExpectations(change_processor_.get()); - Mock::VerifyAndClearExpectations(dtc_mock_.get()); - - non_ui_dtc_->UnblockBackendTasks(); - WaitForDTC(); -} - -TEST_F(SyncAsyncDirectoryTypeControllerTest, Stop) { - SetStartExpectations(); - SetAssociateExpectations(); - SetActivateExpectations(DataTypeController::OK); - SetStopExpectations(); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state()); - non_ui_dtc_->Stop(STOP_SYNC); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); -} - -// Start the DTC then block its backend tasks. While its backend -// tasks are blocked, stop and start it again, then unblock its -// backend tasks. The (delayed) running of the backend tasks from the -// stop after the restart shouldn't cause any problems. -TEST_F(SyncAsyncDirectoryTypeControllerTest, StopStart) { - SetStartExpectations(); - SetAssociateExpectations(); - SetActivateExpectations(DataTypeController::OK); - SetStopExpectations(); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state()); - - non_ui_dtc_->BlockBackendTasks(); - non_ui_dtc_->Stop(STOP_SYNC); - SetStartExpectations(); - SetAssociateExpectations(); - SetActivateExpectations(DataTypeController::OK); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - non_ui_dtc_->UnblockBackendTasks(); - - WaitForDTC(); - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state()); -} - -TEST_F(SyncAsyncDirectoryTypeControllerTest, OnUnrecoverableError) { - SetStartExpectations(); - SetAssociateExpectations(); - SetActivateExpectations(DataTypeController::OK); - EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state()); - Start(); - WaitForDTC(); - EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state()); - - testing::Mock::VerifyAndClearExpectations(&start_callback_); - EXPECT_CALL(model_load_callback_, Run(_, _)); - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, "error", - non_ui_dtc_->type()); - backend_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&DataTypeErrorHandler::OnUnrecoverableError, - non_ui_dtc_->CreateErrorHandler(), error)); - WaitForDTC(); -} - -} // namespace - -} // namespace syncer
diff --git a/components/sync/driver/fake_generic_change_processor.cc b/components/sync/driver/fake_generic_change_processor.cc deleted file mode 100644 index 4492558..0000000 --- a/components/sync/driver/fake_generic_change_processor.cc +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/fake_generic_change_processor.h" - -#include <utility> - -#include "base/location.h" -#include "base/memory/weak_ptr.h" -#include "components/sync/model/syncable_service.h" - -namespace syncer { - -FakeGenericChangeProcessor::FakeGenericChangeProcessor(ModelType type) - : GenericChangeProcessor(type, - nullptr, - base::WeakPtr<SyncableService>(), - base::WeakPtr<SyncMergeResult>(), - nullptr), - sync_model_has_user_created_nodes_(true), - sync_model_has_user_created_nodes_success_(true) {} - -FakeGenericChangeProcessor::~FakeGenericChangeProcessor() {} - -void FakeGenericChangeProcessor::set_sync_model_has_user_created_nodes( - bool has_nodes) { - sync_model_has_user_created_nodes_ = has_nodes; -} -void FakeGenericChangeProcessor::set_sync_model_has_user_created_nodes_success( - bool success) { - sync_model_has_user_created_nodes_success_ = success; -} - -SyncError FakeGenericChangeProcessor::ProcessSyncChanges( - const base::Location& from_here, - const SyncChangeList& change_list) { - return SyncError(); -} - -SyncError FakeGenericChangeProcessor::GetAllSyncDataReturnError( - SyncDataList* current_sync_data) const { - return SyncError(); -} - -bool FakeGenericChangeProcessor::GetDataTypeContext( - std::string* context) const { - return false; -} - -int FakeGenericChangeProcessor::GetSyncCount() { - return 0; -} - -bool FakeGenericChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) { - *has_nodes = sync_model_has_user_created_nodes_; - return sync_model_has_user_created_nodes_success_; -} - -bool FakeGenericChangeProcessor::CryptoReadyIfNecessary() { - return true; -} - -FakeGenericChangeProcessorFactory::FakeGenericChangeProcessorFactory( - std::unique_ptr<FakeGenericChangeProcessor> processor) - : processor_(std::move(processor)) {} - -FakeGenericChangeProcessorFactory::~FakeGenericChangeProcessorFactory() {} - -std::unique_ptr<GenericChangeProcessor> -FakeGenericChangeProcessorFactory::CreateGenericChangeProcessor( - ModelType type, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncableService>& local_service, - const base::WeakPtr<SyncMergeResult>& merge_result) { - return std::move(processor_); -} - -} // namespace syncer
diff --git a/components/sync/driver/fake_generic_change_processor.h b/components/sync/driver/fake_generic_change_processor.h deleted file mode 100644 index d72d66c1..0000000 --- a/components/sync/driver/fake_generic_change_processor.h +++ /dev/null
@@ -1,64 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_FAKE_GENERIC_CHANGE_PROCESSOR_H_ -#define COMPONENTS_SYNC_DRIVER_FAKE_GENERIC_CHANGE_PROCESSOR_H_ - -#include <memory> -#include <string> - -#include "base/macros.h" -#include "components/sync/base/model_type.h" -#include "components/sync/driver/generic_change_processor.h" -#include "components/sync/driver/generic_change_processor_factory.h" -#include "components/sync/driver/sync_api_component_factory.h" -#include "components/sync/model/sync_error.h" - -namespace syncer { - -// A fake GenericChangeProcessor that can return arbitrary values. -class FakeGenericChangeProcessor : public GenericChangeProcessor { - public: - explicit FakeGenericChangeProcessor(ModelType type); - ~FakeGenericChangeProcessor() override; - - // Setters for GenericChangeProcessor implementation results. - void set_sync_model_has_user_created_nodes(bool has_nodes); - void set_sync_model_has_user_created_nodes_success(bool success); - - // GenericChangeProcessor implementations. - SyncError ProcessSyncChanges(const base::Location& from_here, - const SyncChangeList& change_list) override; - SyncError GetAllSyncDataReturnError(SyncDataList* data) const override; - bool GetDataTypeContext(std::string* context) const override; - int GetSyncCount() override; - bool SyncModelHasUserCreatedNodes(bool* has_nodes) override; - bool CryptoReadyIfNecessary() override; - - private: - bool sync_model_has_user_created_nodes_; - bool sync_model_has_user_created_nodes_success_; -}; - -// Define a factory for FakeGenericChangeProcessor for convenience. -class FakeGenericChangeProcessorFactory : public GenericChangeProcessorFactory { - public: - explicit FakeGenericChangeProcessorFactory( - std::unique_ptr<FakeGenericChangeProcessor> processor); - ~FakeGenericChangeProcessorFactory() override; - std::unique_ptr<GenericChangeProcessor> CreateGenericChangeProcessor( - ModelType type, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncableService>& local_service, - const base::WeakPtr<SyncMergeResult>& merge_result) override; - - private: - std::unique_ptr<FakeGenericChangeProcessor> processor_; - DISALLOW_COPY_AND_ASSIGN(FakeGenericChangeProcessorFactory); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_FAKE_GENERIC_CHANGE_PROCESSOR_H_
diff --git a/components/sync/driver/generic_change_processor.cc b/components/sync/driver/generic_change_processor.cc deleted file mode 100644 index 71f77d9..0000000 --- a/components/sync/driver/generic_change_processor.cc +++ /dev/null
@@ -1,582 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/generic_change_processor.h" - -#include <stddef.h> - -#include <algorithm> -#include <utility> - -#include "base/location.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "base/threading/sequenced_task_runner_handle.h" -#include "components/sync/base/unrecoverable_error_handler.h" -#include "components/sync/driver/sync_api_component_factory.h" -#include "components/sync/model/local_change_observer.h" -#include "components/sync/model/sync_change.h" -#include "components/sync/model/sync_error.h" -#include "components/sync/model/syncable_service.h" -#include "components/sync/syncable/base_node.h" -#include "components/sync/syncable/change_record.h" -#include "components/sync/syncable/entry.h" // TODO(tim): Bug 123674. -#include "components/sync/syncable/read_node.h" -#include "components/sync/syncable/read_transaction.h" -#include "components/sync/syncable/write_node.h" -#include "components/sync/syncable/write_transaction.h" - -namespace syncer { - -namespace { - -const int kContextSizeLimit = 1024; // Datatype context size limit. - -void SetNodeSpecifics(const sync_pb::EntitySpecifics& entity_specifics, - WriteNode* write_node) { - if (GetModelTypeFromSpecifics(entity_specifics) == PASSWORDS) { - write_node->SetPasswordSpecifics( - entity_specifics.password().client_only_encrypted_data()); - } else { - write_node->SetEntitySpecifics(entity_specifics); - } -} - -SyncData BuildRemoteSyncData(int64_t sync_id, const ReadNode& read_node) { - switch (read_node.GetModelType()) { - case PASSWORDS: { - // Passwords must be accessed differently, to account for their - // encryption, and stored into a temporary EntitySpecifics. - sync_pb::EntitySpecifics password_holder; - password_holder.mutable_password() - ->mutable_client_only_encrypted_data() - ->CopyFrom(read_node.GetPasswordSpecifics()); - return SyncData::CreateRemoteData(sync_id, password_holder); - } - case SESSIONS: - // Include tag hashes for sessions data type to allow discarding during - // merge if re-hashing by the service gives a different value. This is to - // allow removal of incorrectly hashed values, see crbug.com/604657. This - // cannot be done in the processor because only the service knows how to - // generate a tag from the specifics. We don't set this value for other - // data types because they shouldn't need it and it costs memory to hold - // another copy of this string around. - return SyncData::CreateRemoteData( - sync_id, read_node.GetEntitySpecifics(), - read_node.GetEntry()->GetUniqueClientTag()); - default: - // Use the specifics directly, encryption has already been handled. - return SyncData::CreateRemoteData(sync_id, - read_node.GetEntitySpecifics()); - } -} - -} // namespace - -GenericChangeProcessor::GenericChangeProcessor( - ModelType type, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncableService>& local_service, - const base::WeakPtr<SyncMergeResult>& merge_result, - UserShare* user_share) - : ChangeProcessor(std::move(error_handler)), - type_(type), - local_service_(local_service), - merge_result_(merge_result), - share_handle_(user_share) { - DCHECK(sequence_checker_.CalledOnValidSequence()); - DCHECK_NE(type_, UNSPECIFIED); -} - -GenericChangeProcessor::~GenericChangeProcessor() { - DCHECK(sequence_checker_.CalledOnValidSequence()); -} - -void GenericChangeProcessor::ApplyChangesFromSyncModel( - const BaseTransaction* trans, - int64_t model_version, - const ImmutableChangeRecordList& changes) { - DCHECK(sequence_checker_.CalledOnValidSequence()); - DCHECK(syncer_changes_.empty()); - for (auto it = changes.Get().begin(); it != changes.Get().end(); ++it) { - if (it->action == ChangeRecord::ACTION_DELETE) { - std::unique_ptr<sync_pb::EntitySpecifics> specifics; - if (it->specifics.has_password()) { - DCHECK(it->extra.has_value()); - specifics = std::make_unique<sync_pb::EntitySpecifics>(it->specifics); - specifics->mutable_password() - ->mutable_client_only_encrypted_data() - ->CopyFrom(it->extra->unencrypted()); - } - syncer_changes_.push_back( - SyncChange(FROM_HERE, SyncChange::ACTION_DELETE, - SyncData::CreateRemoteData( - it->id, specifics ? *specifics : it->specifics))); - } else { - SyncChange::SyncChangeType action = - (it->action == ChangeRecord::ACTION_ADD) ? SyncChange::ACTION_ADD - : SyncChange::ACTION_UPDATE; - // Need to load specifics from node. - ReadNode read_node(trans); - if (read_node.InitByIdLookup(it->id) != BaseNode::INIT_OK) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Failed to look up data for received change with id " + - base::NumberToString(it->id), - GetModelTypeFromSpecifics(it->specifics)); - error_handler()->OnUnrecoverableError(error); - return; - } - syncer_changes_.push_back(SyncChange( - FROM_HERE, action, BuildRemoteSyncData(it->id, read_node))); - } - } -} - -void GenericChangeProcessor::CommitChangesFromSyncModel() { - DCHECK(sequence_checker_.CalledOnValidSequence()); - if (syncer_changes_.empty()) - return; - if (!local_service_) { - ModelType type = syncer_changes_[0].sync_data().GetDataType(); - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Local service destroyed.", type); - error_handler()->OnUnrecoverableError(error); - return; - } - SyncError error = - local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_); - syncer_changes_.clear(); - if (error.IsSet()) - error_handler()->OnUnrecoverableError(error); -} - -SyncDataList GenericChangeProcessor::GetAllSyncData(ModelType type) const { - DCHECK_EQ(type_, type); - // This is slow / memory intensive. Should be used sparingly by datatypes. - SyncDataList data; - GetAllSyncDataReturnError(&data); - return data; -} - -SyncError GenericChangeProcessor::UpdateDataTypeContext( - ModelType type, - SyncChangeProcessor::ContextRefreshStatus refresh_status, - const std::string& context) { - DCHECK(ProtocolTypes().Has(type)); - DCHECK_EQ(type_, type); - - if (context.size() > static_cast<size_t>(kContextSizeLimit)) { - return SyncError(FROM_HERE, SyncError::DATATYPE_ERROR, - "Context size limit exceeded.", type); - } - - WriteTransaction trans(FROM_HERE, share_handle()); - trans.SetDataTypeContext(type, refresh_status, context); - - // TODO(zea): plumb a pointer to the PSS or SyncManagerImpl here so we can - // trigger a datatype nudge if |refresh_status == REFRESH_NEEDED|. - - return SyncError(); -} - -void GenericChangeProcessor::AddLocalChangeObserver( - LocalChangeObserver* observer) { - local_change_observers_.AddObserver(observer); -} - -void GenericChangeProcessor::RemoveLocalChangeObserver( - LocalChangeObserver* observer) { - local_change_observers_.RemoveObserver(observer); -} - -SyncError GenericChangeProcessor::GetAllSyncDataReturnError( - SyncDataList* current_sync_data) const { - DCHECK(sequence_checker_.CalledOnValidSequence()); - std::string type_name = ModelTypeToString(type_); - ReadTransaction trans(FROM_HERE, share_handle()); - ReadNode root(&trans); - if (root.InitTypeRoot(type_) != BaseNode::INIT_OK) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Server did not create the top-level " + type_name + - " node. We might be running against an out-of-" - "date server.", - type_); - return error; - } - - // TODO(akalin): We'll have to do a tree traversal for bookmarks. - DCHECK_NE(type_, BOOKMARKS); - - std::vector<int64_t> child_ids; - root.GetChildIds(&child_ids); - - current_sync_data->reserve(current_sync_data->size() + child_ids.size()); - for (int64_t child_id : child_ids) { - ReadNode sync_child_node(&trans); - if (sync_child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Failed to fetch child node for type " + type_name + ".", - type_); - return error; - } - current_sync_data->push_back( - BuildRemoteSyncData(sync_child_node.GetId(), sync_child_node)); - } - return SyncError(); -} - -bool GenericChangeProcessor::GetDataTypeContext(std::string* context) const { - ReadTransaction trans(FROM_HERE, share_handle()); - sync_pb::DataTypeContext context_proto; - trans.GetDataTypeContext(type_, &context_proto); - if (!context_proto.has_context()) - return false; - - DCHECK_EQ(type_, - GetModelTypeFromSpecificsFieldNumber(context_proto.data_type_id())); - *context = context_proto.context(); - return true; -} - -int GenericChangeProcessor::GetSyncCount() { - ReadTransaction trans(FROM_HERE, share_handle()); - ReadNode root(&trans); - if (root.InitTypeRoot(type_) != BaseNode::INIT_OK) - return 0; - - // Subtract one to account for type's root node. - return root.GetTotalNodeCount() - 1; -} - -namespace { - -// WARNING: this code is sensitive to compiler optimizations. Be careful -// modifying any code around an OnUnrecoverableError call, else the compiler -// attempts to merge it with other calls, losing useful information in -// breakpad uploads. -SyncError LogLookupFailure(BaseNode::InitByLookupResult lookup_result, - const base::Location& from_here, - const std::string& error_prefix, - ModelType type, - DataTypeErrorHandler* error_handler) { - switch (lookup_result) { - case BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { - SyncError error; - error.Reset( - from_here, - error_prefix + "could not find entry matching the lookup criteria.", - type); - error_handler->OnUnrecoverableError(error); - LOG(ERROR) << "Delete: Bad entry."; - return error; - } - case BaseNode::INIT_FAILED_ENTRY_IS_DEL: { - SyncError error; - error.Reset(from_here, error_prefix + "entry is already deleted.", type); - error_handler->OnUnrecoverableError(error); - LOG(ERROR) << "Delete: Deleted entry."; - return error; - } - case BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { - SyncError error; - error.Reset(from_here, error_prefix + "unable to decrypt", type); - error_handler->OnUnrecoverableError(error); - LOG(ERROR) << "Delete: Undecryptable entry."; - return error; - } - case BaseNode::INIT_FAILED_PRECONDITION: { - SyncError error; - error.Reset(from_here, - error_prefix + "a precondition was not met for calling init.", - type); - error_handler->OnUnrecoverableError(error); - LOG(ERROR) << "Delete: Failed precondition."; - return error; - } - default: { - SyncError error; - // Should have listed all the possible error cases above. - error.Reset(from_here, error_prefix + "unknown error", type); - error_handler->OnUnrecoverableError(error); - LOG(ERROR) << "Delete: Unknown error."; - return error; - } - } -} - -} // namespace - -SyncError GenericChangeProcessor::AttemptDelete( - const SyncChange& change, - ModelType type, - const std::string& type_str, - WriteNode* node, - DataTypeErrorHandler* error_handler) { - DCHECK_EQ(change.change_type(), SyncChange::ACTION_DELETE); - if (change.sync_data().IsLocal()) { - const std::string& tag = SyncDataLocal(change.sync_data()).GetTag(); - if (tag.empty()) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Failed to delete " + type_str + - " node. Local data, empty tag. " + - change.location().ToString(), - type); - error_handler->OnUnrecoverableError(error); - NOTREACHED(); - return error; - } - - BaseNode::InitByLookupResult result = - node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); - if (result != BaseNode::INIT_OK) { - return LogLookupFailure(result, FROM_HERE, - "Failed to delete " + type_str + - " node. Local data. " + - change.location().ToString(), - type, error_handler); - } - } else { - BaseNode::InitByLookupResult result = - node->InitByIdLookup(SyncDataRemote(change.sync_data()).GetId()); - if (result != BaseNode::INIT_OK) { - return LogLookupFailure(result, FROM_HERE, - "Failed to delete " + type_str + - " node. Non-local data. " + - change.location().ToString(), - type, error_handler); - } - } - NotifyLocalChangeObservers(node->GetEntry(), change); - if (IsActOnceDataType(type)) - node->Drop(); - else - node->Tombstone(); - return SyncError(); -} - -SyncError GenericChangeProcessor::ProcessSyncChanges( - const base::Location& from_here, - const SyncChangeList& list_of_changes) { - DCHECK(sequence_checker_.CalledOnValidSequence()); - - if (list_of_changes.empty()) { - // No work. Exit without entering WriteTransaction. - return SyncError(); - } - - WriteTransaction trans(from_here, share_handle()); - - for (auto iter = list_of_changes.begin(); iter != list_of_changes.end(); - ++iter) { - const SyncChange& change = *iter; - DCHECK_EQ(change.sync_data().GetDataType(), type_); - std::string type_str = ModelTypeToString(type_); - WriteNode sync_node(&trans); - if (change.change_type() == SyncChange::ACTION_DELETE) { - SyncError error = - AttemptDelete(change, type_, type_str, &sync_node, error_handler()); - if (error.IsSet()) - return error; - if (merge_result_) { - merge_result_->set_num_items_deleted( - merge_result_->num_items_deleted() + 1); - } - } else if (change.change_type() == SyncChange::ACTION_ADD) { - SyncError error = HandleActionAdd(change, type_str, trans, &sync_node); - if (error.IsSet()) { - return error; - } - } else if (change.change_type() == SyncChange::ACTION_UPDATE) { - SyncError error = HandleActionUpdate(change, type_str, trans, &sync_node); - if (error.IsSet()) { - return error; - } - } else { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Received unset SyncChange in the change processor, " + - change.location().ToString(), - type_); - error_handler()->OnUnrecoverableError(error); - NOTREACHED(); - LOG(ERROR) << "Unset sync change."; - return error; - } - } - - return SyncError(); -} - -// WARNING: this code is sensitive to compiler optimizations. Be careful -// modifying any code around an OnUnrecoverableError call, else the compiler -// attempts to merge it with other calls, losing useful information in -// breakpad uploads. -SyncError GenericChangeProcessor::HandleActionAdd(const SyncChange& change, - const std::string& type_str, - const WriteTransaction& trans, - WriteNode* sync_node) { - // TODO(sync): Handle other types of creation (custom parents, folders, - // etc.). - const SyncDataLocal sync_data_local(change.sync_data()); - WriteNode::InitUniqueByCreationResult result = - sync_node->InitUniqueByCreation(sync_data_local.GetDataType(), - sync_data_local.GetTag()); - if (result != WriteNode::INIT_SUCCESS) { - std::string error_prefix = "Failed to create " + type_str + " node: " + - change.location().ToString() + ", "; - switch (result) { - case WriteNode::INIT_FAILED_EMPTY_TAG: { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "empty tag", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Create: Empty tag."; - return error; - } - case WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "failed to create entry", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Create: Could not create entry."; - return error; - } - case WriteNode::INIT_FAILED_SET_PREDECESSOR: { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "failed to set predecessor", - type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Create: Bad predecessor."; - return error; - } - case WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Create: Failed to decrypt."; - return error; - } - default: { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "unknown error", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Create: Unknown error."; - return error; - } - } - } - NotifyLocalChangeObservers(sync_node->GetEntry(), change); - - sync_node->SetTitle(change.sync_data().GetTitle()); - SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); - - if (merge_result_) { - merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); - } - return SyncError(); -} -// WARNING: this code is sensitive to compiler optimizations. Be careful -// modifying any code around an OnUnrecoverableError call, else the compiler -// attempts to merge it with other calls, losing useful information in -// breakpad uploads. -SyncError GenericChangeProcessor::HandleActionUpdate( - const SyncChange& change, - const std::string& type_str, - const WriteTransaction& trans, - WriteNode* sync_node) { - const SyncDataLocal sync_data_local(change.sync_data()); - BaseNode::InitByLookupResult result = sync_node->InitByClientTagLookup( - sync_data_local.GetDataType(), sync_data_local.GetTag()); - if (result != BaseNode::INIT_OK) { - std::string error_prefix = "Failed to load " + type_str + " node. " + - change.location().ToString() + ", "; - if (result == BaseNode::INIT_FAILED_PRECONDITION) { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "empty tag", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Update: Empty tag."; - return error; - } else if (result == BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "bad entry", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Update: bad entry."; - return error; - } else if (result == BaseNode::INIT_FAILED_ENTRY_IS_DEL) { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "deleted entry", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Update: deleted entry."; - return error; - } else if (result == BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY) { - SyncError error; - error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Update: Failed to decrypt."; - return error; - } else { - NOTREACHED(); - SyncError error; - error.Reset(FROM_HERE, error_prefix + "unknown error", type_); - error_handler()->OnUnrecoverableError(error); - LOG(ERROR) << "Update: Unknown error."; - return error; - } - } - - NotifyLocalChangeObservers(sync_node->GetEntry(), change); - - sync_node->SetTitle(change.sync_data().GetTitle()); - SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); - - if (merge_result_) { - merge_result_->set_num_items_modified(merge_result_->num_items_modified() + - 1); - } - // TODO(sync): Support updating other parts of the sync node (title, - // successor, parent, etc.). - return SyncError(); -} - -bool GenericChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) { - DCHECK(sequence_checker_.CalledOnValidSequence()); - DCHECK(has_nodes); - std::string type_name = ModelTypeToString(type_); - std::string err_str = - "Server did not create the top-level " + type_name + - " node. We might be running against an out-of-date server."; - *has_nodes = false; - ReadTransaction trans(FROM_HERE, share_handle()); - ReadNode type_root_node(&trans); - if (type_root_node.InitTypeRoot(type_) != BaseNode::INIT_OK) { - LOG(ERROR) << err_str; - return false; - } - - // The sync model has user created nodes if the type's root node has any - // children. - *has_nodes = type_root_node.HasChildren(); - return true; -} - -bool GenericChangeProcessor::CryptoReadyIfNecessary() { - DCHECK(sequence_checker_.CalledOnValidSequence()); - // We only access the cryptographer while holding a transaction. - ReadTransaction trans(FROM_HERE, share_handle()); - const ModelTypeSet encrypted_types = trans.GetEncryptedTypes(); - return !encrypted_types.Has(type_) || trans.GetCryptographer()->CanEncrypt(); -} - -void GenericChangeProcessor::StartImpl() {} - -UserShare* GenericChangeProcessor::share_handle() const { - DCHECK(sequence_checker_.CalledOnValidSequence()); - return share_handle_; -} - -void GenericChangeProcessor::NotifyLocalChangeObservers( - const syncable::Entry* current_entry, - const SyncChange& change) { - for (auto& observer : local_change_observers_) - observer.OnLocalChange(current_entry, change); -} - -} // namespace syncer
diff --git a/components/sync/driver/generic_change_processor.h b/components/sync/driver/generic_change_processor.h deleted file mode 100644 index cbc2b2b..0000000 --- a/components/sync/driver/generic_change_processor.h +++ /dev/null
@@ -1,158 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_H_ -#define COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_H_ - -#include <stdint.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "base/observer_list.h" -#include "base/sequence_checker.h" -#include "components/sync/model/change_processor.h" -#include "components/sync/model/data_type_error_handler.h" -#include "components/sync/model/sync_change_processor.h" -#include "components/sync/model/sync_merge_result.h" - -namespace syncer { - -class SyncData; -class SyncableService; -class WriteNode; -class WriteTransaction; - -namespace syncable { -class Entry; -} // namespace syncable - -using SyncDataList = std::vector<SyncData>; - -// Datatype agnostic change processor. One instance of GenericChangeProcessor -// is created for each datatype and lives on the datatype's sequence. It then -// handles all interaction with the sync api, both translating pushes from the -// local service into transactions and receiving changes from the sync model, -// which then get converted into SyncChange's and sent to the local service. -// -// As a rule, the GenericChangeProcessor is not thread safe, and should only -// be used on the same sequence in which it was created. -class GenericChangeProcessor : public ChangeProcessor, - public SyncChangeProcessor { - public: - // Create a change processor for |type| and connect it to the syncer. - GenericChangeProcessor(ModelType type, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncableService>& local_service, - const base::WeakPtr<SyncMergeResult>& merge_result, - UserShare* user_share); - ~GenericChangeProcessor() override; - - // ChangeProcessor interface. - // Build and store a list of all changes into |syncer_changes_|. - void ApplyChangesFromSyncModel( - const BaseTransaction* trans, - int64_t version, - const ImmutableChangeRecordList& changes) override; - // Passes |syncer_changes_|, built in ApplyChangesFromSyncModel, onto - // |local_service_| by way of its ProcessSyncChanges method. - void CommitChangesFromSyncModel() override; - - // SyncChangeProcessor implementation. - SyncError ProcessSyncChanges(const base::Location& from_here, - const SyncChangeList& change_list) override; - SyncDataList GetAllSyncData(ModelType type) const override; - SyncError UpdateDataTypeContext( - ModelType type, - SyncChangeProcessor::ContextRefreshStatus refresh_status, - const std::string& context) override; - void AddLocalChangeObserver(LocalChangeObserver* observer) override; - void RemoveLocalChangeObserver(LocalChangeObserver* observer) override; - - // Similar to above, but returns a SyncError for use by direct clients - // of GenericChangeProcessor that may need more error visibility. - virtual SyncError GetAllSyncDataReturnError(SyncDataList* data) const; - - // If a datatype context associated with this GenericChangeProcessor's type - // exists, fills |context| and returns true. Otheriwse, if there has not been - // a context set, returns false. - virtual bool GetDataTypeContext(std::string* context) const; - - // Returns the number of items for this type. - virtual int GetSyncCount(); - - // Generic versions of AssociatorInterface methods. Called by - // SyncableServiceAdapter or the DataTypeController. - virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes); - virtual bool CryptoReadyIfNecessary(); - - protected: - // ChangeProcessor interface. - void StartImpl() override; // Does nothing. - UserShare* share_handle() const override; - - private: - SyncError AttemptDelete(const SyncChange& change, - ModelType type, - const std::string& type_str, - WriteNode* node, - DataTypeErrorHandler* error_handler); - // Logically part of ProcessSyncChanges. - SyncError HandleActionAdd(const SyncChange& change, - const std::string& type_str, - const WriteTransaction& trans, - WriteNode* sync_node); - - // Logically part of ProcessSyncChanges. - SyncError HandleActionUpdate(const SyncChange& change, - const std::string& type_str, - const WriteTransaction& trans, - WriteNode* sync_node); - - // Notify every registered local change observer that |change| is about to be - // applied to |current_entry|. - void NotifyLocalChangeObservers(const syncable::Entry* current_entry, - const SyncChange& change); - - base::SequenceChecker sequence_checker_; - - const ModelType type_; - - // The SyncableService this change processor will forward changes on to. - const base::WeakPtr<SyncableService> local_service_; - - // A SyncMergeResult used to track the changes made during association. The - // owner will invalidate the weak pointer when association is complete. While - // the pointer is valid though, we increment it with any changes received - // via ProcessSyncChanges. - const base::WeakPtr<SyncMergeResult> merge_result_; - - // The current list of changes received from the syncer. We buffer because - // we must ensure no syncapi transaction is held when we pass it on to - // |local_service_|. - // Set in ApplyChangesFromSyncModel, consumed in CommitChangesFromSyncModel. - SyncChangeList syncer_changes_; - - // Our handle to the sync model. Unlike normal ChangeProcessors, we need to - // be able to access the sync model before the change processor begins - // listening to changes (the local_service_ will be interacting with us - // when it starts up). As such we can't wait until Start(_) has been called, - // and have to keep a local pointer to the user_share. - UserShare* const share_handle_; - - // List of observers that want to be notified of local changes being written. - base::ObserverList<LocalChangeObserver>::Unchecked local_change_observers_; - - base::WeakPtrFactory<GenericChangeProcessor> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(GenericChangeProcessor); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_H_
diff --git a/components/sync/driver/generic_change_processor_factory.cc b/components/sync/driver/generic_change_processor_factory.cc deleted file mode 100644 index acf7f40..0000000 --- a/components/sync/driver/generic_change_processor_factory.cc +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/generic_change_processor_factory.h" - -#include <utility> - -#include "components/sync/driver/generic_change_processor.h" -#include "components/sync/model/syncable_service.h" - -namespace syncer { - -GenericChangeProcessorFactory::GenericChangeProcessorFactory() {} - -GenericChangeProcessorFactory::~GenericChangeProcessorFactory() {} - -std::unique_ptr<GenericChangeProcessor> -GenericChangeProcessorFactory::CreateGenericChangeProcessor( - ModelType type, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncableService>& local_service, - const base::WeakPtr<SyncMergeResult>& merge_result) { - DCHECK(user_share); - return std::make_unique<GenericChangeProcessor>( - type, std::move(error_handler), local_service, merge_result, user_share); -} - -} // namespace syncer
diff --git a/components/sync/driver/generic_change_processor_factory.h b/components/sync/driver/generic_change_processor_factory.h deleted file mode 100644 index 7196514..0000000 --- a/components/sync/driver/generic_change_processor_factory.h +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_FACTORY_H_ -#define COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_FACTORY_H_ - -#include <memory> - -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "components/sync/base/model_type.h" -#include "components/sync/model/data_type_error_handler.h" - -namespace syncer { - -class GenericChangeProcessor; -class SyncMergeResult; -class SyncableService; -struct UserShare; - -// Because GenericChangeProcessors are created and used only from the model -// thread, their lifetime is strictly shorter than other components like -// DataTypeController, which live before / after communication with model -// threads begins and ends. -// The GCP is created "on the fly" at just the right time, on just the right -// thread. Given that, we use a factory to instantiate GenericChangeProcessors -// so that tests can choose to use a fake processor (i.e instead of injection). -class GenericChangeProcessorFactory { - public: - GenericChangeProcessorFactory(); - virtual ~GenericChangeProcessorFactory(); - virtual std::unique_ptr<GenericChangeProcessor> CreateGenericChangeProcessor( - ModelType type, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncableService>& local_service, - const base::WeakPtr<SyncMergeResult>& merge_result); - - private: - DISALLOW_COPY_AND_ASSIGN(GenericChangeProcessorFactory); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_FACTORY_H_
diff --git a/components/sync/driver/generic_change_processor_unittest.cc b/components/sync/driver/generic_change_processor_unittest.cc deleted file mode 100644 index 492d79c..0000000 --- a/components/sync/driver/generic_change_processor_unittest.cc +++ /dev/null
@@ -1,304 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/generic_change_processor.h" - -#include <stddef.h> - -#include <utility> - -#include "base/run_loop.h" -#include "base/strings/stringprintf.h" -#include "base/test/task_environment.h" -#include "components/sync/base/client_tag_hash.h" -#include "components/sync/base/model_type.h" -#include "components/sync/driver/data_type_manager.h" -#include "components/sync/driver/sync_api_component_factory_mock.h" -#include "components/sync/engine/sync_encryption_handler.h" -#include "components/sync/engine/sync_engine.h" -#include "components/sync/model/data_type_error_handler_mock.h" -#include "components/sync/model/fake_syncable_service.h" -#include "components/sync/model/sync_change.h" -#include "components/sync/syncable/read_node.h" -#include "components/sync/syncable/read_transaction.h" -#include "components/sync/syncable/test_user_share.h" -#include "components/sync/syncable/user_share.h" -#include "components/sync/syncable/write_node.h" -#include "components/sync/syncable/write_transaction.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace syncer { - -namespace { - -class SyncGenericChangeProcessorTest : public testing::Test { - public: - // Most test cases will use this type. For those that need a - // GenericChangeProcessor for a different type, use |InitializeForType|. - static const ModelType kType = PREFERENCES; - - SyncGenericChangeProcessorTest() - : task_environment_( - base::test::SingleThreadTaskEnvironment::MainThreadType::UI), - syncable_service_ptr_factory_(&fake_syncable_service_) {} - - void SetUp() override { - // Use kType by default, but allow test cases to re-initialize with whatever - // type they choose. Therefore, it's important that all type dependent - // initialization occurs in InitializeForType. - InitializeForType(kType); - } - - void TearDown() override { - if (test_user_share_) { - test_user_share_->TearDown(); - } - } - - // Initialize GenericChangeProcessor and related classes for testing with - // model type |type|. - void InitializeForType(ModelType type) { - TearDown(); - test_user_share_ = std::make_unique<TestUserShare>(); - test_user_share_->SetUp(); - sync_merge_result_ = std::make_unique<SyncMergeResult>(type); - merge_result_ptr_factory_ = - std::make_unique<base::WeakPtrFactory<SyncMergeResult>>( - sync_merge_result_.get()); - - ModelTypeSet types = ProtocolTypes(); - for (ModelType type : types) { - TestUserShare::CreateRoot(type, test_user_share_->user_share()); - } - test_user_share_->encryption_handler()->Init(); - ConstructGenericChangeProcessor(type); - } - - void ConstructGenericChangeProcessor(ModelType type) { - change_processor_ = std::make_unique<GenericChangeProcessor>( - type, std::make_unique<DataTypeErrorHandlerMock>(), - syncable_service_ptr_factory_.GetWeakPtr(), - merge_result_ptr_factory_->GetWeakPtr(), - test_user_share_->user_share()); - } - - void BuildChildNodes(ModelType type, int n) { - WriteTransaction trans(FROM_HERE, user_share()); - for (int i = 0; i < n; ++i) { - WriteNode node(&trans); - node.InitUniqueByCreation(type, base::StringPrintf("node%05d", i)); - } - } - - GenericChangeProcessor* change_processor() { return change_processor_.get(); } - - UserShare* user_share() { return test_user_share_->user_share(); } - - void RunLoop() { - base::RunLoop run_loop; - run_loop.RunUntilIdle(); - } - - private: - base::test::SingleThreadTaskEnvironment task_environment_; - - std::unique_ptr<SyncMergeResult> sync_merge_result_; - std::unique_ptr<base::WeakPtrFactory<SyncMergeResult>> - merge_result_ptr_factory_; - - FakeSyncableService fake_syncable_service_; - base::WeakPtrFactory<FakeSyncableService> syncable_service_ptr_factory_; - - std::unique_ptr<TestUserShare> test_user_share_; - testing::NiceMock<SyncApiComponentFactoryMock> sync_factory_; - - std::unique_ptr<GenericChangeProcessor> change_processor_; -}; - -// Similar to above, but focused on the method that implements sync/api -// interfaces and is hence exposed to datatypes directly. -TEST_F(SyncGenericChangeProcessorTest, StressGetAllSyncData) { - const int kNumChildNodes = 1000; - const int kRepeatCount = 1; - - ASSERT_NO_FATAL_FAILURE(BuildChildNodes(kType, kNumChildNodes)); - - for (int i = 0; i < kRepeatCount; ++i) { - SyncDataList sync_data = change_processor()->GetAllSyncData(kType); - - // Start with a simple test. We can add more in-depth testing later. - EXPECT_EQ(static_cast<size_t>(kNumChildNodes), sync_data.size()); - } -} - -TEST_F(SyncGenericChangeProcessorTest, SetGetPasswords) { - InitializeForType(PASSWORDS); - const int kNumPasswords = 10; - sync_pb::PasswordSpecificsData password_data; - password_data.set_username_value("user"); - - sync_pb::EntitySpecifics password_holder; - - SyncChangeList change_list; - for (int i = 0; i < kNumPasswords; ++i) { - password_data.set_password_value(base::StringPrintf("password%i", i)); - password_holder.mutable_password() - ->mutable_client_only_encrypted_data() - ->CopyFrom(password_data); - change_list.push_back( - SyncChange(FROM_HERE, SyncChange::ACTION_ADD, - SyncData::CreateLocalData(base::StringPrintf("tag%i", i), - base::StringPrintf("title%i", i), - password_holder))); - } - - ASSERT_FALSE( - change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet()); - - SyncDataList password_list(change_processor()->GetAllSyncData(PASSWORDS)); - - ASSERT_EQ(password_list.size(), change_list.size()); - for (int i = 0; i < kNumPasswords; ++i) { - // Verify the password is returned properly. - ASSERT_TRUE(password_list[i].GetSpecifics().has_password()); - ASSERT_TRUE(password_list[i] - .GetSpecifics() - .password() - .has_client_only_encrypted_data()); - ASSERT_FALSE(password_list[i].GetSpecifics().password().has_encrypted()); - const sync_pb::PasswordSpecificsData& sync_password = - password_list[i].GetSpecifics().password().client_only_encrypted_data(); - const sync_pb::PasswordSpecificsData& change_password = - change_list[i] - .sync_data() - .GetSpecifics() - .password() - .client_only_encrypted_data(); - ASSERT_EQ(sync_password.password_value(), change_password.password_value()); - ASSERT_EQ(sync_password.username_value(), change_password.username_value()); - - // Verify the raw sync data was stored securely. - ReadTransaction read_transaction(FROM_HERE, user_share()); - ReadNode node(&read_transaction); - ASSERT_EQ( - node.InitByClientTagLookup(PASSWORDS, base::StringPrintf("tag%i", i)), - BaseNode::INIT_OK); - ASSERT_EQ(node.GetTitle(), "encrypted"); - const sync_pb::EntitySpecifics& raw_specifics = node.GetEntitySpecifics(); - ASSERT_TRUE(raw_specifics.has_password()); - ASSERT_TRUE(raw_specifics.password().has_encrypted()); - ASSERT_FALSE(raw_specifics.password().has_client_only_encrypted_data()); - } -} - -TEST_F(SyncGenericChangeProcessorTest, UpdatePasswords) { - InitializeForType(PASSWORDS); - const int kNumPasswords = 10; - sync_pb::PasswordSpecificsData password_data; - password_data.set_username_value("user"); - - sync_pb::EntitySpecifics password_holder; - - SyncChangeList change_list; - SyncChangeList change_list2; - for (int i = 0; i < kNumPasswords; ++i) { - password_data.set_password_value(base::StringPrintf("password%i", i)); - password_holder.mutable_password() - ->mutable_client_only_encrypted_data() - ->CopyFrom(password_data); - change_list.push_back( - SyncChange(FROM_HERE, SyncChange::ACTION_ADD, - SyncData::CreateLocalData(base::StringPrintf("tag%i", i), - base::StringPrintf("title%i", i), - password_holder))); - password_data.set_password_value(base::StringPrintf("password_m%i", i)); - password_holder.mutable_password() - ->mutable_client_only_encrypted_data() - ->CopyFrom(password_data); - change_list2.push_back( - SyncChange(FROM_HERE, SyncChange::ACTION_UPDATE, - SyncData::CreateLocalData(base::StringPrintf("tag%i", i), - base::StringPrintf("title_m%i", i), - password_holder))); - } - - ASSERT_FALSE( - change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet()); - ASSERT_FALSE( - change_processor()->ProcessSyncChanges(FROM_HERE, change_list2).IsSet()); - - SyncDataList password_list(change_processor()->GetAllSyncData(PASSWORDS)); - - ASSERT_EQ(password_list.size(), change_list2.size()); - for (int i = 0; i < kNumPasswords; ++i) { - // Verify the password is returned properly. - ASSERT_TRUE(password_list[i].GetSpecifics().has_password()); - ASSERT_TRUE(password_list[i] - .GetSpecifics() - .password() - .has_client_only_encrypted_data()); - ASSERT_FALSE(password_list[i].GetSpecifics().password().has_encrypted()); - const sync_pb::PasswordSpecificsData& sync_password = - password_list[i].GetSpecifics().password().client_only_encrypted_data(); - const sync_pb::PasswordSpecificsData& change_password = - change_list2[i] - .sync_data() - .GetSpecifics() - .password() - .client_only_encrypted_data(); - ASSERT_EQ(sync_password.password_value(), change_password.password_value()); - ASSERT_EQ(sync_password.username_value(), change_password.username_value()); - - // Verify the raw sync data was stored securely. - ReadTransaction read_transaction(FROM_HERE, user_share()); - ReadNode node(&read_transaction); - ASSERT_EQ( - node.InitByClientTagLookup(PASSWORDS, base::StringPrintf("tag%i", i)), - BaseNode::INIT_OK); - ASSERT_EQ(node.GetTitle(), "encrypted"); - const sync_pb::EntitySpecifics& raw_specifics = node.GetEntitySpecifics(); - ASSERT_TRUE(raw_specifics.has_password()); - ASSERT_TRUE(raw_specifics.password().has_encrypted()); - ASSERT_FALSE(raw_specifics.password().has_client_only_encrypted_data()); - } -} - -// Test that attempting to add an entry that already exists still works. -TEST_F(SyncGenericChangeProcessorTest, AddExistingEntry) { - InitializeForType(SESSIONS); - sync_pb::EntitySpecifics sessions_specifics; - sessions_specifics.mutable_session()->set_session_tag("session tag"); - SyncChangeList changes; - - // First add it normally. - changes.push_back( - SyncChange(FROM_HERE, SyncChange::ACTION_ADD, - SyncData::CreateLocalData(base::StringPrintf("tag"), - base::StringPrintf("title"), - sessions_specifics))); - ASSERT_FALSE( - change_processor()->ProcessSyncChanges(FROM_HERE, changes).IsSet()); - - // Now attempt to add it again, but with different specifics. Should not - // result in an error and should still update the specifics. - sessions_specifics.mutable_session()->set_session_tag("session tag 2"); - changes[0] = SyncChange(FROM_HERE, SyncChange::ACTION_ADD, - SyncData::CreateLocalData(base::StringPrintf("tag"), - base::StringPrintf("title"), - sessions_specifics)); - ASSERT_FALSE( - change_processor()->ProcessSyncChanges(FROM_HERE, changes).IsSet()); - - // Verify the data was updated properly. - SyncDataList sync_data = change_processor()->GetAllSyncData(SESSIONS); - ASSERT_EQ(sync_data.size(), 1U); - ASSERT_EQ("session tag 2", - sync_data[0].GetSpecifics().session().session_tag()); - EXPECT_FALSE(SyncDataRemote(sync_data[0]).GetClientTagHash().value().empty()); -} - -} // namespace - -} // namespace syncer
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc index 3ab0691b..9dd4158 100644 --- a/components/sync/driver/glue/sync_engine_backend.cc +++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -64,20 +64,12 @@ FILE_PATH_LITERAL("Nigori.bin"); bool ShouldEnableUSSNigori() { - // USS implementation of Nigori is not compatible with Directory - // implementations of Passwords and Bookmarks. - // |kSyncUSSNigori| should be checked last, since check itself has side - // effect (only clients, which have feature-flag checked participate in the - // study). Otherwise, we will have different amount of clients in control and - // experiment groups. - return base::FeatureList::IsEnabled(switches::kSyncUSSPasswords) && - base::FeatureList::IsEnabled(switches::kSyncUSSNigori); + return base::FeatureList::IsEnabled(switches::kSyncUSSNigori); } // Checks if there is at least one experiment for USS is disabled. bool ShouldClearDirectoryOnEmptyBirthday() { - return !base::FeatureList::IsEnabled(switches::kSyncUSSPasswords) || - !base::FeatureList::IsEnabled(switches::kSyncUSSNigori); + return !base::FeatureList::IsEnabled(switches::kSyncUSSNigori); } } // namespace
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc index fc27b2c2..51e4152 100644 --- a/components/sync/driver/glue/sync_engine_impl_unittest.cc +++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -814,10 +814,7 @@ // Regression test for crbug.com/1019956. TEST_F(SyncEngineImplTest, ShouldDestroyAfterInitFailure) { base::test::ScopedFeatureList override_features; - override_features.InitWithFeatures( - /*enable_feature=*/{switches::kSyncUSSPasswords, - switches::kSyncUSSNigori}, - /*disable_feature=*/{}); + override_features.InitAndEnableFeature(switches::kSyncUSSNigori); fake_manager_factory_->set_should_fail_on_init(true); // Sync manager will report initialization failure and gets destroyed during
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc index fa90b203..44a6eb1 100644 --- a/components/sync/driver/profile_sync_service.cc +++ b/components/sync/driver/profile_sync_service.cc
@@ -1484,10 +1484,8 @@ } if (enable_passwords_account_storage_ && - base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) { - if (!GetUserSettings()->IsUsingSecondaryPassphrase()) { - allowed_types.Put(PASSWORDS); - } + !GetUserSettings()->IsUsingSecondaryPassphrase()) { + allowed_types.Put(PASSWORDS); } if (base::FeatureList::IsEnabled(switches::kSyncDeviceInfoInTransportMode)) {
diff --git a/components/sync/driver/shared_change_processor.cc b/components/sync/driver/shared_change_processor.cc deleted file mode 100644 index 8dcb62c..0000000 --- a/components/sync/driver/shared_change_processor.cc +++ /dev/null
@@ -1,309 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/shared_change_processor.h" - -#include <utility> - -#include "base/threading/sequenced_task_runner_handle.h" -#include "components/sync/driver/generic_change_processor.h" -#include "components/sync/driver/generic_change_processor_factory.h" -#include "components/sync/driver/shared_change_processor_ref.h" -#include "components/sync/driver/sync_client.h" -#include "components/sync/model/sync_change.h" -#include "components/sync/model/syncable_service.h" - -using base::AutoLock; - -namespace syncer { - -SharedChangeProcessor::SharedChangeProcessor(ModelType type) - : disconnected_(false), - type_(type), - frontend_task_runner_(base::SequencedTaskRunnerHandle::Get()), - generic_change_processor_(nullptr) { - DCHECK_NE(type_, UNSPECIFIED); -} - -SharedChangeProcessor::~SharedChangeProcessor() { - // We can either be deleted when the DTC is destroyed (on UI thread), or when - // the SyncableService stops syncing (on |backend_task_runner_|). - // |generic_change_processor_|, if non-null, must be deleted on - // |backend_task_runner_|. - if (backend_task_runner_) { - if (backend_task_runner_->RunsTasksInCurrentSequence()) { - delete generic_change_processor_; - } else { - DCHECK(frontend_task_runner_->RunsTasksInCurrentSequence()); - if (!backend_task_runner_->DeleteSoon(FROM_HERE, - generic_change_processor_)) { - NOTREACHED(); - } - } - } else { - DCHECK(!generic_change_processor_); - } -} - -void SharedChangeProcessor::StartAssociation( - StartDoneCallback start_done, - SyncClient* const sync_client, - GenericChangeProcessorFactory* processor_factory, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler) { - DCHECK(user_share); - SyncMergeResult local_merge_result(type_); - SyncMergeResult syncer_merge_result(type_); - base::WeakPtrFactory<SyncMergeResult> weak_ptr_factory(&syncer_merge_result); - - // Connect |shared_change_processor| to the syncer and get the - // SyncableService associated with type_. - // Note that it's possible the shared_change_processor has already been - // disconnected at this point, so all our accesses to the syncer from this - // point on are through it. - local_service_ = - Connect(sync_client, processor_factory, user_share, - std::move(error_handler), weak_ptr_factory.GetWeakPtr()); - if (!local_service_) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Failed to connect to syncer.", type_); - local_merge_result.set_error(error); - std::move(start_done) - .Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result, - syncer_merge_result); - return; - } - - if (!CryptoReadyIfNecessary()) { - SyncError error(FROM_HERE, SyncError::CRYPTO_ERROR, "", type_); - local_merge_result.set_error(error); - std::move(start_done) - .Run(DataTypeController::NEEDS_CRYPTO, local_merge_result, - syncer_merge_result); - return; - } - - bool sync_has_nodes = false; - if (!SyncModelHasUserCreatedNodes(&sync_has_nodes)) { - SyncError error(FROM_HERE, SyncError::UNRECOVERABLE_ERROR, - "Failed to load sync nodes", type_); - local_merge_result.set_error(error); - std::move(start_done) - .Run(DataTypeController::UNRECOVERABLE_ERROR, local_merge_result, - syncer_merge_result); - return; - } - - // Scope for |initial_sync_data| which might be expensive, so we don't want - // to keep it in memory longer than necessary. - { - SyncDataList initial_sync_data; - - SyncError error = GetAllSyncDataReturnError(type_, &initial_sync_data); - if (error.IsSet()) { - local_merge_result.set_error(error); - std::move(start_done) - .Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result, - syncer_merge_result); - return; - } - - syncer_merge_result.set_num_items_before_association( - initial_sync_data.size()); - // Passes a reference to |shared_change_processor|. - local_merge_result = local_service_->MergeDataAndStartSyncing( - type_, initial_sync_data, std::unique_ptr<SyncChangeProcessor>( - new SharedChangeProcessorRef(this)), - std::unique_ptr<SyncErrorFactory>(new SharedChangeProcessorRef(this))); - if (local_merge_result.error().IsSet()) { - std::move(start_done) - .Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result, - syncer_merge_result); - return; - } - } - - syncer_merge_result.set_num_items_after_association(GetSyncCount()); - - std::move(start_done) - .Run(!sync_has_nodes ? DataTypeController::OK_FIRST_RUN - : DataTypeController::OK, - local_merge_result, syncer_merge_result); -} - -base::WeakPtr<SyncableService> SharedChangeProcessor::Connect( - SyncClient* sync_client, - GenericChangeProcessorFactory* processor_factory, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncMergeResult>& merge_result) { - DCHECK(sync_client); - DCHECK(error_handler); - backend_task_runner_ = base::SequencedTaskRunnerHandle::Get(); - AutoLock lock(monitor_lock_); - if (disconnected_) - return base::WeakPtr<SyncableService>(); - error_handler_ = std::move(error_handler); - base::WeakPtr<SyncableService> local_service = - sync_client->GetSyncableServiceForType(type_); - if (!local_service) { - DLOG(WARNING) << "SyncableService destroyed before DTC was stopped for " - << ModelTypeToString(type_); - disconnected_ = true; - return base::WeakPtr<SyncableService>(); - } - - generic_change_processor_ = processor_factory - ->CreateGenericChangeProcessor( - type_, user_share, error_handler_->Copy(), - local_service, merge_result) - .release(); - return local_service; -} - -bool SharedChangeProcessor::Disconnect() { - // May be called from any thread. - DVLOG(1) << "Disconnecting change processor."; - AutoLock lock(monitor_lock_); - bool was_connected = !disconnected_; - disconnected_ = true; - error_handler_.reset(); - return was_connected; -} - -ChangeProcessor* SharedChangeProcessor::generic_change_processor() { - return generic_change_processor_; -} - -int SharedChangeProcessor::GetSyncCount() { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - LOG(ERROR) << "Change processor disconnected."; - return 0; - } - return generic_change_processor_->GetSyncCount(); -} - -SyncError SharedChangeProcessor::ProcessSyncChanges( - const base::Location& from_here, - const SyncChangeList& list_of_changes) { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - // The DTC that disconnects us must ensure it posts a StopSyncing task. - // If we reach this, it means it just hasn't executed yet. - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Change processor disconnected.", type_); - return error; - } - return generic_change_processor_->ProcessSyncChanges(from_here, - list_of_changes); -} - -SyncDataList SharedChangeProcessor::GetAllSyncData(ModelType type) const { - SyncDataList data; - GetAllSyncDataReturnError(type, &data); // Handles the disconnect case. - return data; -} - -SyncError SharedChangeProcessor::GetAllSyncDataReturnError( - ModelType type, - SyncDataList* data) const { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Change processor disconnected.", type_); - return error; - } - return generic_change_processor_->GetAllSyncDataReturnError(data); -} - -SyncError SharedChangeProcessor::UpdateDataTypeContext( - ModelType type, - SyncChangeProcessor::ContextRefreshStatus refresh_status, - const std::string& context) { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, - "Change processor disconnected.", type_); - return error; - } - return generic_change_processor_->UpdateDataTypeContext(type, refresh_status, - context); -} - -void SharedChangeProcessor::AddLocalChangeObserver( - LocalChangeObserver* observer) { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - - generic_change_processor_->AddLocalChangeObserver(observer); -} - -void SharedChangeProcessor::RemoveLocalChangeObserver( - LocalChangeObserver* observer) { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - - generic_change_processor_->RemoveLocalChangeObserver(observer); -} - -bool SharedChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - LOG(ERROR) << "Change processor disconnected."; - return false; - } - return generic_change_processor_->SyncModelHasUserCreatedNodes(has_nodes); -} - -bool SharedChangeProcessor::CryptoReadyIfNecessary() { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - LOG(ERROR) << "Change processor disconnected."; - return true; // Otherwise we get into infinite spin waiting. - } - return generic_change_processor_->CryptoReadyIfNecessary(); -} - -bool SharedChangeProcessor::GetDataTypeContext(std::string* context) const { - DCHECK(backend_task_runner_); - DCHECK(backend_task_runner_->RunsTasksInCurrentSequence()); - AutoLock lock(monitor_lock_); - if (disconnected_) { - LOG(ERROR) << "Change processor disconnected."; - return false; - } - return generic_change_processor_->GetDataTypeContext(context); -} - -SyncError SharedChangeProcessor::CreateAndUploadError( - const base::Location& location, - const std::string& message) { - AutoLock lock(monitor_lock_); - if (!disconnected_) { - return error_handler_->CreateAndUploadError(location, message, type_); - } else { - return SyncError(location, SyncError::DATATYPE_ERROR, message, type_); - } -} - -void SharedChangeProcessor::StopLocalService() { - if (local_service_) - local_service_->StopSyncing(type_); - local_service_.reset(); -} - -} // namespace syncer
diff --git a/components/sync/driver/shared_change_processor.h b/components/sync/driver/shared_change_processor.h deleted file mode 100644 index 2bb1866..0000000 --- a/components/sync/driver/shared_change_processor.h +++ /dev/null
@@ -1,159 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_H_ -#define COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_H_ - -#include <memory> -#include <string> - -#include "base/location.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/sequenced_task_runner.h" -#include "base/synchronization/lock.h" -#include "components/sync/driver/data_type_controller.h" -#include "components/sync/engine/model_safe_worker.h" -#include "components/sync/model/data_type_error_handler.h" -#include "components/sync/model/sync_change_processor.h" -#include "components/sync/model/sync_data.h" -#include "components/sync/model/sync_error.h" -#include "components/sync/model/sync_error_factory.h" -#include "components/sync/model/sync_merge_result.h" - -namespace syncer { - -class ChangeProcessor; -class GenericChangeProcessor; -class GenericChangeProcessorFactory; -class SyncClient; -class SyncableService; -struct UserShare; - -// A ref-counted wrapper around a GenericChangeProcessor for use with datatypes -// that don't live on the UI thread. -// -// We need to make it refcounted as the ownership transfer from the -// DataTypeController is dependent on threading, and hence racy. The -// SharedChangeProcessor should be created on the UI thread, but should only be -// connected and used on the same thread as the datatype it interacts with. -// -// The only thread-safe method is Disconnect, which will disconnect from the -// generic change processor, letting us shut down the syncer/datatype without -// waiting for non-UI threads. -// -// Note: since we control the work being done while holding the lock, we ensure -// no I/O or other intensive work is done while blocking the UI thread (all -// the work is in-memory sync interactions). -// -// We use virtual methods so that we can use mock's in testing. -class SharedChangeProcessor - : public base::RefCountedThreadSafe<SharedChangeProcessor> { - public: - using StartDoneCallback = - base::OnceCallback<void(DataTypeController::ConfigureResult start_result, - const SyncMergeResult& local_merge_result, - const SyncMergeResult& syncer_merge_result)>; - - // Create an uninitialized SharedChangeProcessor. - explicit SharedChangeProcessor(ModelType type); - - void StartAssociation(StartDoneCallback start_done, - SyncClient* const sync_client, - GenericChangeProcessorFactory* processor_factory, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler); - - // Connect to the Syncer and prepare to handle changes for |type|. Will - // create and store a new GenericChangeProcessor and return a weak pointer to - // the SyncableService associated with |type|. - // Note: If this SharedChangeProcessor has been disconnected, or the - // SyncableService was not alive, will return a null weak pointer. - virtual base::WeakPtr<SyncableService> Connect( - SyncClient* sync_client, - GenericChangeProcessorFactory* processor_factory, - UserShare* user_share, - std::unique_ptr<DataTypeErrorHandler> error_handler, - const base::WeakPtr<SyncMergeResult>& merge_result); - - // Disconnects from the generic change processor. This method is thread-safe. - // After this, all attempts to interact with the change processor by - // |local_service_| are dropped and return errors. The syncer will be safe to - // shut down from the point of view of this datatype. - // Note: Once disconnected, you cannot reconnect without creating a new - // SharedChangeProcessor. - // Returns: true if we were previously succesfully connected, false if we were - // already disconnected. - virtual bool Disconnect(); - - // GenericChangeProcessor stubs (with disconnect support). - // Should only be called on the same sequence the datatype resides. - virtual int GetSyncCount(); - virtual SyncError ProcessSyncChanges(const base::Location& from_here, - const SyncChangeList& change_list); - virtual SyncDataList GetAllSyncData(ModelType type) const; - virtual SyncError GetAllSyncDataReturnError(ModelType type, - SyncDataList* data) const; - virtual SyncError UpdateDataTypeContext( - ModelType type, - SyncChangeProcessor::ContextRefreshStatus refresh_status, - const std::string& context); - virtual void AddLocalChangeObserver(LocalChangeObserver* observer); - virtual void RemoveLocalChangeObserver(LocalChangeObserver* observer); - virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes); - virtual bool CryptoReadyIfNecessary(); - - // If a datatype context associated with the current type exists, fills - // |context| and returns true. Otheriwse, if there has not been a context - // set, returns false. - virtual bool GetDataTypeContext(std::string* context) const; - - virtual SyncError CreateAndUploadError(const base::Location& location, - const std::string& message); - - // Calls local_service_->StopSyncing() and releases our reference to it. - void StopLocalService(); - - ChangeProcessor* generic_change_processor(); - - protected: - friend class base::RefCountedThreadSafe<SharedChangeProcessor>; - virtual ~SharedChangeProcessor(); - - private: - // Monitor lock for this object. All methods that interact with the change - // processor must aquire this lock and check whether we're disconnected or - // not. Once disconnected, all attempted changes to or loads from the change - // processor return errors. This enables us to shut down the syncer without - // having to wait for possibly non-UI thread datatypes to complete work. - mutable base::Lock monitor_lock_; - bool disconnected_; - - // The sync datatype we process changes for. - const ModelType type_; - - // The frontend / UI MessageLoop this object is constructed on. May also be - // destructed and/or disconnected on this loop, see ~SharedChangeProcessor. - const scoped_refptr<const base::SequencedTaskRunner> frontend_task_runner_; - - // The execution sequence that all methods except the constructor, destructor, - // and Disconnect() should be called on. Set in Connect(). - scoped_refptr<base::SequencedTaskRunner> backend_task_runner_; - - // Used only on |backend_task_runner_|. - GenericChangeProcessor* generic_change_processor_; - - std::unique_ptr<DataTypeErrorHandler> error_handler_; - - // The local service for this type. Only set if the DTC for the type uses - // SharedChangeProcessor::StartAssociation(). - base::WeakPtr<SyncableService> local_service_; - - DISALLOW_COPY_AND_ASSIGN(SharedChangeProcessor); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_H_
diff --git a/components/sync/driver/shared_change_processor_ref.cc b/components/sync/driver/shared_change_processor_ref.cc deleted file mode 100644 index 67cf7bd..0000000 --- a/components/sync/driver/shared_change_processor_ref.cc +++ /dev/null
@@ -1,51 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/shared_change_processor_ref.h" - -namespace syncer { - -SharedChangeProcessorRef::SharedChangeProcessorRef( - const scoped_refptr<SharedChangeProcessor>& change_processor) - : change_processor_(change_processor) { - DCHECK(change_processor_); -} - -SharedChangeProcessorRef::~SharedChangeProcessorRef() {} - -SyncError SharedChangeProcessorRef::ProcessSyncChanges( - const base::Location& from_here, - const SyncChangeList& change_list) { - return change_processor_->ProcessSyncChanges(from_here, change_list); -} - -SyncDataList SharedChangeProcessorRef::GetAllSyncData(ModelType type) const { - return change_processor_->GetAllSyncData(type); -} - -SyncError SharedChangeProcessorRef::UpdateDataTypeContext( - ModelType type, - SyncChangeProcessor::ContextRefreshStatus refresh_status, - const std::string& context) { - return change_processor_->UpdateDataTypeContext(type, refresh_status, - context); -} - -void SharedChangeProcessorRef::AddLocalChangeObserver( - LocalChangeObserver* observer) { - change_processor_->AddLocalChangeObserver(observer); -} - -void SharedChangeProcessorRef::RemoveLocalChangeObserver( - LocalChangeObserver* observer) { - change_processor_->RemoveLocalChangeObserver(observer); -} - -SyncError SharedChangeProcessorRef::CreateAndUploadError( - const base::Location& from_here, - const std::string& message) { - return change_processor_->CreateAndUploadError(from_here, message); -} - -} // namespace syncer
diff --git a/components/sync/driver/shared_change_processor_ref.h b/components/sync/driver/shared_change_processor_ref.h deleted file mode 100644 index f75ec1c..0000000 --- a/components/sync/driver/shared_change_processor_ref.h +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_REF_H_ -#define COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_REF_H_ - -#include <string> - -#include "base/compiler_specific.h" -#include "base/memory/ref_counted.h" -#include "components/sync/driver/shared_change_processor.h" -#include "components/sync/model/sync_change_processor.h" -#include "components/sync/model/sync_error_factory.h" - -namespace syncer { - -// A SyncChangeProcessor stub for interacting with a refcounted -// SharedChangeProcessor. -class SharedChangeProcessorRef : public SyncChangeProcessor, - public SyncErrorFactory { - public: - SharedChangeProcessorRef( - const scoped_refptr<SharedChangeProcessor>& change_processor); - ~SharedChangeProcessorRef() override; - - // SyncChangeProcessor implementation. - SyncError ProcessSyncChanges(const base::Location& from_here, - const SyncChangeList& change_list) override; - SyncDataList GetAllSyncData(ModelType type) const override; - SyncError UpdateDataTypeContext( - ModelType type, - SyncChangeProcessor::ContextRefreshStatus refresh_status, - const std::string& context) override; - void AddLocalChangeObserver(LocalChangeObserver* observer) override; - void RemoveLocalChangeObserver(LocalChangeObserver* observer) override; - - // SyncErrorFactory implementation. - SyncError CreateAndUploadError(const base::Location& from_here, - const std::string& message) override; - - // Default copy and assign welcome (and safe due to refcounted-ness). - - private: - scoped_refptr<SharedChangeProcessor> change_processor_; -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_REF_H_
diff --git a/components/sync/driver/shared_change_processor_unittest.cc b/components/sync/driver/shared_change_processor_unittest.cc deleted file mode 100644 index c50acf4e..0000000 --- a/components/sync/driver/shared_change_processor_unittest.cc +++ /dev/null
@@ -1,145 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/driver/shared_change_processor.h" - -#include <cstddef> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/compiler_specific.h" -#include "base/synchronization/waitable_event.h" -#include "base/test/task_environment.h" -#include "base/threading/thread.h" -#include "components/sync/base/model_type.h" -#include "components/sync/driver/data_type_manager.h" -#include "components/sync/driver/generic_change_processor.h" -#include "components/sync/driver/generic_change_processor_factory.h" -#include "components/sync/driver/sync_client_mock.h" -#include "components/sync/engine/sync_engine.h" -#include "components/sync/model/data_type_error_handler_mock.h" -#include "components/sync/model/fake_syncable_service.h" -#include "components/sync/syncable/test_user_share.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace syncer { - -namespace { - -using ::testing::_; -using ::testing::NiceMock; -using ::testing::StrictMock; - -class SyncSharedChangeProcessorTest : public testing::Test { - public: - SyncSharedChangeProcessorTest() - : model_thread_("dbthread"), did_connect_(false) {} - - ~SyncSharedChangeProcessorTest() override { - EXPECT_FALSE(db_syncable_service_); - } - - protected: - base::WeakPtr<SyncableService> GetSyncableServiceForType(ModelType type) { - DCHECK(model_thread_.task_runner()->BelongsToCurrentThread()); - return db_syncable_service_->AsWeakPtr(); - } - - void SetUp() override { - test_user_share_.SetUp(); - shared_change_processor_ = new SharedChangeProcessor(AUTOFILL); - ON_CALL(sync_client_, GetSyncableServiceForType(AUTOFILL)) - .WillByDefault(testing::Invoke( - this, &SyncSharedChangeProcessorTest::GetSyncableServiceForType)); - ASSERT_TRUE(model_thread_.Start()); - ASSERT_TRUE(model_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&SyncSharedChangeProcessorTest::SetUpDBSyncableService, - base::Unretained(this)))); - } - - void TearDown() override { - EXPECT_TRUE(model_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce( - &SyncSharedChangeProcessorTest::TearDownDBSyncableService, - base::Unretained(this)))); - // This must happen before the DB thread is stopped since - // |shared_change_processor_| may post tasks to delete its members - // on the correct thread. - // - // TODO(akalin): Write deterministic tests for the destruction of - // |shared_change_processor_| on the UI and DB threads. - shared_change_processor_ = nullptr; - model_thread_.Stop(); - - // Note: Stop() joins the threads, and that barrier prevents this read - // from being moved (e.g by compiler optimization) in such a way that it - // would race with the write in ConnectOnDBThread (because by this time, - // everything that could have run on |model_thread_| has done so). - ASSERT_TRUE(did_connect_); - test_user_share_.TearDown(); - } - - // Connect |shared_change_processor_| on the DB thread. - void Connect() { - EXPECT_TRUE(model_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&SyncSharedChangeProcessorTest::ConnectOnDBThread, - base::Unretained(this), shared_change_processor_))); - } - - private: - // Used by SetUp(). - void SetUpDBSyncableService() { - DCHECK(model_thread_.task_runner()->BelongsToCurrentThread()); - DCHECK(!db_syncable_service_); - db_syncable_service_ = std::make_unique<FakeSyncableService>(); - } - - // Used by TearDown(). - void TearDownDBSyncableService() { - DCHECK(model_thread_.task_runner()->BelongsToCurrentThread()); - DCHECK(db_syncable_service_); - db_syncable_service_.reset(); - } - - // Used by Connect(). The SharedChangeProcessor is passed in - // because we modify |shared_change_processor_| on the main thread - // (in TearDown()). - void ConnectOnDBThread( - const scoped_refptr<SharedChangeProcessor>& shared_change_processor) { - DCHECK(model_thread_.task_runner()->BelongsToCurrentThread()); - EXPECT_TRUE(shared_change_processor->Connect( - &sync_client_, &processor_factory_, test_user_share_.user_share(), - std::make_unique<DataTypeErrorHandlerMock>(), - base::WeakPtr<SyncMergeResult>())); - did_connect_ = true; - } - - base::test::SingleThreadTaskEnvironment task_environment_; - base::Thread model_thread_; - TestUserShare test_user_share_; - - scoped_refptr<SharedChangeProcessor> shared_change_processor_; - - GenericChangeProcessorFactory processor_factory_; - bool did_connect_; - - // Used only on DB thread. - std::unique_ptr<FakeSyncableService> db_syncable_service_; - - testing::NiceMock<SyncClientMock> sync_client_; -}; - -// Simply connect the shared change processor. It should succeed, and -// nothing further should happen. -TEST_F(SyncSharedChangeProcessorTest, Basic) { - Connect(); -} - -} // namespace - -} // namespace syncer
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc index b474588f..a807610 100644 --- a/components/sync/driver/sync_driver_switches.cc +++ b/components/sync/driver/sync_driver_switches.cc
@@ -53,10 +53,6 @@ const base::Feature kStopSyncInPausedState{"StopSyncInPausedState", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enable USS implementation of Passwords datatype. -const base::Feature kSyncUSSPasswords{"SyncUSSPasswords", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Enable USS implementation of Nigori datatype. const base::Feature kSyncUSSNigori{"SyncUSSNigori", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h index bfb14065..909b2e88 100644 --- a/components/sync/driver/sync_driver_switches.h +++ b/components/sync/driver/sync_driver_switches.h
@@ -29,7 +29,6 @@ extern const base::Feature kStopSyncInPausedState; extern const base::Feature kSyncAllowWalletDataInTransportModeWithCustomPassphrase; -extern const base::Feature kSyncUSSPasswords; extern const base::Feature kSyncUSSNigori; extern const base::Feature kSyncWifiConfigurations; extern const base::Feature kUpdateBookmarkGUIDWithNodeReplacement;
diff --git a/components/sync/engine/model_safe_worker.cc b/components/sync/engine/model_safe_worker.cc index 24d70865..841ee4a 100644 --- a/components/sync/engine/model_safe_worker.cc +++ b/components/sync/engine/model_safe_worker.cc
@@ -51,12 +51,8 @@ std::string ModelSafeGroupToString(ModelSafeGroup group) { switch (group) { - case GROUP_UI: - return "Group UI"; case GROUP_PASSIVE: return "Group Passive"; - case GROUP_PASSWORD: - return "Group Password"; case GROUP_NON_BLOCKING: return "Group Non Blocking"; }
diff --git a/components/sync/engine/model_safe_worker.h b/components/sync/engine/model_safe_worker.h index 1658950..3f514bf 100644 --- a/components/sync/engine/model_safe_worker.h +++ b/components/sync/engine/model_safe_worker.h
@@ -30,10 +30,6 @@ GROUP_PASSIVE = 0, // Models that are just "passively" being synced; e.g. // changes to these models don't need to be pushed to a // native model. - GROUP_UI, // Models that live on UI thread and are being synced. - GROUP_PASSWORD, // Models that live on the password thread and are - // being synced. On windows and linux, this runs on the - // DB thread. GROUP_NON_BLOCKING, // Models that correspond to non-blocking types. These // models always stay in GROUP_NON_BLOCKING; changes are // forwarded to these models without ModelSafeWorker/
diff --git a/components/sync/engine/model_safe_worker_unittest.cc b/components/sync/engine/model_safe_worker_unittest.cc index 7efe517..e498aa5e 100644 --- a/components/sync/engine/model_safe_worker_unittest.cc +++ b/components/sync/engine/model_safe_worker_unittest.cc
@@ -87,14 +87,10 @@ TEST_F(ModelSafeWorkerTest, ModelSafeRoutingInfoToValue) { ModelSafeRoutingInfo routing_info; routing_info[BOOKMARKS] = GROUP_PASSIVE; - routing_info[NIGORI] = GROUP_UI; - routing_info[PASSWORDS] = GROUP_PASSWORD; routing_info[APPS] = GROUP_NON_BLOCKING; base::DictionaryValue expected_value; expected_value.SetString("Apps", "Group Non Blocking"); expected_value.SetString("Bookmarks", "Group Passive"); - expected_value.SetString("Encryption Keys", "Group UI"); - expected_value.SetString("Passwords", "Group Password"); std::unique_ptr<base::DictionaryValue> value( ModelSafeRoutingInfoToValue(routing_info)); EXPECT_TRUE(value->Equals(&expected_value)); @@ -104,20 +100,15 @@ ModelSafeRoutingInfo routing_info; routing_info[APPS] = GROUP_NON_BLOCKING; routing_info[BOOKMARKS] = GROUP_PASSIVE; - routing_info[NIGORI] = GROUP_UI; - routing_info[PASSWORDS] = GROUP_PASSWORD; - EXPECT_EQ( - "{\"Apps\":\"Group Non Blocking\",\"Bookmarks\":\"Group Passive\"," - "\"Encryption Keys\":\"Group UI\",\"Passwords\":\"Group Password\"}", - ModelSafeRoutingInfoToString(routing_info)); + EXPECT_EQ("{\"Apps\":\"Group Non Blocking\",\"Bookmarks\":\"Group Passive\"}", + ModelSafeRoutingInfoToString(routing_info)); } TEST_F(ModelSafeWorkerTest, GetRoutingInfoTypes) { ModelSafeRoutingInfo routing_info; routing_info[BOOKMARKS] = GROUP_PASSIVE; - routing_info[NIGORI] = GROUP_UI; - routing_info[PASSWORDS] = GROUP_PASSWORD; - const ModelTypeSet expected_types(BOOKMARKS, NIGORI, PASSWORDS); + routing_info[PASSWORDS] = GROUP_NON_BLOCKING; + const ModelTypeSet expected_types(BOOKMARKS, PASSWORDS); EXPECT_EQ(expected_types, GetRoutingInfoTypes(routing_info)); }
diff --git a/components/sync/engine/sequenced_model_worker.cc b/components/sync/engine/sequenced_model_worker.cc deleted file mode 100644 index ed84c5cd..0000000 --- a/components/sync/engine/sequenced_model_worker.cc +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/engine/sequenced_model_worker.h" - -#include <utility> - -namespace syncer { - -SequencedModelWorker::SequencedModelWorker( - const scoped_refptr<base::SequencedTaskRunner>& runner, - ModelSafeGroup group) - : runner_(runner), group_(group) {} - -void SequencedModelWorker::ScheduleWork(base::OnceClosure work) { - if (runner_->RunsTasksInCurrentSequence()) { - DLOG(WARNING) << "Already on sequenced task runner " << runner_; - std::move(work).Run(); - } else { - runner_->PostTask(FROM_HERE, std::move(work)); - } -} - -ModelSafeGroup SequencedModelWorker::GetModelSafeGroup() { - return group_; -} - -bool SequencedModelWorker::IsOnModelSequence() { - return runner_->RunsTasksInCurrentSequence(); -} - -SequencedModelWorker::~SequencedModelWorker() {} - -} // namespace syncer
diff --git a/components/sync/engine/sequenced_model_worker.h b/components/sync/engine/sequenced_model_worker.h deleted file mode 100644 index 7da1b787..0000000 --- a/components/sync/engine/sequenced_model_worker.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_ENGINE_SEQUENCED_MODEL_WORKER_H_ -#define COMPONENTS_SYNC_ENGINE_SEQUENCED_MODEL_WORKER_H_ - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/sequenced_task_runner.h" -#include "components/sync/engine/model_safe_worker.h" - -namespace syncer { - -// A ModelSafeWorker for models that accept requests from the -// syncapi that need to be fulfilled on a model specific sequenced task runner. -// TODO(sync): Try to generalize other ModelWorkers (e.g. history, etc). -class SequencedModelWorker : public ModelSafeWorker { - public: - SequencedModelWorker(const scoped_refptr<base::SequencedTaskRunner>& runner, - ModelSafeGroup group); - - // ModelSafeWorker implementation. - ModelSafeGroup GetModelSafeGroup() override; - bool IsOnModelSequence() override; - - private: - ~SequencedModelWorker() override; - - void ScheduleWork(base::OnceClosure work) override; - - scoped_refptr<base::SequencedTaskRunner> runner_; - ModelSafeGroup group_; - - DISALLOW_COPY_AND_ASSIGN(SequencedModelWorker); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_ENGINE_SEQUENCED_MODEL_WORKER_H_
diff --git a/components/sync/engine/sequenced_model_worker_unittest.cc b/components/sync/engine/sequenced_model_worker_unittest.cc deleted file mode 100644 index 8bb8fafc..0000000 --- a/components/sync/engine/sequenced_model_worker_unittest.cc +++ /dev/null
@@ -1,92 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/engine/sequenced_model_worker.h" - -#include "base/bind.h" -#include "base/callback.h" -#include "base/location.h" -#include "base/memory/weak_ptr.h" -#include "base/run_loop.h" -#include "base/task/post_task.h" -#include "base/task/thread_pool.h" -#include "base/test/task_environment.h" -#include "base/test/test_timeouts.h" -#include "base/threading/sequenced_task_runner_handle.h" -#include "base/timer/timer.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace syncer { - -namespace { - -class SequencedModelWorkerTest : public testing::Test { - public: - SequencedModelWorkerTest() : did_do_work_(false) {} - - bool did_do_work() { return did_do_work_; } - SequencedModelWorker* worker() { return worker_.get(); } - base::OneShotTimer* timer() { return &timer_; } - base::WeakPtrFactory<SequencedModelWorkerTest>* factory() { - return &weak_factory_; - } - - // Schedule DoWork to be executed on the DB sequence and have the test fail if - // DoWork hasn't executed within action_timeout(). - void ScheduleWork() { - // We wait until the callback is done. So it is safe to use unretained. - timer()->Start(FROM_HERE, TestTimeouts::action_timeout(), this, - &SequencedModelWorkerTest::Timeout); - worker()->DoWorkAndWaitUntilDone(base::BindOnce( - &SequencedModelWorkerTest::DoWork, base::Unretained(this))); - } - - // This is the work that will be scheduled to be done on the DB sequence. - SyncerError DoWork() { - EXPECT_TRUE(task_runner_->RunsTasksInCurrentSequence()); - run_loop_.Quit(); - did_do_work_ = true; - return SyncerError(SyncerError::SYNCER_OK); - } - - // This will be called by the OneShotTimer and make the test fail unless - // DoWork is called first. - void Timeout() { - ADD_FAILURE() - << "Timed out waiting for work to be done on the DB sequence."; - run_loop_.Quit(); - } - - protected: - void SetUp() override { - task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT}); - worker_ = new SequencedModelWorker(task_runner_, GROUP_PASSWORD); - } - - private: - base::test::TaskEnvironment task_environment_; - bool did_do_work_; - scoped_refptr<base::SequencedTaskRunner> task_runner_; - scoped_refptr<SequencedModelWorker> worker_; - base::OneShotTimer timer_; - - protected: - base::RunLoop run_loop_; - - private: - base::WeakPtrFactory<SequencedModelWorkerTest> weak_factory_{this}; -}; - -TEST_F(SequencedModelWorkerTest, DoesWorkOnDatabaseSequence) { - base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&SequencedModelWorkerTest::ScheduleWork, - factory()->GetWeakPtr())); - run_loop_.Run(); - EXPECT_TRUE(did_do_work()); -} - -} // namespace - -} // namespace syncer
diff --git a/components/sync/engine/sync_backend_registrar.cc b/components/sync/engine/sync_backend_registrar.cc index b814d883..9587c44 100644 --- a/components/sync/engine/sync_backend_registrar.cc +++ b/components/sync/engine/sync_backend_registrar.cc
@@ -19,9 +19,7 @@ ModelSafeWorkerFactory worker_factory) : name_(name) { DCHECK(!worker_factory.is_null()); - MaybeAddWorker(worker_factory, GROUP_UI); MaybeAddWorker(worker_factory, GROUP_PASSIVE); - MaybeAddWorker(worker_factory, GROUP_PASSWORD); } void SyncBackendRegistrar::RegisterNonBlockingType(ModelType type) { @@ -58,12 +56,6 @@ } } - if (!workers_.count(GROUP_PASSWORD)) { - LOG_IF(WARNING, initial_types.Has(PASSWORDS)) - << "Password store not initialized, cannot sync passwords"; - routing_info_.erase(PASSWORDS); - } - // Although this can re-set NonBlocking types, this should be idempotent. last_configured_types_ = GetRoutingInfoTypes(routing_info_); } @@ -89,15 +81,10 @@ ModelTypeSet types_to_add, ModelTypeSet types_to_remove) { DCHECK(Intersection(types_to_add, types_to_remove).Empty()); - ModelTypeSet filtered_types_to_add = types_to_add; - if (workers_.count(GROUP_PASSWORD) == 0) { - LOG(WARNING) << "No password worker -- removing PASSWORDS"; - filtered_types_to_add.Remove(PASSWORDS); - } base::AutoLock lock(lock_); ModelTypeSet newly_added_types; - for (ModelType type : filtered_types_to_add) { + for (ModelType type : types_to_add) { // Add a newly specified data type corresponding initial group into the // routing_info, if it does not already exist. if (routing_info_.count(type) == 0) {
diff --git a/components/sync/engine/sync_backend_registrar_unittest.cc b/components/sync/engine/sync_backend_registrar_unittest.cc index 437cc98..7ba17940 100644 --- a/components/sync/engine/sync_backend_registrar_unittest.cc +++ b/components/sync/engine/sync_backend_registrar_unittest.cc
@@ -11,7 +11,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "components/sync/engine/passive_model_worker.h" -#include "components/sync/engine/sequenced_model_worker.h" #include "components/sync/model/change_processor_mock.h" #include "components/sync/syncable/test_user_share.h" #include "testing/gmock/include/gmock/gmock.h" @@ -84,9 +83,6 @@ scoped_refptr<ModelSafeWorker> CreateModelWorkerForGroup( ModelSafeGroup group) { switch (group) { - case GROUP_UI: - return new SequencedModelWorker( - task_environment_.GetMainThreadTaskRunner(), group); case GROUP_PASSIVE: return new PassiveModelWorker(); default: @@ -105,16 +101,16 @@ TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) { registrar()->SetInitialTypes(ModelTypeSet()); EXPECT_FALSE(registrar()->IsNigoriEnabled()); - EXPECT_EQ(2u, GetWorkersSize()); + EXPECT_EQ(1u, GetWorkersSize()); ExpectRoutingInfo(ModelSafeRoutingInfo()); ExpectHasProcessorsForTypes(ModelTypeSet()); } TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) { registrar()->RegisterNonBlockingType(BOOKMARKS); - registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); + registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI)); EXPECT_TRUE(registrar()->IsNigoriEnabled()); - EXPECT_EQ(2u, GetWorkersSize()); + EXPECT_EQ(1u, GetWorkersSize()); EXPECT_EQ(ModelTypeSet(NIGORI), registrar()->GetLastConfiguredTypes()); // Bookmarks dropped because it is nonblocking. // Passwords dropped because of no password store. @@ -124,10 +120,10 @@ TEST_F(SyncBackendRegistrarTest, ConstructorNonEmptyReversedInitialization) { // The blocking types get to set initial types before NonBlocking types here. - registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS)); + registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI)); registrar()->RegisterNonBlockingType(BOOKMARKS); EXPECT_TRUE(registrar()->IsNigoriEnabled()); - EXPECT_EQ(2u, GetWorkersSize()); + EXPECT_EQ(1u, GetWorkersSize()); EXPECT_EQ(ModelTypeSet(NIGORI), registrar()->GetLastConfiguredTypes()); // Bookmarks dropped because it is nonblocking. // Passwords dropped because of no password store. @@ -163,38 +159,6 @@ EXPECT_EQ(ModelTypeSet(), registrar()->GetLastConfiguredTypes()); } -TEST_F(SyncBackendRegistrarTest, ActivateDeactivateUIDataType) { - InSequence in_sequence; - registrar()->SetInitialTypes(ModelTypeSet()); - - // Should do nothing. - TriggerChanges(BOOKMARKS); - - StrictMock<ChangeProcessorMock> change_processor_mock; - EXPECT_CALL(change_processor_mock, StartImpl()); - EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); - EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _)); - EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true)); - EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel()); - EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false)); - - const ModelTypeSet types(BOOKMARKS); - EXPECT_EQ(types, registrar()->ConfigureDataTypes(types, ModelTypeSet())); - registrar()->ActivateDataType(BOOKMARKS, GROUP_UI, &change_processor_mock, - user_share()); - ExpectRoutingInfo({{BOOKMARKS, GROUP_UI}}); - ExpectHasProcessorsForTypes(types); - - TriggerChanges(BOOKMARKS); - - registrar()->DeactivateDataType(BOOKMARKS); - ExpectRoutingInfo(ModelSafeRoutingInfo()); - ExpectHasProcessorsForTypes(ModelTypeSet()); - - // Should do nothing. - TriggerChanges(BOOKMARKS); -} - // Tests that registration and configuration of non-blocking data types is // handled correctly in SyncBackendRegistrar. TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) {
diff --git a/components/sync/engine/ui_model_worker.cc b/components/sync/engine/ui_model_worker.cc deleted file mode 100644 index 2df7465f..0000000 --- a/components/sync/engine/ui_model_worker.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/engine/ui_model_worker.h" - -#include <utility> - -namespace syncer { - -UIModelWorker::UIModelWorker( - scoped_refptr<base::SingleThreadTaskRunner> ui_thread) - : ui_thread_(std::move(ui_thread)) {} - -ModelSafeGroup UIModelWorker::GetModelSafeGroup() { - return GROUP_UI; -} - -bool UIModelWorker::IsOnModelSequence() { - return ui_thread_->BelongsToCurrentThread(); -} - -UIModelWorker::~UIModelWorker() {} - -void UIModelWorker::ScheduleWork(base::OnceClosure work) { - ui_thread_->PostTask(FROM_HERE, std::move(work)); -} - -} // namespace syncer
diff --git a/components/sync/engine/ui_model_worker.h b/components/sync/engine/ui_model_worker.h deleted file mode 100644 index 325bae0..0000000 --- a/components/sync/engine/ui_model_worker.h +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_ENGINE_UI_MODEL_WORKER_H_ -#define COMPONENTS_SYNC_ENGINE_UI_MODEL_WORKER_H_ - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/single_thread_task_runner.h" -#include "components/sync/engine/model_safe_worker.h" - -namespace syncer { - -// A ModelSafeWorker for UI models (e.g. bookmarks) that -// accepts work requests from the syncapi that need to be fulfilled -// from the MessageLoop home to the native model. -class UIModelWorker : public ModelSafeWorker { - public: - explicit UIModelWorker(scoped_refptr<base::SingleThreadTaskRunner> ui_thread); - - // ModelSafeWorker implementation. - ModelSafeGroup GetModelSafeGroup() override; - bool IsOnModelSequence() override; - - private: - ~UIModelWorker() override; - - void ScheduleWork(base::OnceClosure work) override; - - // A reference to the UI thread's task runner. - const scoped_refptr<base::SingleThreadTaskRunner> ui_thread_; - - DISALLOW_COPY_AND_ASSIGN(UIModelWorker); -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_ENGINE_UI_MODEL_WORKER_H_
diff --git a/components/sync/engine/ui_model_worker_unittest.cc b/components/sync/engine/ui_model_worker_unittest.cc deleted file mode 100644 index aac3b0e..0000000 --- a/components/sync/engine/ui_model_worker_unittest.cc +++ /dev/null
@@ -1,122 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/engine/ui_model_worker.h" - -#include <memory> -#include <utility> - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/location.h" -#include "base/run_loop.h" -#include "base/test/task_environment.h" -#include "base/test/test_timeouts.h" -#include "base/threading/platform_thread.h" -#include "base/threading/thread.h" -#include "base/threading/thread_task_runner_handle.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace syncer { -namespace { - -// Makes a Closure into a WorkCallback. -// Does |work| and checks that we're on the |thread_verifier| thread. -SyncerError DoWork( - const scoped_refptr<base::SingleThreadTaskRunner>& thread_verifier, - base::OnceClosure work) { - DCHECK(thread_verifier->BelongsToCurrentThread()); - std::move(work).Run(); - return SyncerError(SyncerError::SYNCER_OK); -} - -// Converts |work| to a WorkCallback that will verify that it's run on the -// thread it was constructed on. -WorkCallback ClosureToWorkCallback(base::OnceClosure work) { - return base::BindOnce(&DoWork, base::ThreadTaskRunnerHandle::Get(), - std::move(work)); -} - -// Increments |counter|. -void IncrementCounter(int* counter) { - ++*counter; -} - -class SyncUIModelWorkerTest : public testing::Test { - public: - SyncUIModelWorkerTest() : sync_thread_("SyncThreadForTest") { - sync_thread_.Start(); - worker_ = new UIModelWorker(base::ThreadTaskRunnerHandle::Get()); - } - - void PostWorkToSyncThread(base::OnceClosure work) { - sync_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce( - base::IgnoreResult(&UIModelWorker::DoWorkAndWaitUntilDone), worker_, - ClosureToWorkCallback(std::move(work)))); - } - - protected: - std::unique_ptr<base::test::SingleThreadTaskEnvironment> task_environment_ = - std::make_unique<base::test::SingleThreadTaskEnvironment>(); - base::Thread sync_thread_; - scoped_refptr<UIModelWorker> worker_; -}; - -} // namespace - -TEST_F(SyncUIModelWorkerTest, ScheduledWorkRunsOnUILoop) { - base::RunLoop run_loop; - PostWorkToSyncThread(run_loop.QuitClosure()); - // This won't quit until the QuitClosure is run. - run_loop.Run(); -} - -TEST_F(SyncUIModelWorkerTest, MultipleDoWork) { - constexpr int kNumWorkCallbacks = 10; - int counter = 0; - for (int i = 0; i < kNumWorkCallbacks; ++i) { - PostWorkToSyncThread( - base::BindOnce(&IncrementCounter, base::Unretained(&counter))); - } - - base::RunLoop run_loop; - PostWorkToSyncThread(run_loop.QuitClosure()); - run_loop.Run(); - - EXPECT_EQ(kNumWorkCallbacks, counter); -} - -TEST_F(SyncUIModelWorkerTest, JoinSyncThreadAfterUIMessageLoopDestruction) { - PostWorkToSyncThread(base::DoNothing()); - - // Wait to allow the sync thread to post the WorkCallback to the UI - // MessageLoop. This is racy. If the WorkCallback isn't posted fast enough, - // this test doesn't verify that UIModelWorker behaves properly when the UI - // MessageLoop is destroyed. However, it doesn't fail (no flakes). - base::PlatformThread::Sleep(TestTimeouts::tiny_timeout()); - - // The sync thread shouldn't wait for the WorkCallback to run on the UI thread - // after the UI MessageLoop is gone. - task_environment_.reset(); - sync_thread_.Stop(); -} - -TEST_F(SyncUIModelWorkerTest, JoinSyncThreadAfterRequestStop) { - PostWorkToSyncThread(base::DoNothing()); - - // Wait to allow the sync thread to post the WorkCallback to the UI - // MessageLoop. This is racy. If the WorkCallback isn't posted fast enough, - // this test doesn't verify that UIModelWorker behaves properly when - // RequestStop() is called. However, it doesn't fail (no flakes). - base::PlatformThread::Sleep(TestTimeouts::tiny_timeout()); - - // The sync thread shouldn't wait for the WorkCallback to run on the UI thread - // after RequestStop() is called. - worker_->RequestStop(); - sync_thread_.Stop(); -} - -} // namespace syncer
diff --git a/components/sync/engine_impl/directory_update_handler_unittest.cc b/components/sync/engine_impl/directory_update_handler_unittest.cc index 70b17ad..e8ed43e 100644 --- a/components/sync/engine_impl/directory_update_handler_unittest.cc +++ b/components/sync/engine_impl/directory_update_handler_unittest.cc
@@ -46,7 +46,7 @@ class DirectoryUpdateHandlerProcessUpdateTest : public ::testing::Test { public: DirectoryUpdateHandlerProcessUpdateTest() - : ui_worker_(new FakeModelWorker(GROUP_UI)) {} + : ui_worker_(new FakeModelWorker(GROUP_NON_BLOCKING)) {} ~DirectoryUpdateHandlerProcessUpdateTest() override {} @@ -473,24 +473,18 @@ class DirectoryUpdateHandlerApplyUpdateTest : public ::testing::Test { public: DirectoryUpdateHandlerApplyUpdateTest() - : ui_worker_(new FakeModelWorker(GROUP_UI)), - password_worker_(new FakeModelWorker(GROUP_PASSWORD)), + : non_blocking_worker_(new FakeModelWorker(GROUP_NON_BLOCKING)), passive_worker_(new FakeModelWorker(GROUP_PASSIVE)), - bookmarks_emitter_(BOOKMARKS, &type_observers_), - passwords_emitter_(PASSWORDS, &type_observers_) {} + bookmarks_emitter_(BOOKMARKS, &type_observers_) {} void SetUp() override { dir_maker_.SetUp(); entry_factory_ = std::make_unique<TestEntryFactory>(directory()); update_handler_map_.insert(std::make_pair( - BOOKMARKS, - std::make_unique<DirectoryUpdateHandler>( - directory(), BOOKMARKS, ui_worker_, &bookmarks_emitter_))); - update_handler_map_.insert(std::make_pair( - PASSWORDS, - std::make_unique<DirectoryUpdateHandler>( - directory(), PASSWORDS, password_worker_, &passwords_emitter_))); + BOOKMARKS, std::make_unique<DirectoryUpdateHandler>( + directory(), BOOKMARKS, non_blocking_worker_, + &bookmarks_emitter_))); } void TearDown() override { dir_maker_.TearDown(); } @@ -499,10 +493,6 @@ return bookmarks_emitter_.GetUpdateCounters(); } - const UpdateCounters& GetPasswordsUpdateCounters() { - return passwords_emitter_.GetUpdateCounters(); - } - DirectoryCryptographer* GetCryptographer( const syncable::BaseTransaction* trans) { return dir_maker_.GetCryptographer(trans); @@ -513,10 +503,6 @@ update_handler_map_.find(BOOKMARKS)->second->ApplyUpdates(status); } - void ApplyPasswordUpdates(StatusController* status) { - update_handler_map_.find(PASSWORDS)->second->ApplyUpdates(status); - } - TestEntryFactory* entry_factory() { return entry_factory_.get(); } syncable::Directory* directory() { return dir_maker_.directory(); } @@ -527,13 +513,11 @@ TestDirectorySetterUpper dir_maker_; std::unique_ptr<TestEntryFactory> entry_factory_; - scoped_refptr<FakeModelWorker> ui_worker_; - scoped_refptr<FakeModelWorker> password_worker_; + scoped_refptr<FakeModelWorker> non_blocking_worker_; scoped_refptr<FakeModelWorker> passive_worker_; base::ObserverList<TypeDebugInfoObserver>::Unchecked type_observers_; DirectoryTypeDebugInfoEmitter bookmarks_emitter_; - DirectoryTypeDebugInfoEmitter passwords_emitter_; std::map<ModelType, std::unique_ptr<UpdateHandler>> update_handler_map_; }; @@ -919,151 +903,4 @@ } } -// Attempt application of password upates where the passphrase is known. -TEST_F(DirectoryUpdateHandlerApplyUpdateTest, DecryptablePassword) { - // Decryptable password updates should be applied. - DirectoryCryptographer* cryptographer; - { - // Storing the cryptographer separately is bad, but for this test we - // know it's safe. - syncable::ReadTransaction trans(FROM_HERE, directory()); - cryptographer = GetCryptographer(&trans); - } - - KeyParams params = {KeyDerivationParams::CreateForPbkdf2(), "foobar"}; - cryptographer->AddKey(params); - - sync_pb::EntitySpecifics specifics; - sync_pb::PasswordSpecificsData data; - data.set_origin("http://example.com"); - - cryptographer->Encrypt(data, - specifics.mutable_password()->mutable_encrypted()); - int64_t handle = - entry_factory()->CreateUnappliedNewItem("item", specifics, false); - - StatusController status; - ApplyPasswordUpdates(&status); - - const UpdateCounters& counters = GetPasswordsUpdateCounters(); - EXPECT_EQ(1, counters.num_updates_applied) - << "The updates that can be decrypted should be applied"; - - { - syncable::ReadTransaction trans(FROM_HERE, directory()); - syncable::Entry e(&trans, syncable::GET_BY_HANDLE, handle); - ASSERT_TRUE(e.good()); - EXPECT_FALSE(e.GetIsUnappliedUpdate()); - EXPECT_FALSE(e.GetIsUnsynced()); - } -} - -// Attempt application of encrypted items when the passphrase is not known. -TEST_F(DirectoryUpdateHandlerApplyUpdateTest, UndecryptableData) { - // Undecryptable updates should not be applied. - sync_pb::EntitySpecifics encrypted_bookmark; - encrypted_bookmark.mutable_encrypted(); - AddDefaultFieldValue(BOOKMARKS, &encrypted_bookmark); - std::string root_server_id = Id::GetRoot().GetServerId(); - int64_t folder_handle = entry_factory()->CreateUnappliedNewItemWithParent( - "folder", encrypted_bookmark, root_server_id); - int64_t bookmark_handle = entry_factory()->CreateUnappliedNewItem( - "item2", encrypted_bookmark, false); - sync_pb::EntitySpecifics encrypted_password; - encrypted_password.mutable_password(); - int64_t password_handle = entry_factory()->CreateUnappliedNewItem( - "item3", encrypted_password, false); - - StatusController status; - ApplyBookmarkUpdates(&status); - ApplyPasswordUpdates(&status); - - const UpdateCounters& bm_counters = GetBookmarksUpdateCounters(); - EXPECT_EQ(2, bm_counters.num_encryption_conflict_application_failures) - << "Updates that can't be decrypted should be in encryption conflict"; - EXPECT_EQ(0, bm_counters.num_updates_applied) - << "No update that can't be decrypted should be applied"; - - const UpdateCounters& pw_counters = GetPasswordsUpdateCounters(); - EXPECT_EQ(1, pw_counters.num_encryption_conflict_application_failures) - << "Updates that can't be decrypted should be in encryption conflict"; - EXPECT_EQ(0, pw_counters.num_updates_applied) - << "No update that can't be decrypted should be applied"; - - { - syncable::ReadTransaction trans(FROM_HERE, directory()); - syncable::Entry folder(&trans, syncable::GET_BY_HANDLE, folder_handle); - syncable::Entry bm(&trans, syncable::GET_BY_HANDLE, bookmark_handle); - syncable::Entry pw(&trans, syncable::GET_BY_HANDLE, password_handle); - ASSERT_TRUE(folder.good()); - ASSERT_TRUE(bm.good()); - ASSERT_TRUE(pw.good()); - EXPECT_TRUE(folder.GetIsUnappliedUpdate()); - EXPECT_TRUE(bm.GetIsUnappliedUpdate()); - EXPECT_TRUE(pw.GetIsUnappliedUpdate()); - } -} - -// Test a mix of decryptable and undecryptable updates. -TEST_F(DirectoryUpdateHandlerApplyUpdateTest, SomeUndecryptablePassword) { - DirectoryCryptographer* cryptographer; - - int64_t decryptable_handle = -1; - int64_t undecryptable_handle = -1; - - // Only decryptable password updates should be applied. - { - sync_pb::EntitySpecifics specifics; - sync_pb::PasswordSpecificsData data; - data.set_origin("http://example.com/1"); - { - syncable::ReadTransaction trans(FROM_HERE, directory()); - cryptographer = GetCryptographer(&trans); - - KeyParams params = {KeyDerivationParams::CreateForPbkdf2(), "foobar"}; - cryptographer->AddKey(params); - - cryptographer->Encrypt(data, - specifics.mutable_password()->mutable_encrypted()); - } - decryptable_handle = - entry_factory()->CreateUnappliedNewItem("item1", specifics, false); - } - { - // Create a new cryptographer, independent of the one in the cycle. - DirectoryCryptographer other_cryptographer; - KeyParams params = {KeyDerivationParams::CreateForPbkdf2(), "bazqux"}; - other_cryptographer.AddKey(params); - - sync_pb::EntitySpecifics specifics; - sync_pb::PasswordSpecificsData data; - data.set_origin("http://example.com/2"); - - other_cryptographer.Encrypt( - data, specifics.mutable_password()->mutable_encrypted()); - undecryptable_handle = - entry_factory()->CreateUnappliedNewItem("item2", specifics, false); - } - - StatusController status; - ApplyPasswordUpdates(&status); - - const UpdateCounters& counters = GetPasswordsUpdateCounters(); - EXPECT_EQ(1, counters.num_encryption_conflict_application_failures) - << "The updates that can't be decrypted should be in encryption " - << "conflict"; - EXPECT_EQ(1, counters.num_updates_applied) - << "The undecryptable password update shouldn't be applied"; - - { - syncable::ReadTransaction trans(FROM_HERE, directory()); - syncable::Entry e1(&trans, syncable::GET_BY_HANDLE, decryptable_handle); - syncable::Entry e2(&trans, syncable::GET_BY_HANDLE, undecryptable_handle); - ASSERT_TRUE(e1.good()); - ASSERT_TRUE(e2.good()); - EXPECT_FALSE(e1.GetIsUnappliedUpdate()); - EXPECT_TRUE(e2.GetIsUnappliedUpdate()); - } -} - } // namespace syncer
diff --git a/components/sync/engine_impl/model_type_registry_unittest.cc b/components/sync/engine_impl/model_type_registry_unittest.cc index 5a60676..317823da 100644 --- a/components/sync/engine_impl/model_type_registry_unittest.cc +++ b/components/sync/engine_impl/model_type_registry_unittest.cc
@@ -30,7 +30,8 @@ test_user_share_.SetUp(); scoped_refptr<ModelSafeWorker> passive_worker( new FakeModelWorker(GROUP_PASSIVE)); - scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI)); + scoped_refptr<ModelSafeWorker> ui_worker( + new FakeModelWorker(GROUP_NON_BLOCKING)); workers_.push_back(passive_worker); workers_.push_back(ui_worker); @@ -111,39 +112,6 @@ bool migration_attempted_ = false; }; -// Tests operations with directory types. -// Registering/unregistering type should affect enabled types and handlers map. -// Registering/unregistering type twice should trigger DCHECK. -// Registering type with unknown ModelSafeGroup should trigger DCHECK. -TEST_F(ModelTypeRegistryTest, DirectoryTypes) { - UpdateHandlerMap* update_handler_map = registry()->update_handler_map(); - EXPECT_TRUE(registry()->GetEnabledTypes().Empty()); - - registry()->RegisterDirectoryType(AUTOFILL, GROUP_UI); - EXPECT_EQ(ModelTypeSet(AUTOFILL), registry()->GetEnabledTypes()); - - registry()->RegisterDirectoryType(BOOKMARKS, GROUP_UI); - EXPECT_EQ(ModelTypeSet(AUTOFILL, BOOKMARKS), registry()->GetEnabledTypes()); - - // Try registering already registered type. - EXPECT_DCHECK_DEATH(registry()->RegisterDirectoryType(BOOKMARKS, GROUP_UI)); - - EXPECT_TRUE(update_handler_map->find(AUTOFILL) != update_handler_map->end()); - EXPECT_TRUE(update_handler_map->find(BOOKMARKS) != update_handler_map->end()); - - registry()->UnregisterDirectoryType(AUTOFILL); - EXPECT_EQ(ModelTypeSet(BOOKMARKS), registry()->GetEnabledTypes()); - EXPECT_TRUE(update_handler_map->find(AUTOFILL) == update_handler_map->end()); - EXPECT_TRUE(update_handler_map->find(BOOKMARKS) != update_handler_map->end()); - - // Try unregistering already unregistered type. - EXPECT_DCHECK_DEATH(registry()->UnregisterDirectoryType(AUTOFILL)); - - // Try registering type with unknown worker. - EXPECT_DCHECK_DEATH( - registry()->RegisterDirectoryType(SESSIONS, GROUP_PASSWORD)); -} - TEST_F(ModelTypeRegistryTest, NonBlockingTypes) { EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
diff --git a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc index 353b090..bd0750b 100644 --- a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc +++ b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
@@ -21,6 +21,8 @@ #include "components/sync/base/cancelation_signal.h" #include "components/sync/base/extensions_activity.h" #include "components/sync/base/model_type_test_util.h" +#include "components/sync/engine/data_type_activation_response.h" +#include "components/sync/engine/fake_model_type_processor.h" #include "components/sync/engine/sync_engine_switches.h" #include "components/sync/engine_impl/backoff_delay_provider.h" #include "components/sync/engine_impl/cycle/test_util.h" @@ -64,6 +66,12 @@ MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, SyncCycle*)); }; +std::unique_ptr<DataTypeActivationResponse> MakeFakeActivationResponse() { + auto response = std::make_unique<DataTypeActivationResponse>(); + response->type_processor = std::make_unique<FakeModelTypeProcessor>(); + return response; +} + MockSyncer::MockSyncer() : Syncer(nullptr) {} using SyncShareTimes = std::vector<TimeTicks>; @@ -119,7 +127,8 @@ extensions_activity_ = new ExtensionsActivity(); workers_.clear(); - workers_.push_back(base::MakeRefCounted<FakeModelWorker>(GROUP_UI)); + workers_.push_back( + base::MakeRefCounted<FakeModelWorker>(GROUP_NON_BLOCKING)); workers_.push_back(base::MakeRefCounted<FakeModelWorker>(GROUP_PASSIVE)); connection_ = std::make_unique<MockConnectionManager>(directory()); @@ -129,11 +138,13 @@ workers_, test_user_share_.user_share(), &mock_nudge_handler_, UssMigrator(), &cancelation_signal_, test_user_share_.keystore_keys_handler()); - model_type_registry_->RegisterDirectoryType(HISTORY_DELETE_DIRECTIVES, - GROUP_UI); + model_type_registry_->ConnectNonBlockingType(HISTORY_DELETE_DIRECTIVES, + MakeFakeActivationResponse()); model_type_registry_->RegisterDirectoryType(NIGORI, GROUP_PASSIVE); - model_type_registry_->RegisterDirectoryType(THEMES, GROUP_UI); - model_type_registry_->RegisterDirectoryType(TYPED_URLS, GROUP_UI); + model_type_registry_->ConnectNonBlockingType(THEMES, + MakeFakeActivationResponse()); + model_type_registry_->ConnectNonBlockingType(TYPED_URLS, + MakeFakeActivationResponse()); context_ = std::make_unique<SyncCycleContext>( connection_.get(), directory(), extensions_activity_.get(), @@ -146,8 +157,8 @@ RebuildScheduler(); } - void UnregisterDataType(ModelType type) { - model_type_registry_->UnregisterDirectoryType(type); + void DisconnectDataType(ModelType type) { + model_type_registry_->DisconnectNonBlockingType(type); } void RebuildScheduler() { @@ -405,7 +416,7 @@ // The user enables a custom passphrase at this point, so // HISTORY_DELETE_DIRECTIVES gets disabled. - UnregisterDataType(HISTORY_DELETE_DIRECTIVES); + DisconnectDataType(HISTORY_DELETE_DIRECTIVES); ASSERT_FALSE(context()->GetEnabledTypes().Has(HISTORY_DELETE_DIRECTIVES)); // The resulting sync cycle should ask only for the remaining types.
diff --git a/components/sync/model/fake_syncable_service.cc b/components/sync/model/fake_syncable_service.cc index 3d9440a..0532b8f4 100644 --- a/components/sync/model/fake_syncable_service.cc +++ b/components/sync/model/fake_syncable_service.cc
@@ -56,10 +56,6 @@ sync_processor_.reset(); } -SyncDataList FakeSyncableService::GetAllSyncData(ModelType type) const { - return SyncDataList(); -} - SyncError FakeSyncableService::ProcessSyncChanges( const base::Location& from_here, const SyncChangeList& change_list) {
diff --git a/components/sync/model/fake_syncable_service.h b/components/sync/model/fake_syncable_service.h index 3f2657d..35ff2e9 100644 --- a/components/sync/model/fake_syncable_service.h +++ b/components/sync/model/fake_syncable_service.h
@@ -36,7 +36,6 @@ std::unique_ptr<SyncChangeProcessor> sync_processor, std::unique_ptr<SyncErrorFactory> sync_error_factory) override; void StopSyncing(ModelType type) override; - SyncDataList GetAllSyncData(ModelType type) const override; SyncError ProcessSyncChanges(const base::Location& from_here, const SyncChangeList& change_list) override;
diff --git a/components/sync/model/sync_change_processor.h b/components/sync/model/sync_change_processor.h index 9d9c1e7..bcb49f71 100644 --- a/components/sync/model/sync_change_processor.h +++ b/components/sync/model/sync_change_processor.h
@@ -58,8 +58,8 @@ const std::string& context); // Adds an observer of local sync changes. This observer is notified when - // local sync changes are applied by GenericChangeProcessor. observer is - // not owned by the SyncChangeProcessor. + // local sync changes are applied. |observer| is not owned by the + // SyncChangeProcessor. virtual void AddLocalChangeObserver(LocalChangeObserver* observer); virtual void RemoveLocalChangeObserver(LocalChangeObserver* observer); };
diff --git a/components/sync/model/syncable_service.h b/components/sync/model/syncable_service.h index 7314e4d..69186ebb 100644 --- a/components/sync/model/syncable_service.h +++ b/components/sync/model/syncable_service.h
@@ -74,10 +74,6 @@ virtual SyncError ProcessSyncChanges(const base::Location& from_here, const SyncChangeList& change_list) = 0; - // TODO(crbug.com/870624): We don't seem to use this function anywhere, so - // we should simply remove it and simplify all implementations. - virtual SyncDataList GetAllSyncData(ModelType type) const = 0; - private: DISALLOW_COPY_AND_ASSIGN(SyncableService); };
diff --git a/components/sync/model_impl/syncable_service_based_bridge.cc b/components/sync/model_impl/syncable_service_based_bridge.cc index 5f6e5903..3abdbf4 100644 --- a/components/sync/model_impl/syncable_service_based_bridge.cc +++ b/components/sync/model_impl/syncable_service_based_bridge.cc
@@ -228,7 +228,7 @@ ContextRefreshStatus refresh_status, const std::string& context) override { // This function is not supported and not exercised by anyone, since - // the USS flow doesn't use SharedChangeProcessor. + // the USS flow doesn't use it. // TODO(crbug.com/870624): Remove this function altogether when the // directory codebase is removed. NOTREACHED();
diff --git a/components/sync_preferences/pref_model_associator.cc b/components/sync_preferences/pref_model_associator.cc index 3e5d781c..330dec7 100644 --- a/components/sync_preferences/pref_model_associator.cc +++ b/components/sync_preferences/pref_model_associator.cc
@@ -214,8 +214,8 @@ // We're not syncing this preference locally, ignore the sync data. // TODO(zea): Eventually we want to be able to have the syncable service // reconstruct all sync data for its datatype (therefore having - // GetAllSyncData be a complete representation). We should store this - // data somewhere, even if we don't use it. + // GetAllSyncDataForTesting be a complete representation). We should store + // this data somewhere, even if we don't use it. continue; } @@ -362,7 +362,7 @@ // with user controlled data. We do not track any information for preferences // not registered locally as syncable and do not inform the syncer of // non-user controlled preferences. -syncer::SyncDataList PrefModelAssociator::GetAllSyncData( +syncer::SyncDataList PrefModelAssociator::GetAllSyncDataForTesting( syncer::ModelType type) const { DCHECK_EQ(type_, type); syncer::SyncDataList current_data;
diff --git a/components/sync_preferences/pref_model_associator.h b/components/sync_preferences/pref_model_associator.h index 886cd62..5afc574 100644 --- a/components/sync_preferences/pref_model_associator.h +++ b/components/sync_preferences/pref_model_associator.h
@@ -68,11 +68,11 @@ syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override; - // Note for GetAllSyncData: This will build a model of all preferences - // registered as syncable with user controlled data. We do not track any - // information for preferences not registered locally as syncable and do not - // inform the syncer of non-user controlled preferences. - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + // Note for GetAllSyncDataForTesting: This will build a model of all + // preferences registered as syncable with user controlled data. We do not + // track any information for preferences not registered locally as syncable + // and do not inform the syncer of non-user controlled preferences. + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; // Register a preference with the specified name for syncing. We do not care // about the type at registration time, but when changes arrive from the
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc index fdbd53e..43a6ec5 100644 --- a/components/sync_preferences/pref_service_syncable_unittest.cc +++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -406,7 +406,8 @@ kDefaultCharsetPrefName, kDefaultCharsetValue, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); - pref_sync_service_ = prefs_.GetSyncableService(syncer::PREFERENCES); + pref_sync_service_ = static_cast<PrefModelAssociator*>( + prefs_.GetSyncableService(syncer::PREFERENCES)); ASSERT_THAT(pref_sync_service_, NotNull()); } @@ -474,7 +475,7 @@ scoped_refptr<TestingPrefStore> user_prefs_; TestPrefModelAssociatorClient client_; PrefServiceSyncable prefs_; - syncer::SyncableService* pref_sync_service_; + PrefModelAssociator* pref_sync_service_; int next_pref_remote_sync_node_id_; }; @@ -649,7 +650,7 @@ 1, pref_name, base::Value("remote_value2"), SyncChange::ACTION_UPDATE)); pref_sync_service_->ProcessSyncChanges(FROM_HERE, remote_changes); // The pref isn't synced. - EXPECT_THAT(pref_sync_service_->GetAllSyncData(syncer::PREFERENCES), + EXPECT_THAT(pref_sync_service_->GetAllSyncDataForTesting(syncer::PREFERENCES), IsEmpty()); EXPECT_THAT(GetPreferenceValue(pref_name).GetString(), Eq("default_value")); }
diff --git a/components/sync_sessions/favicon_cache.cc b/components/sync_sessions/favicon_cache.cc index ddf22c8..ccc09ed 100644 --- a/components/sync_sessions/favicon_cache.cc +++ b/components/sync_sessions/favicon_cache.cc
@@ -321,8 +321,8 @@ page_task_map_.clear(); } -syncer::SyncDataList FaviconCache::GetAllSyncData(syncer::ModelType type) - const { +syncer::SyncDataList FaviconCache::GetAllSyncDataForTesting( + syncer::ModelType type) const { syncer::SyncDataList data_list; for (auto iter = synced_favicons_.begin(); iter != synced_favicons_.end(); ++iter) {
diff --git a/components/sync_sessions/favicon_cache.h b/components/sync_sessions/favicon_cache.h index efee2f7..47fff98 100644 --- a/components/sync_sessions/favicon_cache.h +++ b/components/sync_sessions/favicon_cache.h
@@ -75,7 +75,7 @@ std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, std::unique_ptr<syncer::SyncErrorFactory> error_handler) override; void StopSyncing(syncer::ModelType type) override; - syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override; + syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const; syncer::SyncError ProcessSyncChanges( const base::Location& from_here, const syncer::SyncChangeList& change_list) override;
diff --git a/components/sync_sessions/favicon_cache_unittest.cc b/components/sync_sessions/favicon_cache_unittest.cc index 54245cc0..d0e89b1 100644 --- a/components/sync_sessions/favicon_cache_unittest.cc +++ b/components/sync_sessions/favicon_cache_unittest.cc
@@ -373,9 +373,9 @@ testing::AssertionResult SyncFaviconCacheTest::VerifyLocalCustomIcons( const std::vector<TestFaviconData>& expected_custom_icons) { syncer::SyncDataList image_data_list = - cache()->GetAllSyncData(syncer::FAVICON_IMAGES); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES); syncer::SyncDataList tracking_data_list = - cache()->GetAllSyncData(syncer::FAVICON_TRACKING); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING); if (expected_custom_icons.size() > image_data_list.size() || expected_custom_icons.size() > tracking_data_list.size()) return testing::AssertionFailure() << "Number of icons doesn't match."; @@ -579,7 +579,8 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); - EXPECT_EQ(0U, cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size()); + EXPECT_EQ(0U, + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(0, merge_result.num_items_modified()); @@ -593,7 +594,8 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); - EXPECT_EQ(0U, cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size()); + EXPECT_EQ(0U, + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(0, merge_result.num_items_modified()); @@ -621,7 +623,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size()); syncer::SyncChangeList change_list = processor()->GetAndResetChangeList(); EXPECT_TRUE(VerifyChanges(syncer::FAVICON_IMAGES, expected_change_types, @@ -639,7 +641,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size()); change_list = processor()->GetAndResetChangeList(); EXPECT_TRUE(VerifyChanges(syncer::FAVICON_TRACKING, expected_change_types, @@ -676,7 +678,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_added()); EXPECT_EQ(0, merge_result.num_items_modified()); @@ -690,7 +692,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_modified()); @@ -745,7 +747,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size()); syncer::SyncChangeList changes = processor()->GetAndResetChangeList(); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize)/2, changes.size()); EXPECT_EQ(0, merge_result.num_items_added()); @@ -760,7 +762,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_modified()); @@ -820,7 +822,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_modified()); @@ -834,7 +836,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize), - cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size()); syncer::SyncChangeList changes = processor()->GetAndResetChangeList(); EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize)/2, changes.size()); EXPECT_EQ(0, merge_result.num_items_added()); @@ -1128,7 +1130,7 @@ EXPECT_EQ(static_cast<size_t>(kMaxSyncFavicons)*2, GetFaviconCount()); // Still have tracking. EXPECT_EQ(static_cast<size_t>(kMaxSyncFavicons), - cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(kMaxSyncFavicons, merge_result.num_items_added()); EXPECT_EQ(0, merge_result.num_items_modified()); @@ -1143,7 +1145,7 @@ CreateAndPassProcessor(), CreateAndPassSyncErrorFactory()); EXPECT_EQ(static_cast<size_t>(kMaxSyncFavicons), - cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size()); + cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size()); EXPECT_EQ(0U, processor()->GetAndResetChangeList().size()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(kMaxSyncFavicons, merge_result.num_items_modified());
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc index 6951bea2..96423492 100644 --- a/components/sync_sessions/local_session_event_handler_impl.cc +++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -414,14 +414,20 @@ } if (is_supervised) { - const std::vector<std::unique_ptr<const SerializedNavigationEntry>>& - blocked_navigations = *tab_delegate.GetBlockedNavigations(); - for (size_t i = 0; i < blocked_navigations.size(); ++i) { - sync_pb::TabNavigation* navigation = specifics.add_navigation(); - SessionNavigationToSyncData(*blocked_navigations[i]).Swap(navigation); - navigation->set_blocked_state( - sync_pb::TabNavigation_BlockedState_STATE_BLOCKED); - // TODO(bauerb): Add categories + const std::vector<std::unique_ptr<const SerializedNavigationEntry>>* + blocked_navigations = tab_delegate.GetBlockedNavigations(); + // TODO(crbug.com/1061427): If the profile is supervised, + // |blocked_navigations| should always be non-null. Investigate why some + // users run into null pointers here and ultimately replace the condition + // below with a DCHECK. This is a workaround to avoid reported crashes. + if (blocked_navigations) { + for (const auto& blocked_navigation : *blocked_navigations) { + sync_pb::TabNavigation* navigation = specifics.add_navigation(); + *navigation = SessionNavigationToSyncData(*blocked_navigation); + navigation->set_blocked_state( + sync_pb::TabNavigation_BlockedState_STATE_BLOCKED); + // TODO(bauerb): Add categories + } } }
diff --git a/components/test/data/payments/csp_test_iframe.html b/components/test/data/payments/csp_test_iframe.html new file mode 100644 index 0000000..9f66669e1 --- /dev/null +++ b/components/test/data/payments/csp_test_iframe.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta + http-equiv="Content-Security-Policy" + content="default-src 'none'; script-src 'unsafe-eval' 'unsafe-inline'; img-src 'self' https://kylepay.com:*" + > + <script> + async function checkCanMakePayment() { + const methodData = [{ + supportedMethods: "https://kylepay.com/webpay", + }]; + let details = { + total: { + label: "Total", + amount: { + currency: "USD", + value: "1.00", + }, + }, + }; + const request = new PaymentRequest(methodData, details); + const result = await request.canMakePayment(); + document.querySelector("#output").innerText = "canMakePayment: " + result; + return result; + } + + </script> + </head> + <body> + <p>This page is a regression test for <a href="https://crbug.com/1055360"> + crbug/1055360</a>.</p> + <div id="output"></div> + </body> +</html>
diff --git a/components/test/data/payments/csp_test_main.html b/components/test/data/payments/csp_test_main.html new file mode 100644 index 0000000..53c8d37 --- /dev/null +++ b/components/test/data/payments/csp_test_main.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta + http-equiv="Content-Security-Policy" + content="default-src 'none'; script-src 'unsafe-eval'; frame-src https://other.example:*" + > + </head> + <body> + <p>This page is a regression test for <a href="https://crbug.com/1055360"> + crbug/1055360</a>.</p> + <ul> + <li>Setup:</li> + <ul> + <li>This top-level document has a CSP policy that sets img-src to + 'self'</li> + <li>The cross-origin iframe creates a payment request that triggers + JIT + crawling of the payment method manifest hosted at kylepay.com. + </li> + </ul> + <li>Test: if Chrome handles CSP policy correctly, request.canMakePayment() + should return true as the payment method manifest crawl is successful. + </li> + </ul> + <iframe id="test" allow="payment"> + </iframe> + </body> +</html>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 20a1370..9505df09 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1536,6 +1536,8 @@ "renderer_host/overscroll_controller_delegate.h", "renderer_host/p2p/socket_dispatcher_host.cc", "renderer_host/p2p/socket_dispatcher_host.h", + "renderer_host/page_lifecycle_state_manager.cc", + "renderer_host/page_lifecycle_state_manager.h", "renderer_host/render_frame_metadata_provider_impl.cc", "renderer_host/render_frame_metadata_provider_impl.h", "renderer_host/render_message_filter.cc",
diff --git a/content/browser/accessibility/accessibility_mode_browsertest.cc b/content/browser/accessibility/accessibility_mode_browsertest.cc index d588d80..71c4587a 100644 --- a/content/browser/accessibility/accessibility_mode_browsertest.cc +++ b/content/browser/accessibility/accessibility_mode_browsertest.cc
@@ -189,4 +189,24 @@ EXPECT_EQ(original_id, textbox2->GetId()); } +IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, + ReEnablingAccessibilityDoesNotTimeout) { + EXPECT_TRUE(NavigateToURL(shell(), GURL(kMinimalPageDataURL))); + ASSERT_TRUE(web_contents()->GetAccessibilityMode().is_mode_off()); + + AccessibilityNotificationWaiter waiter(shell()->web_contents()); + web_contents()->AddAccessibilityMode(ui::kAXModeWebContentsOnly); + EXPECT_TRUE(web_contents()->GetAccessibilityMode() == + ui::kAXModeWebContentsOnly); + waiter.WaitForNotification(); + EXPECT_EQ(nullptr, GetManager()); + + AccessibilityNotificationWaiter waiter2(shell()->web_contents()); + web_contents()->SetAccessibilityMode(ui::AXMode()); + web_contents()->AddAccessibilityMode(ui::kAXModeComplete); + EXPECT_TRUE(web_contents()->GetAccessibilityMode() == ui::kAXModeComplete); + waiter2.WaitForNotification(); + EXPECT_NE(nullptr, GetManager()); +} + } // namespace content
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 8ca9377a..3c285c7 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -15,7 +15,6 @@ #include "base/strings/string_util.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" -#include "content/common/accessibility_messages.h" #include "content/public/common/content_client.h" #include "third_party/blink/public/strings/grit/blink_strings.h" #include "ui/accessibility/ax_enums.mojom.h"
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index f4728f3..6961805 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -12,7 +12,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "content/browser/accessibility/browser_accessibility_manager_android.h" -#include "content/common/accessibility_messages.h" #include "content/public/common/content_client.h" #include "third_party/blink/public/strings/grit/blink_strings.h" #include "third_party/skia/include/core/SkColor.h"
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc index a2324ad..aa5d005 100644 --- a/content/browser/accessibility/browser_accessibility_com_win.cc +++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -19,7 +19,6 @@ #include "content/browser/accessibility/browser_accessibility_manager_win.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/accessibility/browser_accessibility_win.h" -#include "content/common/accessibility_messages.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h" #include "ui/accessibility/ax_mode.h"
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 6267ba5..fd6d640 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -17,7 +17,7 @@ #include "base/no_destructor.h" #include "build/build_config.h" #include "content/browser/accessibility/browser_accessibility.h" -#include "content/common/accessibility_messages.h" +#include "content/common/render_accessibility.mojom.h" #include "content/public/common/use_zoom_for_dsf_policy.h" #include "ui/accessibility/ax_language_detection.h" #include "ui/accessibility/ax_node_position.h" @@ -502,23 +502,23 @@ void BrowserAccessibilityManager::FinalizeAccessibilityEvents() {} void BrowserAccessibilityManager::OnLocationChanges( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { - for (size_t i = 0; i < params.size(); ++i) { - BrowserAccessibility* obj = GetFromID(params[i].id); + const std::vector<mojom::LocationChangesPtr>& changes) { + for (auto& change : changes) { + BrowserAccessibility* obj = GetFromID(change->id); if (!obj) continue; ui::AXNode* node = obj->node(); - node->SetLocation(params[i].new_location.offset_container_id, - params[i].new_location.bounds, - params[i].new_location.transform.get()); + node->SetLocation(change->new_location.offset_container_id, + change->new_location.bounds, + change->new_location.transform.get()); } - SendLocationChangeEvents(params); + SendLocationChangeEvents(changes); } void BrowserAccessibilityManager::SendLocationChangeEvents( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { - for (size_t i = 0; i < params.size(); ++i) { - BrowserAccessibility* obj = GetFromID(params[i].id); + const std::vector<mojom::LocationChangesPtr>& changes) { + for (auto& change : changes) { + BrowserAccessibility* obj = GetFromID(change->id); if (obj) obj->OnLocationChanged(); }
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index 63135b2..8defcf4 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -21,6 +21,7 @@ #include "content/browser/accessibility/accessibility_buildflags.h" #include "content/browser/accessibility/browser_accessibility_position.h" #include "content/common/content_export.h" +#include "content/common/render_accessibility.mojom-forward.h" #include "content/public/browser/ax_event_notification_details.h" #include "content/public/browser/web_contents_observer.h" #include "third_party/blink/public/web/web_ax_enums.h" @@ -38,8 +39,6 @@ #include "ui/accessibility/platform/ax_platform_node.h" #include "ui/gfx/native_widget_types.h" -struct AccessibilityHostMsg_LocationChangeParams; - namespace content { class BrowserAccessibility; class BrowserAccessibilityDelegate; @@ -291,8 +290,7 @@ // Called when the renderer process updates the location of accessibility // objects. Calls SendLocationChangeEvents(), which can be overridden. - void OnLocationChanges( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params); + void OnLocationChanges(const std::vector<mojom::LocationChangesPtr>& changes); // Called when a new find in page result is received. We hold on to this // information and don't activate it until the user requests it. @@ -473,7 +471,7 @@ // their location has changed. This is called by OnLocationChanges // after it's updated the internal data structure. virtual void SendLocationChangeEvents( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params); + const std::vector<mojom::LocationChangesPtr>& changes); // Given the data from an atomic update, collect the nodes that need updating // assuming that this platform is one where plain text node content is
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index e7dce55..facd309 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -7,7 +7,7 @@ #include "base/i18n/char_iterator.h" #include "content/browser/accessibility/browser_accessibility_android.h" #include "content/browser/accessibility/web_contents_accessibility_android.h" -#include "content/common/accessibility_messages.h" +#include "content/common/render_accessibility.mojom.h" #include "content/public/common/use_zoom_for_dsf_policy.h" #include "ui/accessibility/ax_role_properties.h" @@ -258,19 +258,19 @@ } void BrowserAccessibilityManagerAndroid::SendLocationChangeEvents( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { + const std::vector<mojom::LocationChangesPtr>& changes) { // Android is not very efficient at handling notifications, and location // changes in particular are frequent and not time-critical. If a lot of // nodes changed location, just send a single notification after a short // delay (to batch them), rather than lots of individual notifications. - if (params.size() > 3) { + if (changes.size() > 3) { auto* wcax = GetWebContentsAXFromRootManager(); if (!wcax) return; wcax->SendDelayedWindowContentChangedEvent(); return; } - BrowserAccessibilityManager::SendLocationChangeEvents(params); + BrowserAccessibilityManager::SendLocationChangeEvents(changes); } bool BrowserAccessibilityManagerAndroid::NextAtGranularity(
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h index d1cde018..9e458b8 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.h +++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -8,6 +8,7 @@ #include <utility> #include "content/browser/accessibility/browser_accessibility_manager.h" +#include "content/common/render_accessibility.mojom-forward.h" namespace ui { class MotionEventAndroid; @@ -75,8 +76,7 @@ // BrowserAccessibilityManager overrides. BrowserAccessibility* GetFocus() const override; void SendLocationChangeEvents( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) - override; + const std::vector<mojom::LocationChangesPtr>& changes) override; void FireFocusEvent(BrowserAccessibility* node) override; void FireBlinkEvent(ax::mojom::Event event_type, BrowserAccessibility* node) override;
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc index 206c1970..eddb1c8 100644 --- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc +++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -10,7 +10,6 @@ #include <vector> #include "content/browser/accessibility/browser_accessibility_auralinux.h" -#include "content/common/accessibility_messages.h" #include "ui/accessibility/platform/ax_platform_node_auralinux.h" namespace content {
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm index 292d3ed8..2b87af26 100644 --- a/content/browser/accessibility/browser_accessibility_manager_mac.mm +++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -15,7 +15,6 @@ #include "base/time/time.h" #import "content/browser/accessibility/browser_accessibility_cocoa.h" #import "content/browser/accessibility/browser_accessibility_mac.h" -#include "content/common/accessibility_messages.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index d7ebc88..a817eb7 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -17,7 +17,6 @@ #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/accessibility/browser_accessibility_win.h" #include "content/browser/renderer_host/legacy_render_widget_host_win.h" -#include "content/common/accessibility_messages.h" #include "content/public/common/content_switches.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/accessibility/ax_role_properties.h"
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc index 7aaa472..25459cb0 100644 --- a/content/browser/accessibility/browser_accessibility_win_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -21,7 +21,7 @@ #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/accessibility/test_browser_accessibility_delegate.h" #include "content/browser/renderer_host/legacy_render_widget_host_win.h" -#include "content/common/accessibility_messages.h" +#include "content/common/ax_content_node_data.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/accessibility_switches.h"
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc index 6f66019..e05367b8 100644 --- a/content/browser/devtools/protocol/browser_handler.cc +++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -304,7 +304,7 @@ } Response BrowserHandler::SetPermission( - const std::string& origin, + Maybe<std::string> origin, std::unique_ptr<protocol::Browser::PermissionDescriptor> permission, const protocol::Browser::PermissionSetting& setting, Maybe<std::string> browser_context_id) { @@ -327,11 +327,14 @@ PermissionControllerImpl* permission_controller = PermissionControllerImpl::FromBrowserContext(browser_context); - url::Origin overridden_origin = url::Origin::Create(GURL(origin)); - if (overridden_origin.opaque()) - return Response::InvalidParams( - "Permission can't be granted to opaque origins."); + base::Optional<url::Origin> overridden_origin; + if (origin.isJust()) { + overridden_origin = url::Origin::Create(GURL(origin.fromJust())); + if (overridden_origin->opaque()) + return Response::InvalidParams( + "Permission can't be granted to opaque origins."); + } PermissionControllerImpl::OverrideStatus status = permission_controller->SetOverrideForDevTools(overridden_origin, type, permission_status); @@ -345,7 +348,7 @@ } Response BrowserHandler::GrantPermissions( - const std::string& origin, + Maybe<std::string> origin, std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>> permissions, Maybe<std::string> browser_context_id) { @@ -366,14 +369,17 @@ PermissionControllerImpl* permission_controller = PermissionControllerImpl::FromBrowserContext(browser_context); - url::Origin overridden_origin = url::Origin::Create(GURL(origin)); - if (overridden_origin.opaque()) - return Response::InvalidParams( - "Permission can't be granted to opaque origins."); - + base::Optional<url::Origin> overridden_origin; + if (origin.isJust()) { + overridden_origin = url::Origin::Create(GURL(origin.fromJust())); + if (overridden_origin->opaque()) + return Response::InvalidParams( + "Permission can't be granted to opaque origins."); + } PermissionControllerImpl::OverrideStatus status = permission_controller->GrantOverridesForDevTools(overridden_origin, internal_permissions); + if (status != PermissionControllerImpl::OverrideStatus::kOverrideSet) { return Response::InvalidParams( "Permissions can't be granted in current context.");
diff --git a/content/browser/devtools/protocol/browser_handler.h b/content/browser/devtools/protocol/browser_handler.h index 9b4d310..e1625ec 100644 --- a/content/browser/devtools/protocol/browser_handler.h +++ b/content/browser/devtools/protocol/browser_handler.h
@@ -50,13 +50,13 @@ std::unique_ptr<protocol::Array<std::string>>* arguments) override; Response SetPermission( - const std::string& origin, + Maybe<std::string> origin, std::unique_ptr<protocol::Browser::PermissionDescriptor> permission, const protocol::Browser::PermissionSetting& setting, Maybe<std::string> browser_context_id) override; Response GrantPermissions( - const std::string& origin, + Maybe<std::string> origin, std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>> permissions, Maybe<std::string> browser_context_id) override;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 0491417..2379abe 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1536,12 +1536,8 @@ IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFrameOwnerProperties, OnDidChangeFrameOwnerProperties) IPC_MESSAGE_HANDLER(AccessibilityHostMsg_EventBundle, OnAccessibilityEvents) - IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, - OnAccessibilityLocationChanges) IPC_MESSAGE_HANDLER(AccessibilityHostMsg_ChildFrameHitTestResult, OnAccessibilityChildFrameHitTestResult) - IPC_MESSAGE_HANDLER(AccessibilityHostMsg_SnapshotResponse, - OnAccessibilitySnapshotResponse) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) IPC_MESSAGE_HANDLER(FrameHostMsg_SelectionChanged, OnSelectionChanged) IPC_MESSAGE_HANDLER(FrameHostMsg_FrameDidCallFocus, OnFrameDidCallFocus) @@ -1707,11 +1703,6 @@ must_be_replaced_ = IsRenderDocumentEnabledForCrashedFrame(); has_committed_any_navigation_ = false; - // Execute any pending AX tree snapshot callbacks with an empty response, - // since we're never going to get a response from this renderer. - for (auto& iter : ax_tree_snapshot_callbacks_) - std::move(iter.second).Run(ui::AXTreeUpdate()); - #if defined(OS_ANDROID) // Execute any pending Samsung smart clip callbacks. for (base::IDMap<std::unique_ptr<ExtractSmartClipDataCallback>>::iterator @@ -1723,7 +1714,6 @@ smart_clip_callbacks_.Clear(); #endif // defined(OS_ANDROID) - ax_tree_snapshot_callbacks_.clear(); visual_state_callbacks_.clear(); // Ensure that future remote interface requests are associated with the new @@ -3947,37 +3937,6 @@ controller->GetBackForwardCache().PostTaskToDestroyEvictedFrames(); } -void RenderFrameHostImpl::OnAccessibilityLocationChanges( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { - if (accessibility_reset_token_ || !is_active()) - return; - - RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( - render_view_host_->GetWidget()->GetView()); - if (view) { - ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode(); - if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) { - BrowserAccessibilityManager* manager = - GetOrCreateBrowserAccessibilityManager(); - if (manager) - manager->OnLocationChanges(params); - } - - // Send the updates to the automation extension API. - std::vector<AXLocationChangeNotificationDetails> details; - details.reserve(params.size()); - for (size_t i = 0; i < params.size(); ++i) { - const AccessibilityHostMsg_LocationChangeParams& param = params[i]; - AXLocationChangeNotificationDetails detail; - detail.id = param.id; - detail.ax_tree_id = GetAXTreeID(); - detail.new_location = param.new_location; - details.push_back(detail); - } - delegate_->AccessibilityLocationChangesReceived(details); - } -} - void RenderFrameHostImpl::OnAccessibilityChildFrameHitTestResult( int action_request_id, const gfx::Point& point, @@ -4011,29 +3970,6 @@ child_frame->AccessibilityPerformAction(action_data); } -void RenderFrameHostImpl::OnAccessibilitySnapshotResponse( - int callback_id, - const AXContentTreeUpdate& snapshot) { - const auto& it = ax_tree_snapshot_callbacks_.find(callback_id); - if (it != ax_tree_snapshot_callbacks_.end()) { - ui::AXTreeUpdate dst_snapshot; - dst_snapshot.root_id = snapshot.root_id; - dst_snapshot.nodes.resize(snapshot.nodes.size()); - for (size_t i = 0; i < snapshot.nodes.size(); ++i) { - AXContentNodeDataToAXNodeData(snapshot.nodes[i], &dst_snapshot.nodes[i]); - } - if (snapshot.has_tree_data) { - ax_content_tree_data_ = snapshot.tree_data; - AXContentTreeDataToAXTreeData(&dst_snapshot.tree_data); - dst_snapshot.has_tree_data = true; - } - std::move(it->second).Run(dst_snapshot); - ax_tree_snapshot_callbacks_.erase(it); - } else { - NOTREACHED() << "Received AX tree snapshot response for unknown id"; - } -} - bool RenderFrameHostImpl::HasSeenRecentXrOverlaySetup() { static constexpr base::TimeDelta kMaxInterval = base::TimeDelta::FromSeconds(1); @@ -4798,6 +4734,36 @@ std::move(resource_load_info)); } +void RenderFrameHostImpl::HandleAXLocationChanges( + std::vector<mojom::LocationChangesPtr> changes) { + if (accessibility_reset_token_ || !is_active()) + return; + + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetWidget()->GetView()); + if (view) { + ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode(); + if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) { + BrowserAccessibilityManager* manager = + GetOrCreateBrowserAccessibilityManager(); + if (manager) + manager->OnLocationChanges(changes); + } + + // Send the updates to the automation extension API. + std::vector<AXLocationChangeNotificationDetails> details; + details.reserve(changes.size()); + for (auto& change : changes) { + AXLocationChangeNotificationDetails detail; + detail.id = change->id; + detail.ax_tree_id = GetAXTreeID(); + detail.new_location = change->new_location; + details.push_back(detail); + } + delegate_->AccessibilityLocationChangesReceived(details); + } +} + void RenderFrameHostImpl::RegisterMojoInterfaces() { file_system_manager_.reset(new FileSystemManagerImpl( GetProcess()->GetID(), @@ -5886,6 +5852,15 @@ }, base::Unretained(this))); } + + associated_registry_->AddInterface(base::BindRepeating( + [](RenderFrameHostImpl* impl, + mojo::PendingAssociatedReceiver<mojom::RenderAccessibilityHost> + receiver) { + impl->render_accessibility_host_receiver_.Bind(std::move(receiver)); + }, + base::Unretained(this))); + RegisterMojoInterfaces(); mojo::PendingRemote<mojom::FrameFactory> frame_factory; GetProcess()->BindReceiver(frame_factory.InitWithNewPipeAndPassReceiver()); @@ -5928,6 +5903,7 @@ geolocation_service_.reset(); sensor_provider_proxy_.reset(); + render_accessibility_host_receiver_.reset(); local_frame_host_receiver_.reset(); local_main_frame_host_receiver_.reset(); associated_registry_.reset(); @@ -6113,11 +6089,10 @@ void RenderFrameHostImpl::RequestAXTreeSnapshot(AXTreeSnapshotCallback callback, ui::AXMode ax_mode) { - static int next_id = 1; - int callback_id = next_id++; - Send(new AccessibilityMsg_SnapshotTree(routing_id_, callback_id, - ax_mode.mode())); - ax_tree_snapshot_callbacks_.emplace(callback_id, std::move(callback)); + frame_->SnapshotAccessibilityTree( + ax_mode.mode(), + base::BindOnce(&RenderFrameHostImpl::RequestAXTreeSnapshotCallback, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void RenderFrameHostImpl::SetAccessibilityCallbackForTesting( @@ -6479,21 +6454,12 @@ // Copy the common fields. *dst = src; - // Map content-specific attributes based on routing IDs or browser plugin - // instance IDs to generic attributes with global AXTreeIDs. - for (auto iter : src.content_int_attributes) { - AXContentIntAttribute attr = iter.first; - int32_t value = iter.second; - switch (attr) { - case AX_CONTENT_ATTR_CHILD_ROUTING_ID: - dst->string_attributes.push_back( - std::make_pair(ax::mojom::StringAttribute::kChildTreeId, - RoutingIDToAXTreeID(value).ToString())); - break; - case AX_CONTENT_INT_ATTRIBUTE_LAST: - NOTREACHED(); - break; - } + // Map content-specific's |child_routing_id| attribute to a generic attribute + // with a global AXTreeID. + if (src.child_routing_id != MSG_ROUTING_NONE) { + dst->string_attributes.push_back( + std::make_pair(ax::mojom::StringAttribute::kChildTreeId, + RoutingIDToAXTreeID(src.child_routing_id).ToString())); } } @@ -6503,10 +6469,10 @@ // Copy the common fields. *dst = src; - if (src.routing_id != -1) + if (src.routing_id != MSG_ROUTING_NONE) dst->tree_id = RoutingIDToAXTreeID(src.routing_id); - if (src.parent_routing_id != -1) + if (src.parent_routing_id != MSG_ROUTING_NONE) dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); if (browser_plugin_embedder_ax_tree_id_ != ui::AXTreeIDUnknown()) @@ -6524,6 +6490,23 @@ dst->focused_tree_id = focused_frame->GetAXTreeID(); } +void RenderFrameHostImpl::RequestAXTreeSnapshotCallback( + AXTreeSnapshotCallback callback, + const AXContentTreeUpdate& snapshot) { + ui::AXTreeUpdate dst_snapshot; + dst_snapshot.root_id = snapshot.root_id; + dst_snapshot.nodes.resize(snapshot.nodes.size()); + for (size_t i = 0; i < snapshot.nodes.size(); ++i) + AXContentNodeDataToAXNodeData(snapshot.nodes[i], &dst_snapshot.nodes[i]); + + if (snapshot.has_tree_data) { + ax_content_tree_data_ = snapshot.tree_data; + AXContentTreeDataToAXTreeData(&dst_snapshot.tree_data); + dst_snapshot.has_tree_data = true; + } + std::move(callback).Run(dst_snapshot); +} + void RenderFrameHostImpl::CreatePaymentManager( mojo::PendingReceiver<payments::mojom::PaymentManager> receiver) { if (!IsFeatureEnabled(blink::mojom::FeaturePolicyFeature::kPayment)) {
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 78a1e2d..34448177 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -144,7 +144,6 @@ class GURL; struct AccessibilityHostMsg_EventBundleParams; -struct AccessibilityHostMsg_LocationChangeParams; struct FrameHostMsg_OpenURL_Params; #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU) struct FrameHostMsg_ShowPopup_Params; @@ -226,6 +225,7 @@ : public RenderFrameHost, public base::SupportsUserData, public mojom::FrameHost, + public mojom::RenderAccessibilityHost, public BrowserAccessibilityDelegate, public RenderProcessHostObserver, public SiteInstanceImpl::Observer, @@ -1599,16 +1599,12 @@ const AccessibilityHostMsg_EventBundleParams& params, int reset_token, int ack_token); - void OnAccessibilityLocationChanges( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params); void OnAccessibilityChildFrameHitTestResult( int action_request_id, const gfx::Point& point, int child_frame_routing_id, int child_frame_browser_plugin_instance_id, ax::mojom::Event event_to_fire); - void OnAccessibilitySnapshotResponse(int callback_id, - const AXContentTreeUpdate& snapshot); void OnDidStopLoading(); void OnSelectionChanged(const base::string16& text, uint32_t offset, @@ -1704,6 +1700,10 @@ void UpdateUserGestureCarryoverInfo() override; #endif + // mojom::RenderAccessibilityHost: + void HandleAXLocationChanges( + std::vector<mojom::LocationChangesPtr> changes) override; + // Registers Mojo interfaces that this frame host makes available. void RegisterMojoInterfaces(); @@ -1797,6 +1797,13 @@ // AXTreeData structure. void AXContentTreeDataToAXTreeData(ui::AXTreeData* dst); + // Callback that will be called as a response to the call to the method + // content::mojom::RenderAccessibility::SnapshotAccessibilityTree(). The + // |callback| passed will be invoked after the renderer has responded with a + // standalone snapshot of the accessibility tree as |snapshot|. + void RequestAXTreeSnapshotCallback(AXTreeSnapshotCallback callback, + const AXContentTreeUpdate& snapshot); + // Returns the RenderWidgetHostView used for accessibility. For subframes, // this function will return the platform view on the main frame; for main // frames, it will return the current frame's view. @@ -2305,10 +2312,6 @@ // The AX tree ID of the embedder, if this is a browser plugin guest. ui::AXTreeID browser_plugin_embedder_ax_tree_id_; - // The mapping from callback id to corresponding callback for pending - // accessibility tree snapshot calls created by RequestAXTreeSnapshot. - std::map<int, AXTreeSnapshotCallback> ax_tree_snapshot_callbacks_; - // Samsung Galaxy Note-specific "smart clip" stylus text getter. #if defined(OS_ANDROID) base::IDMap<std::unique_ptr<ExtractSmartClipDataCallback>> @@ -2556,6 +2559,9 @@ // is an accessibility mode that includes |kWebContents|. mojo::AssociatedRemote<mojom::RenderAccessibility> render_accessibility_; + mojo::AssociatedReceiver<mojom::RenderAccessibilityHost> + render_accessibility_host_receiver_{this}; + std::unique_ptr<KeepAliveHandleFactory> keep_alive_handle_factory_; base::TimeDelta keep_alive_timeout_;
diff --git a/content/browser/indexed_db/indexed_db_browsertest.cc b/content/browser/indexed_db/indexed_db_browsertest.cc index aa86f38e..5a4335e 100644 --- a/content/browser/indexed_db/indexed_db_browsertest.cc +++ b/content/browser/indexed_db/indexed_db_browsertest.cc
@@ -1078,7 +1078,9 @@ // Fails to cleanup GPU processes on swarming. // http://crbug.com/552543 -#if defined(OS_WIN) +// Flasky on TSAN: +// crbug.com/1061251 +#if defined(OS_WIN) || defined(THREAD_SANITIZER) #define MAYBE_VersionChangeCrashResilience DISABLED_VersionChangeCrashResilience #else #define MAYBE_VersionChangeCrashResilience VersionChangeCrashResilience
diff --git a/content/browser/mojo_sandbox_browsertest.cc b/content/browser/mojo_sandbox_browsertest.cc index b0b2eea..16b2847 100644 --- a/content/browser/mojo_sandbox_browsertest.cc +++ b/content/browser/mojo_sandbox_browsertest.cc
@@ -7,9 +7,16 @@ #include <utility> #include "base/bind.h" +#include "base/containers/span.h" #include "base/macros.h" +#include "base/memory/read_only_shared_memory_region.h" +#include "base/memory/shared_memory_mapping.h" +#include "base/memory/unsafe_shared_memory_region.h" +#include "base/memory/writable_shared_memory_region.h" #include "base/run_loop.h" +#include "base/strings/string_piece.h" #include "base/task/post_task.h" +#include "base/test/bind_test_util.h" #include "content/browser/utility_process_host.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -25,7 +32,7 @@ class MojoSandboxTest : public ContentBrowserTest { public: - MojoSandboxTest() {} + MojoSandboxTest() = default; void SetUpOnMainThread() override { base::RunLoop run_loop; @@ -62,9 +69,9 @@ DISALLOW_COPY_AND_ASSIGN(MojoSandboxTest); }; -IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessSharedBuffer) { - // Ensures that a shared buffer can be created within a sandboxed process. - +// Ensures that a read-only shared memory region can be created within a +// sandboxed process. +IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessReadOnlySharedMemoryRegion) { mojo::Remote<mojom::TestService> test_service; base::PostTask( FROM_HERE, {BrowserThread::IO}, @@ -78,22 +85,79 @@ bool got_response = false; base::RunLoop run_loop; test_service.set_disconnect_handler(run_loop.QuitClosure()); - test_service->CreateSharedBuffer( + test_service->CreateReadOnlySharedMemoryRegion( kTestMessage, + base::BindLambdaForTesting([&](base::ReadOnlySharedMemoryRegion region) { + got_response = true; + ASSERT_TRUE(region.IsValid()); + base::ReadOnlySharedMemoryMapping mapping = region.Map(); + ASSERT_TRUE(mapping.IsValid()); + auto span = mapping.GetMemoryAsSpan<const char>(); + EXPECT_EQ(kTestMessage, base::StringPiece(span.data(), span.size())); + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_TRUE(got_response); +} + +// Ensures that a writable shared memory region can be created within a +// sandboxed process. +IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessWritableSharedMemoryRegion) { + mojo::Remote<mojom::TestService> test_service; + base::PostTask( + FROM_HERE, {BrowserThread::IO}, base::BindOnce( - [](base::OnceClosure quit_closure, bool* got_response, - mojo::ScopedSharedBufferHandle buffer) { - ASSERT_TRUE(buffer.is_valid()); - mojo::ScopedSharedBufferMapping mapping = - buffer->Map(kTestMessage.size()); - ASSERT_TRUE(mapping); - std::string contents(static_cast<const char*>(mapping.get()), - kTestMessage.size()); - EXPECT_EQ(kTestMessage, contents); - *got_response = true; - std::move(quit_closure).Run(); + [](UtilityProcessHost* host, + mojo::PendingReceiver<mojom::TestService> receiver) { + host->GetChildProcess()->BindReceiver(std::move(receiver)); }, - run_loop.QuitClosure(), &got_response)); + host_.get(), test_service.BindNewPipeAndPassReceiver())); + + bool got_response = false; + base::RunLoop run_loop; + test_service.set_disconnect_handler(run_loop.QuitClosure()); + test_service->CreateWritableSharedMemoryRegion( + kTestMessage, + base::BindLambdaForTesting([&](base::WritableSharedMemoryRegion region) { + got_response = true; + ASSERT_TRUE(region.IsValid()); + base::WritableSharedMemoryMapping mapping = region.Map(); + ASSERT_TRUE(mapping.IsValid()); + auto span = mapping.GetMemoryAsSpan<const char>(); + EXPECT_EQ(kTestMessage, base::StringPiece(span.data(), span.size())); + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_TRUE(got_response); +} + +// Ensures that an unsafe shared memory region can be created within a +// sandboxed process. +IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessUnsafeSharedMemoryRegion) { + mojo::Remote<mojom::TestService> test_service; + base::PostTask( + FROM_HERE, {BrowserThread::IO}, + base::BindOnce( + [](UtilityProcessHost* host, + mojo::PendingReceiver<mojom::TestService> receiver) { + host->GetChildProcess()->BindReceiver(std::move(receiver)); + }, + host_.get(), test_service.BindNewPipeAndPassReceiver())); + + bool got_response = false; + base::RunLoop run_loop; + test_service.set_disconnect_handler(run_loop.QuitClosure()); + test_service->CreateUnsafeSharedMemoryRegion( + kTestMessage, + base::BindLambdaForTesting([&](base::UnsafeSharedMemoryRegion region) { + got_response = true; + ASSERT_TRUE(region.IsValid()); + base::WritableSharedMemoryMapping mapping = region.Map(); + ASSERT_TRUE(mapping.IsValid()); + auto span = mapping.GetMemoryAsSpan<const char>(); + EXPECT_EQ(kTestMessage, base::StringPiece(span.data(), span.size())); + run_loop.Quit(); + })); run_loop.Run(); EXPECT_TRUE(got_response); }
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc index b269a9f..a7cfeb85 100644 --- a/content/browser/permissions/permission_controller_impl.cc +++ b/content/browser/permissions/permission_controller_impl.cc
@@ -188,8 +188,8 @@ PermissionControllerImpl::OverrideStatus PermissionControllerImpl::SetOverrideForDevTools( - const url::Origin& origin, - const PermissionType& permission, + const base::Optional<url::Origin>& origin, + PermissionType permission, const blink::mojom::PermissionStatus& status) { PermissionControllerDelegate* delegate = browser_context_->GetPermissionControllerDelegate(); @@ -197,8 +197,8 @@ !delegate->IsPermissionOverridableByDevTools(permission, origin)) { return OverrideStatus::kOverrideNotSet; } - const auto old_statuses = GetSubscriptionsStatuses(origin.GetURL()); - + const auto old_statuses = GetSubscriptionsStatuses( + origin ? base::make_optional(origin->GetURL()) : base::nullopt); devtools_permission_overrides_.Set(origin, permission, status); NotifyChangedSubscriptions(old_statuses); @@ -208,16 +208,19 @@ PermissionControllerImpl::OverrideStatus PermissionControllerImpl::GrantOverridesForDevTools( - const url::Origin& origin, + const base::Optional<url::Origin>& origin, const std::vector<PermissionType>& permissions) { PermissionControllerDelegate* delegate = browser_context_->GetPermissionControllerDelegate(); - if (delegate) - for (const auto permission : permissions) + if (delegate) { + for (const auto permission : permissions) { if (!delegate->IsPermissionOverridableByDevTools(permission, origin)) return OverrideStatus::kOverrideNotSet; + } + } - const auto old_statuses = GetSubscriptionsStatuses(origin.GetURL()); + const auto old_statuses = GetSubscriptionsStatuses( + origin ? base::make_optional(origin->GetURL()) : base::nullopt); devtools_permission_overrides_.GrantPermissions(origin, permissions); // If any statuses changed because they lose overrides or the new overrides // modify their previous state (overridden or not), subscribers must be @@ -243,7 +246,7 @@ } void PermissionControllerImpl::UpdateDelegateOverridesForDevTools( - const url::Origin& origin) { + const base::Optional<url::Origin>& origin) { PermissionControllerDelegate* delegate = browser_context_->GetPermissionControllerDelegate(); if (!delegate)
diff --git a/content/browser/permissions/permission_controller_impl.h b/content/browser/permissions/permission_controller_impl.h index 0c5e652..7ebf3c4 100644 --- a/content/browser/permissions/permission_controller_impl.h +++ b/content/browser/permissions/permission_controller_impl.h
@@ -31,13 +31,14 @@ enum class OverrideStatus { kOverrideNotSet, kOverrideSet }; // For the given |origin|, grant permissions in |overrides| and reject all - // others. + // others. If no |origin| is specified, grant permissions to all origins in + // the browser context. OverrideStatus GrantOverridesForDevTools( - const url::Origin& origin, + const base::Optional<url::Origin>& origin, const std::vector<PermissionType>& permissions); OverrideStatus SetOverrideForDevTools( - const url::Origin& origin, - const PermissionType& permission, + const base::Optional<url::Origin>& origin, + PermissionType permission, const blink::mojom::PermissionStatus& status); void ResetOverridesForDevTools(); @@ -93,7 +94,8 @@ void NotifyChangedSubscriptions(const SubscriptionsStatusMap& old_statuses); void OnDelegatePermissionStatusChange(Subscription* subscription, blink::mojom::PermissionStatus status); - void UpdateDelegateOverridesForDevTools(const url::Origin& origin); + void UpdateDelegateOverridesForDevTools( + const base::Optional<url::Origin>& origin); DevToolsPermissionOverrides devtools_permission_overrides_; SubscriptionsMap subscriptions_;
diff --git a/content/browser/permissions/permission_controller_impl_unittest.cc b/content/browser/permissions/permission_controller_impl_unittest.cc index 7e4909e6..3a133ab 100644 --- a/content/browser/permissions/permission_controller_impl_unittest.cc +++ b/content/browser/permissions/permission_controller_impl_unittest.cc
@@ -42,11 +42,11 @@ const base::OnceCallback<void( const std::vector<blink::mojom::PermissionStatus>&)> callback)); MOCK_METHOD2(SetPermissionOverridesForDevTools, - void(const url::Origin& origin, + void(const base::Optional<url::Origin>& origin, const PermissionOverrides& overrides)); MOCK_METHOD0(ResetPermissionOverridesForDevTools, void()); MOCK_METHOD2(IsPermissionOverridableByDevTools, - bool(PermissionType, const url::Origin&)); + bool(PermissionType, const base::Optional<url::Origin>&)); private: DISALLOW_COPY_AND_ASSIGN(MockManagerWithRequests); @@ -92,7 +92,7 @@ } TEST_F(PermissionControllerImplTest, SettingOverridesForwardsUpdates) { - url::Origin kTestOrigin = url::Origin::Create(GURL(kTestUrl)); + auto kTestOrigin = base::make_optional(url::Origin::Create(GURL(kTestUrl))); EXPECT_CALL(*mock_manager(), SetPermissionOverridesForDevTools( kTestOrigin, testing::ElementsAre(testing::Pair(
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.cc b/content/browser/renderer_host/page_lifecycle_state_manager.cc new file mode 100644 index 0000000..df0a664 --- /dev/null +++ b/content/browser/renderer_host/page_lifecycle_state_manager.cc
@@ -0,0 +1,37 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/renderer_host/page_lifecycle_state_manager.h" + +#include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/public/browser/render_process_host.h" +#include "services/service_manager/public/cpp/interface_provider.h" + +namespace content { + +PageLifecycleStateManager::PageLifecycleStateManager( + RenderViewHostImpl* render_view_host_impl) + : render_view_host_impl_(render_view_host_impl) {} + +PageLifecycleStateManager::~PageLifecycleStateManager() = default; + +void PageLifecycleStateManager::SetIsFrozen(bool frozen) { + if (!render_view_host_impl_->GetAssociatedPageBroadcast()) { + // For some tests, |render_view_host_impl_| does not have the associated + // page. + return; + } + auto state = blink::mojom::PageLifecycleState::New(); + state->is_frozen = frozen; + + render_view_host_impl_->GetAssociatedPageBroadcast()->SetPageLifecycleState( + std::move(state), base::BindOnce(&PageLifecycleStateManager::OnFreezeAck, + weak_ptr_factory_.GetWeakPtr())); +} + +void PageLifecycleStateManager::OnFreezeAck() { + // TODO(yuzus): Implement OnPageFrozen and send changes to the observers. +} + +} // namespace content
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.h b/content/browser/renderer_host/page_lifecycle_state_manager.h new file mode 100644 index 0000000..79e14f6 --- /dev/null +++ b/content/browser/renderer_host/page_lifecycle_state_manager.h
@@ -0,0 +1,36 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_RENDERER_HOST_PAGE_LIFECYCLE_STATE_MANAGER_H_ +#define CONTENT_BROWSER_RENDERER_HOST_PAGE_LIFECYCLE_STATE_MANAGER_H_ + +#include "content/common/content_export.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "third_party/blink/public/mojom/page/page.mojom.h" + +namespace content { + +class RenderViewHostImpl; + +// A class responsible for managing the main lifecycle state of the blink::Page +// and communicating in to the RenderView. 1:1 with RenderViewHostImpl. +class CONTENT_EXPORT PageLifecycleStateManager { + public: + explicit PageLifecycleStateManager(RenderViewHostImpl* render_view_host_impl); + ~PageLifecycleStateManager(); + + void SetIsFrozen(bool frozen); + + private: + void OnFreezeAck(); + + RenderViewHostImpl* render_view_host_impl_; + + // NOTE: This must be the last member. + base::WeakPtrFactory<PageLifecycleStateManager> weak_ptr_factory_{this}; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_RENDERER_HOST_PAGE_LIFECYCLE_STATE_MANAGER_H_
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager_browsertest.cc b/content/browser/renderer_host/page_lifecycle_state_manager_browsertest.cc new file mode 100644 index 0000000..0a10b77b --- /dev/null +++ b/content/browser/renderer_host/page_lifecycle_state_manager_browsertest.cc
@@ -0,0 +1,80 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/location.h" +#include "content/browser/frame_host/frame_tree_node.h" +#include "content/browser/frame_host/render_frame_host_impl.h" +#include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/web_contents/web_contents_impl.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_browser_test.h" +#include "content/public/test/content_browser_test_utils.h" +#include "content/shell/browser/shell.h" +#include "net/test/embedded_test_server/embedded_test_server.h" + +namespace content { + +class PageLifecycleStateManagerBrowserTest : public ContentBrowserTest { + public: + ~PageLifecycleStateManagerBrowserTest() override = default; + + protected: + WebContentsImpl* web_contents() const { + return static_cast<WebContentsImpl*>(shell()->web_contents()); + } + + void StartRecordingEvents(RenderFrameHostImpl* rfh) { + EXPECT_TRUE(ExecJs(rfh, R"( + window.testObservedEvents = []; + let event_list = [ + 'freeze', + 'resume', + ]; + for (event_name of event_list) { + let result = event_name; + document.addEventListener(event_name, event => { + window.testObservedEvents.push('document.' + result); + }); + } + )")); + } + + void MatchEventList(RenderFrameHostImpl* rfh, + base::ListValue list, + base::Location location = base::Location::Current()) { + EXPECT_EQ(list, EvalJs(rfh, "window.testObservedEvents")) + << location.ToString(); + } + + RenderViewHostImpl* render_view_host() { + return static_cast<RenderViewHostImpl*>( + shell()->web_contents()->GetRenderViewHost()); + } + + RenderFrameHostImpl* current_frame_host() { + return static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root() + ->current_frame_host(); + } +}; + +IN_PROC_BROWSER_TEST_F(PageLifecycleStateManagerBrowserTest, SetFrozen) { + EXPECT_TRUE(embedded_test_server()->Start()); + GURL test_url = embedded_test_server()->GetURL("/empty.html"); + EXPECT_TRUE(NavigateToURL(shell(), test_url)); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + RenderViewHostImpl* rvh = render_view_host(); + RenderFrameHostImpl* rfh = current_frame_host(); + StartRecordingEvents(rfh); + // TODO(yuzus):Use PageLifecycleStateManager for visibility change. + shell()->web_contents()->WasHidden(); + + rvh->SetIsFrozen(/*frozen*/ true); + rvh->SetIsFrozen(/*frozen*/ false); + MatchEventList(rfh, ListValueOf("document.freeze", "document.resume")); +} + +} // namespace content
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 464c6df..200d25b6 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -251,6 +251,9 @@ input_device_change_observer_ = std::make_unique<InputDeviceChangeObserver>(this); + page_lifecycle_state_manager_ = + std::make_unique<PageLifecycleStateManager>(this); + GetWidget()->set_owner_delegate(this); } @@ -431,6 +434,10 @@ navigation_start)); } +void RenderViewHostImpl::SetIsFrozen(bool frozen) { + page_lifecycle_state_manager_->SetIsFrozen(frozen); +} + bool RenderViewHostImpl::IsRenderViewLive() { return GetProcess()->IsInitializedAndNotDead() && GetWidget()->renderer_initialized();
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 9418a36..70f9ea0f 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -22,6 +22,7 @@ #include "base/process/kill.h" #include "build/build_config.h" #include "content/browser/renderer_host/input/input_device_change_observer.h" +#include "content/browser/renderer_host/page_lifecycle_state_manager.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_owner_delegate.h" #include "content/browser/site_instance_impl.h" @@ -221,6 +222,8 @@ // to allow it to record the latency of this navigation. void LeaveBackForwardCache(base::TimeTicks navigation_start); + void SetIsFrozen(bool frozen); + // Called during frame eviction to return all SurfaceIds in the frame tree. // Marks all views in the frame tree as evicted. std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction(); @@ -309,6 +312,7 @@ // specific code away from this class. friend class RenderFrameHostImpl; friend class TestRenderViewHost; + friend class PageLifecycleStateManagerBrowserTest; FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, BasicRenderFrameHost); FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, RoutingIdSane); FRIEND_TEST_ALL_PREFIXES(RenderFrameHostManagerTest, @@ -385,6 +389,9 @@ // This monitors input changes so they can be reflected to the interaction MQ. std::unique_ptr<InputDeviceChangeObserver> input_device_change_observer_; + // This controls the lifecycle change and notify the renderer. + std::unique_ptr<PageLifecycleStateManager> page_lifecycle_state_manager_; + bool updating_web_preferences_ = false; // This tracks whether this RenderViewHost has notified observers about its
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index d249b1f..815125b 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -3863,6 +3863,35 @@ } } +// Test falling back to PIN for devices that support internal user verification +// but not uv token. +TEST_F(InternalUVAuthenticatorImplTest, MakeCredentialFallBackToPin) { + mojo::Remote<blink::mojom::Authenticator> authenticator = + ConnectToAuthenticator(); + + device::VirtualCtap2Device::Config config; + config.internal_uv_support = true; + config.pin_support = true; + config.user_verification_succeeds = false; + virtual_device_factory_->mutable_state()->pin = kTestPIN; + virtual_device_factory_->mutable_state()->pin_retries = + device::kMaxPinRetries; + virtual_device_factory_->mutable_state()->fingerprints_enrolled = true; + virtual_device_factory_->SetCtap2Config(config); + + auto options = + make_credential_options(device::UserVerificationRequirement::kRequired); + + TestMakeCredentialCallback callback_receiver; + authenticator->MakeCredential(std::move(options), + callback_receiver.callback()); + callback_receiver.WaitForCallback(); + + EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status()); + EXPECT_TRUE(HasUV(callback_receiver)); + EXPECT_TRUE(test_client_.collected_pin()); +} + TEST_F(InternalUVAuthenticatorImplTest, MakeCredentialCryptotoken) { auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>( base::Time::Now(), base::TimeTicks::Now()); @@ -3928,6 +3957,38 @@ } } +// Test falling back to PIN for devices that support internal user verification +// but not uv token. +TEST_F(InternalUVAuthenticatorImplTest, GetAssertionFallbackToPIN) { + mojo::Remote<blink::mojom::Authenticator> authenticator = + ConnectToAuthenticator(); + + device::VirtualCtap2Device::Config config; + config.internal_uv_support = true; + config.pin_support = true; + config.user_verification_succeeds = false; + virtual_device_factory_->mutable_state()->pin = kTestPIN; + virtual_device_factory_->mutable_state()->pin_retries = + device::kMaxPinRetries; + virtual_device_factory_->mutable_state()->fingerprints_enrolled = true; + virtual_device_factory_->SetCtap2Config(config); + + ASSERT_TRUE(virtual_device_factory_->mutable_state()->InjectRegistration( + get_credential_options()->allow_credentials[0].id(), + kTestRelyingPartyId)); + + auto options = + get_credential_options(device::UserVerificationRequirement::kRequired); + + TestGetAssertionCallback callback_receiver; + authenticator->GetAssertion(std::move(options), callback_receiver.callback()); + callback_receiver.WaitForCallback(); + + EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status()); + EXPECT_TRUE(HasUV(callback_receiver)); + EXPECT_TRUE(test_client_.collected_pin()); +} + TEST_F(InternalUVAuthenticatorImplTest, GetAssertionCryptotoken) { mojo::Remote<blink::mojom::Authenticator> authenticator = ConnectToAuthenticator();
diff --git a/content/browser/webrtc/OWNERS b/content/browser/webrtc/OWNERS index 0bec65a03..1dedf34e 100644 --- a/content/browser/webrtc/OWNERS +++ b/content/browser/webrtc/OWNERS
@@ -1,7 +1,7 @@ guidou@chromium.org tommi@chromium.org -per-file *test*=phoglund@chromium.org +per-file *test*=mbonadei@chromium.org # Original (legacy) owners. chfremer@chromium.org
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index af7b2f3..40c2cf2 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -440,6 +440,9 @@ sources = [ "associated_interfaces.mojom", + "ax_content_node_data.mojom", + "ax_content_tree_data.mojom", + "ax_content_tree_update.mojom", "child_process.mojom", "document_scoped_interface_bundle.mojom", "download/mhtml_file_writer.mojom",
diff --git a/content/common/accessibility_messages.h b/content/common/accessibility_messages.h index dff353c..bf70db0 100644 --- a/content/common/accessibility_messages.h +++ b/content/common/accessibility_messages.h
@@ -16,11 +16,9 @@ #include "ipc/ipc_param_traits.h" #include "ipc/param_traits_macros.h" #include "third_party/blink/public/web/web_ax_enums.h" -#include "ui/accessibility/ax_action_data.h" #include "ui/accessibility/ax_event.h" #include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_param_traits.h" -#include "ui/accessibility/ax_relative_bounds.h" #include "ui/accessibility/ax_tree_update.h" #include "ui/gfx/transform.h" @@ -29,37 +27,6 @@ #define IPC_MESSAGE_START AccessibilityMsgStart -IPC_ENUM_TRAITS_MAX_VALUE(content::AXContentIntAttribute, - content::AX_CONTENT_INT_ATTRIBUTE_LAST) -IPC_ENUM_TRAITS_MAX_VALUE(ax::mojom::Action, ax::mojom::Action::kMaxValue) - -IPC_ENUM_TRAITS_MAX_VALUE(ax::mojom::ScrollAlignment, - ax::mojom::ScrollAlignment::kMaxValue) - -IPC_ENUM_TRAITS_MAX_VALUE(ax::mojom::ScrollBehavior, - ax::mojom::ScrollBehavior::kMaxValue) - -IPC_STRUCT_TRAITS_BEGIN(ui::AXActionData) - IPC_STRUCT_TRAITS_MEMBER(action) - IPC_STRUCT_TRAITS_MEMBER(target_tree_id) - IPC_STRUCT_TRAITS_MEMBER(source_extension_id) - IPC_STRUCT_TRAITS_MEMBER(target_node_id) - IPC_STRUCT_TRAITS_MEMBER(request_id) - IPC_STRUCT_TRAITS_MEMBER(flags) - IPC_STRUCT_TRAITS_MEMBER(anchor_node_id) - IPC_STRUCT_TRAITS_MEMBER(anchor_offset) - IPC_STRUCT_TRAITS_MEMBER(focus_node_id) - IPC_STRUCT_TRAITS_MEMBER(focus_offset) - IPC_STRUCT_TRAITS_MEMBER(custom_action_id) - IPC_STRUCT_TRAITS_MEMBER(target_rect) - IPC_STRUCT_TRAITS_MEMBER(target_point) - IPC_STRUCT_TRAITS_MEMBER(value) - IPC_STRUCT_TRAITS_MEMBER(hit_test_event_to_fire) - IPC_STRUCT_TRAITS_MEMBER(horizontal_scroll_alignment) - IPC_STRUCT_TRAITS_MEMBER(vertical_scroll_alignment) - IPC_STRUCT_TRAITS_MEMBER(scroll_behavior) -IPC_STRUCT_TRAITS_END() - IPC_STRUCT_TRAITS_BEGIN(content::AXContentNodeData) IPC_STRUCT_TRAITS_MEMBER(id) IPC_STRUCT_TRAITS_MEMBER(role) @@ -72,8 +39,8 @@ IPC_STRUCT_TRAITS_MEMBER(intlist_attributes) IPC_STRUCT_TRAITS_MEMBER(html_attributes) IPC_STRUCT_TRAITS_MEMBER(child_ids) - IPC_STRUCT_TRAITS_MEMBER(content_int_attributes) IPC_STRUCT_TRAITS_MEMBER(relative_bounds) + IPC_STRUCT_TRAITS_MEMBER(child_routing_id) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(content::AXContentTreeData) @@ -115,14 +82,6 @@ IPC_STRUCT_MEMBER(std::vector<ui::AXEvent>, events) IPC_STRUCT_END() -IPC_STRUCT_BEGIN(AccessibilityHostMsg_LocationChangeParams) - // ID of the object whose location is changing. - IPC_STRUCT_MEMBER(int, id) - - // The object's new location info. - IPC_STRUCT_MEMBER(ui::AXRelativeBounds, new_location) -IPC_STRUCT_END() - // Messages sent from the browser to the renderer. // Tells the render view that a AccessibilityHostMsg_EventBundle @@ -131,13 +90,6 @@ // AccessibilityHostMsg_EventBundle. IPC_MESSAGE_ROUTED1(AccessibilityMsg_EventBundle_ACK, int /* ack_token */) -// Request a one-time snapshot of the accessibility tree without -// enabling accessibility if it wasn't already enabled. The passed id -// will be returned in the AccessibilityHostMsg_SnapshotResponse message. -IPC_MESSAGE_ROUTED2(AccessibilityMsg_SnapshotTree, - int /* callback id */, - ui::AXMode /* ax_mode */) - // Messages sent from the renderer to the browser. // Sent to notify the browser about renderer accessibility events. @@ -152,11 +104,6 @@ int /* reset_token */, int /* ack_token */) -// Sent to update the browser of the location of accessibility objects. -IPC_MESSAGE_ROUTED1( - AccessibilityHostMsg_LocationChanges, - std::vector<AccessibilityHostMsg_LocationChangeParams>) - // Sent in response to PerformAction with parameter kHitTest. IPC_MESSAGE_ROUTED5(AccessibilityHostMsg_ChildFrameHitTestResult, int /* action request id of initial caller */, @@ -165,11 +112,4 @@ int /* browser plugin instance id of child frame */, ax::mojom::Event /* event to fire */) -// Sent in response to AccessibilityMsg_SnapshotTree. The callback id that was -// passed to the request will be returned in |callback_id|, along with -// a standalone snapshot of the accessibility tree. -IPC_MESSAGE_ROUTED2(AccessibilityHostMsg_SnapshotResponse, - int /* callback_id */, - content::AXContentTreeUpdate) - #endif // CONTENT_COMMON_ACCESSIBILITY_MESSAGES_H_
diff --git a/content/common/ax_content_node_data.cc b/content/common/ax_content_node_data.cc index acd5465..69d550e 100644 --- a/content/common/ax_content_node_data.cc +++ b/content/common/ax_content_node_data.cc
@@ -7,104 +7,30 @@ #include <algorithm> #include "base/strings/string_number_conversions.h" +#include "content/common/ax_content_node_data.mojom.h" using base::NumberToString; namespace content { -namespace { - -// Helper function that finds a key in a vector of pairs by matching on the -// first value, and returns an iterator. -template<typename FirstType, typename SecondType> -typename std::vector<std::pair<FirstType, SecondType>>::const_iterator - FindInVectorOfPairs( - FirstType first, - const std::vector<std::pair<FirstType, SecondType>>& vector) { - return std::find_if(vector.begin(), - vector.end(), - [first](std::pair<FirstType, SecondType> const& p) { - return p.first == first; - }); -} - -} // namespace - -AXContentNodeData::AXContentNodeData() { -} - -AXContentNodeData::AXContentNodeData(const AXContentNodeData& other) = default; - -AXContentNodeData::AXContentNodeData(const AXNodeData& other) - : AXNodeData(other) { -} - -AXContentNodeData::~AXContentNodeData() { -} - -bool AXContentNodeData::HasContentIntAttribute( - AXContentIntAttribute attribute) const { - auto iter = FindInVectorOfPairs(attribute, content_int_attributes); - return iter != content_int_attributes.end(); -} - -int AXContentNodeData::GetContentIntAttribute( - AXContentIntAttribute attribute) const { - int result; - if (GetContentIntAttribute(attribute, &result)) - return result; - return 0; -} - -bool AXContentNodeData::GetContentIntAttribute( - AXContentIntAttribute attribute, int* value) const { - auto iter = FindInVectorOfPairs(attribute, content_int_attributes); - if (iter != content_int_attributes.end()) { - *value = iter->second; - return true; - } - - return false; -} - -void AXContentNodeData::AddContentIntAttribute(AXContentIntAttribute attribute, - int32_t value) { - content_int_attributes.push_back(std::make_pair(attribute, value)); +AXContentNodeData& AXContentNodeData::operator=(const AXNodeData& other) { + *static_cast<AXNodeData*>(this) = other; + return *this; } std::string AXContentNodeData::ToString() const { std::string result = AXNodeData::ToString(); - - for (auto iter : content_int_attributes) { - std::string value = NumberToString(iter.second); - switch (iter.first) { - case AX_CONTENT_ATTR_CHILD_ROUTING_ID: - result += " child_routing_id=" + value; - break; - case AX_CONTENT_INT_ATTRIBUTE_LAST: - NOTREACHED(); - break; - } - } - + if (child_routing_id != MSG_ROUTING_NONE) + result += " child_routing_id=" + NumberToString(child_routing_id); return result; } -AXContentTreeData::AXContentTreeData() - : AXTreeData(), - routing_id(-1), - parent_routing_id(-1) { -} - -AXContentTreeData::~AXContentTreeData() { -} - std::string AXContentTreeData::ToString() const { std::string result = AXTreeData::ToString(); - if (routing_id != -1) + if (routing_id != MSG_ROUTING_NONE) result += " routing_id=" + NumberToString(routing_id); - if (parent_routing_id != -1) + if (parent_routing_id != MSG_ROUTING_NONE) result += " parent_routing_id=" + NumberToString(parent_routing_id); return result;
diff --git a/content/common/ax_content_node_data.h b/content/common/ax_content_node_data.h index 866393b..ab7d4225 100644 --- a/content/common/ax_content_node_data.h +++ b/content/common/ax_content_node_data.h
@@ -8,55 +8,42 @@ #include <stdint.h> #include "content/common/content_export.h" +#include "ipc/ipc_message.h" #include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_tree_data.h" #include "ui/accessibility/ax_tree_update.h" namespace content { -enum AXContentIntAttribute { - // The routing ID of this node's child tree. - AX_CONTENT_ATTR_CHILD_ROUTING_ID, - - AX_CONTENT_INT_ATTRIBUTE_LAST -}; - // A subclass of AXNodeData that contains extra fields for // content-layer-specific AX attributes. struct CONTENT_EXPORT AXContentNodeData : public ui::AXNodeData { - AXContentNodeData(); - AXContentNodeData(const AXNodeData& other); - AXContentNodeData(const AXContentNodeData& other); - ~AXContentNodeData() override; - - bool HasContentIntAttribute(AXContentIntAttribute attribute) const; - int GetContentIntAttribute(AXContentIntAttribute attribute) const; - bool GetContentIntAttribute(AXContentIntAttribute attribute, - int* value) const; - void AddContentIntAttribute(AXContentIntAttribute attribute, int value); + AXContentNodeData() = default; + AXContentNodeData(const AXContentNodeData& other) = default; + ~AXContentNodeData() override = default; + AXContentNodeData& operator=(const AXNodeData& other); // Return a string representation of this data, for debugging. std::string ToString() const override; - // This is a simple serializable struct. All member variables should be - // public and copyable. - std::vector<std::pair<AXContentIntAttribute, int32_t>> content_int_attributes; + // The routing ID of this node's child tree. + int32_t child_routing_id = MSG_ROUTING_NONE; }; // A subclass of AXTreeData that contains extra fields for // content-layer-specific AX attributes. struct CONTENT_EXPORT AXContentTreeData : public ui::AXTreeData { - AXContentTreeData(); - ~AXContentTreeData() override; + AXContentTreeData() = default; + ~AXContentTreeData() override = default; // Return a string representation of this data, for debugging. std::string ToString() const override; // The routing ID of this frame. - int routing_id; + int routing_id = MSG_ROUTING_NONE; // The routing ID of the parent frame. - int parent_routing_id; + int parent_routing_id = MSG_ROUTING_NONE; }; typedef ui::AXTreeUpdateBase<content::AXContentNodeData,
diff --git a/content/common/ax_content_node_data.mojom b/content/common/ax_content_node_data.mojom new file mode 100644 index 0000000..ffc5d33 --- /dev/null +++ b/content/common/ax_content_node_data.mojom
@@ -0,0 +1,13 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module ax.mojom; + +import "ui/accessibility/mojom/ax_node_data.mojom"; + +// See content::AXContentNodeData for comments / explanations of these fields. +struct AXContentNodeData { + ax.mojom.AXNodeData node_data; + int32 child_routing_id; +};
diff --git a/content/common/ax_content_node_data.typemap b/content/common/ax_content_node_data.typemap new file mode 100644 index 0000000..09308bd --- /dev/null +++ b/content/common/ax_content_node_data.typemap
@@ -0,0 +1,13 @@ +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//content/common/ax_content_node_data.mojom" +public_headers = [ "//content/common/ax_content_node_data.h" ] +traits_headers = [ "//content/common/ax_content_node_data_mojom_traits.h" ] +sources = [ + "ax_content_node_data_mojom_traits.cc", + "ax_content_node_data_mojom_traits.h", +] +deps = [ "//ui/accessibility" ] +type_mappings = [ "ax.mojom.AXContentNodeData=::content::AXContentNodeData" ]
diff --git a/content/common/ax_content_node_data_mojom_traits.cc b/content/common/ax_content_node_data_mojom_traits.cc new file mode 100644 index 0000000..197060a --- /dev/null +++ b/content/common/ax_content_node_data_mojom_traits.cc
@@ -0,0 +1,24 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/common/ax_content_node_data_mojom_traits.h" +#include "ui/accessibility/ax_node_data.h" +#include "ui/accessibility/mojom/ax_node_data_mojom_traits.h" + +namespace mojo { + +// static +bool StructTraits< + ax::mojom::AXContentNodeDataDataView, + content::AXContentNodeData>::Read(ax::mojom::AXContentNodeDataDataView data, + content::AXContentNodeData* out) { + if (!data.ReadNodeData(static_cast<ui::AXNodeData*>(out))) + return false; + + out->child_routing_id = data.child_routing_id(); + + return true; +} + +} // namespace mojo
diff --git a/content/common/ax_content_node_data_mojom_traits.h b/content/common/ax_content_node_data_mojom_traits.h new file mode 100644 index 0000000..6b5800f --- /dev/null +++ b/content/common/ax_content_node_data_mojom_traits.h
@@ -0,0 +1,30 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_COMMON_AX_CONTENT_NODE_DATA_MOJOM_TRAITS_H_ +#define CONTENT_COMMON_AX_CONTENT_NODE_DATA_MOJOM_TRAITS_H_ + +#include "content/common/ax_content_node_data.h" +#include "content/common/ax_content_node_data.mojom-shared.h" +#include "ui/accessibility/ax_node_data.h" + +namespace mojo { + +template <> +struct StructTraits<ax::mojom::AXContentNodeDataDataView, + content::AXContentNodeData> { + static const ui::AXNodeData& node_data(const content::AXContentNodeData& p) { + return p; + } + static int32_t child_routing_id(const content::AXContentNodeData& p) { + return p.child_routing_id; + } + + static bool Read(ax::mojom::AXContentNodeDataDataView data, + content::AXContentNodeData* out); +}; + +} // namespace mojo + +#endif // CONTENT_COMMON_AX_CONTENT_NODE_DATA_MOJOM_TRAITS_H_
diff --git a/content/common/ax_content_tree_data.mojom b/content/common/ax_content_tree_data.mojom new file mode 100644 index 0000000..154ea56 --- /dev/null +++ b/content/common/ax_content_tree_data.mojom
@@ -0,0 +1,14 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module ax.mojom; + +import "ui/accessibility/mojom/ax_tree_data.mojom"; + +// See content::AXContentTreeData for comments / explanations of these fields. +struct AXContentTreeData { + ax.mojom.AXTreeData tree_data; + int32 routing_id; + int32 parent_routing_id; +};
diff --git a/content/common/ax_content_tree_data.typemap b/content/common/ax_content_tree_data.typemap new file mode 100644 index 0000000..3d336ca --- /dev/null +++ b/content/common/ax_content_tree_data.typemap
@@ -0,0 +1,13 @@ +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//content/common/ax_content_tree_data.mojom" +public_headers = [ "//content/common/ax_content_node_data.h" ] +traits_headers = [ "//content/common/ax_content_tree_data_mojom_traits.h" ] +sources = [ + "ax_content_tree_data_mojom_traits.cc", + "ax_content_tree_data_mojom_traits.h", +] +deps = [ "//ui/accessibility" ] +type_mappings = [ "ax.mojom.AXContentTreeData=::content::AXContentTreeData" ]
diff --git a/content/common/ax_content_tree_data_mojom_traits.cc b/content/common/ax_content_tree_data_mojom_traits.cc new file mode 100644 index 0000000..af214e2 --- /dev/null +++ b/content/common/ax_content_tree_data_mojom_traits.cc
@@ -0,0 +1,25 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/common/ax_content_tree_data_mojom_traits.h" +#include "ui/accessibility/ax_tree_data.h" +#include "ui/accessibility/mojom/ax_tree_data_mojom_traits.h" + +namespace mojo { + +// static +bool StructTraits< + ax::mojom::AXContentTreeDataDataView, + content::AXContentTreeData>::Read(ax::mojom::AXContentTreeDataDataView data, + content::AXContentTreeData* out) { + if (!data.ReadTreeData(static_cast<ui::AXTreeData*>(out))) + return false; + + out->routing_id = data.routing_id(); + out->parent_routing_id = data.parent_routing_id(); + + return true; +} + +} // namespace mojo
diff --git a/content/common/ax_content_tree_data_mojom_traits.h b/content/common/ax_content_tree_data_mojom_traits.h new file mode 100644 index 0000000..ef3657e --- /dev/null +++ b/content/common/ax_content_tree_data_mojom_traits.h
@@ -0,0 +1,33 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_COMMON_AX_CONTENT_TREE_DATA_MOJOM_TRAITS_H_ +#define CONTENT_COMMON_AX_CONTENT_TREE_DATA_MOJOM_TRAITS_H_ + +#include "content/common/ax_content_node_data.h" +#include "content/common/ax_content_tree_data.mojom-shared.h" +#include "ui/accessibility/ax_tree_data.h" + +namespace mojo { + +template <> +struct StructTraits<ax::mojom::AXContentTreeDataDataView, + content::AXContentTreeData> { + static const ui::AXTreeData& tree_data(const content::AXContentTreeData& p) { + return p; + } + static int32_t routing_id(const content::AXContentTreeData& p) { + return p.routing_id; + } + static int32_t parent_routing_id(const content::AXContentTreeData& p) { + return p.parent_routing_id; + } + + static bool Read(ax::mojom::AXContentTreeDataDataView data, + content::AXContentTreeData* out); +}; + +} // namespace mojo + +#endif // CONTENT_COMMON_AX_CONTENT_TREE_DATA_MOJOM_TRAITS_H_
diff --git a/content/common/ax_content_tree_update.mojom b/content/common/ax_content_tree_update.mojom new file mode 100644 index 0000000..7373065 --- /dev/null +++ b/content/common/ax_content_tree_update.mojom
@@ -0,0 +1,19 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module ax.mojom; + +import "ui/accessibility/ax_enums.mojom"; +import "content/common/ax_content_node_data.mojom"; +import "content/common/ax_content_tree_data.mojom"; + +// See content::AXContentTreeUpdate for comments / explanations of these fields. +struct AXContentTreeUpdate { + bool has_tree_data; + AXContentTreeData tree_data; + int32 node_id_to_clear; + int32 root_id; + array<AXContentNodeData> nodes; + ax.mojom.EventFrom event_from; +};
diff --git a/content/common/ax_content_tree_update.typemap b/content/common/ax_content_tree_update.typemap new file mode 100644 index 0000000..8050bc0c --- /dev/null +++ b/content/common/ax_content_tree_update.typemap
@@ -0,0 +1,13 @@ +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//content/common/ax_content_tree_update.mojom" +public_headers = [ "//content/common/ax_content_node_data.h" ] +traits_headers = [ "//content/common/ax_content_tree_update_mojom_traits.h" ] +sources = [ + "ax_content_tree_update_mojom_traits.cc", + "ax_content_tree_update_mojom_traits.h", +] +type_mappings = + [ "ax.mojom.AXContentTreeUpdate=::content::AXContentTreeUpdate" ]
diff --git a/content/common/ax_content_tree_update_mojom_traits.cc b/content/common/ax_content_tree_update_mojom_traits.cc new file mode 100644 index 0000000..9793bb2d --- /dev/null +++ b/content/common/ax_content_tree_update_mojom_traits.cc
@@ -0,0 +1,28 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/common/ax_content_tree_update_mojom_traits.h" + +namespace mojo { + +// static +bool StructTraits<ax::mojom::AXContentTreeUpdateDataView, + content::AXContentTreeUpdate>:: + Read(ax::mojom::AXContentTreeUpdateDataView data, + content::AXContentTreeUpdate* out) { + if (!data.ReadTreeData(&out->tree_data)) + return false; + + if (!data.ReadNodes(&out->nodes)) + return false; + + out->has_tree_data = data.has_tree_data(); + out->node_id_to_clear = data.node_id_to_clear(); + out->root_id = data.root_id(); + out->event_from = data.event_from(); + + return true; +} + +} // namespace mojo
diff --git a/content/common/ax_content_tree_update_mojom_traits.h b/content/common/ax_content_tree_update_mojom_traits.h new file mode 100644 index 0000000..015de489 --- /dev/null +++ b/content/common/ax_content_tree_update_mojom_traits.h
@@ -0,0 +1,47 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_COMMON_AX_CONTENT_TREE_UPDATE_MOJOM_TRAITS_H_ +#define CONTENT_COMMON_AX_CONTENT_TREE_UPDATE_MOJOM_TRAITS_H_ + +#include "content/common/ax_content_node_data.h" +#include "content/common/ax_content_node_data_mojom_traits.h" +#include "content/common/ax_content_tree_data_mojom_traits.h" +#include "content/common/ax_content_tree_update.mojom-shared.h" + +namespace mojo { + +template <> +struct StructTraits<ax::mojom::AXContentTreeUpdateDataView, + content::AXContentTreeUpdate> { + static bool has_tree_data(const content::AXContentTreeUpdate& p) { + return p.has_tree_data; + } + static const content::AXContentTreeData& tree_data( + const content::AXContentTreeUpdate& p) { + return p.tree_data; + } + static int32_t node_id_to_clear(const content::AXContentTreeUpdate& p) { + return p.node_id_to_clear; + } + static int32_t root_id(const content::AXContentTreeUpdate& p) { + return p.root_id; + } + static const std::vector<content::AXContentNodeData>& nodes( + const content::AXContentTreeUpdate& p) { + return p.nodes; + } + + static ax::mojom::EventFrom event_from( + const content::AXContentTreeUpdate& p) { + return p.event_from; + } + + static bool Read(ax::mojom::AXContentTreeUpdateDataView data, + content::AXContentTreeUpdate* out); +}; + +} // namespace mojo + +#endif // CONTENT_COMMON_AX_CONTENT_TREE_UPDATE_MOJOM_TRAITS_H_
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index db3ef34..00d9c34 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -4,6 +4,7 @@ module content.mojom; +import "content/common/ax_content_tree_update.mojom"; import "content/common/document_scoped_interface_bundle.mojom"; import "content/common/frame_messages.mojom"; import "content/common/native_types.mojom"; @@ -83,6 +84,12 @@ UpdateBrowserControlsState(BrowserControlsState constraints, BrowserControlsState current, bool animate); + + // Requests a one-time snapshot of the accessibility tree without enabling + // accessibility if it wasn't already enabled. + // See ui/accessibility/ax_mode.h for valid values of |ax_mode|. + SnapshotAccessibilityTree(uint32 ax_mode) + => (ax.mojom.AXContentTreeUpdate snapshot); }; // Implemented by the frame provider and currently must be associated with the
diff --git a/content/common/page_messages.h b/content/common/page_messages.h index bab308c3..285c1517a 100644 --- a/content/common/page_messages.h +++ b/content/common/page_messages.h
@@ -22,6 +22,7 @@ // Messages sent from the browser to the renderer. +// TODO(yuzus): Migrate this as a part of blink::mojom::SetPageLifecycleState. IPC_MESSAGE_ROUTED1(PageMsg_VisibilityChanged, content::PageVisibilityState) // Sent when the history for this page is altered from another process. The
diff --git a/content/common/render_accessibility.mojom b/content/common/render_accessibility.mojom index 0d48a174..f0645624 100644 --- a/content/common/render_accessibility.mojom +++ b/content/common/render_accessibility.mojom
@@ -5,6 +5,22 @@ module content.mojom; import "ui/accessibility/mojom/ax_action_data.mojom"; +import "ui/accessibility/mojom/ax_relative_bounds.mojom"; + +struct LocationChanges { + // ID of the object whose location is changing. + int32 id; + + // The object's new location info. + ax.mojom.AXRelativeBounds new_location; +}; + +// Interface for accessibility messages sent from the renderer to the browser, +// implemented by RenderFrameHostImpl in the browser process. +interface RenderAccessibilityHost { + // Sent to update the browser of the location of accessibility objects. + HandleAXLocationChanges(array<LocationChanges> changes); +}; // Interface for accessibility messages sent from RenderFrameHostImpl in the // browser process, implemented by the RenderAccessibilityManager object in the
diff --git a/content/common/typemaps.gni b/content/common/typemaps.gni index 48ddd889..7e051a59 100644 --- a/content/common/typemaps.gni +++ b/content/common/typemaps.gni
@@ -3,6 +3,9 @@ # found in the LICENSE file. typemaps = [ + "//content/common/ax_content_node_data.typemap", + "//content/common/ax_content_tree_data.typemap", + "//content/common/ax_content_tree_update.typemap", "//content/common/frame_messages.typemap", "//content/common/input/synchronous_compositor.typemap", "//content/common/native_types.typemap",
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index 0bce81c..615050e 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -1066,11 +1066,11 @@ return; } - AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType); - if (event == null) return; - // Check whether this type of event is one we want to throttle, and if not then send it if (!mEventsToThrottle.contains(eventType)) { + AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType); + if (event == null) return; + mView.requestSendAccessibilityEvent(mView, event); return; } @@ -1080,6 +1080,10 @@ // to be sent immediately and record the time and clear any lingering callbacks. long now = Calendar.getInstance().getTimeInMillis(); if (now - mEventLastFiredTimes.get(eventType, 0) >= ACCESSIBILITY_EVENT_DELAY) { + AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType); + // If accessibility is disabled or the node is invalid, returned event will be null. + if (event == null) return; + mView.requestSendAccessibilityEvent(mView, event); mView.removeCallbacks(mPendingEvents.get(eventType)); mPendingEvents.remove(eventType); @@ -1092,12 +1096,10 @@ Runnable myRunnable = () -> { // We have delayed firing this event, so accessibility may not be enabled or the - // node may be invalid. Only fire if neither of these are the case. - if (isAccessibilityEnabled() - && WebContentsAccessibilityImplJni.get().isNodeValid( - mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) { + // node may be invalid, in which case build will return a null event. + AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType); + if (event != null) { mView.requestSendAccessibilityEvent(mView, event); - // After sending event, record time it was sent mEventLastFiredTimes.put(eventType, Calendar.getInstance().getTimeInMillis()); } @@ -1114,10 +1116,12 @@ } private AccessibilityEvent buildAccessibilityEvent(int virtualViewId, int eventType) { - // If we don't have any frame info, then the virtual hierarchy - // doesn't exist in the view of the Android framework, so should - // never send any events. - if (!isAccessibilityEnabled() || !isFrameInfoInitialized()) { + // If accessibility is disabled, node is invalid, or we don't have any frame info, + // then the virtual hierarchy doesn't exist in the view of the Android framework, + // so should never send any events. + if (!isAccessibilityEnabled() || !isFrameInfoInitialized() + || !WebContentsAccessibilityImplJni.get().isNodeValid( + mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) { return null; }
diff --git a/content/public/browser/devtools_permission_overrides.cc b/content/public/browser/devtools_permission_overrides.cc index eb9f4693..f7ca1a064 100644 --- a/content/public/browser/devtools_permission_overrides.cc +++ b/content/public/browser/devtools_permission_overrides.cc
@@ -17,10 +17,12 @@ DevToolsPermissionOverrides& DevToolsPermissionOverrides::operator=( DevToolsPermissionOverrides&& other) = default; -void DevToolsPermissionOverrides::Set(const url::Origin& origin, - const PermissionType& permission, - const PermissionStatus status) { - PermissionOverrides& origin_overrides = overrides_[origin]; +void DevToolsPermissionOverrides::Set( + const base::Optional<url::Origin>& origin, + PermissionType permission, + const blink::mojom::PermissionStatus& status) { + PermissionOverrides& origin_overrides = + overrides_[origin.value_or(global_overrides_origin_)]; origin_overrides[permission] = status; // Special override status - MIDI_SYSEX is stronger than MIDI, meaning that @@ -37,29 +39,37 @@ base::Optional<PermissionStatus> DevToolsPermissionOverrides::Get( const url::Origin& origin, - const PermissionType& type) const { + PermissionType permission) const { auto current_override = overrides_.find(origin); if (current_override == overrides_.end()) + current_override = overrides_.find(global_overrides_origin_); + if (current_override == overrides_.end()) return base::nullopt; - auto new_status = current_override->second.find(type); - if (new_status == current_override->second.end()) - return base::nullopt; - - return base::make_optional(new_status->second); + auto new_status = current_override->second.find(permission); + if (new_status != current_override->second.end()) + return base::make_optional(new_status->second); + return base::nullopt; } const PermissionOverrides& DevToolsPermissionOverrides::GetAll( - const url::Origin& origin) const { + const base::Optional<url::Origin>& origin) const { static const base::NoDestructor<PermissionOverrides> empty_overrides; - auto it = overrides_.find(origin); + auto it = origin ? overrides_.find(*origin) : overrides_.end(); + if (it == overrides_.end()) + it = overrides_.find(global_overrides_origin_); if (it == overrides_.end()) return *empty_overrides; return it->second; } +void DevToolsPermissionOverrides::Reset( + const base::Optional<url::Origin>& origin) { + overrides_.erase(origin.value_or(global_overrides_origin_)); +} + void DevToolsPermissionOverrides::GrantPermissions( - const url::Origin& origin, + const base::Optional<url::Origin>& origin, const std::vector<PermissionType>& permissions) { const std::vector<PermissionType>& kAllPermissionTypes = GetAllPermissionTypes(); @@ -69,14 +79,8 @@ for (const auto& permission : permissions) granted_overrides[permission] = PermissionStatus::GRANTED; Reset(origin); - SetAll(origin, granted_overrides); -} - -void DevToolsPermissionOverrides::SetAll(const url::Origin& origin, - const PermissionOverrides& overrides) { - PermissionOverrides& current_override = overrides_[origin]; - for (const auto& setting : overrides) - current_override[setting.first] = setting.second; + for (const auto& setting : granted_overrides) + Set(origin, setting.first, setting.second); } } // namespace content
diff --git a/content/public/browser/devtools_permission_overrides.h b/content/public/browser/devtools_permission_overrides.h index 3095d53..8c685d0b 100644 --- a/content/public/browser/devtools_permission_overrides.h +++ b/content/public/browser/devtools_permission_overrides.h
@@ -32,31 +32,34 @@ base::flat_map<PermissionType, blink::mojom::PermissionStatus>; // Set permission override for |permission| at |origin| to |status|. - void Set(const url::Origin& origin, - const PermissionType& permission, - const blink::mojom::PermissionStatus status); + // Null |origin| specifies global overrides. + void Set(const base::Optional<url::Origin>& origin, + PermissionType permission, + const blink::mojom::PermissionStatus& status); // Get override for |origin| set for |permission|, if specified. base::Optional<blink::mojom::PermissionStatus> Get( const url::Origin& origin, - const PermissionType& permission) const; + PermissionType permission) const; - // Get all overrides for particular |origin|, stored in |overrides| if found. - // Will return empty overrides if none previously existed. - const PermissionOverrides& GetAll(const url::Origin& origin) const; + // Get all overrides for particular |origin|, stored in |overrides| + // if found. Will return empty overrides if none previously existed. Returns + // global overrides when |origin| is nullptr. + const PermissionOverrides& GetAll( + const base::Optional<url::Origin>& origin) const; // Resets overrides for |origin|. - void Reset(const url::Origin& origin) { overrides_.erase(origin); } + // Null |origin| resets global overrides. + void Reset(const base::Optional<url::Origin>& origin); - // Sets status for |permissions| to GRANTED in |origin|, and DENIED for all - // others. - void GrantPermissions(const url::Origin& origin, + // Sets status for |permissions| to GRANTED in |origin|, and DENIED + // for all others. + // Null |origin| grants permissions globally for context. + void GrantPermissions(const base::Optional<url::Origin>& origin, const std::vector<PermissionType>& permissions); private: - // Insert/adds every entry of |overrides| to |origin|'s overrides. - void SetAll(const url::Origin& origin, const PermissionOverrides& overrides); - + url::Origin global_overrides_origin_; base::flat_map<url::Origin, PermissionOverrides> overrides_; };
diff --git a/content/public/browser/permission_controller_delegate.cc b/content/public/browser/permission_controller_delegate.cc index cd833f2..d2dc1935 100644 --- a/content/public/browser/permission_controller_delegate.cc +++ b/content/public/browser/permission_controller_delegate.cc
@@ -8,7 +8,7 @@ bool PermissionControllerDelegate::IsPermissionOverridableByDevTools( PermissionType permission, - const url::Origin& origin) { + const base::Optional<url::Origin>& origin) { return true; }
diff --git a/content/public/browser/permission_controller_delegate.h b/content/public/browser/permission_controller_delegate.h index fed32f8..e47de2a 100644 --- a/content/public/browser/permission_controller_delegate.h +++ b/content/public/browser/permission_controller_delegate.h
@@ -100,7 +100,7 @@ // are tracked by the delegate. This method should only be called by the // PermissionController owning the delegate. virtual void SetPermissionOverridesForDevTools( - const url::Origin& origin, + const base::Optional<url::Origin>& origin, const PermissionOverrides& overrides) {} // Removes overrides that have been set, if any, for all origins. If delegate @@ -109,8 +109,9 @@ // Returns whether permission can be overridden by // DevToolsPermissionOverrides. - virtual bool IsPermissionOverridableByDevTools(PermissionType permission, - const url::Origin& origin); + virtual bool IsPermissionOverridableByDevTools( + PermissionType permission, + const base::Optional<url::Origin>& origin); }; } // namespace content
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 423c32b..e512760 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -622,7 +622,7 @@ } bool NavigateIframeToURL(WebContents* web_contents, - std::string iframe_id, + const std::string& iframe_id, const GURL& url) { std::string script = base::StringPrintf( "setTimeout(\""
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index 123f31b..160f61e 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h
@@ -133,7 +133,7 @@ // finishes. Uses a renderer-initiated navigation from script code in the // main frame. bool NavigateIframeToURL(WebContents* web_contents, - std::string iframe_id, + const std::string& iframe_id, const GURL& url); // Generate a URL for a file path including a query string. @@ -385,7 +385,7 @@ bool IsWebcamAvailableOnSystem(WebContents* web_contents); // Allow ExecuteScript* methods to target either a WebContents or a -// RenderFrameHost. Targetting a WebContents means executing the script in the +// RenderFrameHost. Targeting a WebContents means executing the script in the // RenderFrameHost returned by WebContents::GetMainFrame(), which is the main // frame. Pass a specific RenderFrameHost to target it. Embedders may declare // additional ConvertToRenderFrameHost functions for convenience.
diff --git a/content/public/test/test_service.cc b/content/public/test/test_service.cc index 4497f375..7aecbcd 100644 --- a/content/public/test/test_service.cc +++ b/content/public/test/test_service.cc
@@ -57,8 +57,21 @@ std::move(callback).Run(requestor_name_); } -void TestService::CreateSharedBuffer(const std::string& message, - CreateSharedBufferCallback callback) { +void TestService::CreateReadOnlySharedMemoryRegion( + const std::string& message, + CreateReadOnlySharedMemoryRegionCallback callback) { + NOTREACHED(); +} + +void TestService::CreateWritableSharedMemoryRegion( + const std::string& message, + CreateWritableSharedMemoryRegionCallback callback) { + NOTREACHED(); +} + +void TestService::CreateUnsafeSharedMemoryRegion( + const std::string& message, + CreateUnsafeSharedMemoryRegionCallback callback) { NOTREACHED(); }
diff --git a/content/public/test/test_service.h b/content/public/test/test_service.h index 3710c54..1bd344b 100644 --- a/content/public/test/test_service.h +++ b/content/public/test/test_service.h
@@ -41,8 +41,15 @@ void DoCrashImmediately(DoCrashImmediatelyCallback callback) override; void CreateFolder(CreateFolderCallback callback) override; void GetRequestorName(GetRequestorNameCallback callback) override; - void CreateSharedBuffer(const std::string& message, - CreateSharedBufferCallback callback) override; + void CreateReadOnlySharedMemoryRegion( + const std::string& message, + CreateReadOnlySharedMemoryRegionCallback callback) override; + void CreateWritableSharedMemoryRegion( + const std::string& message, + CreateWritableSharedMemoryRegionCallback callback) override; + void CreateUnsafeSharedMemoryRegion( + const std::string& message, + CreateUnsafeSharedMemoryRegionCallback callback) override; service_manager::ServiceBinding service_binding_; service_manager::BinderRegistry registry_;
diff --git a/content/public/test/test_service.mojom b/content/public/test/test_service.mojom index 166e45e..3580ebd9 100644 --- a/content/public/test/test_service.mojom +++ b/content/public/test/test_service.mojom
@@ -4,6 +4,8 @@ module content.mojom; +import "mojo/public/mojom/base/shared_memory.mojom"; + interface TestService { // Doesn't actually do anything, just responds. DoSomething() => (); @@ -22,7 +24,21 @@ // Retrieve the requestor name as seen by the test app providing this service. GetRequestorName() => (string name); - // Requests that a new shared buffer be created and returned. If successful, - // |buffer| is non-null and its contents match |message|'s bytes exactly. - CreateSharedBuffer(string message) => (handle<shared_buffer>? buffer); + // Requests that a new read-only shared memory region be created and + // returned. On success, |region| is valid and its contents match |message|'s + // bytes exactly. + CreateReadOnlySharedMemoryRegion(string message) + => (mojo_base.mojom.ReadOnlySharedMemoryRegion? region); + + // Requests that a new writable shared memory region be created and + // returned. On success, |region| is valid and its contents match |message|'s + // bytes exactly. + CreateWritableSharedMemoryRegion(string message) + => (mojo_base.mojom.WritableSharedMemoryRegion? region); + + // Requests that a new unsafe shared memory region be created and returned. + // On success, |region| is valid and its contents match |message|'s bytes + // exactly. + CreateUnsafeSharedMemoryRegion(string message) + => (mojo_base.mojom.UnsafeSharedMemoryRegion? region); };
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index 159469f..b1086d9 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -15,7 +15,6 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" -#include "content/common/accessibility_messages.h" #include "content/public/common/content_features.h" #include "content/renderer/accessibility/ax_image_annotator.h" #include "content/renderer/accessibility/blink_ax_enum_conversion.h" @@ -1135,10 +1134,8 @@ // Frames and iframes. WebFrame* frame = WebFrame::FromFrameOwnerElement(element); - if (frame) { - dst->AddContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID, - RenderFrame::GetRoutingIdForWebFrame(frame)); - } + if (frame) + dst->child_routing_id = RenderFrame::GetRoutingIdForWebFrame(frame); } // Add the ids of *indirect* children - those who are children of this node,
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc index fee479db..8d85936 100644 --- a/content/renderer/accessibility/render_accessibility_impl.cc +++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -26,6 +26,7 @@ #include "content/renderer/accessibility/ax_image_annotator.h" #include "content/renderer/accessibility/blink_ax_action_target.h" #include "content/renderer/accessibility/blink_ax_enum_conversion.h" +#include "content/renderer/accessibility/render_accessibility_manager.h" #include "content/renderer/render_frame_impl.h" #include "content/renderer/render_frame_proxy.h" #include "content/renderer/render_view_impl.h" @@ -174,9 +175,12 @@ snapshotter.SnapshotContentTree(ax_mode, kMaxSnapshotNodeCount, response); } -RenderAccessibilityImpl::RenderAccessibilityImpl(RenderFrameImpl* render_frame, - ui::AXMode mode) +RenderAccessibilityImpl::RenderAccessibilityImpl( + RenderAccessibilityManager* const render_accessibility_manager, + RenderFrameImpl* const render_frame, + ui::AXMode mode) : RenderFrameObserver(render_frame), + render_accessibility_manager_(render_accessibility_manager), render_frame_(render_frame), tree_source_(render_frame, mode), serializer_(&tree_source_), @@ -812,7 +816,7 @@ void RenderAccessibilityImpl::SendLocationChanges() { TRACE_EVENT0("accessibility", "RenderAccessibilityImpl::SendLocationChanges"); - std::vector<AccessibilityHostMsg_LocationChangeParams> messages; + std::vector<mojom::LocationChangesPtr> changes; // Update layout on the root of the tree. WebAXObject root = tree_source_.GetRoot(); @@ -846,12 +850,8 @@ if (!container_transform.isIdentity()) new_location.transform = base::WrapUnique( new gfx::Transform(container_transform)); - if (iter->second != new_location) { - AccessibilityHostMsg_LocationChangeParams message; - message.id = id; - message.new_location = new_location; - messages.push_back(message); - } + if (iter->second != new_location) + changes.push_back(mojom::LocationChanges::New(id, new_location)); // Save the new location. new_locations[id] = new_location; @@ -864,7 +864,7 @@ } locations_.swap(new_locations); - Send(new AccessibilityHostMsg_LocationChanges(routing_id(), messages)); + render_accessibility_manager_->HandleLocationChanges(std::move(changes)); } void RenderAccessibilityImpl::OnEventsAck(int ack_token) { @@ -897,10 +897,10 @@ AXContentNodeData data; ScopedFreezeBlinkAXTreeSource freeze(&tree_source_); tree_source_.SerializeNode(obj, &data); - if (data.HasContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID)) { + if (data.child_routing_id != MSG_ROUTING_NONE) { gfx::Point transformed_point = point; - bool is_remote_frame = RenderFrameProxy::FromRoutingID( - data.GetContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID)); + bool is_remote_frame = + RenderFrameProxy::FromRoutingID(data.child_routing_id); if (is_remote_frame) { // Remote frames don't have access to the information from the visual // viewport regarding the visual viewport offset, so we adjust the @@ -917,8 +917,7 @@ } Send(new AccessibilityHostMsg_ChildFrameHitTestResult( routing_id(), action_request_id, transformed_point, - data.GetContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID), 0, - event_to_fire)); + data.child_routing_id, 0, event_to_fire)); return; } @@ -1019,13 +1018,13 @@ if (!render_frame_) return; mojo::PendingRemote<image_annotation::mojom::Annotator> annotator; - render_frame()->GetBrowserInterfaceBroker()->GetInterface( + render_frame_->GetBrowserInterfaceBroker()->GetInterface( annotator.InitWithNewPipeAndPassReceiver()); const std::string preferred_language = - render_frame()->render_view() + render_frame_->render_view() ? GetPreferredLanguage( - render_frame()->render_view()->GetAcceptLanguages()) + render_frame_->render_view()->GetAcceptLanguages()) : std::string(); ax_image_annotator_ = std::make_unique<AXImageAnnotator>( this, preferred_language, std::move(annotator));
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h index 71ef56e0..3e16e83 100644 --- a/content/renderer/accessibility/render_accessibility_impl.h +++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "content/common/ax_content_node_data.h" #include "content/common/content_export.h" +#include "content/common/render_accessibility.mojom.h" #include "content/public/renderer/plugin_ax_tree_source.h" #include "content/public/renderer/render_accessibility.h" #include "content/public/renderer/render_frame.h" @@ -39,6 +40,7 @@ class AXImageAnnotator; class RenderFrameImpl; +class RenderAccessibilityManager; using BlinkAXTreeSerializer = ui:: AXTreeSerializer<blink::WebAXObject, AXContentNodeData, AXContentTreeData>; @@ -67,27 +69,28 @@ AXTreeSnapshotterImpl& operator=(const AXTreeSnapshotterImpl&) = delete; }; -// The browser process implements native accessibility APIs, allowing -// assistive technology (e.g., screen readers, magnifiers) to access and -// control the web contents with high-level APIs. These APIs are also used -// by automation tools, and Windows 8 uses them to determine when the -// on-screen keyboard should be shown. +// The browser process implements native accessibility APIs, allowing assistive +// technology (e.g., screen readers, magnifiers) to access and control the web +// contents with high-level APIs. These APIs are also used by automation tools, +// and Windows 8 uses them to determine when the on-screen keyboard should be +// shown. // -// An instance of this class belongs to RenderFrameImpl. Accessibility is -// initialized based on the ui::AXMode of RenderFrameImpl; it lazily -// starts as Off or EditableTextOnly depending on the operating system, and -// switches to Complete if assistive technology is detected or a flag is set. +// An instance of this class belongs to the RenderAccessibilityManager object. +// Accessibility is initialized based on the ui::AXMode passed from the browser +// process to the manager object; it lazily starts as Off or EditableTextOnly +// depending on the operating system, and switches to Complete if assistive +// technology is detected or a flag is set. // // A tree of accessible objects is built here and sent to the browser process; -// the browser process maintains this as a tree of platform-native -// accessible objects that can be used to respond to accessibility requests -// from other processes. +// the browser process maintains this as a tree of platform-native accessible +// objects that can be used to respond to accessibility requests from other +// processes. // // This class implements complete accessibility support for assistive // technology. It turns on Blink's accessibility code and sends a serialized // representation of that tree whenever it changes. It also handles requests -// from the browser to perform accessibility actions on nodes in the tree -// (e.g., change focus, or click on a button). +// from the browser to perform accessibility actions on nodes in the tree (e.g., +// change focus, or click on a button). class CONTENT_EXPORT RenderAccessibilityImpl : public RenderAccessibility, public RenderFrameObserver, @@ -99,11 +102,12 @@ AXContentTreeUpdate* response, ui::AXMode ax_mode); - RenderAccessibilityImpl(RenderFrameImpl* const render_frame, ui::AXMode mode); + RenderAccessibilityImpl( + RenderAccessibilityManager* const render_accessibility_manager, + RenderFrameImpl* const render_frame, + ui::AXMode mode); ~RenderAccessibilityImpl() override; - RenderFrameImpl* render_frame() { return render_frame_; } - ui::AXMode GetAccessibilityMode() { return tree_source_.accessibility_mode(); } @@ -194,7 +198,10 @@ // Returns the document for the active popup if any. blink::WebDocument GetPopupDocument(); - // The RenderFrameImpl that owns us. + // The RenderAccessibilityManager that owns us. + RenderAccessibilityManager* render_accessibility_manager_; + + // The associated RenderFrameImpl by means of the RenderAccessibilityManager. RenderFrameImpl* render_frame_; // This keeps accessibility enabled as long as it lives.
diff --git a/content/renderer/accessibility/render_accessibility_manager.cc b/content/renderer/accessibility/render_accessibility_manager.cc index 56258b5..115b897 100644 --- a/content/renderer/accessibility/render_accessibility_manager.cc +++ b/content/renderer/accessibility/render_accessibility_manager.cc
@@ -49,8 +49,8 @@ if (new_mode.has_mode(ui::AXMode::kWebContents) && !old_mode.has_mode(ui::AXMode::kWebContents)) { - render_accessibility_ = - std::make_unique<RenderAccessibilityImpl>(render_frame_, new_mode); + render_accessibility_ = std::make_unique<RenderAccessibilityImpl>( + this, render_frame_, new_mode); } else if (!new_mode.has_mode(ui::AXMode::kWebContents) && old_mode.has_mode(ui::AXMode::kWebContents)) { render_accessibility_.reset(); @@ -78,4 +78,19 @@ render_accessibility_->Reset(reset_token); } +void RenderAccessibilityManager::HandleLocationChanges( + std::vector<mojom::LocationChangesPtr> changes) { + GetOrCreateRemoteRenderAccessibilityHost()->HandleAXLocationChanges( + std::move(changes)); +} + +mojo::AssociatedRemote<mojom::RenderAccessibilityHost>& +RenderAccessibilityManager::GetOrCreateRemoteRenderAccessibilityHost() { + if (!render_accessibility_host_) { + render_frame_->GetRemoteAssociatedInterfaces()->GetInterface( + &render_accessibility_host_); + } + return render_accessibility_host_; +} + } // namespace content
diff --git a/content/renderer/accessibility/render_accessibility_manager.h b/content/renderer/accessibility/render_accessibility_manager.h index e2f23d5..7f87facd 100644 --- a/content/renderer/accessibility/render_accessibility_manager.h +++ b/content/renderer/accessibility/render_accessibility_manager.h
@@ -11,6 +11,7 @@ #include "content/common/content_export.h" #include "content/common/render_accessibility.mojom.h" #include "mojo/public/cpp/bindings/associated_receiver.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "ui/accessibility/ax_action_data.h" #include "ui/accessibility/ax_mode.h" @@ -59,7 +60,15 @@ void PerformAction(const ui::AXActionData& data) override; void Reset(int32_t reset_token) override; + // Communication with the browser process. + void HandleLocationChanges(std::vector<mojom::LocationChangesPtr> changes); + private: + // Returns the associated remote used to send messages to the browser process, + // lazily initializing it the first time it's used. + mojo::AssociatedRemote<mojom::RenderAccessibilityHost>& + GetOrCreateRemoteRenderAccessibilityHost(); + // The RenderFrameImpl that owns us. RenderFrameImpl* render_frame_; @@ -69,6 +78,10 @@ // Endpoint to receive and handle messages from the browser process. mojo::AssociatedReceiver<mojom::RenderAccessibility> receiver_{this}; + // Endpoint to send messages to the browser process. + mojo::AssociatedRemote<mojom::RenderAccessibilityHost> + render_accessibility_host_; + DISALLOW_COPY_AND_ASSIGN(RenderAccessibilityManager); };
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index b5e1542..e65c52f5 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -49,7 +49,6 @@ #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "cc/base/switches.h" -#include "content/common/accessibility_messages.h" #include "content/common/associated_interfaces.mojom.h" #include "content/common/content_constants_internal.h" #include "content/common/content_navigation_policy.h" @@ -2181,8 +2180,6 @@ IPC_MESSAGE_HANDLER(FrameMsg_VisualStateRequest, OnVisualStateRequest) IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) - IPC_MESSAGE_HANDLER(AccessibilityMsg_SnapshotTree, - OnSnapshotAccessibilityTree) IPC_MESSAGE_HANDLER(FrameMsg_UpdateOpener, OnUpdateOpener) IPC_MESSAGE_HANDLER(FrameMsg_AdvanceFocus, OnAdvanceFocus) IPC_MESSAGE_HANDLER(FrameMsg_GetSavableResourceLinks, @@ -2603,14 +2600,6 @@ std::make_unique<FrameHostMsg_VisualStateResponse>(routing_id_, id)); } -void RenderFrameImpl::OnSnapshotAccessibilityTree(int callback_id, - ui::AXMode ax_mode) { - AXContentTreeUpdate response; - RenderAccessibilityImpl::SnapshotAccessibilityTree(this, &response, ax_mode); - Send(new AccessibilityHostMsg_SnapshotResponse( - routing_id_, callback_id, response)); -} - void RenderFrameImpl::OnPortalActivated( const base::UnguessableToken& portal_token, mojo::PendingAssociatedRemote<blink::mojom::Portal> portal, @@ -2665,6 +2654,15 @@ static_cast<cc::BrowserControlsState>(current), animate); } +void RenderFrameImpl::SnapshotAccessibilityTree( + uint32_t ax_mode, + SnapshotAccessibilityTreeCallback callback) { + AXContentTreeUpdate response; + RenderAccessibilityImpl::SnapshotAccessibilityTree(this, &response, + ui::AXMode(ax_mode)); + std::move(callback).Run(response); +} + #if defined(OS_ANDROID) void RenderFrameImpl::ExtractSmartClipData( const gfx::Rect& rect,
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 15005470..aab87eff 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -508,6 +508,9 @@ void UpdateBrowserControlsState(BrowserControlsState constraints, BrowserControlsState current, bool animate) override; + void SnapshotAccessibilityTree( + uint32_t ax_mode, + SnapshotAccessibilityTreeCallback callback) override; #if defined(OS_ANDROID) void ExtractSmartClipData( @@ -1036,7 +1039,6 @@ void OnVisualStateRequest(uint64_t key); // TODO(https://crbug.com/995428): Deprecated. void OnReload(); - void OnSnapshotAccessibilityTree(int callback_id, ui::AXMode ax_mode); void OnUpdateOpener(int opener_routing_id); void OnAdvanceFocus(blink::mojom::FocusType type, int32_t source_routing_id); void OnGetSavableResourceLinks();
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index cad3bfce..5995562 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -533,7 +533,8 @@ frame_widget()->OnMessageReceived(set_viewport_intersection_message); // Setting a new frame intersection in a local frame triggers the render frame // observer call. - EXPECT_EQ(observer.last_intersection_rect(), blink::WebRect(0, 0, 200, 140)); + EXPECT_EQ(observer.last_intersection_rect(), + blink::WebRect(7, -11, 200, 140)); } // Used to annotate the source of an interface request.
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 1591ba9..1e698fb9 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -212,21 +212,6 @@ RenderWidget* render_widget_; }; -class ScopedUkmRafAlignedInputTimer { - public: - explicit ScopedUkmRafAlignedInputTimer(blink::WebWidget* webwidget) - : webwidget_(webwidget) { - webwidget_->BeginRafAlignedInput(); - } - - ~ScopedUkmRafAlignedInputTimer() { webwidget_->EndRafAlignedInput(); } - - private: - blink::WebWidget* webwidget_; - - DISALLOW_COPY_AND_ASSIGN(ScopedUkmRafAlignedInputTimer); -}; - bool IsDateTimeInput(ui::TextInputType type) { return type == ui::TEXT_INPUT_TYPE_DATE || type == ui::TEXT_INPUT_TYPE_DATE_TIME || @@ -1164,22 +1149,13 @@ void RenderWidget::BeginMainFrame(base::TimeTicks frame_time) { DCHECK(!IsForProvisionalFrame()); - - // We record metrics only when running in multi-threaded mode, not - // single-thread mode for testing. - bool record_main_frame_metrics = - !!compositor_deps_->GetCompositorImplThreadTaskRunner(); - { - base::Optional<ScopedUkmRafAlignedInputTimer> ukm_timer; - if (record_main_frame_metrics) { - ukm_timer.emplace(GetWebWidget()); - } - input_event_queue_->DispatchRafAlignedInput(frame_time); - } - GetWebWidget()->BeginFrame(frame_time); } +void RenderWidget::DispatchRafAlignedInput(base::TimeTicks frame_time) { + input_event_queue_->DispatchRafAlignedInput(frame_time); +} + void RenderWidget::OnDeferMainFrameUpdatesChanged(bool deferral_state) { // LayerTreeHost::CreateThreaded() will defer main frame updates immediately // until it gets a LocalSurfaceIdAllocation. That's before the
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 536a1e2..7c9455e 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h
@@ -429,6 +429,7 @@ bool is_pinch_gesture_active, float minimum, float maximum) override; + void DispatchRafAlignedInput(base::TimeTicks frame_time) override; void RequestDecode(const cc::PaintImage& image, base::OnceCallback<void(bool)> callback) override; void NotifySwapTime(blink::WebReportTimeCallback callback) override;
diff --git a/content/shell/renderer/shell_content_renderer_client.cc b/content/shell/renderer/shell_content_renderer_client.cc index d96ad800..194a43c 100644 --- a/content/shell/renderer/shell_content_renderer_client.cc +++ b/content/shell/renderer/shell_content_renderer_client.cc
@@ -86,8 +86,21 @@ std::move(callback).Run("Not implemented."); } - void CreateSharedBuffer(const std::string& message, - CreateSharedBufferCallback callback) override { + void CreateReadOnlySharedMemoryRegion( + const std::string& message, + CreateReadOnlySharedMemoryRegionCallback callback) override { + NOTREACHED(); + } + + void CreateWritableSharedMemoryRegion( + const std::string& message, + CreateWritableSharedMemoryRegionCallback callback) override { + NOTREACHED(); + } + + void CreateUnsafeSharedMemoryRegion( + const std::string& message, + CreateUnsafeSharedMemoryRegionCallback callback) override { NOTREACHED(); }
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc index ea46a70..62382f3 100644 --- a/content/shell/utility/shell_content_utility_client.cc +++ b/content/shell/utility/shell_content_utility_client.cc
@@ -9,8 +9,13 @@ #include "base/bind.h" #include "base/command_line.h" +#include "base/containers/span.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/ptr_util.h" +#include "base/memory/read_only_shared_memory_region.h" +#include "base/memory/shared_memory_mapping.h" +#include "base/memory/unsafe_shared_memory_region.h" +#include "base/memory/writable_shared_memory_region.h" #include "base/no_destructor.h" #include "base/process/process.h" #include "build/build_config.h" @@ -67,18 +72,39 @@ NOTREACHED(); } - void CreateSharedBuffer(const std::string& message, - CreateSharedBufferCallback callback) override { - mojo::ScopedSharedBufferHandle buffer = - mojo::SharedBufferHandle::Create(message.size()); - CHECK(buffer.is_valid()); - - mojo::ScopedSharedBufferMapping mapping = buffer->Map(message.size()); - CHECK(mapping); + void CreateReadOnlySharedMemoryRegion( + const std::string& message, + CreateReadOnlySharedMemoryRegionCallback callback) override { + base::MappedReadOnlyRegion map_and_region = + base::ReadOnlySharedMemoryRegion::Create(message.size()); + CHECK(map_and_region.IsValid()); std::copy(message.begin(), message.end(), - reinterpret_cast<char*>(mapping.get())); + map_and_region.mapping.GetMemoryAsSpan<char>().begin()); + std::move(callback).Run(std::move(map_and_region.region)); + } - std::move(callback).Run(std::move(buffer)); + void CreateWritableSharedMemoryRegion( + const std::string& message, + CreateWritableSharedMemoryRegionCallback callback) override { + auto region = base::WritableSharedMemoryRegion::Create(message.size()); + CHECK(region.IsValid()); + base::WritableSharedMemoryMapping mapping = region.Map(); + CHECK(mapping.IsValid()); + std::copy(message.begin(), message.end(), + mapping.GetMemoryAsSpan<char>().begin()); + std::move(callback).Run(std::move(region)); + } + + void CreateUnsafeSharedMemoryRegion( + const std::string& message, + CreateUnsafeSharedMemoryRegionCallback callback) override { + auto region = base::UnsafeSharedMemoryRegion::Create(message.size()); + CHECK(region.IsValid()); + base::WritableSharedMemoryMapping mapping = region.Map(); + CHECK(mapping.IsValid()); + std::copy(message.begin(), message.end(), + mapping.GetMemoryAsSpan<char>().begin()); + std::move(callback).Run(std::move(region)); } private:
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 3311cd3..43ff60c 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -587,9 +587,9 @@ group("fuchsia_telemetry_gpu_integration_test") { testonly = true deps = [ + ":telemetry_gpu_integration_test_scripts_only", "//fuchsia/engine:web_engine_runner", "//fuchsia/engine:web_engine_shell", - "//tools/perf/chrome_telemetry_build:telemetry_chrome_test_without_chrome", ] } } @@ -600,7 +600,13 @@ "//tools/perf/chrome_telemetry_build:telemetry_chrome_test_without_chrome", ] - data = [ "//content/test/gpu/" ] + data = [ + "//content/test/gpu/", + "//testing/scripts/run_isolated_script_test.py", + "//testing/scripts/common.py", + "//testing/xvfb.py", + "//testing/test_env.py", + ] } # browsertest_support can be used by targets that run content_shell based @@ -671,7 +677,10 @@ "frame_host_test_interface.mojom", "test_browser_associated_interfaces.mojom", ] - public_deps = [ "//url/mojom:url_mojom_gurl" ] + public_deps = [ + "//mojo/public/mojom/base", + "//url/mojom:url_mojom_gurl", + ] } mojom("web_ui_test_mojo_bindings") { @@ -1012,6 +1021,7 @@ "../browser/renderer_host/input/wheel_event_listener_browsertest.cc", "../browser/renderer_host/input/wheel_scroll_latching_browsertest.cc", "../browser/renderer_host/media/video_capture_browsertest.cc", + "../browser/renderer_host/page_lifecycle_state_manager_browsertest.cc", "../browser/renderer_host/panel_rotation_browsertest.cc", "../browser/renderer_host/render_process_host_browsertest.cc", "../browser/renderer_host/render_view_host_browsertest.cc",
diff --git a/device/fido/fido_request_handler_base.cc b/device/fido/fido_request_handler_base.cc index 431f39d2..a124609 100644 --- a/device/fido/fido_request_handler_base.cc +++ b/device/fido/fido_request_handler_base.cc
@@ -12,7 +12,10 @@ #include "base/logging.h" #include "base/strings/string_piece.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "base/time/time.h" +#include "base/timer/elapsed_timer.h" #include "build/build_config.h" +#include "components/device_event_log/device_event_log.h" #include "device/fido/ble_adapter_manager.h" #include "device/fido/fido_authenticator.h" #include "device/fido/fido_discovery_factory.h" @@ -21,8 +24,23 @@ #include "device/fido/win/authenticator.h" #endif +namespace { +// Authenticators that return a response in less than this time are likely to +// have done so without interaction from the user. +static const base::TimeDelta kMinExpectedAuthenticatorResponseTime = + base::TimeDelta::FromMilliseconds(300); +} // namespace + namespace device { +// FidoRequestHandlerBase::AuthenticatorState --------------------------------- + +FidoRequestHandlerBase::AuthenticatorState::AuthenticatorState( + FidoAuthenticator* authenticator) + : authenticator(authenticator) {} + +FidoRequestHandlerBase::AuthenticatorState::~AuthenticatorState() = default; + // FidoRequestHandlerBase::TransportAvailabilityInfo -------------------------- FidoRequestHandlerBase::TransportAvailabilityInfo::TransportAvailabilityInfo() = @@ -154,7 +172,7 @@ if (authenticator_it == active_authenticators_.end()) return; - InitializeAuthenticatorAndDispatchRequest(authenticator_it->second); + InitializeAuthenticatorAndDispatchRequest(authenticator_it->second.get()); } void FidoRequestHandlerBase::CancelActiveAuthenticators( @@ -164,7 +182,7 @@ DCHECK(!task_it->first.empty()); if (task_it->first != exclude_device_id) { DCHECK(task_it->second); - task_it->second->Cancel(); + task_it->second->authenticator->Cancel(); // Note that the pointer being erased is non-owning. The actual // FidoAuthenticator instance is owned by its discovery (which in turn is @@ -229,6 +247,20 @@ discovery->Start(); } +bool FidoRequestHandlerBase::AuthenticatorMayHaveReturnedImmediately( + const std::string& authenticator_id) { + auto it = active_authenticators_.find(authenticator_id); + if (it == active_authenticators_.end()) + return false; + + if (!it->second->timer) + return true; + + FIDO_LOG(DEBUG) << "Authenticator returned in " + << it->second->timer->Elapsed(); + return it->second->timer->Elapsed() < kMinExpectedAuthenticatorResponseTime; +} + void FidoRequestHandlerBase::AuthenticatorRemoved( FidoDiscoveryBase* discovery, FidoAuthenticator* authenticator) { @@ -271,7 +303,8 @@ if (observer_) { observer_->FidoAuthenticatorPairingModeChanged( - device_id, is_in_pairing_mode, it->second->GetDisplayName()); + device_id, is_in_pairing_mode, + it->second->authenticator->GetDisplayName()); } } @@ -296,7 +329,11 @@ FidoAuthenticator* authenticator) { DCHECK(authenticator && !base::Contains(active_authenticators(), authenticator->GetId())); - active_authenticators_.emplace(authenticator->GetId(), authenticator); + auto authenticator_state = + std::make_unique<AuthenticatorState>(authenticator); + auto* weak_authenticator_state = authenticator_state.get(); + active_authenticators_.emplace(authenticator->GetId(), + std::move(authenticator_state)); // If |observer_| exists, dispatching request to |authenticator| is // delegated to |observer_|. Else, dispatch request to |authenticator| @@ -318,7 +355,7 @@ FROM_HERE, base::BindOnce( &FidoRequestHandlerBase::InitializeAuthenticatorAndDispatchRequest, - GetWeakPtr(), authenticator)); + GetWeakPtr(), weak_authenticator_state)); } else { VLOG(2) << "Embedder controls the dispatch."; } @@ -347,10 +384,11 @@ } void FidoRequestHandlerBase::InitializeAuthenticatorAndDispatchRequest( - FidoAuthenticator* authenticator) { - authenticator->InitializeAuthenticator( - base::BindOnce(&FidoRequestHandlerBase::DispatchRequest, - weak_factory_.GetWeakPtr(), authenticator)); + AuthenticatorState* authenticator_state) { + authenticator_state->timer = std::make_unique<base::ElapsedTimer>(); + authenticator_state->authenticator->InitializeAuthenticator(base::BindOnce( + &FidoRequestHandlerBase::DispatchRequest, weak_factory_.GetWeakPtr(), + authenticator_state->authenticator)); } void FidoRequestHandlerBase::ConstructBleAdapterPowerManager() {
diff --git a/device/fido/fido_request_handler_base.h b/device/fido/fido_request_handler_base.h index 87c75e0e..1a183011 100644 --- a/device/fido/fido_request_handler_base.h +++ b/device/fido/fido_request_handler_base.h
@@ -25,6 +25,10 @@ #include "device/fido/fido_discovery_base.h" #include "device/fido/fido_transport_protocol.h" +namespace base { +class ElapsedTimer; +} + namespace device { class BleAdapterManager; @@ -39,8 +43,6 @@ class COMPONENT_EXPORT(DEVICE_FIDO) FidoRequestHandlerBase : public FidoDiscoveryBase::Observer { public: - using AuthenticatorMap = - std::map<std::string, FidoAuthenticator*, std::less<>>; using RequestCallback = base::RepeatingCallback<void(const std::string&)>; using BlePairingCallback = base::RepeatingCallback<void(std::string authenticator_id, @@ -50,6 +52,17 @@ enum class RequestType { kMakeCredential, kGetAssertion }; + struct AuthenticatorState { + explicit AuthenticatorState(FidoAuthenticator* authenticator); + ~AuthenticatorState(); + + FidoAuthenticator* authenticator; + std::unique_ptr<base::ElapsedTimer> timer; + }; + + using AuthenticatorMap = + std::map<std::string, std::unique_ptr<AuthenticatorState>, std::less<>>; + // Encapsulates data required to initiate WebAuthN UX dialog. Once all // components of TransportAvailabilityInfo is set, // AuthenticatorRequestClientDelegate should be notified. @@ -233,6 +246,13 @@ void Start(); + // Returns |true| if a short enough time has elapsed since the request was + // dispatched that an authenticator may be suspected to have returned a + // response without user interaction. + // Must be called after |DispatchRequest| is called. + bool AuthenticatorMayHaveReturnedImmediately( + const std::string& authenticator_id); + AuthenticatorMap& active_authenticators() { return active_authenticators_; } std::vector<std::unique_ptr<FidoDiscoveryBase>>& discoveries() { return discoveries_; @@ -273,7 +293,8 @@ // DispatchRequest(). InitializeAuthenticator() sends a GetInfo command // to FidoDeviceAuthenticator instances in order to determine their protocol // versions before a request can be dispatched. - void InitializeAuthenticatorAndDispatchRequest(FidoAuthenticator*); + void InitializeAuthenticatorAndDispatchRequest( + AuthenticatorState* authenticator_state); void ConstructBleAdapterPowerManager(); AuthenticatorMap active_authenticators_;
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc index dae12a3..3f57684 100644 --- a/device/fido/get_assertion_handler_unittest.cc +++ b/device/fido/get_assertion_handler_unittest.cc
@@ -845,7 +845,7 @@ EXPECT_EQ(handler->AuthenticatorsForTesting().size(), 1u); EXPECT_EQ(handler->AuthenticatorsForTesting() .begin() - ->second->IsWinNativeApiAuthenticator(), + ->second->authenticator->IsWinNativeApiAuthenticator(), enable_api); } }
diff --git a/device/fido/get_assertion_request_handler.cc b/device/fido/get_assertion_request_handler.cc index c55dc17..924942406 100644 --- a/device/fido/get_assertion_request_handler.cc +++ b/device/fido/get_assertion_request_handler.cc
@@ -398,6 +398,22 @@ authenticator->WillNeedPINToGetAssertion(request_, observer()) != PINDisposition::kUsePIN); + if ((status == CtapDeviceResponseCode::kCtap2ErrPinRequired || + status == CtapDeviceResponseCode::kCtap2ErrOperationDenied) && + authenticator->WillNeedPINToGetAssertion(request_, observer()) == + PINDisposition::kUsePINForFallback) { + // Some authenticators will return this error immediately without user + // interaction when internal UV is locked. + if (AuthenticatorMayHaveReturnedImmediately(authenticator->GetId())) { + authenticator->GetTouch(base::BindOnce( + &GetAssertionRequestHandler::StartPINFallbackForInternalUv, + weak_factory_.GetWeakPtr(), authenticator)); + return; + } + StartPINFallbackForInternalUv(authenticator); + return; + } + const base::Optional<GetAssertionStatus> maybe_result = ConvertDeviceResponseCode(status); if (!maybe_result) {
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc index 61a3705..c8e2d09 100644 --- a/device/fido/make_credential_request_handler.cc +++ b/device/fido/make_credential_request_handler.cc
@@ -421,6 +421,22 @@ will_need_pin == MakeCredentialPINDisposition::kNoPIN || will_need_pin == MakeCredentialPINDisposition::kUsePINForFallback); + if ((status == CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid || + status == CtapDeviceResponseCode::kCtap2ErrPinRequired) && + authenticator->WillNeedPINToMakeCredential(request_, observer()) == + MakeCredentialPINDisposition::kUsePINForFallback) { + // Some authenticators will return this error immediately without user + // interaction when internal UV is locked. + if (AuthenticatorMayHaveReturnedImmediately(authenticator->GetId())) { + authenticator->GetTouch(base::BindOnce( + &MakeCredentialRequestHandler::StartPINFallbackForInternalUv, + weak_factory_.GetWeakPtr(), authenticator)); + return; + } + StartPINFallbackForInternalUv(authenticator); + return; + } + const base::Optional<MakeCredentialStatus> maybe_result = ConvertDeviceResponseCode(status); if (!maybe_result) {
diff --git a/extensions/common/manifest_handlers/mime_types_handler.cc b/extensions/common/manifest_handlers/mime_types_handler.cc index f4874a5..f0dbb79 100644 --- a/extensions/common/manifest_handlers/mime_types_handler.cc +++ b/extensions/common/manifest_handlers/mime_types_handler.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include "base/logging.h" +#include "base/metrics/histogram_functions.h" #include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -22,6 +23,7 @@ namespace { +// This has to by in sync with MimeHandlerType enum. const char* const kMIMETypeHandlersWhitelist[] = { extension_misc::kPdfExtensionId, extension_misc::kQuickOfficeComponentExtensionId, @@ -29,6 +31,24 @@ extension_misc::kQuickOfficeExtensionId, extension_misc::kMimeHandlerPrivateTestExtensionId}; +// Used for UMA stats. Entries should not be renumbered and numeric values +// should never be reused. This corresponds to kMimeTypeHandlersWhitelist. +// Don't forget to update enums.xml when updating these. +enum class MimeHandlerType { + kPdfExtension = 0, + kQuickOfficeComponentExtension = 1, + kQuickOfficeInternalExtension = 2, + kQuickOfficeExtension = 3, + kTestExtension = 4, + + kMaxValue = kTestExtension, +}; + +static_assert( + base::size(kMIMETypeHandlersWhitelist) == + static_cast<size_t>(MimeHandlerType::kMaxValue) + 1, + "MimeHandlerType enum is not in sync with kMIMETypeHandlersWhitelist."); + constexpr SkColor kPdfExtensionBackgroundColor = SkColorSetRGB(82, 86, 89); constexpr SkColor kQuickOfficeExtensionBackgroundColor = SkColorSetRGB(241, 241, 241); @@ -41,11 +61,8 @@ ~MimeTypesHandlerInfo() override; }; -MimeTypesHandlerInfo::MimeTypesHandlerInfo() { -} - -MimeTypesHandlerInfo::~MimeTypesHandlerInfo() { -} +MimeTypesHandlerInfo::MimeTypesHandlerInfo() = default; +MimeTypesHandlerInfo::~MimeTypesHandlerInfo() = default; } // namespace @@ -57,11 +74,20 @@ return whitelist; } -MimeTypesHandler::MimeTypesHandler() { +// static +void MimeTypesHandler::ReportUsedHandler(const std::string& extension_id) { + auto* const* it = + std::find(std::begin(kMIMETypeHandlersWhitelist), + std::end(kMIMETypeHandlersWhitelist), extension_id); + if (it != std::end(kMIMETypeHandlersWhitelist)) { + MimeHandlerType type = static_cast<MimeHandlerType>( + it - std::begin(kMIMETypeHandlersWhitelist)); + base::UmaHistogramEnumeration("Extensions.UsedMimeTypeHandler", type); + } } -MimeTypesHandler::~MimeTypesHandler() { -} +MimeTypesHandler::MimeTypesHandler() = default; +MimeTypesHandler::~MimeTypesHandler() = default; void MimeTypesHandler::AddMIMEType(const std::string& mime_type) { mime_type_set_.insert(mime_type);
diff --git a/extensions/common/manifest_handlers/mime_types_handler.h b/extensions/common/manifest_handlers/mime_types_handler.h index 22dfd725..b9da14a 100644 --- a/extensions/common/manifest_handlers/mime_types_handler.h +++ b/extensions/common/manifest_handlers/mime_types_handler.h
@@ -20,6 +20,9 @@ static MimeTypesHandler* GetHandler(const extensions::Extension* extension); + // Sends a UMA stat about usage of the specific type handler. + static void ReportUsedHandler(const std::string& extension_id); + MimeTypesHandler(); ~MimeTypesHandler();
diff --git a/gpu/command_buffer/service/shared_image_backing_egl_image.cc b/gpu/command_buffer/service/shared_image_backing_egl_image.cc index d4e7f16..3117ba5 100644 --- a/gpu/command_buffer/service/shared_image_backing_egl_image.cc +++ b/gpu/command_buffer/service/shared_image_backing_egl_image.cc
@@ -68,6 +68,8 @@ gles2::Texture* GetTexture() override { return texture_; } + bool SupportsMultipleConcurrentReadAccess() override { return true; } + private: SharedImageBackingEglImage* egl_backing() { return static_cast<SharedImageBackingEglImage*>(backing());
diff --git a/gpu/command_buffer/service/shared_image_representation.cc b/gpu/command_buffer/service/shared_image_representation.cc index 810e7d83..93133a1 100644 --- a/gpu/command_buffer/service/shared_image_representation.cc +++ b/gpu/command_buffer/service/shared_image_representation.cc
@@ -54,6 +54,11 @@ return true; } +bool SharedImageRepresentationGLTextureBase:: + SupportsMultipleConcurrentReadAccess() { + return false; +} + gpu::TextureBase* SharedImageRepresentationGLTexture::GetTextureBase() { return GetTexture(); }
diff --git a/gpu/command_buffer/service/shared_image_representation.h b/gpu/command_buffer/service/shared_image_representation.h index f4278420..7d0d241 100644 --- a/gpu/command_buffer/service/shared_image_representation.h +++ b/gpu/command_buffer/service/shared_image_representation.h
@@ -169,6 +169,8 @@ // exist. virtual bool BeginAccess(GLenum mode); virtual void EndAccess() {} + + virtual bool SupportsMultipleConcurrentReadAccess(); }; class GPU_GLES2_EXPORT SharedImageRepresentationGLTexture
diff --git a/gpu/command_buffer/service/shared_image_representation_skia_gl.cc b/gpu/command_buffer/service/shared_image_representation_skia_gl.cc index 23ce89e..d23d5358 100644 --- a/gpu/command_buffer/service/shared_image_representation_skia_gl.cc +++ b/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
@@ -147,4 +147,8 @@ #endif } +bool SharedImageRepresentationSkiaGL::SupportsMultipleConcurrentReadAccess() { + return gl_representation_->SupportsMultipleConcurrentReadAccess(); +} + } // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_representation_skia_gl.h b/gpu/command_buffer/service/shared_image_representation_skia_gl.h index 216856d..f3f1111 100644 --- a/gpu/command_buffer/service/shared_image_representation_skia_gl.h +++ b/gpu/command_buffer/service/shared_image_representation_skia_gl.h
@@ -38,6 +38,8 @@ std::vector<GrBackendSemaphore>* end_semaphores) override; void EndReadAccess() override; + bool SupportsMultipleConcurrentReadAccess() override; + private: SharedImageRepresentationSkiaGL( std::unique_ptr<SharedImageRepresentationGLTextureBase> gl_representation,
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star index a7ed274c..a0a94ce8 100644 --- a/infra/config/buckets/ci.star +++ b/infra/config/buckets/ci.star
@@ -139,41 +139,6 @@ ) ci.android_builder( - name = 'Android WebView M (dbg)', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'Android WebView N (dbg)', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'Android WebView O (dbg)', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'Android WebView P (dbg)', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'Android arm64 Builder (dbg)', - goma_jobs = goma.jobs.MANY_JOBS_FOR_CI, - execution_timeout = 4 * time.hour, -) - -ci.android_builder( - name = 'Android x64 Builder (dbg)', - execution_timeout = 4 * time.hour, -) - -ci.android_builder( - name = 'Android x86 Builder (dbg)', -) - -ci.android_builder( name = 'Deterministic Android', executable = 'recipe:swarming/deterministic_build', execution_timeout = 6 * time.hour, @@ -223,32 +188,12 @@ ) ci.android_builder( - name = 'Marshmallow 64 bit Tester', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'Nougat Phone Tester', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'Oreo Phone Tester', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( name = 'android-arm64-proguard-rel', goma_jobs = goma.jobs.MANY_JOBS_FOR_CI, execution_timeout = 6 * time.hour, ) ci.android_builder( - name = 'android-cronet-arm-dbg', - notifies = ['cronet'], -) - -ci.android_builder( name = 'android-cronet-arm64-dbg', notifies = ['cronet'], ) @@ -298,15 +243,6 @@ ) ci.android_builder( - name = 'android-pie-arm64-dbg', - triggered_by = ['Android arm64 Builder (dbg)'], -) - -ci.android_builder( - name = 'android-pie-arm64-rel', -) - -ci.android_builder( name = 'android-10-arm64-rel', ) @@ -411,17 +347,9 @@ ) ci.chromiumos_builder( - name = 'chromeos-amd64-generic-dbg', -) - -ci.chromiumos_builder( name = 'chromeos-arm-generic-dbg', ) -ci.chromiumos_builder( - name = 'chromeos-kevin-rel', -) - ci.clang_builder( name = 'CFI Linux CF', @@ -583,24 +511,6 @@ ) ci.dawn_builder( - name = 'Dawn Linux x64 DEPS Builder', -) - -ci.dawn_builder( - name = 'Dawn Linux x64 DEPS Release (Intel HD 630)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Linux x64 DEPS Builder'], -) - -ci.dawn_builder( - name = 'Dawn Linux x64 DEPS Release (NVIDIA)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Linux x64 DEPS Builder'], -) - -ci.dawn_builder( name = 'Dawn Linux x64 Release (Intel HD 630)', cores = 2, os = os.LINUX_DEFAULT, @@ -622,29 +532,6 @@ ) ci.dawn_builder( - name = 'Dawn Mac x64 DEPS Builder', - builderless = False, - cores = None, - os = os.MAC_ANY, -) - -# Note that the Mac testers are all thin Linux VMs, triggering jobs on the -# physical Mac hardware in the Swarming pool which is why they run on linux -ci.dawn_builder( - name = 'Dawn Mac x64 DEPS Release (AMD)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Mac x64 DEPS Builder'], -) - -ci.dawn_builder( - name = 'Dawn Mac x64 DEPS Release (Intel)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Mac x64 DEPS Builder'], -) - -ci.dawn_builder( name = 'Dawn Mac x64 Release (AMD)', cores = 2, os = os.LINUX_DEFAULT, @@ -698,44 +585,6 @@ triggered_by = ['Dawn Win10 x64 Builder'], ) -ci.dawn_builder( - name = 'Dawn Win10 x86 DEPS Builder', - os = os.WINDOWS_ANY, -) - -ci.dawn_builder( - name = 'Dawn Win10 x64 DEPS Builder', - os = os.WINDOWS_ANY, -) - -ci.dawn_builder( - name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Win10 x86 DEPS Builder'], -) - -ci.dawn_builder( - name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Win10 x64 DEPS Builder'], -) - -ci.dawn_builder( - name = 'Dawn Win10 x86 DEPS Release (NVIDIA)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Win10 x86 DEPS Builder'], -) - -ci.dawn_builder( - name = 'Dawn Win10 x64 DEPS Release (NVIDIA)', - cores = 2, - os = os.LINUX_DEFAULT, - triggered_by = ['Dawn Win10 x64 DEPS Builder'], -) - ci.fuzz_builder( name = 'ASAN Debug', @@ -1005,10 +854,6 @@ ) ci.fyi_builder( - name = 'VR Linux', -) - -ci.fyi_builder( name = 'android-mojo-webview-rel', ) @@ -1017,10 +862,6 @@ ) ci.fyi_builder( - name = 'chromeos-kevin-rel-hw-tests', -) - -ci.fyi_builder( name = 'fuchsia-fyi-arm64-rel', notifies = ['cr-fuchsia'], ) @@ -1695,38 +1536,14 @@ ) ci.linux_builder( - name = 'Linux Builder (dbg)', -) - -ci.linux_builder( name = 'Linux Builder (dbg)(32)', ) ci.linux_builder( - name = 'Linux Tests (dbg)(1)', - triggered_by = ['Linux Builder (dbg)'], -) - -ci.linux_builder( name = 'Network Service Linux', ) ci.linux_builder( - name = 'fuchsia-arm64-cast', - notifies = ['cr-fuchsia'], -) - -ci.linux_builder( - name = 'fuchsia-x64-cast', - notifies = ['cr-fuchsia'], -) - -ci.linux_builder( - name = 'fuchsia-x64-dbg', - notifies = ['cr-fuchsia'], -) - -ci.linux_builder( name = 'linux-gcc-rel', goma_backend = None, )
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star index 7b74ec0f..1a3c911 100644 --- a/infra/config/buckets/try.star +++ b/infra/config/buckets/try.star
@@ -42,19 +42,6 @@ try_.blink_builder( - name = 'linux-blink-rel', - goma_backend = goma.backend.RBE_PROD, - tryjob = try_.job( - location_regexp = [ - '.+/[+]/cc/.+', - '.+/[+]/third_party/blink/renderer/core/paint/.+', - '.+/[+]/third_party/blink/renderer/core/svg/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/.+', - ], - ), -) - -try_.blink_builder( name = 'win10-blink-rel', goma_backend = goma.backend.RBE_PROD, os = os.WINDOWS_ANY, @@ -103,21 +90,6 @@ ) try_.chromium_android_builder( - name = 'android-cronet-arm-dbg', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/components/cronet/.+', - '.+/[+]/components/grpc_support/.+', - '.+/[+]/build/android/.+', - '.+/[+]/build/config/android/.+', - ], - location_regexp_exclude = [ - '.+/[+]/components/cronet/ios/.+', - ], - ), -) - -try_.chromium_android_builder( name = 'android-deterministic-dbg', executable = 'recipe:swarming/deterministic_build', execution_timeout = 6 * time.hour, @@ -150,21 +122,6 @@ ) try_.chromium_android_builder( - name = 'android-pie-arm64-dbg', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/android/features/vr/.+', - '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', - '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+', - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/third_party/gvr-android-sdk/.+', - '.+/[+]/third_party/arcore-android-sdk/.+', - '.+/[+]/third_party/arcore-android-sdk-client/.+', - ], - ), -) - -try_.chromium_android_builder( name = 'android-pie-x86-fyi-rel', goma_jobs=goma.jobs.J150, ) @@ -178,14 +135,6 @@ ) try_.chromium_android_builder( - name = 'android-pie-arm64-rel', - cores = 16, - goma_jobs = goma.jobs.J300, - ssd = True, - tryjob = try_.job(), -) - -try_.chromium_android_builder( name = 'android-10-arm64-rel', ) @@ -237,37 +186,6 @@ ) try_.chromium_android_builder( - name = 'android_compile_x64_dbg', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/sandbox/linux/seccomp-bpf/.+', - '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+', - '.+/[+]/sandbox/linux/system_headers/.+', - '.+/[+]/sandbox/linux/tests/.+', - '.+/[+]/third_party/gvr-android-sdk/.+', - ], - ), -) - -try_.chromium_android_builder( - name = 'android_compile_x86_dbg', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/sandbox/linux/seccomp-bpf/.+', - '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+', - '.+/[+]/sandbox/linux/system_headers/.+', - '.+/[+]/sandbox/linux/tests/.+', - '.+/[+]/third_party/gvr-android-sdk/.+', - ], - ), -) - - -try_.chromium_android_builder( name = 'android_cronet_tester', properties = { 'buildername': 'android-cronet-arm-dbg', @@ -286,7 +204,6 @@ name = 'android_unswarmed_pixel_aosp', ) - try_.chromium_android_builder( name = 'linux_android_dbg_ng', ) @@ -364,16 +281,6 @@ try_.chromium_chromiumos_builder( - name = 'chromeos-amd64-generic-dbg', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/content/gpu/.+', - '.+/[+]/media/.+', - ], - ), -) - -try_.chromium_chromiumos_builder( name = 'chromeos-amd64-generic-cfi-thin-lto-rel', ) @@ -381,104 +288,12 @@ name = 'chromeos-arm-generic-dbg', ) - -try_.chromium_chromiumos_builder( - name = 'chromeos-kevin-compile-rel', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chromeos/CHROMEOS_LKGM', - ], - ), -) - -try_.chromium_chromiumos_builder( - name = 'chromeos-kevin-rel', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/build/chromeos/.+', - '.+/[+]/build/config/chromeos/.*', - ], - ), -) - - try_.chromium_chromiumos_builder( name = 'linux-chromeos-dbg', ) try_.chromium_dawn_builder( - name = 'dawn-linux-x64-deps-rel', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/gpu/.+', - '.+/[+]/testing/buildbot/chromium.dawn.json', - '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', - '.+/[+]/third_party/dawn/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/features.gni', - ], - ), -) - -try_.chromium_dawn_builder( - name = 'dawn-mac-x64-deps-rel', - os = os.MAC_ANY, - tryjob = try_.job( - location_regexp = [ - '.+/[+]/gpu/.+', - '.+/[+]/testing/buildbot/chromium.dawn.json', - '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', - '.+/[+]/third_party/dawn/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/features.gni', - ], - ), -) - -try_.chromium_dawn_builder( - name = 'dawn-win10-x64-deps-rel', - os = os.WINDOWS_ANY, - tryjob = try_.job( - location_regexp = [ - '.+/[+]/gpu/.+', - '.+/[+]/testing/buildbot/chromium.dawn.json', - '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', - '.+/[+]/third_party/dawn/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/features.gni', - ], - ), -) - -try_.chromium_dawn_builder( - name = 'dawn-win10-x86-deps-rel', - os = os.WINDOWS_ANY, - tryjob = try_.job( - location_regexp = [ - '.+/[+]/gpu/.+', - '.+/[+]/testing/buildbot/chromium.dawn.json', - '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', - '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', - '.+/[+]/third_party/dawn/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/features.gni', - ], - ), -) - -try_.chromium_dawn_builder( name = 'linux-dawn-rel', ) @@ -497,33 +312,6 @@ name = 'cast_shell_audio_linux', ) - -try_.chromium_linux_builder( - name = 'closure_compilation', - executable = 'recipe:closure_compilation', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/third_party/closure_compiler/.+', - ], - ), -) - -try_.chromium_linux_builder( - name = 'fuchsia-arm64-cast', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chromecast/.+', - ], - ), -) - -try_.chromium_linux_builder( - name = 'fuchsia-compile-x64-dbg', - tryjob = try_.job( - experiment_percentage = 50, - ), -) - try_.chromium_linux_builder( name = 'fuchsia-fyi-arm64-rel', ) @@ -537,16 +325,6 @@ ) try_.chromium_linux_builder( - name = 'fuchsia-x64-cast', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chromecast/.+', - ], - ), -) - - -try_.chromium_linux_builder( name = 'layout_test_leak_detection', ) @@ -646,65 +424,20 @@ name = 'linux_chromium_compile_dbg_32_ng', ) - try_.chromium_linux_builder( name = 'linux_chromium_compile_rel_ng', ) try_.chromium_linux_builder( - name = 'linux_chromium_dbg_ng', - caches = [ - swarming.cache( - name = 'builder', - path = 'linux_debug', - ), - ], - tryjob = try_.job( - location_regexp = [ - '.+/[+]/build/.*check_gn_headers.*', - ], - ), -) - -try_.chromium_linux_builder( name = 'linux_chromium_msan_rel_ng', goma_jobs = goma.jobs.J150, ) - try_.chromium_linux_builder( name = 'linux_chromium_ubsan_rel_ng', ) try_.chromium_linux_builder( - name = 'linux_layout_tests_composite_after_paint', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/third_party/blink/renderer/core/paint/.+', - '.+/[+]/third_party/blink/renderer/core/svg/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/.+', - '.+/[+]/third_party/blink/web_tests/.+', - ], - ), -) - -try_.chromium_linux_builder( - name = 'linux_layout_tests_layout_ng_disabled', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/third_party/blink/renderer/core/editing/.+', - '.+/[+]/third_party/blink/renderer/core/layout/.+', - '.+/[+]/third_party/blink/renderer/core/paint/.+', - '.+/[+]/third_party/blink/renderer/core/svg/.+', - '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/.+', - '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng', - '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+', - ], - ), -) - -try_.chromium_linux_builder( name = 'linux-layout-tests-fragment-item', ) @@ -730,15 +463,6 @@ ) try_.chromium_linux_builder( - name = 'linux_vr', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/browser/vr/.+', - ], - ), -) - -try_.chromium_linux_builder( name = 'linux-wpt-fyi-rel', ) @@ -749,13 +473,6 @@ try_.chromium_mac_builder( - name = 'mac-coverage-rel', - use_clang_coverage = True, - goma_jobs = goma.jobs.J150, - tryjob = try_.job(experiment_percentage = 3) -) - -try_.chromium_mac_builder( name = 'mac-osxbeta-rel', os = os.MAC_DEFAULT, ) @@ -788,7 +505,6 @@ goma_jobs = goma.jobs.J150, ) - try_.chromium_mac_builder( name = 'mac_chromium_compile_rel_ng', ) @@ -836,20 +552,6 @@ ) try_.chromium_mac_ios_builder( - name = 'ios-simulator-cronet', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/components/cronet/.+', - '.+/[+]/components/grpc_support/.+', - '.+/[+]/ios/.+', - ], - location_regexp_exclude = [ - '.+/[+]/components/cronet/android/.+', - ], - ), -) - -try_.chromium_mac_ios_builder( name = 'ios-simulator-eg', ) @@ -858,15 +560,6 @@ ) try_.chromium_mac_ios_builder( - name = 'ios-simulator-full-configs', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/ios/.+', - ], - ), -) - -try_.chromium_mac_ios_builder( name = 'ios13-beta-simulator', ) @@ -875,7 +568,6 @@ ) - try_.chromium_swangle_linux_builder( name = 'linux-swangle-try-tot-angle-x64' ) @@ -952,15 +644,6 @@ ) try_.chromium_win_builder( - name = 'win10_chromium_x64_coverage_rel_ng', - os = os.WINDOWS_10, - use_clang_coverage = True, - goma_jobs = goma.jobs.J150, - ssd = True, - tryjob = try_.job(experiment_percentage = 3), -) - -try_.chromium_win_builder( name = 'win10_chromium_x64_rel_ng_exp', builderless = False, os = os.WINDOWS_ANY, @@ -977,7 +660,6 @@ name = 'win_archive', ) - try_.chromium_win_builder( name = 'win_chromium_compile_rel_ng', ) @@ -1008,98 +690,6 @@ ) -try_.gpu_chromium_android_builder( - name = 'android_optional_gpu_tests_rel', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/cc/.+', - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/components/viz/.+', - '.+/[+]/content/test/gpu/.+', - '.+/[+]/gpu/.+', - '.+/[+]/media/audio/.+', - '.+/[+]/media/filters/.+', - '.+/[+]/media/gpu/.+', - '.+/[+]/services/viz/.+', - '.+/[+]/testing/trigger_scripts/.+', - '.+/[+]/third_party/blink/renderer/modules/webgl/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/.+', - ], - ), -) - - -try_.gpu_chromium_linux_builder( - name = 'linux_optional_gpu_tests_rel', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/content/test/gpu/.+', - '.+/[+]/gpu/.+', - '.+/[+]/media/audio/.+', - '.+/[+]/media/filters/.+', - '.+/[+]/media/gpu/.+', - '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', - '.+/[+]/testing/trigger_scripts/.+', - '.+/[+]/third_party/blink/renderer/modules/webgl/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/.+', - ], - ), -) - - -try_.gpu_chromium_mac_builder( - name = 'mac_optional_gpu_tests_rel', - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/content/test/gpu/.+', - '.+/[+]/gpu/.+', - '.+/[+]/media/audio/.+', - '.+/[+]/media/filters/.+', - '.+/[+]/media/gpu/.+', - '.+/[+]/services/shape_detection/.+', - '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', - '.+/[+]/testing/trigger_scripts/.+', - '.+/[+]/third_party/blink/renderer/modules/webgl/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/.+', - ], - ), -) - - -try_.gpu_chromium_win_builder( - name = 'win_optional_gpu_tests_rel', - builderless = True, - os = os.WINDOWS_DEFAULT, - tryjob = try_.job( - location_regexp = [ - '.+/[+]/chrome/browser/vr/.+', - '.+/[+]/content/test/gpu/.+', - '.+/[+]/device/vr/.+', - '.+/[+]/gpu/.+', - '.+/[+]/media/audio/.+', - '.+/[+]/media/filters/.+', - '.+/[+]/media/gpu/.+', - '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', - '.+/[+]/testing/trigger_scripts/.+', - '.+/[+]/third_party/blink/renderer/modules/vr/.+', - '.+/[+]/third_party/blink/renderer/modules/webgl/.+', - '.+/[+]/third_party/blink/renderer/modules/xr/.+', - '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', - '.+/[+]/tools/clang/scripts/update.py', - '.+/[+]/ui/gl/.+', - ], - ), -) - - # Used for listing chrome trybots in chromium's commit-queue.cfg without also # adding them to chromium's cr-buildbucket.cfg. Note that the recipe these # builders run allow only known roller accounts when triggered via the CQ.
diff --git a/infra/config/consoles/main-beta.star b/infra/config/consoles/main-beta.star index ce983c6..df9b8e5 100644 --- a/infra/config/consoles/main-beta.star +++ b/infra/config/consoles/main-beta.star
@@ -5,7 +5,7 @@ repo = 'https://chromium.googlesource.com/chromium/src', # TODO(gbeaty) Define the main consoles inside the respective versioned # directories once their contents are stablilized - refs = ['refs/branch-heads/4044'], + refs = ['refs/branch-heads/4085'], title = 'Chromium Beta Console', entries = [ luci.console_view_entry( @@ -34,11 +34,36 @@ short_name = 'ozo', ), luci.console_view_entry( + builder = 'ci-beta/Linux Builder (dbg)', + category = 'chromium.linux|debug|builder', + short_name = '64', + ), + luci.console_view_entry( + builder = 'ci-beta/Linux Tests (dbg)(1)', + category = 'chromium.linux|debug|tester', + short_name = '64', + ), + luci.console_view_entry( builder = 'ci-beta/Cast Linux', category = 'chromium.linux|cast', short_name = 'vid', ), luci.console_view_entry( + builder = 'ci-beta/fuchsia-arm64-cast', + category = 'chromium.linux|fuchsia|cast', + short_name = 'a64', + ), + luci.console_view_entry( + builder = 'ci-beta/fuchsia-x64-cast', + category = 'chromium.linux|fuchsia|cast', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/fuchsia-x64-dbg', + category = 'chromium.linux|fuchsia|x64', + short_name = 'dbg', + ), + luci.console_view_entry( builder = 'ci-beta/Fuchsia ARM64', category = 'chromium.linux|fuchsia|a64', ), @@ -63,11 +88,21 @@ short_name = 'arm', ), luci.console_view_entry( + builder = 'ci-beta/chromeos-amd64-generic-dbg', + category = 'chromium.chromiumos|simple|debug|x64', + short_name = 'dbg', + ), + luci.console_view_entry( builder = 'ci-beta/chromeos-amd64-generic-rel', category = 'chromium.chromiumos|simple|release|x64', short_name = 'rel', ), luci.console_view_entry( + builder = 'ci-beta/chromeos-kevin-rel', + category = 'chromium.chromiumos|simple|release', + short_name = 'kvn', + ), + luci.console_view_entry( builder = 'ci-beta/Mac Builder', category = 'chromium.mac|release', short_name = 'bld', @@ -157,6 +192,7 @@ category = 'chromium.memory|linux|asan lsan', short_name = 'sbx', ), + # TODO(https://crbug.com/922150) Add the following builders to the main # console or don't have them be mirrored by main waterfall trybots luci.console_view_entry( @@ -180,11 +216,76 @@ short_name = '32', ), luci.console_view_entry( + builder = 'ci-beta/Android arm64 Builder (dbg)', + category = 'chromium.android|builder|arm', + short_name = '64', + ), + luci.console_view_entry( + builder = 'ci-beta/Android x86 Builder (dbg)', + category = 'chromium.android|builder|x86', + short_name = '32', + ), + luci.console_view_entry( + builder = 'ci-beta/Android x64 Builder (dbg)', + category = 'chromium.android|builder|x86', + short_name = '64', + ), + luci.console_view_entry( + builder = 'ci-beta/Marshmallow 64 bit Tester', + category = 'chromium.android|tester|phone', + short_name = 'M', + ), + luci.console_view_entry( + builder = 'ci-beta/Nougat Phone Tester', + category = 'chromium.android|tester|phone', + short_name = 'N', + ), + luci.console_view_entry( + builder = 'ci-beta/Oreo Phone Tester', + category = 'chromium.android|tester|phone', + short_name = 'O', + ), + luci.console_view_entry( + builder = 'ci-beta/android-pie-arm64-dbg', + category = 'chromium.android|tester|phone', + short_name = 'P', + ), + luci.console_view_entry( + builder = 'ci-beta/android-pie-arm64-rel', + category = 'chromium.android|on_cq', + short_name = 'P', + ), + luci.console_view_entry( + builder = 'ci-beta/Android WebView M (dbg)', + category = 'chromium.android|tester|webview', + short_name = 'M', + ), + luci.console_view_entry( + builder = 'ci-beta/Android WebView N (dbg)', + category = 'chromium.android|tester|webview', + short_name = 'N', + ), + luci.console_view_entry( + builder = 'ci-beta/Android WebView O (dbg)', + category = 'chromium.android|tester|webview', + short_name = 'O', + ), + luci.console_view_entry( + builder = 'ci-beta/Android WebView P (dbg)', + category = 'chromium.android|tester|webview', + short_name = 'P', + ), + luci.console_view_entry( builder = 'ci-beta/android-cronet-arm-rel', category = 'chromium.android|cronet|arm', short_name = 'rel', ), luci.console_view_entry( + builder = 'ci-beta/android-cronet-arm-dbg', + category = 'cronet|arm', + short_name = 'dbg', + ), + luci.console_view_entry( builder = 'ci-beta/android-cronet-kitkat-arm-rel', category = 'chromium.android|cronet|test', short_name = 'k', @@ -195,6 +296,74 @@ short_name = 'l', ), luci.console_view_entry( + builder = 'ci-beta/Dawn Linux x64 DEPS Builder', + category = 'chromium.dawn|DEPS|Linux|Builder', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Linux x64 DEPS Release (Intel HD 630)', + category = 'chromium.dawn|DEPS|Linux|Intel', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Linux x64 DEPS Release (NVIDIA)', + category = 'chromium.dawn|DEPS|Linux|Nvidia', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Mac x64 DEPS Builder', + category = 'chromium.dawn|DEPS|Mac|Builder', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Mac x64 DEPS Release (AMD)', + category = 'chromium.dawn|DEPS|Mac|AMD', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Mac x64 DEPS Release (Intel)', + category = 'chromium.dawn|DEPS|Mac|Intel', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Win10 x86 DEPS Builder', + category = 'chromium.dawn|DEPS|Windows|Builder', + short_name = 'x86', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Win10 x64 DEPS Builder', + category = 'chromium.dawn|DEPS|Windows|Builder', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Win10 x86 DEPS Release (Intel HD 630)', + category = 'chromium.dawn|DEPS|Windows|Intel', + short_name = 'x86', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Win10 x64 DEPS Release (Intel HD 630)', + category = 'chromium.dawn|DEPS|Windows|Intel', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Win10 x86 DEPS Release (NVIDIA)', + category = 'chromium.dawn|DEPS|Windows|Nvidia', + short_name = 'x86', + ), + luci.console_view_entry( + builder = 'ci-beta/Dawn Win10 x64 DEPS Release (NVIDIA)', + category = 'chromium.dawn|DEPS|Windows|Nvidia', + short_name = 'x64', + ), + luci.console_view_entry( + builder = 'ci-beta/chromeos-kevin-rel-hw-tests', + category = 'chromium.fyi|chromeos', + ), + luci.console_view_entry( + builder = 'ci-beta/VR Linux', + category = 'chromium.fyi|linux', + ), + luci.console_view_entry( builder = 'ci-beta/mac-osxbeta-rel', category = 'chromium.fyi|mac', short_name = 'osxbeta',
diff --git a/infra/config/consoles/main-stable.star b/infra/config/consoles/main-stable.star index 5ca71d32f..e93cc825 100644 --- a/infra/config/consoles/main-stable.star +++ b/infra/config/consoles/main-stable.star
@@ -5,7 +5,7 @@ repo = 'https://chromium.googlesource.com/chromium/src', # TODO(gbeaty) Define the main consoles inside the respective versioned # directories once their contents are stablilized - refs = ['refs/branch-heads/3987'], + refs = ['refs/branch-heads/4044'], title = 'Chromium Stable Console', entries = [ luci.console_view_entry( @@ -29,14 +29,38 @@ short_name = 'tst', ), luci.console_view_entry( + builder = 'ci-stable/linux-ozone-rel', + category = 'chromium.linux|release', + short_name = 'ozo', + ), + luci.console_view_entry( + builder = 'ci-stable/Cast Linux', + category = 'chromium.linux|cast', + short_name = 'vid', + ), + luci.console_view_entry( + builder = 'ci-stable/Fuchsia ARM64', + category = 'chromium.linux|fuchsia|a64', + ), + luci.console_view_entry( + builder = 'ci-stable/Fuchsia x64', + category = 'chromium.linux|fuchsia|x64', + short_name = 'rel', + ), + luci.console_view_entry( builder = 'ci-stable/linux-chromeos-rel', category = 'chromium.chromiumos|default', short_name = 'rel', ), luci.console_view_entry( - builder = 'ci-stable/linux-ozone-rel', - category = 'chromium.linux|release', - short_name = 'ozo', + builder = 'ci-stable/linux-chromeos-dbg', + category = 'chromium.chromiumos|default', + short_name = 'dbg', + ), + luci.console_view_entry( + builder = 'ci-stable/chromeos-arm-generic-rel', + category = 'chromium.chromiumos|simple|release', + short_name = 'arm', ), luci.console_view_entry( builder = 'ci-stable/chromeos-amd64-generic-rel', @@ -79,6 +103,16 @@ short_name = 'ret', ), luci.console_view_entry( + builder = 'ci-stable/Mac Builder (dbg)', + category = 'chromium.mac|debug', + short_name = 'bld', + ), + luci.console_view_entry( + builder = 'ci-stable/Mac10.13 Tests (dbg)', + category = 'chromium.mac|debug', + short_name = '13', + ), + luci.console_view_entry( builder = 'ci-stable/ios-simulator', category = 'chromium.mac|ios|default', short_name = 'sim', @@ -98,6 +132,31 @@ category = 'chromium.win|release|tester', short_name = 'w10', ), + luci.console_view_entry( + builder = 'ci-stable/Win Builder (dbg)', + category = 'chromium.win|debug|builder', + short_name = '32', + ), + luci.console_view_entry( + builder = 'ci-stable/Win7 Tests (dbg)(1)', + category = 'chromium.win|debug|tester', + short_name = '7', + ), + luci.console_view_entry( + builder = 'ci-stable/Linux ASan LSan Builder', + category = 'chromium.memory|linux|asan lsan', + short_name = 'bld', + ), + luci.console_view_entry( + builder = 'ci-stable/Linux ASan LSan Tests (1)', + category = 'chromium.memory|linux|asan lsan', + short_name = 'tst', + ), + luci.console_view_entry( + builder = 'ci-stable/Linux ASan Tests (sandboxed)', + category = 'chromium.memory|linux|asan lsan', + short_name = 'sbx', + ), # TODO(https://crbug.com/922150) Add the following builders to the main # console or don't have them be mirrored by main waterfall trybots luci.console_view_entry( @@ -111,6 +170,31 @@ short_name = 'm', ), luci.console_view_entry( + builder = 'ci-stable/Cast Android (dbg)', + category = 'chromium.android', + short_name = 'cst', + ), + luci.console_view_entry( + builder = 'ci-stable/Android arm Builder (dbg)', + category = 'chromium.android|builder|arm', + short_name = '32', + ), + luci.console_view_entry( + builder = 'ci-stable/android-cronet-arm-rel', + category = 'chromium.android|cronet|arm', + short_name = 'rel', + ), + luci.console_view_entry( + builder = 'ci-stable/android-cronet-kitkat-arm-rel', + category = 'chromium.android|cronet|test', + short_name = 'k', + ), + luci.console_view_entry( + builder = 'ci-stable/android-cronet-lollipop-arm-rel', + category = 'chromium.android|cronet|test', + short_name = 'l', + ), + luci.console_view_entry( builder = 'ci-stable/mac-osxbeta-rel', category = 'chromium.fyi|mac', short_name = 'osxbeta',
diff --git a/infra/config/consoles/try-beta.star b/infra/config/consoles/try-beta.star index 4e705f9..ea1153b 100644 --- a/infra/config/consoles/try-beta.star +++ b/infra/config/consoles/try-beta.star
@@ -2,30 +2,60 @@ name = 'try-beta', entries = [ 'try-beta/android-binary-size', + 'try-beta/android-cronet-arm-dbg', 'try-beta/android-kitkat-arm-rel', 'try-beta/android-marshmallow-arm64-rel', + 'try-beta/android-pie-arm64-dbg', + 'try-beta/android-pie-arm64-rel', 'try-beta/android_compile_dbg', + 'try-beta/android_compile_x64_dbg', + 'try-beta/android_compile_x86_dbg', 'try-beta/android_cronet', + 'try-beta/android_optional_gpu_tests_rel', 'try-beta/cast_shell_android', 'try-beta/cast_shell_linux', + 'try-beta/chromeos-amd64-generic-dbg', 'try-beta/chromeos-amd64-generic-rel', 'try-beta/chromeos-arm-generic-rel', + 'try-beta/chromeos-kevin-compile-rel', + 'try-beta/chromeos-kevin-rel', 'try-beta/chromium_presubmit', + 'try-beta/closure_compilation', + 'try-beta/dawn-linux-x64-deps-rel', + 'try-beta/dawn-mac-x64-deps-rel', + 'try-beta/dawn-win10-x64-deps-rel', + 'try-beta/dawn-win10-x86-deps-rel', + 'try-beta/fuchsia-arm64-cast', + 'try-beta/fuchsia-compile-x64-dbg', + 'try-beta/fuchsia-x64-cast', 'try-beta/fuchsia_arm64', 'try-beta/fuchsia_x64', 'try-beta/ios-simulator', + 'try-beta/ios-simulator-cronet', + 'try-beta/ios-simulator-full-configs', + 'try-beta/linux-blink-rel', 'try-beta/linux-chromeos-compile-dbg', 'try-beta/linux-chromeos-rel', 'try-beta/linux-libfuzzer-asan-rel', 'try-beta/linux-ozone-rel', + 'try-beta/linux-ozone-x11-and-wayland-rel', 'try-beta/linux-rel', 'try-beta/linux_chromium_asan_rel_ng', 'try-beta/linux_chromium_compile_dbg_ng', + 'try-beta/linux_chromium_dbg_ng', 'try-beta/linux_chromium_tsan_rel_ng', + 'try-beta/linux_layout_tests_composite_after_paint', + 'try-beta/linux_layout_tests_layout_ng_disabled', + 'try-beta/linux_optional_gpu_tests_rel', + 'try-beta/linux_vr', + 'try-beta/mac-coverage-rel', 'try-beta/mac-rel', 'try-beta/mac_chromium_compile_dbg_ng', + 'try-beta/mac_optional_gpu_tests_rel', 'try-beta/win-libfuzzer-asan-rel', + 'try-beta/win10_chromium_x64_coverage_rel_ng', 'try-beta/win10_chromium_x64_rel_ng', 'try-beta/win_chromium_compile_dbg_ng', + 'try-beta/win_optional_gpu_tests_rel', ], )
diff --git a/infra/config/consoles/try-stable.star b/infra/config/consoles/try-stable.star index cf0cc0af..456e686 100644 --- a/infra/config/consoles/try-stable.star +++ b/infra/config/consoles/try-stable.star
@@ -1,14 +1,31 @@ luci.list_view( name = 'try-stable', entries = [ + 'try-stable/android-binary-size', 'try-stable/android-kitkat-arm-rel', 'try-stable/android-marshmallow-arm64-rel', + 'try-stable/android_compile_dbg', + 'try-stable/android_cronet', + 'try-stable/cast_shell_android', + 'try-stable/cast_shell_linux', 'try-stable/chromeos-amd64-generic-rel', + 'try-stable/chromeos-arm-generic-rel', 'try-stable/chromium_presubmit', + 'try-stable/fuchsia_arm64', + 'try-stable/fuchsia_x64', 'try-stable/ios-simulator', + 'try-stable/linux-chromeos-compile-dbg', 'try-stable/linux-chromeos-rel', + 'try-stable/linux-libfuzzer-asan-rel', + 'try-stable/linux-ozone-rel', 'try-stable/linux-rel', + 'try-stable/linux_chromium_asan_rel_ng', + 'try-stable/linux_chromium_compile_dbg_ng', + 'try-stable/linux_chromium_tsan_rel_ng', 'try-stable/mac-rel', + 'try-stable/mac_chromium_compile_dbg_ng', + 'try-stable/win-libfuzzer-asan-rel', 'try-stable/win10_chromium_x64_rel_ng', + 'try-stable/win_chromium_compile_dbg_ng', ], )
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 4936ebf8..9ba304f 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -1202,7 +1202,7 @@ url: "https://chromium-review.googlesource.com" projects: < name: "chromium/src" - ref_regexp: "refs/branch-heads/4044" + ref_regexp: "refs/branch-heads/4085" > > verifiers: < @@ -1215,34 +1215,170 @@ name: "chromium/try-beta/android-binary-size" > builders: < + name: "chromium/try-beta/android-cronet-arm-dbg" + location_regexp: ".+/[+]/components/cronet/.+" + location_regexp: ".+/[+]/components/grpc_support/.+" + location_regexp: ".+/[+]/build/android/.+" + location_regexp: ".+/[+]/build/config/android/.+" + location_regexp_exclude: ".+/[+]/components/cronet/ios/.+" + > + builders: < name: "chromium/try-beta/android-kitkat-arm-rel" > builders: < name: "chromium/try-beta/android-marshmallow-arm64-rel" > builders: < + name: "chromium/try-beta/android-pie-arm64-dbg" + location_regexp: ".+/[+]/chrome/android/features/vr/.+" + location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+" + location_regexp: ".+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/third_party/gvr-android-sdk/.+" + location_regexp: ".+/[+]/third_party/arcore-android-sdk/.+" + location_regexp: ".+/[+]/third_party/arcore-android-sdk-client/.+" + > + builders: < + name: "chromium/try-beta/android-pie-arm64-rel" + > + builders: < name: "chromium/try-beta/android_compile_dbg" > builders: < + name: "chromium/try-beta/android_compile_x64_dbg" + location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf/.+" + location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+" + location_regexp: ".+/[+]/sandbox/linux/system_headers/.+" + location_regexp: ".+/[+]/sandbox/linux/tests/.+" + location_regexp: ".+/[+]/third_party/gvr-android-sdk/.+" + > + builders: < + name: "chromium/try-beta/android_compile_x86_dbg" + location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf/.+" + location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+" + location_regexp: ".+/[+]/sandbox/linux/system_headers/.+" + location_regexp: ".+/[+]/sandbox/linux/tests/.+" + location_regexp: ".+/[+]/third_party/gvr-android-sdk/.+" + > + builders: < name: "chromium/try-beta/android_cronet" > builders: < + name: "chromium/try-beta/android_optional_gpu_tests_rel" + location_regexp: ".+/[+]/cc/.+" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/components/viz/.+" + location_regexp: ".+/[+]/content/test/gpu/.+" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/media/audio/.+" + location_regexp: ".+/[+]/media/filters/.+" + location_regexp: ".+/[+]/media/gpu/.+" + location_regexp: ".+/[+]/services/viz/.+" + location_regexp: ".+/[+]/testing/trigger_scripts/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/.+" + > + builders: < name: "chromium/try-beta/cast_shell_android" > builders: < name: "chromium/try-beta/cast_shell_linux" > builders: < + name: "chromium/try-beta/chromeos-amd64-generic-dbg" + location_regexp: ".+/[+]/content/gpu/.+" + location_regexp: ".+/[+]/media/.+" + > + builders: < name: "chromium/try-beta/chromeos-amd64-generic-rel" > builders: < name: "chromium/try-beta/chromeos-arm-generic-rel" > builders: < + name: "chromium/try-beta/chromeos-kevin-compile-rel" + location_regexp: ".+/[+]/chromeos/CHROMEOS_LKGM" + > + builders: < + name: "chromium/try-beta/chromeos-kevin-rel" + location_regexp: ".+/[+]/build/chromeos/.+" + location_regexp: ".+/[+]/build/config/chromeos/.*" + > + builders: < name: "chromium/try-beta/chromium_presubmit" disable_reuse: true > builders: < + name: "chromium/try-beta/closure_compilation" + location_regexp: ".+/[+]/third_party/closure_compiler/.+" + > + builders: < + name: "chromium/try-beta/dawn-linux-x64-deps-rel" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations" + location_regexp: ".+/[+]/third_party/dawn/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/features.gni" + > + builders: < + name: "chromium/try-beta/dawn-mac-x64-deps-rel" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations" + location_regexp: ".+/[+]/third_party/dawn/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/features.gni" + > + builders: < + name: "chromium/try-beta/dawn-win10-x64-deps-rel" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations" + location_regexp: ".+/[+]/third_party/dawn/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/features.gni" + > + builders: < + name: "chromium/try-beta/dawn-win10-x86-deps-rel" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations" + location_regexp: ".+/[+]/third_party/dawn/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/features.gni" + > + builders: < + name: "chromium/try-beta/fuchsia-arm64-cast" + location_regexp: ".+/[+]/chromecast/.+" + > + builders: < + name: "chromium/try-beta/fuchsia-compile-x64-dbg" + experiment_percentage: 50 + > + builders: < + name: "chromium/try-beta/fuchsia-x64-cast" + location_regexp: ".+/[+]/chromecast/.+" + > + builders: < name: "chromium/try-beta/fuchsia_arm64" > builders: < @@ -1252,6 +1388,24 @@ name: "chromium/try-beta/ios-simulator" > builders: < + name: "chromium/try-beta/ios-simulator-cronet" + location_regexp: ".+/[+]/components/cronet/.+" + location_regexp: ".+/[+]/components/grpc_support/.+" + location_regexp: ".+/[+]/ios/.+" + location_regexp_exclude: ".+/[+]/components/cronet/android/.+" + > + builders: < + name: "chromium/try-beta/ios-simulator-full-configs" + location_regexp: ".+/[+]/ios/.+" + > + builders: < + name: "chromium/try-beta/linux-blink-rel" + location_regexp: ".+/[+]/cc/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+" + > + builders: < name: "chromium/try-beta/linux-chromeos-compile-dbg" > builders: < @@ -1264,6 +1418,10 @@ name: "chromium/try-beta/linux-ozone-rel" > builders: < + name: "chromium/try-beta/linux-ozone-x11-and-wayland-rel" + experiment_percentage: 1 + > + builders: < name: "chromium/try-beta/linux-rel" > builders: < @@ -1273,23 +1431,106 @@ name: "chromium/try-beta/linux_chromium_compile_dbg_ng" > builders: < + name: "chromium/try-beta/linux_chromium_dbg_ng" + location_regexp: ".+/[+]/build/.*check_gn_headers.*" + > + builders: < name: "chromium/try-beta/linux_chromium_tsan_rel_ng" > builders: < + name: "chromium/try-beta/linux_layout_tests_composite_after_paint" + location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/.+" + > + builders: < + name: "chromium/try-beta/linux_layout_tests_layout_ng_disabled" + location_regexp: ".+/[+]/third_party/blink/renderer/core/editing/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/core/layout/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng" + location_regexp: ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+" + > + builders: < + name: "chromium/try-beta/linux_optional_gpu_tests_rel" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/content/test/gpu/.+" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/media/audio/.+" + location_regexp: ".+/[+]/media/filters/.+" + location_regexp: ".+/[+]/media/gpu/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.gpu.fyi.json" + location_regexp: ".+/[+]/testing/trigger_scripts/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/.+" + > + builders: < + name: "chromium/try-beta/linux_vr" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + > + builders: < + name: "chromium/try-beta/mac-coverage-rel" + experiment_percentage: 3 + > + builders: < name: "chromium/try-beta/mac-rel" > builders: < name: "chromium/try-beta/mac_chromium_compile_dbg_ng" > builders: < + name: "chromium/try-beta/mac_optional_gpu_tests_rel" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/content/test/gpu/.+" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/media/audio/.+" + location_regexp: ".+/[+]/media/filters/.+" + location_regexp: ".+/[+]/media/gpu/.+" + location_regexp: ".+/[+]/services/shape_detection/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.gpu.fyi.json" + location_regexp: ".+/[+]/testing/trigger_scripts/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/.+" + > + builders: < name: "chromium/try-beta/win-libfuzzer-asan-rel" > builders: < + name: "chromium/try-beta/win10_chromium_x64_coverage_rel_ng" + experiment_percentage: 3 + > + builders: < name: "chromium/try-beta/win10_chromium_x64_rel_ng" > builders: < name: "chromium/try-beta/win_chromium_compile_dbg_ng" > + builders: < + name: "chromium/try-beta/win_optional_gpu_tests_rel" + location_regexp: ".+/[+]/chrome/browser/vr/.+" + location_regexp: ".+/[+]/content/test/gpu/.+" + location_regexp: ".+/[+]/device/vr/.+" + location_regexp: ".+/[+]/gpu/.+" + location_regexp: ".+/[+]/media/audio/.+" + location_regexp: ".+/[+]/media/filters/.+" + location_regexp: ".+/[+]/media/gpu/.+" + location_regexp: ".+/[+]/testing/buildbot/chromium.gpu.fyi.json" + location_regexp: ".+/[+]/testing/trigger_scripts/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/vr/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/xr/.+" + location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+" + location_regexp: ".+/[+]/tools/clang/scripts/update.py" + location_regexp: ".+/[+]/ui/gl/.+" + > retry_config: < single_quota: 1 global_quota: 2 @@ -1307,7 +1548,7 @@ url: "https://chromium-review.googlesource.com" projects: < name: "chromium/src" - ref_regexp: "refs/branch-heads/3987" + ref_regexp: "refs/branch-heads/4044" > > verifiers: < @@ -1317,33 +1558,84 @@ > tryjob: < builders: < + name: "chromium/try-stable/android-binary-size" + > + builders: < name: "chromium/try-stable/android-kitkat-arm-rel" > builders: < name: "chromium/try-stable/android-marshmallow-arm64-rel" > builders: < + name: "chromium/try-stable/android_compile_dbg" + > + builders: < + name: "chromium/try-stable/android_cronet" + > + builders: < + name: "chromium/try-stable/cast_shell_android" + > + builders: < + name: "chromium/try-stable/cast_shell_linux" + > + builders: < name: "chromium/try-stable/chromeos-amd64-generic-rel" > builders: < + name: "chromium/try-stable/chromeos-arm-generic-rel" + > + builders: < name: "chromium/try-stable/chromium_presubmit" disable_reuse: true > builders: < + name: "chromium/try-stable/fuchsia_arm64" + > + builders: < + name: "chromium/try-stable/fuchsia_x64" + > + builders: < name: "chromium/try-stable/ios-simulator" > builders: < + name: "chromium/try-stable/linux-chromeos-compile-dbg" + > + builders: < name: "chromium/try-stable/linux-chromeos-rel" > builders: < + name: "chromium/try-stable/linux-libfuzzer-asan-rel" + > + builders: < + name: "chromium/try-stable/linux-ozone-rel" + > + builders: < name: "chromium/try-stable/linux-rel" > builders: < + name: "chromium/try-stable/linux_chromium_asan_rel_ng" + > + builders: < + name: "chromium/try-stable/linux_chromium_compile_dbg_ng" + > + builders: < + name: "chromium/try-stable/linux_chromium_tsan_rel_ng" + > + builders: < name: "chromium/try-stable/mac-rel" > builders: < + name: "chromium/try-stable/mac_chromium_compile_dbg_ng" + > + builders: < + name: "chromium/try-stable/win-libfuzzer-asan-rel" + > + builders: < name: "chromium/try-stable/win10_chromium_x64_rel_ng" > + builders: < + name: "chromium/try-stable/win_chromium_compile_dbg_ng" + > retry_config: < single_quota: 1 global_quota: 2
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 99b4997..35f6b5c 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -599,6 +599,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -620,6 +621,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -641,6 +643,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -662,6 +665,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -747,6 +751,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -768,6 +773,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -789,6 +795,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -1022,6 +1029,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1043,6 +1051,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1064,6 +1073,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1144,6 +1154,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1165,6 +1176,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1186,6 +1198,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1270,6 +1283,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1291,6 +1305,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1312,6 +1327,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1396,6 +1412,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1417,6 +1434,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -1438,6 +1456,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.dawn\"" @@ -2550,6 +2569,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.linux\"" @@ -3193,6 +3213,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.linux\"" @@ -4002,6 +4023,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -4148,6 +4170,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -4169,6 +4192,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -4936,6 +4960,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.fyi\"" @@ -6019,6 +6044,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -6378,6 +6404,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -6399,6 +6426,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.android\"" @@ -6503,6 +6531,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.chromiumos\"" @@ -6610,6 +6639,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.chromiumos\"" @@ -6631,6 +6661,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.fyi\"" @@ -6652,6 +6683,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.linux\"" @@ -6736,6 +6768,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.linux\"" @@ -6757,6 +6790,7 @@ name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.linux\"" @@ -8125,6 +8159,1856 @@ service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" > builders: < + name: "Android WebView M (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android WebView N (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android WebView O (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android WebView P (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android arm Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 14400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android arm64 Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 14400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android x64 Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 14400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Android x86 Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Cast Android (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Cast Linux" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":50,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Linux x64 DEPS Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Linux x64 DEPS Release (Intel HD 630)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Linux x64 DEPS Release (NVIDIA)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Mac x64 DEPS Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Dawn Mac x64 DEPS Builder" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Mac x64 DEPS Release (AMD)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Mac x64 DEPS Release (Intel)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Win10 x64 DEPS Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Win10 x64 DEPS Release (Intel HD 630)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Win10 x64 DEPS Release (NVIDIA)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Win10 x86 DEPS Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Win10 x86 DEPS Release (Intel HD 630)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Dawn Win10 x86 DEPS Release (NVIDIA)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.dawn\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Fuchsia ARM64" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Fuchsia x64" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "GPU Linux Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "GPU Mac Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:GPU Mac Builder" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "GPU Win x64 Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux ASan LSan Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:1" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.memory\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux ASan LSan Tests (1)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.memory\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux ASan Tests (sandboxed)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.memory\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Ozone Tester (Wayland)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Ozone Tester (X11)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Release (NVIDIA)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"jobs\":500}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Linux Tests (dbg)(1)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac Builder" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.14" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac Builder (dbg)" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac Release (Intel)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac Retina Release (AMD)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac10.10 Tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac10.10 Tests" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.13" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac10.11 Tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac10.11 Tests" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.13" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac10.12 Tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac10.12 Tests" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.12" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac10.13 Tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac10.13 Tests" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.13" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac10.13 Tests (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac10.13 Tests (dbg)" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Mac10.14 Tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Mac10.14 Tests" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.14" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Marshmallow 64 bit Tester" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Nougat Phone Tester" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Oreo Phone Tester" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "VR Linux" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.fyi\"" + > + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "WebKit Mac10.13 (retina)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:WebKit Mac10.13 (retina)" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.13" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win 7 Tests x64 (1)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win 7 Tests x64 (1)" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-7" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.win\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win Builder (dbg)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win Builder (dbg)" + dimensions: "cores:32" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.win\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win x64 Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win x64 Builder" + dimensions: "cores:32" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.win\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win10 Tests x64" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win10 Tests x64" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.win\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win10 Tests x64 1803" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win10 Tests x64 1803" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.fyi\"" + > + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win10 x64 Release (NVIDIA)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "Win7 Tests (dbg)(1)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win7 Tests (dbg)(1)" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-7" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.win\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-cronet-arm-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-cronet-arm-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-cronet-kitkat-arm-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-cronet-lollipop-arm-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-kitkat-arm-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-marshmallow-arm64-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-pie-arm64-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "android-pie-arm64-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "chromeos-amd64-generic-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.chromiumos\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "chromeos-amd64-generic-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.chromiumos\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "chromeos-arm-generic-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.chromiumos\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "chromeos-kevin-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.chromiumos\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "chromeos-kevin-rel-hw-tests" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.fyi\"" + > + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "fuchsia-arm64-cast" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "fuchsia-x64-cast" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "fuchsia-x64-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "ios-simulator" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:ios-simulator" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.ci" + recipe: < + name: "ios/unified_builder_tester" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.mac\"" + > + execution_timeout_secs: 10800 + caches: < + name: "xcode_ios_11c29" + path: "xcode_ios_11c29.app" + > + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "linux-chromeos-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.chromiumos\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "linux-chromeos-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.chromiumos\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "linux-ozone-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.linux\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < + name: "mac-osxbeta-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.fyi\"" + > + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + > +> +buckets: < + name: "ci-stable" + acls: < + role: WRITER + group: "google/luci-task-force@google.com" + > + acls: < + group: "all" + > + acls: < + role: SCHEDULER + group: "project-chromium-ci-schedulers" + > + swarming: < + builders: < + name: "Android Release (Nexus 5X)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.gpu\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + builders: < name: "Android arm Builder (dbg)" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -9158,691 +11042,6 @@ > > buckets: < - name: "ci-stable" - acls: < - role: WRITER - group: "google/luci-task-force@google.com" - > - acls: < - group: "all" - > - acls: < - role: SCHEDULER - group: "project-chromium-ci-schedulers" - > - swarming: < - builders: < - name: "Android Release (Nexus 5X)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "GPU Linux Builder" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "GPU Mac Builder" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:GPU Mac Builder" - dimensions: "cpu:x86-64" - dimensions: "os:Mac" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "GPU Win x64 Builder" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Linux Builder" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.linux\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Linux Ozone Tester (Wayland)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"jobs\":500}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.linux\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Linux Ozone Tester (X11)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"jobs\":500}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.linux\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Linux Release (NVIDIA)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:2" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Linux Tests" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"jobs\":500}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.linux\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac Builder" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Mac Builder" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.14" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac Release (Intel)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:2" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac Retina Release (AMD)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:2" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac10.10 Tests" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Mac10.10 Tests" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.13" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac10.11 Tests" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Mac10.11 Tests" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.13" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac10.12 Tests" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Mac10.12 Tests" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.12" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac10.13 Tests" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Mac10.13 Tests" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.13" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Mac10.14 Tests" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Mac10.14 Tests" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.14" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "WebKit Mac10.13 (retina)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:WebKit Mac10.13 (retina)" - dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.13" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Win 7 Tests x64 (1)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win 7 Tests x64 (1)" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-7" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.win\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Win x64 Builder" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win x64 Builder" - dimensions: "cores:32" - dimensions: "cpu:x86-64" - dimensions: "os:Windows" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.win\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Win10 Tests x64" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win10 Tests x64" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-10" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.win\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Win10 Tests x64 1803" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win10 Tests x64 1803" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-10" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.fyi\"" - > - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "Win10 x64 Release (NVIDIA)" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:2" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.gpu\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "android-kitkat-arm-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.android\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "android-marshmallow-arm64-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.android\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "chromeos-amd64-generic-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.chromiumos\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "ios-simulator" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:ios-simulator" - dimensions: "cpu:x86-64" - dimensions: "os:Mac" - dimensions: "pool:luci.chromium.ci" - recipe: < - name: "ios/unified_builder_tester" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.mac\"" - > - execution_timeout_secs: 10800 - caches: < - name: "xcode_ios_11c29" - path: "xcode_ios_11c29.app" - > - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "linux-chromeos-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.chromiumos\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "linux-ozone-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.linux\"" - > - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < - name: "mac-osxbeta-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.fyi\"" - > - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - > -> -buckets: < name: "findit" acls: < identity: "user:findit-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -18827,6 +20026,1720 @@ > > builders: < + name: "android-cronet-arm-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android-kitkat-arm-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android-marshmallow-arm64-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:16" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/code_coverage:{\"use_java_coverage\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android-pie-arm64-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android-pie-arm64-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:16" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android_compile_dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android_compile_x64_dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android_compile_x86_dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android_cronet" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "android_optional_gpu_tests_rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:android_optional_gpu_tests_rel" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "cast_shell_android" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "cast_shell_linux" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "chromeos-amd64-generic-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "chromeos-amd64-generic-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "chromeos-arm-generic-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "chromeos-kevin-compile-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "chromeos-kevin-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "chromium_presubmit" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "presubmit" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$depot_tools/presubmit:{\"runhooks\":true,\"timeout_s\":480}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + properties_j: "repo_name:\"chromium\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "closure_compilation" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "closure_compilation" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "dawn-linux-x64-deps-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:dawn-linux-x64-deps-rel" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.dawn\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "dawn-mac-x64-deps-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:dawn-mac-x64-deps-rel" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.dawn\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "dawn-win10-x64-deps-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:dawn-win10-x64-deps-rel" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.dawn\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "dawn-win10-x86-deps-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:dawn-win10-x86-deps-rel" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.dawn\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "fuchsia-arm64-cast" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "fuchsia-compile-x64-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "fuchsia-x64-cast" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "fuchsia_arm64" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "fuchsia_x64" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "ios-simulator" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:ios-simulator" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "ios/try" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + caches: < + name: "xcode_ios_11c29" + path: "xcode_ios_11c29.app" + > + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "ios-simulator-cronet" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:ios-simulator-cronet" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "ios/try" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + caches: < + name: "xcode_ios_11c29" + path: "xcode_ios_11c29.app" + > + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "ios-simulator-full-configs" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:ios-simulator-full-configs" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "ios/try" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + caches: < + name: "xcode_ios_11c29" + path: "xcode_ios_11c29.app" + > + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "linux-blink-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.blink\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux-chromeos-compile-dbg" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux-chromeos-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.chromiumos\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux-libfuzzer-asan-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_libfuzzer_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux-ozone-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux-ozone-x11-and-wayland-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux_chromium_asan_rel_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux_chromium_compile_dbg_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "builder" + path: "linux_debug" + > + 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 + > + > + builders: < + name: "linux_chromium_dbg_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "builder" + path: "linux_debug" + > + 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 + > + > + builders: < + name: "linux_chromium_tsan_rel_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux_layout_tests_composite_after_paint" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux_layout_tests_layout_ng_disabled" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "linux_optional_gpu_tests_rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:linux_optional_gpu_tests_rel" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "linux_vr" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.linux\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "mac-coverage-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" + properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "mac-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "mac_chromium_compile_dbg_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-10.13" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "mac_optional_gpu_tests_rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:mac_optional_gpu_tests_rel" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.mac\"" + > + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < + name: "win-libfuzzer-asan-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:win-libfuzzer-asan-rel" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.try" + recipe: < + name: "chromium_libfuzzer_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.win\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "win10_chromium_x64_coverage_rel_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.win\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "win10_chromium_x64_rel_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:1" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.win\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "win_chromium_compile_dbg_ng" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.win\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < + name: "win_optional_gpu_tests_rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.win\"" + > + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + > +> +buckets: < + name: "try-stable" + acls: < + role: WRITER + group: "service-account-chromium-tryserver" + > + acls: < + group: "all" + > + acls: < + role: SCHEDULER + identity: "user:findit-for-me@appspot.gserviceaccount.com" + > + acls: < + role: SCHEDULER + identity: "user:tricium-prod@appspot.gserviceaccount.com" + > + acls: < + role: SCHEDULER + group: "project-chromium-tryjob-access" + > + acls: < + role: SCHEDULER + group: "service-account-chromeperf" + > + acls: < + role: SCHEDULER + group: "service-account-cq" + > + swarming: < + builders: < + name: "android-binary-size" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + recipe: < + name: "binary_size_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + 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 + > + > + builders: < name: "android-kitkat-arm-rel" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -19589,312 +22502,6 @@ > > buckets: < - name: "try-stable" - acls: < - role: WRITER - group: "service-account-chromium-tryserver" - > - acls: < - group: "all" - > - acls: < - role: SCHEDULER - identity: "user:findit-for-me@appspot.gserviceaccount.com" - > - acls: < - role: SCHEDULER - identity: "user:tricium-prod@appspot.gserviceaccount.com" - > - acls: < - role: SCHEDULER - group: "project-chromium-tryjob-access" - > - acls: < - role: SCHEDULER - group: "service-account-chromeperf" - > - acls: < - role: SCHEDULER - group: "service-account-cq" - > - swarming: < - builders: < - name: "android-kitkat-arm-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.android\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "android-marshmallow-arm64-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:16" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:1" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/code_coverage:{\"use_java_coverage\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.android\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "chromeos-amd64-generic-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.chromiumos\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "chromium_presubmit" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - recipe: < - name: "presubmit" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$depot_tools/presubmit:{\"runhooks\":true,\"timeout_s\":480}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.linux\"" - properties_j: "repo_name:\"chromium\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "ios-simulator" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:ios-simulator" - dimensions: "cpu:x86-64" - dimensions: "os:Mac" - dimensions: "pool:luci.chromium.try" - recipe: < - name: "ios/try" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.mac\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - caches: < - name: "win_toolchain" - path: "win_toolchain" - > - caches: < - name: "xcode_ios_11c29" - path: "xcode_ios_11c29.app" - > - build_numbers: YES - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - task_template_canary_percentage: < - value: 5 - > - > - builders: < - name: "linux-chromeos-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.chromiumos\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "linux-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.linux\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "mac-rel" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cpu:x86-64" - dimensions: "os:Mac" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:1" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.mac\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - builders: < - name: "win10_chromium_x64_rel_ng" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-10" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:1" - recipe: < - name: "chromium_trybot" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"tryserver.chromium.win\"" - > - execution_timeout_secs: 14400 - expiration_secs: 7200 - 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 - > - > - > -> -buckets: < name: "webrtc" acls: < role: WRITER
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index 8f4ab7ee..72bfc45 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -11145,7 +11145,7 @@ id: "main-beta" name: "Chromium Beta Console" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/branch-heads/4044" + refs: "regexp:refs/branch-heads/4085" manifest_name: "REVISION" builders: < name: "buildbucket/luci.chromium.ci-beta/Linux Builder" @@ -11173,11 +11173,36 @@ short_name: "ozo" > builders: < + name: "buildbucket/luci.chromium.ci-beta/Linux Builder (dbg)" + category: "chromium.linux|debug|builder" + short_name: "64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Linux Tests (dbg)(1)" + category: "chromium.linux|debug|tester" + short_name: "64" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/Cast Linux" category: "chromium.linux|cast" short_name: "vid" > builders: < + name: "buildbucket/luci.chromium.ci-beta/fuchsia-arm64-cast" + category: "chromium.linux|fuchsia|cast" + short_name: "a64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/fuchsia-x64-cast" + category: "chromium.linux|fuchsia|cast" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/fuchsia-x64-dbg" + category: "chromium.linux|fuchsia|x64" + short_name: "dbg" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/Fuchsia ARM64" category: "chromium.linux|fuchsia|a64" > @@ -11202,11 +11227,21 @@ short_name: "arm" > builders: < + name: "buildbucket/luci.chromium.ci-beta/chromeos-amd64-generic-dbg" + category: "chromium.chromiumos|simple|debug|x64" + short_name: "dbg" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/chromeos-amd64-generic-rel" category: "chromium.chromiumos|simple|release|x64" short_name: "rel" > builders: < + name: "buildbucket/luci.chromium.ci-beta/chromeos-kevin-rel" + category: "chromium.chromiumos|simple|release" + short_name: "kvn" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/Mac Builder" category: "chromium.mac|release" short_name: "bld" @@ -11317,11 +11352,76 @@ short_name: "32" > builders: < + name: "buildbucket/luci.chromium.ci-beta/Android arm64 Builder (dbg)" + category: "chromium.android|builder|arm" + short_name: "64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Android x86 Builder (dbg)" + category: "chromium.android|builder|x86" + short_name: "32" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Android x64 Builder (dbg)" + category: "chromium.android|builder|x86" + short_name: "64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Marshmallow 64 bit Tester" + category: "chromium.android|tester|phone" + short_name: "M" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Nougat Phone Tester" + category: "chromium.android|tester|phone" + short_name: "N" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Oreo Phone Tester" + category: "chromium.android|tester|phone" + short_name: "O" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/android-pie-arm64-dbg" + category: "chromium.android|tester|phone" + short_name: "P" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/android-pie-arm64-rel" + category: "chromium.android|on_cq" + short_name: "P" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Android WebView M (dbg)" + category: "chromium.android|tester|webview" + short_name: "M" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Android WebView N (dbg)" + category: "chromium.android|tester|webview" + short_name: "N" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Android WebView O (dbg)" + category: "chromium.android|tester|webview" + short_name: "O" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Android WebView P (dbg)" + category: "chromium.android|tester|webview" + short_name: "P" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/android-cronet-arm-rel" category: "chromium.android|cronet|arm" short_name: "rel" > builders: < + name: "buildbucket/luci.chromium.ci-beta/android-cronet-arm-dbg" + category: "cronet|arm" + short_name: "dbg" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/android-cronet-kitkat-arm-rel" category: "chromium.android|cronet|test" short_name: "k" @@ -11332,6 +11432,74 @@ short_name: "l" > builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Linux x64 DEPS Builder" + category: "chromium.dawn|DEPS|Linux|Builder" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Linux x64 DEPS Release (Intel HD 630)" + category: "chromium.dawn|DEPS|Linux|Intel" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Linux x64 DEPS Release (NVIDIA)" + category: "chromium.dawn|DEPS|Linux|Nvidia" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Mac x64 DEPS Builder" + category: "chromium.dawn|DEPS|Mac|Builder" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Mac x64 DEPS Release (AMD)" + category: "chromium.dawn|DEPS|Mac|AMD" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Mac x64 DEPS Release (Intel)" + category: "chromium.dawn|DEPS|Mac|Intel" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x86 DEPS Builder" + category: "chromium.dawn|DEPS|Windows|Builder" + short_name: "x86" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x64 DEPS Builder" + category: "chromium.dawn|DEPS|Windows|Builder" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x86 DEPS Release (Intel HD 630)" + category: "chromium.dawn|DEPS|Windows|Intel" + short_name: "x86" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x64 DEPS Release (Intel HD 630)" + category: "chromium.dawn|DEPS|Windows|Intel" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x86 DEPS Release (NVIDIA)" + category: "chromium.dawn|DEPS|Windows|Nvidia" + short_name: "x86" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x64 DEPS Release (NVIDIA)" + category: "chromium.dawn|DEPS|Windows|Nvidia" + short_name: "x64" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/chromeos-kevin-rel-hw-tests" + category: "chromium.fyi|chromeos" + > + builders: < + name: "buildbucket/luci.chromium.ci-beta/VR Linux" + category: "chromium.fyi|linux" + > + builders: < name: "buildbucket/luci.chromium.ci-beta/mac-osxbeta-rel" category: "chromium.fyi|mac" short_name: "osxbeta" @@ -11642,7 +11810,7 @@ id: "main-stable" name: "Chromium Stable Console" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/branch-heads/3987" + refs: "regexp:refs/branch-heads/4044" manifest_name: "REVISION" builders: < name: "buildbucket/luci.chromium.ci-stable/Linux Builder" @@ -11665,14 +11833,38 @@ short_name: "tst" > builders: < + name: "buildbucket/luci.chromium.ci-stable/linux-ozone-rel" + category: "chromium.linux|release" + short_name: "ozo" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Cast Linux" + category: "chromium.linux|cast" + short_name: "vid" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Fuchsia ARM64" + category: "chromium.linux|fuchsia|a64" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Fuchsia x64" + category: "chromium.linux|fuchsia|x64" + short_name: "rel" + > + builders: < name: "buildbucket/luci.chromium.ci-stable/linux-chromeos-rel" category: "chromium.chromiumos|default" short_name: "rel" > builders: < - name: "buildbucket/luci.chromium.ci-stable/linux-ozone-rel" - category: "chromium.linux|release" - short_name: "ozo" + name: "buildbucket/luci.chromium.ci-stable/linux-chromeos-dbg" + category: "chromium.chromiumos|default" + short_name: "dbg" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/chromeos-arm-generic-rel" + category: "chromium.chromiumos|simple|release" + short_name: "arm" > builders: < name: "buildbucket/luci.chromium.ci-stable/chromeos-amd64-generic-rel" @@ -11715,6 +11907,16 @@ short_name: "ret" > builders: < + name: "buildbucket/luci.chromium.ci-stable/Mac Builder (dbg)" + category: "chromium.mac|debug" + short_name: "bld" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Mac10.13 Tests (dbg)" + category: "chromium.mac|debug" + short_name: "13" + > + builders: < name: "buildbucket/luci.chromium.ci-stable/ios-simulator" category: "chromium.mac|ios|default" short_name: "sim" @@ -11735,6 +11937,31 @@ short_name: "w10" > builders: < + name: "buildbucket/luci.chromium.ci-stable/Win Builder (dbg)" + category: "chromium.win|debug|builder" + short_name: "32" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Win7 Tests (dbg)(1)" + category: "chromium.win|debug|tester" + short_name: "7" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Linux ASan LSan Builder" + category: "chromium.memory|linux|asan lsan" + short_name: "bld" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Linux ASan LSan Tests (1)" + category: "chromium.memory|linux|asan lsan" + short_name: "tst" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Linux ASan Tests (sandboxed)" + category: "chromium.memory|linux|asan lsan" + short_name: "sbx" + > + builders: < name: "buildbucket/luci.chromium.ci-stable/android-kitkat-arm-rel" category: "chromium.android" short_name: "k" @@ -11745,6 +11972,31 @@ short_name: "m" > builders: < + name: "buildbucket/luci.chromium.ci-stable/Cast Android (dbg)" + category: "chromium.android" + short_name: "cst" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/Android arm Builder (dbg)" + category: "chromium.android|builder|arm" + short_name: "32" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/android-cronet-arm-rel" + category: "chromium.android|cronet|arm" + short_name: "rel" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/android-cronet-kitkat-arm-rel" + category: "chromium.android|cronet|test" + short_name: "k" + > + builders: < + name: "buildbucket/luci.chromium.ci-stable/android-cronet-lollipop-arm-rel" + category: "chromium.android|cronet|test" + short_name: "l" + > + builders: < name: "buildbucket/luci.chromium.ci-stable/mac-osxbeta-rel" category: "chromium.fyi|mac" short_name: "osxbeta" @@ -12365,33 +12617,84 @@ name: "buildbucket/luci.chromium.try-beta/android-binary-size" > builders: < + name: "buildbucket/luci.chromium.try-beta/android-cronet-arm-dbg" + > + builders: < name: "buildbucket/luci.chromium.try-beta/android-kitkat-arm-rel" > builders: < name: "buildbucket/luci.chromium.try-beta/android-marshmallow-arm64-rel" > builders: < + name: "buildbucket/luci.chromium.try-beta/android-pie-arm64-dbg" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/android-pie-arm64-rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/android_compile_dbg" > builders: < + name: "buildbucket/luci.chromium.try-beta/android_compile_x64_dbg" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/android_compile_x86_dbg" + > + builders: < name: "buildbucket/luci.chromium.try-beta/android_cronet" > builders: < + name: "buildbucket/luci.chromium.try-beta/android_optional_gpu_tests_rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/cast_shell_android" > builders: < name: "buildbucket/luci.chromium.try-beta/cast_shell_linux" > builders: < + name: "buildbucket/luci.chromium.try-beta/chromeos-amd64-generic-dbg" + > + builders: < name: "buildbucket/luci.chromium.try-beta/chromeos-amd64-generic-rel" > builders: < name: "buildbucket/luci.chromium.try-beta/chromeos-arm-generic-rel" > builders: < + name: "buildbucket/luci.chromium.try-beta/chromeos-kevin-compile-rel" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/chromeos-kevin-rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/chromium_presubmit" > builders: < + name: "buildbucket/luci.chromium.try-beta/closure_compilation" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/dawn-linux-x64-deps-rel" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/dawn-mac-x64-deps-rel" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/dawn-win10-x64-deps-rel" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/dawn-win10-x86-deps-rel" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/fuchsia-arm64-cast" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/fuchsia-compile-x64-dbg" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/fuchsia-x64-cast" + > + builders: < name: "buildbucket/luci.chromium.try-beta/fuchsia_arm64" > builders: < @@ -12401,6 +12704,15 @@ name: "buildbucket/luci.chromium.try-beta/ios-simulator" > builders: < + name: "buildbucket/luci.chromium.try-beta/ios-simulator-cronet" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/ios-simulator-full-configs" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/linux-blink-rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/linux-chromeos-compile-dbg" > builders: < @@ -12413,6 +12725,9 @@ name: "buildbucket/luci.chromium.try-beta/linux-ozone-rel" > builders: < + name: "buildbucket/luci.chromium.try-beta/linux-ozone-x11-and-wayland-rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/linux-rel" > builders: < @@ -12422,55 +12737,133 @@ name: "buildbucket/luci.chromium.try-beta/linux_chromium_compile_dbg_ng" > builders: < + name: "buildbucket/luci.chromium.try-beta/linux_chromium_dbg_ng" + > + builders: < name: "buildbucket/luci.chromium.try-beta/linux_chromium_tsan_rel_ng" > builders: < + name: "buildbucket/luci.chromium.try-beta/linux_layout_tests_composite_after_paint" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/linux_layout_tests_layout_ng_disabled" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/linux_optional_gpu_tests_rel" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/linux_vr" + > + builders: < + name: "buildbucket/luci.chromium.try-beta/mac-coverage-rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/mac-rel" > builders: < name: "buildbucket/luci.chromium.try-beta/mac_chromium_compile_dbg_ng" > builders: < + name: "buildbucket/luci.chromium.try-beta/mac_optional_gpu_tests_rel" + > + builders: < name: "buildbucket/luci.chromium.try-beta/win-libfuzzer-asan-rel" > builders: < + name: "buildbucket/luci.chromium.try-beta/win10_chromium_x64_coverage_rel_ng" + > + builders: < name: "buildbucket/luci.chromium.try-beta/win10_chromium_x64_rel_ng" > builders: < name: "buildbucket/luci.chromium.try-beta/win_chromium_compile_dbg_ng" > + builders: < + name: "buildbucket/luci.chromium.try-beta/win_optional_gpu_tests_rel" + > builder_view_only: true > consoles: < id: "try-stable" name: "try-stable" builders: < + name: "buildbucket/luci.chromium.try-stable/android-binary-size" + > + builders: < name: "buildbucket/luci.chromium.try-stable/android-kitkat-arm-rel" > builders: < name: "buildbucket/luci.chromium.try-stable/android-marshmallow-arm64-rel" > builders: < + name: "buildbucket/luci.chromium.try-stable/android_compile_dbg" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/android_cronet" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/cast_shell_android" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/cast_shell_linux" + > + builders: < name: "buildbucket/luci.chromium.try-stable/chromeos-amd64-generic-rel" > builders: < + name: "buildbucket/luci.chromium.try-stable/chromeos-arm-generic-rel" + > + builders: < name: "buildbucket/luci.chromium.try-stable/chromium_presubmit" > builders: < + name: "buildbucket/luci.chromium.try-stable/fuchsia_arm64" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/fuchsia_x64" + > + builders: < name: "buildbucket/luci.chromium.try-stable/ios-simulator" > builders: < + name: "buildbucket/luci.chromium.try-stable/linux-chromeos-compile-dbg" + > + builders: < name: "buildbucket/luci.chromium.try-stable/linux-chromeos-rel" > builders: < + name: "buildbucket/luci.chromium.try-stable/linux-libfuzzer-asan-rel" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/linux-ozone-rel" + > + builders: < name: "buildbucket/luci.chromium.try-stable/linux-rel" > builders: < + name: "buildbucket/luci.chromium.try-stable/linux_chromium_asan_rel_ng" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/linux_chromium_compile_dbg_ng" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/linux_chromium_tsan_rel_ng" + > + builders: < name: "buildbucket/luci.chromium.try-stable/mac-rel" > builders: < + name: "buildbucket/luci.chromium.try-stable/mac_chromium_compile_dbg_ng" + > + builders: < + name: "buildbucket/luci.chromium.try-stable/win-libfuzzer-asan-rel" + > + builders: < name: "buildbucket/luci.chromium.try-stable/win10_chromium_x64_rel_ng" > + builders: < + name: "buildbucket/luci.chromium.try-stable/win_chromium_compile_dbg_ng" + > builder_view_only: true > consoles: <
diff --git a/infra/config/generated/luci-notify.cfg b/infra/config/generated/luci-notify.cfg index efbbd26..ff54cfd 100644 --- a/infra/config/generated/luci-notify.cfg +++ b/infra/config/generated/luci-notify.cfg
@@ -699,6 +699,19 @@ > builders: < bucket: "ci-beta" + name: "android-cronet-arm-dbg" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cronet-bots-observer@google.com" + > + > + builders: < + bucket: "ci-beta" name: "android-cronet-arm-rel" repository: "https://chromium.googlesource.com/chromium/src" > @@ -727,3 +740,105 @@ name: "android-cronet-lollipop-arm-rel" > > +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cr-fuchsia+bot@chromium.org" + > + > + builders: < + bucket: "ci-beta" + name: "fuchsia-arm64-cast" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cr-fuchsia+bot@chromium.org" + > + > + builders: < + bucket: "ci-beta" + name: "fuchsia-x64-cast" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cr-fuchsia+bot@chromium.org" + > + > + builders: < + bucket: "ci-beta" + name: "fuchsia-x64-dbg" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cr-fuchsia+bot@chromium.org" + > + > + builders: < + bucket: "ci-stable" + name: "Fuchsia ARM64" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cr-fuchsia+bot@chromium.org" + > + > + builders: < + bucket: "ci-stable" + name: "Fuchsia x64" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cronet-bots-observer@google.com" + > + > + builders: < + bucket: "ci-stable" + name: "android-cronet-arm-rel" + repository: "https://chromium.googlesource.com/chromium/src" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cronet-bots-observer@google.com" + > + > + builders: < + bucket: "ci-stable" + name: "android-cronet-kitkat-arm-rel" + > +> +notifiers: < + notifications: < + on_change: true + email: < + recipients: "cronet-bots-observer@google.com" + > + > + builders: < + bucket: "ci-stable" + name: "android-cronet-lollipop-arm-rel" + > +>
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index 2a3024a..5e3775b5 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -275,58 +275,6 @@ > > job: < - id: "Android WebView M (dbg)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android WebView M (dbg)" - > -> -job: < - id: "Android WebView N (dbg)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android WebView N (dbg)" - > -> -job: < - id: "Android WebView O (dbg)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android WebView O (dbg)" - > -> -job: < - id: "Android WebView P (dbg)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android WebView P (dbg)" - > -> -job: < id: "Android WebView P Blink-CORS FYI (rel)" acl_sets: "ci" buildbucket: < @@ -345,33 +293,6 @@ > > job: < - id: "Android arm64 Builder (dbg)" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android arm64 Builder (dbg)" - > -> -job: < - id: "Android x64 Builder (dbg)" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android x64 Builder (dbg)" - > -> -job: < - id: "Android x86 Builder (dbg)" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Android x86 Builder (dbg)" - > -> -job: < id: "CFI Linux CF" acl_sets: "ci" buildbucket: < @@ -619,41 +540,6 @@ > > job: < - id: "Dawn Linux x64 DEPS Builder" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Linux x64 DEPS Builder" - > -> -job: < - id: "Dawn Linux x64 DEPS Release (Intel HD 630)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Linux x64 DEPS Release (Intel HD 630)" - > -> -job: < - id: "Dawn Linux x64 DEPS Release (NVIDIA)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Linux x64 DEPS Release (NVIDIA)" - > -> -job: < id: "Dawn Linux x64 Release (Intel HD 630)" acls: < role: TRIGGERER @@ -689,41 +575,6 @@ > > job: < - id: "Dawn Mac x64 DEPS Builder" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Mac x64 DEPS Builder" - > -> -job: < - id: "Dawn Mac x64 DEPS Release (AMD)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Mac x64 DEPS Release (AMD)" - > -> -job: < - id: "Dawn Mac x64 DEPS Release (Intel)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Mac x64 DEPS Release (Intel)" - > -> -job: < id: "Dawn Mac x64 Release (AMD)" acls: < role: TRIGGERER @@ -759,41 +610,6 @@ > > job: < - id: "Dawn Win10 x64 DEPS Builder" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Win10 x64 DEPS Builder" - > -> -job: < - id: "Dawn Win10 x64 DEPS Release (Intel HD 630)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)" - > -> -job: < - id: "Dawn Win10 x64 DEPS Release (NVIDIA)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Win10 x64 DEPS Release (NVIDIA)" - > -> -job: < id: "Dawn Win10 x64 Release (Intel HD 630)" acls: < role: TRIGGERER @@ -829,41 +645,6 @@ > > job: < - id: "Dawn Win10 x86 DEPS Builder" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Win10 x86 DEPS Builder" - > -> -job: < - id: "Dawn Win10 x86 DEPS Release (Intel HD 630)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)" - > -> -job: < - id: "Dawn Win10 x86 DEPS Release (NVIDIA)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Dawn Win10 x86 DEPS Release (NVIDIA)" - > -> -job: < id: "Dawn Win10 x86 Release (Intel HD 630)" acls: < role: TRIGGERER @@ -1315,15 +1096,6 @@ > > job: < - id: "Linux Builder (dbg)" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Linux Builder (dbg)" - > -> -job: < id: "Linux Builder (dbg)(32)" acl_sets: "ci" buildbucket: < @@ -1662,19 +1434,6 @@ > > job: < - id: "Linux Tests (dbg)(1)" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Linux Tests (dbg)(1)" - > -> -job: < id: "Linux Viz" acl_sets: "ci" buildbucket: < @@ -2100,19 +1859,6 @@ > > job: < - id: "Marshmallow 64 bit Tester" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Marshmallow 64 bit Tester" - > -> -job: < id: "ci-Marshmallow Tablet Tester" acls: < role: TRIGGERER @@ -2171,32 +1917,6 @@ > > job: < - id: "Nougat Phone Tester" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Nougat Phone Tester" - > -> -job: < - id: "Oreo Phone Tester" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "Oreo Phone Tester" - > -> -job: < id: "Site Isolation Android" acl_sets: "ci" buildbucket: < @@ -2528,15 +2248,6 @@ > > job: < - id: "VR Linux" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "VR Linux" - > -> -job: < id: "WebKit Linux ASAN" acl_sets: "ci" buildbucket: < @@ -3495,15 +3206,6 @@ > > job: < - id: "android-cronet-arm-dbg" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "android-cronet-arm-dbg" - > -> -job: < id: "android-cronet-arm64-dbg" acl_sets: "ci" buildbucket: < @@ -3608,28 +3310,6 @@ > > job: < - id: "android-pie-arm64-dbg" - acls: < - role: TRIGGERER - granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "android-pie-arm64-dbg" - > -> -job: < - id: "android-pie-arm64-rel" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "android-pie-arm64-rel" - > -> -job: < id: "android-pie-x86-fyi-rel" acl_sets: "ci" buildbucket: < @@ -3667,15 +3347,6 @@ > > job: < - id: "chromeos-amd64-generic-dbg" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "chromeos-amd64-generic-dbg" - > -> -job: < id: "chromeos-amd64-generic-rel-goma-canary" acl_sets: "goma" buildbucket: < @@ -3730,24 +3401,6 @@ > > job: < - id: "chromeos-kevin-rel" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "chromeos-kevin-rel" - > -> -job: < - id: "chromeos-kevin-rel-hw-tests" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "chromeos-kevin-rel-hw-tests" - > -> -job: < id: "ci-Android Release (Nexus 5X)" acl_sets: "ci" buildbucket: < @@ -3757,6 +3410,58 @@ > > job: < + id: "ci-Android WebView M (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android WebView M (dbg)" + > +> +job: < + id: "ci-Android WebView N (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android WebView N (dbg)" + > +> +job: < + id: "ci-Android WebView O (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android WebView O (dbg)" + > +> +job: < + id: "ci-Android WebView P (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android WebView P (dbg)" + > +> +job: < id: "ci-Android arm Builder (dbg)" acl_sets: "ci" buildbucket: < @@ -3766,6 +3471,33 @@ > > job: < + id: "ci-Android arm64 Builder (dbg)" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android arm64 Builder (dbg)" + > +> +job: < + id: "ci-Android x64 Builder (dbg)" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android x64 Builder (dbg)" + > +> +job: < + id: "ci-Android x86 Builder (dbg)" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Android x86 Builder (dbg)" + > +> +job: < id: "ci-Cast Android (dbg)" acl_sets: "ci" buildbucket: < @@ -3784,6 +3516,146 @@ > > job: < + id: "ci-Dawn Linux x64 DEPS Builder" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Linux x64 DEPS Builder" + > +> +job: < + id: "ci-Dawn Linux x64 DEPS Release (Intel HD 630)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Linux x64 DEPS Release (Intel HD 630)" + > +> +job: < + id: "ci-Dawn Linux x64 DEPS Release (NVIDIA)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Linux x64 DEPS Release (NVIDIA)" + > +> +job: < + id: "ci-Dawn Mac x64 DEPS Builder" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Mac x64 DEPS Builder" + > +> +job: < + id: "ci-Dawn Mac x64 DEPS Release (AMD)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Mac x64 DEPS Release (AMD)" + > +> +job: < + id: "ci-Dawn Mac x64 DEPS Release (Intel)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Mac x64 DEPS Release (Intel)" + > +> +job: < + id: "ci-Dawn Win10 x64 DEPS Builder" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Win10 x64 DEPS Builder" + > +> +job: < + id: "ci-Dawn Win10 x64 DEPS Release (Intel HD 630)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)" + > +> +job: < + id: "ci-Dawn Win10 x64 DEPS Release (NVIDIA)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Win10 x64 DEPS Release (NVIDIA)" + > +> +job: < + id: "ci-Dawn Win10 x86 DEPS Builder" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Win10 x86 DEPS Builder" + > +> +job: < + id: "ci-Dawn Win10 x86 DEPS Release (Intel HD 630)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)" + > +> +job: < + id: "ci-Dawn Win10 x86 DEPS Release (NVIDIA)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Dawn Win10 x86 DEPS Release (NVIDIA)" + > +> +job: < id: "ci-Fuchsia ARM64" acl_sets: "ci" buildbucket: < @@ -3873,6 +3745,15 @@ > > job: < + id: "ci-Linux Builder (dbg)" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Linux Builder (dbg)" + > +> +job: < id: "ci-Linux Ozone Tester (Wayland)" acls: < role: TRIGGERER @@ -3925,6 +3806,19 @@ > > job: < + id: "ci-Linux Tests (dbg)(1)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Linux Tests (dbg)(1)" + > +> +job: < id: "ci-Mac Builder" acl_sets: "ci" buildbucket: < @@ -4047,6 +3941,54 @@ > > job: < + id: "ci-Marshmallow 64 bit Tester" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Marshmallow 64 bit Tester" + > +> +job: < + id: "ci-Nougat Phone Tester" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Nougat Phone Tester" + > +> +job: < + id: "ci-Oreo Phone Tester" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Oreo Phone Tester" + > +> +job: < + id: "ci-VR Linux" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "VR Linux" + > +> +job: < id: "ci-WebKit Mac10.13 (retina)" acls: < role: TRIGGERER @@ -4143,6 +4085,15 @@ > > job: < + id: "ci-android-cronet-arm-dbg" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "android-cronet-arm-dbg" + > +> +job: < id: "ci-android-cronet-arm-rel" acl_sets: "ci" buildbucket: < @@ -4196,6 +4147,28 @@ > > job: < + id: "ci-android-pie-arm64-dbg" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "android-pie-arm64-dbg" + > +> +job: < + id: "ci-android-pie-arm64-rel" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "android-pie-arm64-rel" + > +> +job: < id: "ci-beta-Android Release (Nexus 5X)" acl_sets: "ci-beta" buildbucket: < @@ -4205,6 +4178,58 @@ > > job: < + id: "ci-beta-Android WebView M (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android WebView M (dbg)" + > +> +job: < + id: "ci-beta-Android WebView N (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android WebView N (dbg)" + > +> +job: < + id: "ci-beta-Android WebView O (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android WebView O (dbg)" + > +> +job: < + id: "ci-beta-Android WebView P (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android WebView P (dbg)" + > +> +job: < id: "ci-beta-Android arm Builder (dbg)" acl_sets: "ci-beta" buildbucket: < @@ -4214,6 +4239,33 @@ > > job: < + id: "ci-beta-Android arm64 Builder (dbg)" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android arm64 Builder (dbg)" + > +> +job: < + id: "ci-beta-Android x64 Builder (dbg)" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android x64 Builder (dbg)" + > +> +job: < + id: "ci-beta-Android x86 Builder (dbg)" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Android x86 Builder (dbg)" + > +> +job: < id: "ci-beta-Cast Android (dbg)" acl_sets: "ci-beta" buildbucket: < @@ -4232,6 +4284,146 @@ > > job: < + id: "ci-beta-Dawn Linux x64 DEPS Builder" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Linux x64 DEPS Builder" + > +> +job: < + id: "ci-beta-Dawn Linux x64 DEPS Release (Intel HD 630)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Linux x64 DEPS Release (Intel HD 630)" + > +> +job: < + id: "ci-beta-Dawn Linux x64 DEPS Release (NVIDIA)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Linux x64 DEPS Release (NVIDIA)" + > +> +job: < + id: "ci-beta-Dawn Mac x64 DEPS Builder" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Mac x64 DEPS Builder" + > +> +job: < + id: "ci-beta-Dawn Mac x64 DEPS Release (AMD)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Mac x64 DEPS Release (AMD)" + > +> +job: < + id: "ci-beta-Dawn Mac x64 DEPS Release (Intel)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Mac x64 DEPS Release (Intel)" + > +> +job: < + id: "ci-beta-Dawn Win10 x64 DEPS Builder" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Win10 x64 DEPS Builder" + > +> +job: < + id: "ci-beta-Dawn Win10 x64 DEPS Release (Intel HD 630)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)" + > +> +job: < + id: "ci-beta-Dawn Win10 x64 DEPS Release (NVIDIA)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Win10 x64 DEPS Release (NVIDIA)" + > +> +job: < + id: "ci-beta-Dawn Win10 x86 DEPS Builder" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Win10 x86 DEPS Builder" + > +> +job: < + id: "ci-beta-Dawn Win10 x86 DEPS Release (Intel HD 630)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)" + > +> +job: < + id: "ci-beta-Dawn Win10 x86 DEPS Release (NVIDIA)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Dawn Win10 x86 DEPS Release (NVIDIA)" + > +> +job: < id: "ci-beta-Fuchsia ARM64" acl_sets: "ci-beta" buildbucket: < @@ -4321,6 +4513,15 @@ > > job: < + id: "ci-beta-Linux Builder (dbg)" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Linux Builder (dbg)" + > +> +job: < id: "ci-beta-Linux Ozone Tester (Wayland)" acls: < role: TRIGGERER @@ -4373,6 +4574,19 @@ > > job: < + id: "ci-beta-Linux Tests (dbg)(1)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Linux Tests (dbg)(1)" + > +> +job: < id: "ci-beta-Mac Builder" acl_sets: "ci-beta" buildbucket: < @@ -4495,6 +4709,54 @@ > > job: < + id: "ci-beta-Marshmallow 64 bit Tester" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Marshmallow 64 bit Tester" + > +> +job: < + id: "ci-beta-Nougat Phone Tester" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Nougat Phone Tester" + > +> +job: < + id: "ci-beta-Oreo Phone Tester" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "Oreo Phone Tester" + > +> +job: < + id: "ci-beta-VR Linux" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "VR Linux" + > +> +job: < id: "ci-beta-WebKit Mac10.13 (retina)" acls: < role: TRIGGERER @@ -4591,6 +4853,15 @@ > > job: < + id: "ci-beta-android-cronet-arm-dbg" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "android-cronet-arm-dbg" + > +> +job: < id: "ci-beta-android-cronet-arm-rel" acl_sets: "ci-beta" buildbucket: < @@ -4644,6 +4915,37 @@ > > job: < + id: "ci-beta-android-pie-arm64-dbg" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "android-pie-arm64-dbg" + > +> +job: < + id: "ci-beta-android-pie-arm64-rel" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "android-pie-arm64-rel" + > +> +job: < + id: "ci-beta-chromeos-amd64-generic-dbg" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "chromeos-amd64-generic-dbg" + > +> +job: < id: "ci-beta-chromeos-amd64-generic-rel" acl_sets: "ci-beta" buildbucket: < @@ -4662,6 +4964,51 @@ > > job: < + id: "ci-beta-chromeos-kevin-rel" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "chromeos-kevin-rel" + > +> +job: < + id: "ci-beta-chromeos-kevin-rel-hw-tests" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "chromeos-kevin-rel-hw-tests" + > +> +job: < + id: "ci-beta-fuchsia-arm64-cast" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "fuchsia-arm64-cast" + > +> +job: < + id: "ci-beta-fuchsia-x64-cast" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "fuchsia-x64-cast" + > +> +job: < + id: "ci-beta-fuchsia-x64-dbg" + acl_sets: "ci-beta" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-beta" + builder: "fuchsia-x64-dbg" + > +> +job: < id: "ci-beta-ios-simulator" acl_sets: "ci-beta" buildbucket: < @@ -4711,6 +5058,15 @@ > > job: < + id: "ci-chromeos-amd64-generic-dbg" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "chromeos-amd64-generic-dbg" + > +> +job: < id: "ci-chromeos-amd64-generic-rel" acl_sets: "ci" buildbucket: < @@ -4729,6 +5085,51 @@ > > job: < + id: "ci-chromeos-kevin-rel" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "chromeos-kevin-rel" + > +> +job: < + id: "ci-chromeos-kevin-rel-hw-tests" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "chromeos-kevin-rel-hw-tests" + > +> +job: < + id: "ci-fuchsia-arm64-cast" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "fuchsia-arm64-cast" + > +> +job: < + id: "ci-fuchsia-x64-cast" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "fuchsia-x64-cast" + > +> +job: < + id: "ci-fuchsia-x64-dbg" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "fuchsia-x64-dbg" + > +> +job: < id: "ci-ios-simulator" acl_sets: "ci" buildbucket: < @@ -4787,6 +5188,51 @@ > > job: < + id: "ci-stable-Android arm Builder (dbg)" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Android arm Builder (dbg)" + > +> +job: < + id: "ci-stable-Cast Android (dbg)" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Cast Android (dbg)" + > +> +job: < + id: "ci-stable-Cast Linux" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Cast Linux" + > +> +job: < + id: "ci-stable-Fuchsia ARM64" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Fuchsia ARM64" + > +> +job: < + id: "ci-stable-Fuchsia x64" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Fuchsia x64" + > +> +job: < id: "ci-stable-GPU Linux Builder" acl_sets: "ci-stable" buildbucket: < @@ -4814,6 +5260,41 @@ > > job: < + id: "ci-stable-Linux ASan LSan Builder" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Linux ASan LSan Builder" + > +> +job: < + id: "ci-stable-Linux ASan LSan Tests (1)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Linux ASan LSan Tests (1)" + > +> +job: < + id: "ci-stable-Linux ASan Tests (sandboxed)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Linux ASan Tests (sandboxed)" + > +> +job: < id: "ci-stable-Linux Builder" acl_sets: "ci-stable" buildbucket: < @@ -4884,6 +5365,15 @@ > > job: < + id: "ci-stable-Mac Builder (dbg)" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Mac Builder (dbg)" + > +> +job: < id: "ci-stable-Mac Release (Intel)" acls: < role: TRIGGERER @@ -4962,6 +5452,19 @@ > > job: < + id: "ci-stable-Mac10.13 Tests (dbg)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Mac10.13 Tests (dbg)" + > +> +job: < id: "ci-stable-Mac10.14 Tests" acls: < role: TRIGGERER @@ -5001,6 +5504,15 @@ > > job: < + id: "ci-stable-Win Builder (dbg)" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Win Builder (dbg)" + > +> +job: < id: "ci-stable-Win x64 Builder" acl_sets: "ci-stable" buildbucket: < @@ -5049,6 +5561,54 @@ > > job: < + id: "ci-stable-Win7 Tests (dbg)(1)" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "Win7 Tests (dbg)(1)" + > +> +job: < + id: "ci-stable-android-cronet-arm-rel" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "android-cronet-arm-rel" + > +> +job: < + id: "ci-stable-android-cronet-kitkat-arm-rel" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "android-cronet-kitkat-arm-rel" + > +> +job: < + id: "ci-stable-android-cronet-lollipop-arm-rel" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "android-cronet-lollipop-arm-rel" + > +> +job: < id: "ci-stable-android-kitkat-arm-rel" acl_sets: "ci-stable" buildbucket: < @@ -5076,6 +5636,15 @@ > > job: < + id: "ci-stable-chromeos-arm-generic-rel" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "chromeos-arm-generic-rel" + > +> +job: < id: "ci-stable-ios-simulator" acl_sets: "ci-stable" buildbucket: < @@ -5085,6 +5654,15 @@ > > job: < + id: "ci-stable-linux-chromeos-dbg" + acl_sets: "ci-stable" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci-stable" + builder: "linux-chromeos-dbg" + > +> +job: < id: "ci-stable-linux-chromeos-rel" acl_sets: "ci-stable" buildbucket: < @@ -5116,15 +5694,6 @@ > > job: < - id: "fuchsia-arm64-cast" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "fuchsia-arm64-cast" - > -> -job: < id: "fuchsia-fyi-arm64-rel" acl_sets: "ci" buildbucket: < @@ -5152,24 +5721,6 @@ > > job: < - id: "fuchsia-x64-cast" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "fuchsia-x64-cast" - > -> -job: < - id: "fuchsia-x64-dbg" - acl_sets: "ci" - buildbucket: < - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "fuchsia-x64-dbg" - > -> -job: < id: "ios-device" acl_sets: "ci" buildbucket: < @@ -5880,7 +6431,7 @@ > > job: < - id: "ANGLE GPU Linux Release (Intel HD 630)" + id: "ci-ANGLE GPU Linux Release (Intel HD 630)" schedule: "triggered" acls: < role: TRIGGERER @@ -5890,7 +6441,27 @@ noop: <> > job: < - id: "ANGLE GPU Linux Release (NVIDIA)" + id: "ci-beta-ANGLE GPU Linux Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Linux Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-ANGLE GPU Linux Release (NVIDIA)" schedule: "triggered" acls: < role: TRIGGERER @@ -5900,7 +6471,27 @@ noop: <> > job: < - id: "ANGLE GPU Mac Release (Intel)" + id: "ci-beta-ANGLE GPU Linux Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Linux Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-ANGLE GPU Mac Release (Intel)" schedule: "triggered" acls: < role: TRIGGERER @@ -5910,7 +6501,27 @@ noop: <> > job: < - id: "ANGLE GPU Mac Retina Release (AMD)" + id: "ci-beta-ANGLE GPU Mac Release (Intel)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Mac Release (Intel)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-ANGLE GPU Mac Retina Release (AMD)" schedule: "triggered" acls: < role: TRIGGERER @@ -5920,7 +6531,27 @@ noop: <> > job: < - id: "ANGLE GPU Mac Retina Release (NVIDIA)" + id: "ci-beta-ANGLE GPU Mac Retina Release (AMD)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Mac Retina Release (AMD)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-ANGLE GPU Mac Retina Release (NVIDIA)" schedule: "triggered" acls: < role: TRIGGERER @@ -5930,7 +6561,27 @@ noop: <> > job: < - id: "ANGLE GPU Win10 x64 Release (Intel HD 630)" + id: "ci-beta-ANGLE GPU Mac Retina Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Mac Retina Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-ANGLE GPU Win10 x64 Release (Intel HD 630)" schedule: "triggered" acls: < role: TRIGGERER @@ -5940,7 +6591,27 @@ noop: <> > job: < - id: "ANGLE GPU Win10 x64 Release (NVIDIA)" + id: "ci-beta-ANGLE GPU Win10 x64 Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Win10 x64 Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-ANGLE GPU Win10 x64 Release (NVIDIA)" schedule: "triggered" acls: < role: TRIGGERER @@ -5950,7 +6621,27 @@ noop: <> > job: < - id: "Optional Linux Release (Intel HD 630)" + id: "ci-beta-ANGLE GPU Win10 x64 Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-ANGLE GPU Win10 x64 Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Linux Release (Intel HD 630)" schedule: "triggered" acls: < role: TRIGGERER @@ -5960,7 +6651,27 @@ noop: <> > job: < - id: "Optional Linux Release (NVIDIA)" + id: "ci-beta-Optional Linux Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Linux Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Linux Release (NVIDIA)" schedule: "triggered" acls: < role: TRIGGERER @@ -5970,7 +6681,27 @@ noop: <> > job: < - id: "Optional Mac Release (Intel)" + id: "ci-beta-Optional Linux Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Linux Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Mac Release (Intel)" schedule: "triggered" acls: < role: TRIGGERER @@ -5980,7 +6711,27 @@ noop: <> > job: < - id: "Optional Mac Retina Release (AMD)" + id: "ci-beta-Optional Mac Release (Intel)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Mac Release (Intel)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Mac Retina Release (AMD)" schedule: "triggered" acls: < role: TRIGGERER @@ -5990,7 +6741,27 @@ noop: <> > job: < - id: "Optional Mac Retina Release (NVIDIA)" + id: "ci-beta-Optional Mac Retina Release (AMD)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Mac Retina Release (AMD)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Mac Retina Release (NVIDIA)" schedule: "triggered" acls: < role: TRIGGERER @@ -6000,7 +6771,27 @@ noop: <> > job: < - id: "Optional Win10 x64 Release (Intel HD 630)" + id: "ci-beta-Optional Mac Retina Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Mac Retina Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Win10 x64 Release (Intel HD 630)" schedule: "triggered" acls: < role: TRIGGERER @@ -6010,7 +6801,27 @@ noop: <> > job: < - id: "Optional Win10 x64 Release (NVIDIA)" + id: "ci-beta-Optional Win10 x64 Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Win10 x64 Release (Intel HD 630)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Optional Win10 x64 Release (NVIDIA)" schedule: "triggered" acls: < role: TRIGGERER @@ -6020,7 +6831,27 @@ noop: <> > job: < - id: "Win7 ANGLE Tryserver (AMD)" + id: "ci-beta-Optional Win10 x64 Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Optional Win10 x64 Release (NVIDIA)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < + id: "ci-Win7 ANGLE Tryserver (AMD)" schedule: "triggered" acls: < role: TRIGGERER @@ -6030,6 +6861,26 @@ noop: <> > job: < + id: "ci-beta-Win7 ANGLE Tryserver (AMD)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-beta" + noop: <> +> +job: < + id: "ci-stable-Win7 ANGLE Tryserver (AMD)" + schedule: "triggered" + acls: < + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + > + acl_sets: "ci-stable" + noop: <> +> +job: < id: "ci-beta-Android WebView L (dbg)" schedule: "triggered" acls: < @@ -6154,8 +7005,15 @@ acl_sets: "ci-beta" triggers: "ci-beta-Android Release (Nexus 5X)" triggers: "ci-beta-Android arm Builder (dbg)" + triggers: "ci-beta-Android arm64 Builder (dbg)" + triggers: "ci-beta-Android x64 Builder (dbg)" + triggers: "ci-beta-Android x86 Builder (dbg)" triggers: "ci-beta-Cast Android (dbg)" triggers: "ci-beta-Cast Linux" + triggers: "ci-beta-Dawn Linux x64 DEPS Builder" + triggers: "ci-beta-Dawn Mac x64 DEPS Builder" + triggers: "ci-beta-Dawn Win10 x64 DEPS Builder" + triggers: "ci-beta-Dawn Win10 x86 DEPS Builder" triggers: "ci-beta-Fuchsia ARM64" triggers: "ci-beta-Fuchsia x64" triggers: "ci-beta-GPU Linux Builder" @@ -6163,22 +7021,32 @@ triggers: "ci-beta-GPU Win x64 Builder" triggers: "ci-beta-Linux ASan LSan Builder" triggers: "ci-beta-Linux Builder" + triggers: "ci-beta-Linux Builder (dbg)" triggers: "ci-beta-Mac Builder" triggers: "ci-beta-Mac Builder (dbg)" + triggers: "ci-beta-VR Linux" triggers: "ci-beta-Win Builder (dbg)" triggers: "ci-beta-Win x64 Builder" + triggers: "ci-beta-android-cronet-arm-dbg" triggers: "ci-beta-android-cronet-arm-rel" triggers: "ci-beta-android-kitkat-arm-rel" triggers: "ci-beta-android-marshmallow-arm64-rel" + triggers: "ci-beta-android-pie-arm64-rel" + triggers: "ci-beta-chromeos-amd64-generic-dbg" triggers: "ci-beta-chromeos-amd64-generic-rel" triggers: "ci-beta-chromeos-arm-generic-rel" + triggers: "ci-beta-chromeos-kevin-rel" + triggers: "ci-beta-chromeos-kevin-rel-hw-tests" + triggers: "ci-beta-fuchsia-arm64-cast" + triggers: "ci-beta-fuchsia-x64-cast" + triggers: "ci-beta-fuchsia-x64-dbg" triggers: "ci-beta-ios-simulator" triggers: "ci-beta-linux-chromeos-dbg" triggers: "ci-beta-linux-chromeos-rel" triggers: "ci-beta-linux-ozone-rel" gitiles: < repo: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/branch-heads/4044" + refs: "regexp:refs/branch-heads/4085" > > trigger: < @@ -6212,9 +7080,9 @@ triggers: "Android WebView P Blink-CORS FYI (rel)" triggers: "Android WebView P FYI (rel)" triggers: "ci-Android arm Builder (dbg)" - triggers: "Android arm64 Builder (dbg)" - triggers: "Android x64 Builder (dbg)" - triggers: "Android x86 Builder (dbg)" + triggers: "ci-Android arm64 Builder (dbg)" + triggers: "ci-Android x64 Builder (dbg)" + triggers: "ci-Android x86 Builder (dbg)" triggers: "CFI Linux CF" triggers: "CFI Linux ToT" triggers: "ci-Cast Android (dbg)" @@ -6225,13 +7093,13 @@ triggers: "CrWinAsan" triggers: "CrWinAsan(dll)" triggers: "Dawn Linux x64 Builder" - triggers: "Dawn Linux x64 DEPS Builder" + triggers: "ci-Dawn Linux x64 DEPS Builder" triggers: "Dawn Mac x64 Builder" - triggers: "Dawn Mac x64 DEPS Builder" + triggers: "ci-Dawn Mac x64 DEPS Builder" triggers: "Dawn Win10 x64 Builder" - triggers: "Dawn Win10 x64 DEPS Builder" + triggers: "ci-Dawn Win10 x64 DEPS Builder" triggers: "Dawn Win10 x86 Builder" - triggers: "Dawn Win10 x86 DEPS Builder" + triggers: "ci-Dawn Win10 x86 DEPS Builder" triggers: "Deterministic Android" triggers: "Deterministic Android (dbg)" triggers: "Deterministic Fuchsia (dbg)" @@ -6278,7 +7146,7 @@ triggers: "Libfuzzer Upload Windows ASan" triggers: "ci-Linux ASan LSan Builder" triggers: "ci-Linux Builder" - triggers: "Linux Builder (dbg)" + triggers: "ci-Linux Builder (dbg)" triggers: "Linux Builder (dbg)(32)" triggers: "Linux CFI" triggers: "Linux Chromium OS ASan LSan Builder" @@ -6341,7 +7209,7 @@ triggers: "UBSan Release" triggers: "UBSan vptr Release" triggers: "UBSanVptr Linux" - triggers: "VR Linux" + triggers: "ci-VR Linux" triggers: "WebKit Linux ASAN" triggers: "WebKit Linux Leak" triggers: "WebKit Linux MSAN" @@ -6360,7 +7228,7 @@ triggers: "android-asan" triggers: "android-bfcache-rel" triggers: "android-code-coverage-native" - triggers: "android-cronet-arm-dbg" + triggers: "ci-android-cronet-arm-dbg" triggers: "ci-android-cronet-arm-rel" triggers: "android-cronet-arm64-dbg" triggers: "android-cronet-arm64-rel" @@ -6373,23 +7241,23 @@ triggers: "android-lollipop-arm-rel" triggers: "ci-android-marshmallow-arm64-rel" triggers: "android-mojo-webview-rel" - triggers: "android-pie-arm64-rel" + triggers: "ci-android-pie-arm64-rel" triggers: "android-pie-x86-fyi-rel" triggers: "chromeos-amd64-generic-asan-rel" triggers: "chromeos-amd64-generic-cfi-thin-lto-rel" - triggers: "chromeos-amd64-generic-dbg" + triggers: "ci-chromeos-amd64-generic-dbg" triggers: "ci-chromeos-amd64-generic-rel" triggers: "chromeos-amd64-generic-rel-vm-tests" triggers: "chromeos-arm-generic-dbg" triggers: "ci-chromeos-arm-generic-rel" - triggers: "chromeos-kevin-rel" - triggers: "chromeos-kevin-rel-hw-tests" - triggers: "fuchsia-arm64-cast" + triggers: "ci-chromeos-kevin-rel" + triggers: "ci-chromeos-kevin-rel-hw-tests" + triggers: "ci-fuchsia-arm64-cast" triggers: "fuchsia-fyi-arm64-rel" triggers: "fuchsia-fyi-x64-dbg" triggers: "fuchsia-fyi-x64-rel" - triggers: "fuchsia-x64-cast" - triggers: "fuchsia-x64-dbg" + triggers: "ci-fuchsia-x64-cast" + triggers: "ci-fuchsia-x64-dbg" triggers: "ios-device" triggers: "ci-ios-simulator" triggers: "ios-simulator-code-coverage" @@ -6527,21 +7395,32 @@ id: "stable-gitiles-trigger" acl_sets: "ci-stable" triggers: "ci-stable-Android Release (Nexus 5X)" + triggers: "ci-stable-Android arm Builder (dbg)" + triggers: "ci-stable-Cast Android (dbg)" + triggers: "ci-stable-Cast Linux" + triggers: "ci-stable-Fuchsia ARM64" + triggers: "ci-stable-Fuchsia x64" triggers: "ci-stable-GPU Linux Builder" triggers: "ci-stable-GPU Mac Builder" triggers: "ci-stable-GPU Win x64 Builder" + triggers: "ci-stable-Linux ASan LSan Builder" triggers: "ci-stable-Linux Builder" triggers: "ci-stable-Mac Builder" + triggers: "ci-stable-Mac Builder (dbg)" + triggers: "ci-stable-Win Builder (dbg)" triggers: "ci-stable-Win x64 Builder" + triggers: "ci-stable-android-cronet-arm-rel" triggers: "ci-stable-android-kitkat-arm-rel" triggers: "ci-stable-android-marshmallow-arm64-rel" triggers: "ci-stable-chromeos-amd64-generic-rel" + triggers: "ci-stable-chromeos-arm-generic-rel" triggers: "ci-stable-ios-simulator" + triggers: "ci-stable-linux-chromeos-dbg" triggers: "ci-stable-linux-chromeos-rel" triggers: "ci-stable-linux-ozone-rel" gitiles: < repo: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/branch-heads/3987" + refs: "regexp:refs/branch-heads/4044" > > trigger: <
diff --git a/infra/config/generators/scheduler-noop-jobs.star b/infra/config/generators/scheduler-noop-jobs.star index 4c4fa27..c411d96 100644 --- a/infra/config/generators/scheduler-noop-jobs.star +++ b/infra/config/generators/scheduler-noop-jobs.star
@@ -2,9 +2,9 @@ load('@stdlib//internal/luci/proto.star', 'scheduler_pb') _GPU_NOOP_JOBS = [scheduler_pb.Job( - id = builder, + id = '{}-{}'.format(bucket, builder), schedule = 'triggered', - acl_sets = ['ci'], + acl_sets = [bucket], acls = [scheduler_pb.Acl( role = scheduler_pb.Acl.TRIGGERER, granted_to = 'chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com', @@ -26,6 +26,10 @@ 'Optional Win10 x64 Release (Intel HD 630)', 'Optional Win10 x64 Release (NVIDIA)', 'Win7 ANGLE Tryserver (AMD)', +) for bucket in ( + 'ci', + 'ci-beta', + 'ci-stable', )] # Android testers which are triggered by Android arm Builder (dbg)
diff --git a/infra/config/versioned/milestones.star b/infra/config/versioned/milestones.star index efa5cb5..450f75c 100644 --- a/infra/config/versioned/milestones.star +++ b/infra/config/versioned/milestones.star
@@ -1,2 +1,2 @@ -beta = 'm81' -stable = 'm80' +beta = 'm82' +stable = 'm81'
diff --git a/infra/config/versioned/milestones/m80/buckets/ci.star b/infra/config/versioned/milestones/m80/buckets/ci.star deleted file mode 100644 index e7a393a..0000000 --- a/infra/config/versioned/milestones/m80/buckets/ci.star +++ /dev/null
@@ -1,209 +0,0 @@ -load('//lib/builders.star', 'cpu', 'goma', 'os') -load('//lib/ci.star', 'ci') -load('//versioned/vars/ci.star', 'vars') -# Load this using relative path so that the load statement doesn't -# need to be changed when making a new milestone -load('../vars.star', milestone_vars='vars') - -luci.bucket( - name = vars.bucket.get(), - acls = [ - acl.entry( - roles = acl.BUILDBUCKET_READER, - groups = 'all', - ), - acl.entry( - roles = acl.BUILDBUCKET_TRIGGERER, - groups = 'project-chromium-ci-schedulers', - ), - acl.entry( - roles = acl.BUILDBUCKET_OWNER, - groups = 'google/luci-task-force@google.com', - ), - ], -) - -luci.gitiles_poller( - name = vars.poller.get(), - bucket = vars.bucket.get(), - repo = 'https://chromium.googlesource.com/chromium/src', - refs = [milestone_vars.ref], -) - - -ci.defaults.bucket.set(vars.bucket.get()) -ci.defaults.bucketed_triggers.set(True) -ci.defaults.triggered_by.set([vars.poller.get()]) - - -# Builders are sorted first lexicographically by the function used to define -# them, then lexicographically by their name - - -ci.android_builder( - name = 'android-kitkat-arm-rel', -) - -ci.android_builder( - name = 'android-marshmallow-arm64-rel', -) - - -ci.chromiumos_builder( - name = 'chromeos-amd64-generic-rel', -) - -ci.chromiumos_builder( - name = 'linux-chromeos-rel', -) - - -# This is launching & collecting entirely isolated tests. -# OS shouldn't matter. -ci.fyi_builder( - name = 'mac-osxbeta-rel', - goma_backend = None, - triggered_by = [vars.bucket.builder('Mac Builder')], -) - - -ci.fyi_windows_builder( - name = 'Win10 Tests x64 1803', - os = os.WINDOWS_10, - goma_backend = None, - triggered_by = [vars.bucket.builder('Win x64 Builder')], -) - - -ci.gpu_builder( - name = 'Android Release (Nexus 5X)', -) - -ci.gpu_builder( - name = 'GPU Linux Builder', -) - -ci.gpu_builder( - name = 'GPU Mac Builder', - cores = None, - os = os.MAC_ANY, -) - -ci.gpu_builder( - name = 'GPU Win x64 Builder', - builderless = True, - os = os.WINDOWS_ANY, -) - - -ci.gpu_thin_tester( - name = 'Linux Release (NVIDIA)', - triggered_by = [vars.bucket.builder('GPU Linux Builder')], -) - -ci.gpu_thin_tester( - name = 'Mac Release (Intel)', - triggered_by = [vars.bucket.builder('GPU Mac Builder')], -) - -ci.gpu_thin_tester( - name = 'Mac Retina Release (AMD)', - triggered_by = [vars.bucket.builder('GPU Mac Builder')], -) - -ci.gpu_thin_tester( - name = 'Win10 x64 Release (NVIDIA)', - triggered_by = [vars.bucket.builder('GPU Win x64 Builder')], -) - - -ci.linux_builder( - name = 'Linux Builder', -) - -ci.linux_builder( - name = 'Linux Tests', - goma_backend = None, - triggered_by = [vars.bucket.builder('Linux Builder')], -) - -ci.linux_builder( - name = 'linux-ozone-rel', -) - -ci.linux_builder( - name = 'Linux Ozone Tester (Wayland)', - goma_backend = None, - triggered_by = [vars.bucket.builder('linux-ozone-rel')], -) - -ci.linux_builder( - name = 'Linux Ozone Tester (X11)', - goma_backend = None, - triggered_by = [vars.bucket.builder('linux-ozone-rel')], -) - - -ci.mac_builder( - name = 'Mac Builder', - os = os.MAC_10_14, -) - -# The build runs on 10.13, but triggers tests on 10.10 bots. -ci.mac_builder( - name = 'Mac10.10 Tests', - triggered_by = [vars.bucket.builder('Mac Builder')], -) - -# The build runs on 10.13, but triggers tests on 10.11 bots. -ci.mac_builder( - name = 'Mac10.11 Tests', - triggered_by = [vars.bucket.builder('Mac Builder')], -) - -ci.mac_builder( - name = 'Mac10.12 Tests', - os = os.MAC_10_12, - triggered_by = [vars.bucket.builder('Mac Builder')], -) - -ci.mac_builder( - name = 'Mac10.13 Tests', - os = os.MAC_10_13, - triggered_by = [vars.bucket.builder('Mac Builder')], -) - -ci.mac_builder( - name = 'Mac10.14 Tests', - os = os.MAC_10_14, - triggered_by = [vars.bucket.builder('Mac Builder')], -) - -ci.mac_builder( - name = 'WebKit Mac10.13 (retina)', - os = os.MAC_10_13, - triggered_by = [vars.bucket.builder('Mac Builder')], -) - - -ci.mac_ios_builder( - name = 'ios-simulator', -) - - -ci.win_builder( - name = 'Win 7 Tests x64 (1)', - os = os.WINDOWS_7, - triggered_by = [vars.bucket.builder('Win x64 Builder')], -) - -ci.win_builder( - name = 'Win x64 Builder', - cores = 32, - os = os.WINDOWS_ANY, -) - -ci.win_builder( - name = 'Win10 Tests x64', - triggered_by = [vars.bucket.builder('Win x64 Builder')], -)
diff --git a/infra/config/versioned/milestones/m80/buckets/try.star b/infra/config/versioned/milestones/m80/buckets/try.star deleted file mode 100644 index a74315f..0000000 --- a/infra/config/versioned/milestones/m80/buckets/try.star +++ /dev/null
@@ -1,135 +0,0 @@ -load('//lib/builders.star', 'cpu', 'goma', 'os') -load('//lib/try.star', 'try_') -load('//versioned/vars/try.star', 'vars') -# Load this using relative path so that the load statement doesn't -# need to be changed when making a new milestone -load('../vars.star', milestone_vars='vars') - -luci.bucket( - name = vars.bucket.get(), - acls = [ - acl.entry( - roles = acl.BUILDBUCKET_READER, - groups = 'all', - ), - acl.entry( - roles = acl.BUILDBUCKET_TRIGGERER, - users = [ - 'findit-for-me@appspot.gserviceaccount.com', - 'tricium-prod@appspot.gserviceaccount.com', - ], - groups = [ - 'project-chromium-tryjob-access', - # Allow Pinpoint to trigger builds for bisection - 'service-account-chromeperf', - 'service-account-cq', - ], - ), - acl.entry( - roles = acl.BUILDBUCKET_OWNER, - groups = 'service-account-chromium-tryserver', - ), - ], -) - -luci.cq_group( - name = vars.cq_group.get(), - cancel_stale_tryjobs = True, - retry_config = cq.RETRY_ALL_FAILURES, - watch = cq.refset( - repo = 'https://chromium.googlesource.com/chromium/src', - refs = [milestone_vars.cq_ref_regexp], - ), - acls = [ - acl.entry( - acl.CQ_COMMITTER, - groups = 'project-chromium-committers', - ), - acl.entry( - acl.CQ_DRY_RUNNER, - groups = 'project-chromium-tryjob-access', - ), - ], -) - -try_.defaults.bucket.set(vars.bucket.get()) -try_.defaults.cq_group.set(vars.cq_group.get()) - - -# Builders are sorted first lexicographically by the function used to define -# them, then lexicographically by their name - - -try_.chromium_android_builder( - name = 'android-kitkat-arm-rel', - goma_jobs = goma.jobs.J150, - tryjob = try_.job(), -) - -try_.chromium_android_builder( - name = 'android-marshmallow-arm64-rel', - cores = 16, - goma_jobs = goma.jobs.J300, - ssd = True, - use_java_coverage = True, - tryjob = try_.job(), -) - - -try_.chromium_chromiumos_builder( - name = 'chromeos-amd64-generic-rel', - tryjob = try_.job(), -) - -try_.chromium_chromiumos_builder( - name = 'linux-chromeos-rel', - goma_jobs = goma.jobs.J150, - tryjob = try_.job(), - use_clang_coverage = True, -) - - -try_.chromium_linux_builder( - name = 'chromium_presubmit', - executable = 'recipe:presubmit', - goma_backend = None, - properties = { - '$depot_tools/presubmit': { - 'runhooks': True, - 'timeout_s': 480, - }, - 'repo_name': 'chromium', - }, - tryjob = try_.job( - disable_reuse = True, - ), -) - -try_.chromium_linux_builder( - name = 'linux-rel', - goma_jobs = goma.jobs.J150, - tryjob = try_.job(), - use_clang_coverage = True, -) - - -try_.chromium_mac_builder( - name = 'mac-rel', - goma_jobs = goma.jobs.J150, - tryjob = try_.job(), -) - - -try_.chromium_mac_ios_builder( - name = 'ios-simulator', - tryjob = try_.job(), -) - - -try_.chromium_win_builder( - name = 'win10_chromium_x64_rel_ng', - goma_jobs = goma.jobs.J150, - os = os.WINDOWS_10, - ssd = True, - tryjob = try_.job(), -)
diff --git a/infra/config/versioned/milestones/m80/vars.star b/infra/config/versioned/milestones/m80/vars.star deleted file mode 100644 index ef5726d..0000000 --- a/infra/config/versioned/milestones/m80/vars.star +++ /dev/null
@@ -1,4 +0,0 @@ -vars = struct( - ref = 'refs/branch-heads/3987', - cq_ref_regexp = 'refs/branch-heads/3987' -)
diff --git a/infra/config/versioned/milestones/m82/buckets/ci.star b/infra/config/versioned/milestones/m82/buckets/ci.star new file mode 100644 index 0000000..d22dcdf --- /dev/null +++ b/infra/config/versioned/milestones/m82/buckets/ci.star
@@ -0,0 +1,479 @@ +load('//lib/builders.star', 'cpu', 'goma', 'os') +load('//lib/ci.star', 'ci') +load('//versioned/vars/ci.star', 'vars') +# Load this using relative path so that the load statement doesn't +# need to be changed when making a new milestone +load('../vars.star', milestone_vars='vars') + +luci.bucket( + name = vars.bucket.get(), + acls = [ + acl.entry( + roles = acl.BUILDBUCKET_READER, + groups = 'all', + ), + acl.entry( + roles = acl.BUILDBUCKET_TRIGGERER, + groups = 'project-chromium-ci-schedulers', + ), + acl.entry( + roles = acl.BUILDBUCKET_OWNER, + groups = 'google/luci-task-force@google.com', + ), + ], +) + +luci.gitiles_poller( + name = vars.poller.get(), + bucket = vars.bucket.get(), + repo = 'https://chromium.googlesource.com/chromium/src', + refs = [milestone_vars.ref], +) + + +ci.defaults.bucket.set(vars.bucket.get()) +ci.defaults.bucketed_triggers.set(True) +ci.defaults.triggered_by.set([vars.poller.get()]) + + +# Builders are sorted first lexicographically by the function used to define +# them, then lexicographically by their name + + +ci.android_builder( + name = 'Android WebView M (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android WebView N (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android WebView O (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android WebView P (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android arm Builder (dbg)', + execution_timeout = 4 * time.hour, +) + +ci.android_builder( + name = 'Android arm64 Builder (dbg)', + goma_jobs = goma.jobs.MANY_JOBS_FOR_CI, + execution_timeout = 4 * time.hour, +) + +ci.android_builder( + name = 'Android x64 Builder (dbg)', + execution_timeout = 4 * time.hour, +) + +ci.android_builder( + name = 'Android x86 Builder (dbg)', +) + +ci.android_builder( + name = 'Cast Android (dbg)', +) + +ci.android_builder( + name = 'Marshmallow 64 bit Tester', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Nougat Phone Tester', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Oreo Phone Tester', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'android-cronet-arm-dbg', + notifies = ['cronet'], +) + +ci.android_builder( + name = 'android-cronet-arm-rel', + notifies = ['cronet'], +) + +ci.android_builder( + name = 'android-cronet-kitkat-arm-rel', + notifies = ['cronet'], + triggered_by = [vars.bucket.builder('android-cronet-arm-rel')], +) + +ci.android_builder( + name = 'android-cronet-lollipop-arm-rel', + notifies = ['cronet'], + triggered_by = [vars.bucket.builder('android-cronet-arm-rel')], +) + +ci.android_builder( + name = 'android-kitkat-arm-rel', +) + +ci.android_builder( + name = 'android-marshmallow-arm64-rel', +) + +ci.android_builder( + name = 'android-pie-arm64-dbg', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'android-pie-arm64-rel', +) + + +ci.chromiumos_builder( + name = 'chromeos-amd64-generic-dbg', +) + +ci.chromiumos_builder( + name = 'chromeos-amd64-generic-rel', +) + +ci.chromiumos_builder( + name = 'chromeos-arm-generic-rel', +) + +ci.chromiumos_builder( + name = 'chromeos-kevin-rel', +) + +ci.fyi_builder( + name = 'chromeos-kevin-rel-hw-tests', +) + +ci.chromiumos_builder( + name = 'linux-chromeos-dbg', +) + +ci.chromiumos_builder( + name = 'linux-chromeos-rel', +) + + +ci.dawn_builder( + name = 'Dawn Linux x64 DEPS Builder', +) + +ci.dawn_builder( + name = 'Dawn Linux x64 DEPS Release (Intel HD 630)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Linux x64 DEPS Release (NVIDIA)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Mac x64 DEPS Builder', + builderless = False, + cores = None, + os = os.MAC_ANY, +) + +# Note that the Mac testers are all thin Linux VMs, triggering jobs on the +# physical Mac hardware in the Swarming pool which is why they run on linux +ci.dawn_builder( + name = 'Dawn Mac x64 DEPS Release (AMD)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Mac x64 DEPS Release (Intel)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x64 DEPS Builder', + os = os.WINDOWS_ANY, +) + +ci.dawn_builder( + name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x64 DEPS Release (NVIDIA)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x86 DEPS Builder', + os = os.WINDOWS_ANY, +) + +ci.dawn_builder( + name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x86 DEPS Release (NVIDIA)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')], +) + + +ci.fyi_builder( + name = 'VR Linux', +) + +# This is launching & collecting entirely isolated tests. +# OS shouldn't matter. +ci.fyi_builder( + name = 'mac-osxbeta-rel', + goma_backend = None, + triggered_by = [vars.bucket.builder('Mac Builder')], +) + + +ci.fyi_windows_builder( + name = 'Win10 Tests x64 1803', + goma_backend = None, + os = os.WINDOWS_10, + triggered_by = [vars.bucket.builder('Win x64 Builder')], +) + + +ci.gpu_builder( + name = 'Android Release (Nexus 5X)', +) + +ci.gpu_builder( + name = 'GPU Linux Builder', +) + +ci.gpu_builder( + name = 'GPU Mac Builder', + cores = None, + os = os.MAC_ANY, +) + +ci.gpu_builder( + name = 'GPU Win x64 Builder', + builderless = True, + os = os.WINDOWS_ANY, +) + + +ci.gpu_thin_tester( + name = 'Linux Release (NVIDIA)', + triggered_by = [vars.bucket.builder('GPU Linux Builder')], +) + +ci.gpu_thin_tester( + name = 'Mac Release (Intel)', + triggered_by = [vars.bucket.builder('GPU Mac Builder')], +) + +ci.gpu_thin_tester( + name = 'Mac Retina Release (AMD)', + triggered_by = [vars.bucket.builder('GPU Mac Builder')], +) + +ci.gpu_thin_tester( + name = 'Win10 x64 Release (NVIDIA)', + triggered_by = [vars.bucket.builder('GPU Win x64 Builder')], +) + + +ci.linux_builder( + name = 'Cast Linux', + goma_jobs = goma.jobs.J50, +) + +ci.linux_builder( + name = 'Fuchsia ARM64', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'Fuchsia x64', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'Linux Builder', +) + +ci.linux_builder( + name = 'Linux Builder (dbg)', +) + +ci.linux_builder( + name = 'Linux Tests', + goma_backend = None, + triggered_by = [vars.bucket.builder('Linux Builder')], +) + +ci.linux_builder( + name = 'Linux Tests (dbg)(1)', + triggered_by = [vars.bucket.builder('Linux Builder (dbg)')], +) + +ci.linux_builder( + name = 'fuchsia-arm64-cast', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'fuchsia-x64-cast', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'fuchsia-x64-dbg', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'linux-ozone-rel', +) + +ci.linux_builder( + name = 'Linux Ozone Tester (Wayland)', + triggered_by = [vars.bucket.builder('linux-ozone-rel')], +) + +ci.linux_builder( + name = 'Linux Ozone Tester (X11)', + triggered_by = [vars.bucket.builder('linux-ozone-rel')], +) + + +ci.mac_builder( + name = 'Mac Builder', + os = os.MAC_10_14, +) + +ci.mac_builder( + name = 'Mac Builder (dbg)', + os = os.MAC_ANY, +) + +# The build runs on 10.13, but triggers tests on 10.10 bots. +ci.mac_builder( + name = 'Mac10.10 Tests', + triggered_by = [vars.bucket.builder('Mac Builder')], +) + +# The build runs on 10.13, but triggers tests on 10.11 bots. +ci.mac_builder( + name = 'Mac10.11 Tests', + triggered_by = [vars.bucket.builder('Mac Builder')], +) + +ci.mac_builder( + name = 'Mac10.12 Tests', + os = os.MAC_10_12, + triggered_by = [vars.bucket.builder('Mac Builder')], +) + +ci.mac_builder( + name = 'Mac10.13 Tests', + os = os.MAC_10_13, + triggered_by = [vars.bucket.builder('Mac Builder')], +) + +ci.mac_builder( + name = 'Mac10.14 Tests', + os = os.MAC_10_14, + triggered_by = [vars.bucket.builder('Mac Builder')], +) + +ci.mac_builder( + name = 'Mac10.13 Tests (dbg)', + os = os.MAC_ANY, + triggered_by = [vars.bucket.builder('Mac Builder (dbg)')], +) + +ci.mac_builder( + name = 'WebKit Mac10.13 (retina)', + os = os.MAC_10_13, + triggered_by = [vars.bucket.builder('Mac Builder')], +) + + +ci.mac_ios_builder( + name = 'ios-simulator', +) + + +ci.memory_builder( + name = 'Linux ASan LSan Builder', + ssd = True, +) + +ci.memory_builder( + name = 'Linux ASan LSan Tests (1)', + triggered_by = [vars.bucket.builder('Linux ASan LSan Builder')], +) + +ci.memory_builder( + name = 'Linux ASan Tests (sandboxed)', + triggered_by = [vars.bucket.builder('Linux ASan LSan Builder')], +) + + +ci.win_builder( + name = 'Win7 Tests (dbg)(1)', + os = os.WINDOWS_7, + triggered_by = [vars.bucket.builder('Win Builder (dbg)')], +) + +ci.win_builder( + name = 'Win 7 Tests x64 (1)', + os = os.WINDOWS_7, + triggered_by = [vars.bucket.builder('Win x64 Builder')], +) + +ci.win_builder( + name = 'Win Builder (dbg)', + cores = 32, + os = os.WINDOWS_ANY, +) + +ci.win_builder( + name = 'Win x64 Builder', + cores = 32, + os = os.WINDOWS_ANY, +) + +ci.win_builder( + name = 'Win10 Tests x64', + triggered_by = [vars.bucket.builder('Win x64 Builder')], +)
diff --git a/infra/config/versioned/milestones/m82/buckets/try.star b/infra/config/versioned/milestones/m82/buckets/try.star new file mode 100644 index 0000000..a0da119 --- /dev/null +++ b/infra/config/versioned/milestones/m82/buckets/try.star
@@ -0,0 +1,650 @@ +load('//lib/builders.star', 'cpu', 'goma', 'os') +load('//lib/try.star', 'try_') +load('//versioned/vars/try.star', 'vars') +# Load this using relative path so that the load statement doesn't +# need to be changed when making a new milestone +load('../vars.star', milestone_vars='vars') + +luci.bucket( + name = vars.bucket.get(), + acls = [ + acl.entry( + roles = acl.BUILDBUCKET_READER, + groups = 'all', + ), + acl.entry( + roles = acl.BUILDBUCKET_TRIGGERER, + users = [ + 'findit-for-me@appspot.gserviceaccount.com', + 'tricium-prod@appspot.gserviceaccount.com', + ], + groups = [ + 'project-chromium-tryjob-access', + # Allow Pinpoint to trigger builds for bisection + 'service-account-chromeperf', + 'service-account-cq', + ], + ), + acl.entry( + roles = acl.BUILDBUCKET_OWNER, + groups = 'service-account-chromium-tryserver', + ), + ], +) + +luci.cq_group( + name = vars.cq_group.get(), + cancel_stale_tryjobs = True, + retry_config = cq.RETRY_ALL_FAILURES, + tree_status_host = getattr(milestone_vars, 'tree_status_host', None), + watch = cq.refset( + repo = 'https://chromium.googlesource.com/chromium/src', + refs = [milestone_vars.cq_ref_regexp], + ), + acls = [ + acl.entry( + acl.CQ_COMMITTER, + groups = 'project-chromium-committers', + ), + acl.entry( + acl.CQ_DRY_RUNNER, + groups = 'project-chromium-tryjob-access', + ), + ], +) + +try_.defaults.bucket.set(vars.bucket.get()) +try_.defaults.cq_group.set(vars.cq_group.get()) + + +# Builders are sorted first lexicographically by the function used to define +# them, then lexicographically by their name + + +try_.blink_builder( + name = 'linux-blink-rel', + goma_backend = goma.backend.RBE_PROD, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/cc/.+', + '.+/[+]/third_party/blink/renderer/core/paint/.+', + '.+/[+]/third_party/blink/renderer/core/svg/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/.+', + ], + ), +) + + +try_.chromium_android_builder( + name = 'android-binary-size', + executable = 'recipe:binary_size_trybot', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_android_builder( + name = 'android-cronet-arm-dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/components/cronet/.+', + '.+/[+]/components/grpc_support/.+', + '.+/[+]/build/android/.+', + '.+/[+]/build/config/android/.+', + ], + location_regexp_exclude = [ + '.+/[+]/components/cronet/ios/.+', + ], + ), +) + +try_.chromium_android_builder( + name = 'android-kitkat-arm-rel', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_android_builder( + name = 'android-marshmallow-arm64-rel', + cores = 16, + goma_jobs = goma.jobs.J300, + ssd = True, + use_java_coverage = True, + tryjob = try_.job(), +) + +try_.chromium_android_builder( + name = 'android-pie-arm64-dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/android/features/vr/.+', + '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/third_party/gvr-android-sdk/.+', + '.+/[+]/third_party/arcore-android-sdk/.+', + '.+/[+]/third_party/arcore-android-sdk-client/.+', + ], + ), +) + +try_.chromium_android_builder( + name = 'android-pie-arm64-rel', + cores = 16, + goma_jobs = goma.jobs.J300, + ssd = True, + tryjob = try_.job(), +) + +try_.chromium_android_builder( + name = 'android_compile_dbg', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_android_builder( + name = 'android_compile_x64_dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/sandbox/linux/seccomp-bpf/.+', + '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+', + '.+/[+]/sandbox/linux/system_headers/.+', + '.+/[+]/sandbox/linux/tests/.+', + '.+/[+]/third_party/gvr-android-sdk/.+', + ], + ), +) + +try_.chromium_android_builder( + name = 'android_compile_x86_dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/sandbox/linux/seccomp-bpf/.+', + '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+', + '.+/[+]/sandbox/linux/system_headers/.+', + '.+/[+]/sandbox/linux/tests/.+', + '.+/[+]/third_party/gvr-android-sdk/.+', + ], + ), +) + +try_.chromium_android_builder( + name = 'android_cronet', + tryjob = try_.job(), +) + +try_.chromium_android_builder( + name = 'cast_shell_android', + tryjob = try_.job(), +) + + +try_.chromium_chromiumos_builder( + name = 'chromeos-amd64-generic-dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/content/gpu/.+', + '.+/[+]/media/.+', + ], + ), +) + +try_.chromium_chromiumos_builder( + name = 'chromeos-amd64-generic-rel', + tryjob = try_.job(), +) + +try_.chromium_chromiumos_builder( + name = 'chromeos-arm-generic-rel', + tryjob = try_.job(), +) + +try_.chromium_chromiumos_builder( + name = 'chromeos-kevin-compile-rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chromeos/CHROMEOS_LKGM', + ], + ), +) + +try_.chromium_chromiumos_builder( + name = 'chromeos-kevin-rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/build/chromeos/.+', + '.+/[+]/build/config/chromeos/.*', + ], + ), +) + +try_.chromium_chromiumos_builder( + name = 'linux-chromeos-compile-dbg', + tryjob = try_.job(), +) + +try_.chromium_chromiumos_builder( + name = 'linux-chromeos-rel', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), + use_clang_coverage = True, +) + + +try_.chromium_dawn_builder( + name = 'dawn-linux-x64-deps-rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + +try_.chromium_dawn_builder( + name = 'dawn-mac-x64-deps-rel', + os = os.MAC_ANY, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + +try_.chromium_dawn_builder( + name = 'dawn-win10-x64-deps-rel', + os = os.WINDOWS_ANY, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + +try_.chromium_dawn_builder( + name = 'dawn-win10-x86-deps-rel', + os = os.WINDOWS_ANY, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + + +try_.chromium_linux_builder( + name = 'cast_shell_linux', + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'closure_compilation', + executable = 'recipe:closure_compilation', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/third_party/closure_compiler/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'chromium_presubmit', + executable = 'recipe:presubmit', + goma_backend = None, + properties = { + '$depot_tools/presubmit': { + 'runhooks': True, + 'timeout_s': 480, + }, + 'repo_name': 'chromium', + }, + tryjob = try_.job( + disable_reuse = True, + ), +) + +try_.chromium_linux_builder( + name = 'fuchsia-arm64-cast', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chromecast/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'fuchsia-compile-x64-dbg', + tryjob = try_.job( + experiment_percentage = 50, + ), +) + +try_.chromium_linux_builder( + name = 'fuchsia-x64-cast', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chromecast/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'fuchsia_arm64', + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'fuchsia_x64', + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'linux-libfuzzer-asan-rel', + executable = 'recipe:chromium_libfuzzer_trybot', + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'linux-ozone-rel', + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'linux-ozone-x11-and-wayland-rel', + tryjob = try_.job( + experiment_percentage = 1, + ), +) + +try_.chromium_linux_builder( + name = 'linux-rel', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), + use_clang_coverage = True, +) + +try_.chromium_linux_builder( + name = 'linux_chromium_asan_rel_ng', + goma_jobs = goma.jobs.J150, + ssd = True, + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'linux_chromium_compile_dbg_ng', + caches = [ + swarming.cache( + name = 'builder', + path = 'linux_debug', + ), + ], + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'linux_chromium_dbg_ng', + caches = [ + swarming.cache( + name = 'builder', + path = 'linux_debug', + ), + ], + tryjob = try_.job( + location_regexp = [ + '.+/[+]/build/.*check_gn_headers.*', + ], + ), +) + +try_.chromium_linux_builder( + name = 'linux_chromium_tsan_rel_ng', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_linux_builder( + name = 'linux_layout_tests_composite_after_paint', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/third_party/blink/renderer/core/paint/.+', + '.+/[+]/third_party/blink/renderer/core/svg/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/.+', + '.+/[+]/third_party/blink/web_tests/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'linux_layout_tests_layout_ng_disabled', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/third_party/blink/renderer/core/editing/.+', + '.+/[+]/third_party/blink/renderer/core/layout/.+', + '.+/[+]/third_party/blink/renderer/core/paint/.+', + '.+/[+]/third_party/blink/renderer/core/svg/.+', + '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/.+', + '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng', + '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'linux_vr', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + ], + ), +) + + +try_.chromium_mac_builder( + name = 'mac-rel', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_mac_builder( + name = 'mac-coverage-rel', + use_clang_coverage = True, + goma_jobs = goma.jobs.J150, + tryjob = try_.job(experiment_percentage = 3) +) + +try_.chromium_mac_builder( + name = 'mac_chromium_compile_dbg_ng', + goma_jobs = goma.jobs.J150, + os = os.MAC_10_13, + tryjob = try_.job(), +) + + +try_.chromium_mac_ios_builder( + name = 'ios-simulator', + tryjob = try_.job(), +) + +try_.chromium_mac_ios_builder( + name = 'ios-simulator-cronet', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/components/cronet/.+', + '.+/[+]/components/grpc_support/.+', + '.+/[+]/ios/.+', + ], + location_regexp_exclude = [ + '.+/[+]/components/cronet/android/.+', + ], + ), +) + +try_.chromium_mac_ios_builder( + name = 'ios-simulator-full-configs', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/ios/.+', + ], + ), +) + + +try_.chromium_win_builder( + name = 'win-libfuzzer-asan-rel', + builderless = False, + executable = 'recipe:chromium_libfuzzer_trybot', + os = os.WINDOWS_ANY, + tryjob = try_.job(), +) + +try_.chromium_win_builder( + name = 'win_chromium_compile_dbg_ng', + goma_jobs = goma.jobs.J150, + tryjob = try_.job(), +) + +try_.chromium_win_builder( + name = 'win10_chromium_x64_coverage_rel_ng', + os = os.WINDOWS_10, + use_clang_coverage = True, + goma_jobs = goma.jobs.J150, + ssd = True, + tryjob = try_.job(experiment_percentage = 3), +) + +try_.chromium_win_builder( + name = 'win10_chromium_x64_rel_ng', + goma_jobs = goma.jobs.J150, + os = os.WINDOWS_10, + ssd = True, + use_clang_coverage = True, + tryjob = try_.job(), +) + + +try_.gpu_chromium_android_builder( + name = 'android_optional_gpu_tests_rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/cc/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/components/viz/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/services/viz/.+', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +) + + +try_.gpu_chromium_linux_builder( + name = 'linux_optional_gpu_tests_rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +) + + +try_.gpu_chromium_mac_builder( + name = 'mac_optional_gpu_tests_rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/services/shape_detection/.+', + '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +) + + +try_.gpu_chromium_win_builder( + name = 'win_optional_gpu_tests_rel', + builderless = True, + os = os.WINDOWS_DEFAULT, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/device/vr/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/vr/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/modules/xr/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +)
diff --git a/infra/config/versioned/milestones/m82/vars.star b/infra/config/versioned/milestones/m82/vars.star new file mode 100644 index 0000000..fdbbdda --- /dev/null +++ b/infra/config/versioned/milestones/m82/vars.star
@@ -0,0 +1,4 @@ +vars = struct( + ref = 'refs/branch-heads/4085', + cq_ref_regexp = 'refs/branch-heads/4085', +)
diff --git a/infra/config/versioned/trunk/buckets/ci.star b/infra/config/versioned/trunk/buckets/ci.star index 0226a944..d22dcdf 100644 --- a/infra/config/versioned/trunk/buckets/ci.star +++ b/infra/config/versioned/trunk/buckets/ci.star
@@ -41,15 +41,70 @@ ci.android_builder( + name = 'Android WebView M (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android WebView N (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android WebView O (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Android WebView P (dbg)', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( name = 'Android arm Builder (dbg)', execution_timeout = 4 * time.hour, ) ci.android_builder( + name = 'Android arm64 Builder (dbg)', + goma_jobs = goma.jobs.MANY_JOBS_FOR_CI, + execution_timeout = 4 * time.hour, +) + +ci.android_builder( + name = 'Android x64 Builder (dbg)', + execution_timeout = 4 * time.hour, +) + +ci.android_builder( + name = 'Android x86 Builder (dbg)', +) + +ci.android_builder( name = 'Cast Android (dbg)', ) ci.android_builder( + name = 'Marshmallow 64 bit Tester', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Nougat Phone Tester', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'Oreo Phone Tester', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'android-cronet-arm-dbg', + notifies = ['cronet'], +) + +ci.android_builder( name = 'android-cronet-arm-rel', notifies = ['cronet'], ) @@ -74,6 +129,19 @@ name = 'android-marshmallow-arm64-rel', ) +ci.android_builder( + name = 'android-pie-arm64-dbg', + triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')], +) + +ci.android_builder( + name = 'android-pie-arm64-rel', +) + + +ci.chromiumos_builder( + name = 'chromeos-amd64-generic-dbg', +) ci.chromiumos_builder( name = 'chromeos-amd64-generic-rel', @@ -84,6 +152,14 @@ ) ci.chromiumos_builder( + name = 'chromeos-kevin-rel', +) + +ci.fyi_builder( + name = 'chromeos-kevin-rel-hw-tests', +) + +ci.chromiumos_builder( name = 'linux-chromeos-dbg', ) @@ -92,6 +168,90 @@ ) +ci.dawn_builder( + name = 'Dawn Linux x64 DEPS Builder', +) + +ci.dawn_builder( + name = 'Dawn Linux x64 DEPS Release (Intel HD 630)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Linux x64 DEPS Release (NVIDIA)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Mac x64 DEPS Builder', + builderless = False, + cores = None, + os = os.MAC_ANY, +) + +# Note that the Mac testers are all thin Linux VMs, triggering jobs on the +# physical Mac hardware in the Swarming pool which is why they run on linux +ci.dawn_builder( + name = 'Dawn Mac x64 DEPS Release (AMD)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Mac x64 DEPS Release (Intel)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x64 DEPS Builder', + os = os.WINDOWS_ANY, +) + +ci.dawn_builder( + name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x64 DEPS Release (NVIDIA)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x86 DEPS Builder', + os = os.WINDOWS_ANY, +) + +ci.dawn_builder( + name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')], +) + +ci.dawn_builder( + name = 'Dawn Win10 x86 DEPS Release (NVIDIA)', + cores = 2, + os = os.LINUX_DEFAULT, + triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')], +) + + +ci.fyi_builder( + name = 'VR Linux', +) + # This is launching & collecting entirely isolated tests. # OS shouldn't matter. ci.fyi_builder( @@ -171,12 +331,36 @@ ) ci.linux_builder( + name = 'Linux Builder (dbg)', +) + +ci.linux_builder( name = 'Linux Tests', goma_backend = None, triggered_by = [vars.bucket.builder('Linux Builder')], ) ci.linux_builder( + name = 'Linux Tests (dbg)(1)', + triggered_by = [vars.bucket.builder('Linux Builder (dbg)')], +) + +ci.linux_builder( + name = 'fuchsia-arm64-cast', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'fuchsia-x64-cast', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( + name = 'fuchsia-x64-dbg', + notifies = ['cr-fuchsia'], +) + +ci.linux_builder( name = 'linux-ozone-rel', )
diff --git a/infra/config/versioned/trunk/buckets/try.star b/infra/config/versioned/trunk/buckets/try.star index a20bd94..a0da119 100644 --- a/infra/config/versioned/trunk/buckets/try.star +++ b/infra/config/versioned/trunk/buckets/try.star
@@ -61,6 +61,20 @@ # them, then lexicographically by their name +try_.blink_builder( + name = 'linux-blink-rel', + goma_backend = goma.backend.RBE_PROD, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/cc/.+', + '.+/[+]/third_party/blink/renderer/core/paint/.+', + '.+/[+]/third_party/blink/renderer/core/svg/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/.+', + ], + ), +) + + try_.chromium_android_builder( name = 'android-binary-size', executable = 'recipe:binary_size_trybot', @@ -69,6 +83,21 @@ ) try_.chromium_android_builder( + name = 'android-cronet-arm-dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/components/cronet/.+', + '.+/[+]/components/grpc_support/.+', + '.+/[+]/build/android/.+', + '.+/[+]/build/config/android/.+', + ], + location_regexp_exclude = [ + '.+/[+]/components/cronet/ios/.+', + ], + ), +) + +try_.chromium_android_builder( name = 'android-kitkat-arm-rel', goma_jobs = goma.jobs.J150, tryjob = try_.job(), @@ -84,12 +113,65 @@ ) try_.chromium_android_builder( + name = 'android-pie-arm64-dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/android/features/vr/.+', + '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/third_party/gvr-android-sdk/.+', + '.+/[+]/third_party/arcore-android-sdk/.+', + '.+/[+]/third_party/arcore-android-sdk-client/.+', + ], + ), +) + +try_.chromium_android_builder( + name = 'android-pie-arm64-rel', + cores = 16, + goma_jobs = goma.jobs.J300, + ssd = True, + tryjob = try_.job(), +) + +try_.chromium_android_builder( name = 'android_compile_dbg', goma_jobs = goma.jobs.J150, tryjob = try_.job(), ) try_.chromium_android_builder( + name = 'android_compile_x64_dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/sandbox/linux/seccomp-bpf/.+', + '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+', + '.+/[+]/sandbox/linux/system_headers/.+', + '.+/[+]/sandbox/linux/tests/.+', + '.+/[+]/third_party/gvr-android-sdk/.+', + ], + ), +) + +try_.chromium_android_builder( + name = 'android_compile_x86_dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/sandbox/linux/seccomp-bpf/.+', + '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+', + '.+/[+]/sandbox/linux/system_headers/.+', + '.+/[+]/sandbox/linux/tests/.+', + '.+/[+]/third_party/gvr-android-sdk/.+', + ], + ), +) + +try_.chromium_android_builder( name = 'android_cronet', tryjob = try_.job(), ) @@ -101,8 +183,13 @@ try_.chromium_chromiumos_builder( - name = 'chromeos-arm-generic-rel', - tryjob = try_.job(), + name = 'chromeos-amd64-generic-dbg', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/content/gpu/.+', + '.+/[+]/media/.+', + ], + ), ) try_.chromium_chromiumos_builder( @@ -111,6 +198,30 @@ ) try_.chromium_chromiumos_builder( + name = 'chromeos-arm-generic-rel', + tryjob = try_.job(), +) + +try_.chromium_chromiumos_builder( + name = 'chromeos-kevin-compile-rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chromeos/CHROMEOS_LKGM', + ], + ), +) + +try_.chromium_chromiumos_builder( + name = 'chromeos-kevin-rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/build/chromeos/.+', + '.+/[+]/build/config/chromeos/.*', + ], + ), +) + +try_.chromium_chromiumos_builder( name = 'linux-chromeos-compile-dbg', tryjob = try_.job(), ) @@ -123,12 +234,94 @@ ) +try_.chromium_dawn_builder( + name = 'dawn-linux-x64-deps-rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + +try_.chromium_dawn_builder( + name = 'dawn-mac-x64-deps-rel', + os = os.MAC_ANY, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + +try_.chromium_dawn_builder( + name = 'dawn-win10-x64-deps-rel', + os = os.WINDOWS_ANY, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + +try_.chromium_dawn_builder( + name = 'dawn-win10-x86-deps-rel', + os = os.WINDOWS_ANY, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/gpu/.+', + '.+/[+]/testing/buildbot/chromium.dawn.json', + '.+/[+]/third_party/blink/renderer/modules/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+', + '.+/[+]/third_party/blink/web_tests/WebGPUExpectations', + '.+/[+]/third_party/dawn/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/features.gni', + ], + ), +) + + try_.chromium_linux_builder( name = 'cast_shell_linux', tryjob = try_.job(), ) try_.chromium_linux_builder( + name = 'closure_compilation', + executable = 'recipe:closure_compilation', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/third_party/closure_compiler/.+', + ], + ), +) + +try_.chromium_linux_builder( name = 'chromium_presubmit', executable = 'recipe:presubmit', goma_backend = None, @@ -145,6 +338,31 @@ ) try_.chromium_linux_builder( + name = 'fuchsia-arm64-cast', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chromecast/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'fuchsia-compile-x64-dbg', + tryjob = try_.job( + experiment_percentage = 50, + ), +) + +try_.chromium_linux_builder( + name = 'fuchsia-x64-cast', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chromecast/.+', + ], + ), +) + +try_.chromium_linux_builder( name = 'fuchsia_arm64', tryjob = try_.job(), ) @@ -199,11 +417,63 @@ ) try_.chromium_linux_builder( + name = 'linux_chromium_dbg_ng', + caches = [ + swarming.cache( + name = 'builder', + path = 'linux_debug', + ), + ], + tryjob = try_.job( + location_regexp = [ + '.+/[+]/build/.*check_gn_headers.*', + ], + ), +) + +try_.chromium_linux_builder( name = 'linux_chromium_tsan_rel_ng', goma_jobs = goma.jobs.J150, tryjob = try_.job(), ) +try_.chromium_linux_builder( + name = 'linux_layout_tests_composite_after_paint', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/third_party/blink/renderer/core/paint/.+', + '.+/[+]/third_party/blink/renderer/core/svg/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/.+', + '.+/[+]/third_party/blink/web_tests/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'linux_layout_tests_layout_ng_disabled', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/third_party/blink/renderer/core/editing/.+', + '.+/[+]/third_party/blink/renderer/core/layout/.+', + '.+/[+]/third_party/blink/renderer/core/paint/.+', + '.+/[+]/third_party/blink/renderer/core/svg/.+', + '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/.+', + '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng', + '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+', + ], + ), +) + +try_.chromium_linux_builder( + name = 'linux_vr', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + ], + ), +) + try_.chromium_mac_builder( name = 'mac-rel', @@ -212,6 +482,13 @@ ) try_.chromium_mac_builder( + name = 'mac-coverage-rel', + use_clang_coverage = True, + goma_jobs = goma.jobs.J150, + tryjob = try_.job(experiment_percentage = 3) +) + +try_.chromium_mac_builder( name = 'mac_chromium_compile_dbg_ng', goma_jobs = goma.jobs.J150, os = os.MAC_10_13, @@ -224,6 +501,29 @@ tryjob = try_.job(), ) +try_.chromium_mac_ios_builder( + name = 'ios-simulator-cronet', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/components/cronet/.+', + '.+/[+]/components/grpc_support/.+', + '.+/[+]/ios/.+', + ], + location_regexp_exclude = [ + '.+/[+]/components/cronet/android/.+', + ], + ), +) + +try_.chromium_mac_ios_builder( + name = 'ios-simulator-full-configs', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/ios/.+', + ], + ), +) + try_.chromium_win_builder( name = 'win-libfuzzer-asan-rel', @@ -240,6 +540,15 @@ ) try_.chromium_win_builder( + name = 'win10_chromium_x64_coverage_rel_ng', + os = os.WINDOWS_10, + use_clang_coverage = True, + goma_jobs = goma.jobs.J150, + ssd = True, + tryjob = try_.job(experiment_percentage = 3), +) + +try_.chromium_win_builder( name = 'win10_chromium_x64_rel_ng', goma_jobs = goma.jobs.J150, os = os.WINDOWS_10, @@ -247,3 +556,95 @@ use_clang_coverage = True, tryjob = try_.job(), ) + + +try_.gpu_chromium_android_builder( + name = 'android_optional_gpu_tests_rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/cc/.+', + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/components/viz/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/services/viz/.+', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +) + + +try_.gpu_chromium_linux_builder( + name = 'linux_optional_gpu_tests_rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +) + + +try_.gpu_chromium_mac_builder( + name = 'mac_optional_gpu_tests_rel', + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/services/shape_detection/.+', + '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +) + + +try_.gpu_chromium_win_builder( + name = 'win_optional_gpu_tests_rel', + builderless = True, + os = os.WINDOWS_DEFAULT, + tryjob = try_.job( + location_regexp = [ + '.+/[+]/chrome/browser/vr/.+', + '.+/[+]/content/test/gpu/.+', + '.+/[+]/device/vr/.+', + '.+/[+]/gpu/.+', + '.+/[+]/media/audio/.+', + '.+/[+]/media/filters/.+', + '.+/[+]/media/gpu/.+', + '.+/[+]/testing/buildbot/chromium.gpu.fyi.json', + '.+/[+]/testing/trigger_scripts/.+', + '.+/[+]/third_party/blink/renderer/modules/vr/.+', + '.+/[+]/third_party/blink/renderer/modules/webgl/.+', + '.+/[+]/third_party/blink/renderer/modules/xr/.+', + '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+', + '.+/[+]/tools/clang/scripts/update.py', + '.+/[+]/ui/gl/.+', + ], + ), +)
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 1d6c756..ca524305 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -357,7 +357,7 @@ - (void)scheduleTasksRequiringBVCWithBrowserState; // Schedules the deletion of user downloaded files that might be leftover // from the last time Chrome was run. -- (void)scheduleDeleteDownloadsDirectory; +- (void)scheduleDeleteTempDownloadsDirectory; // Schedule the deletion of the temporary passwords files that might // be left over from incomplete export operations. - (void)scheduleDeleteTempPasswordsDirectory; @@ -1001,7 +1001,7 @@ [self scheduleAuthenticationServiceNotification]; [self sendQueuedFeedback]; [self scheduleSpotlightResync]; - [self scheduleDeleteDownloadsDirectory]; + [self scheduleDeleteTempDownloadsDirectory]; [self scheduleDeleteTempPasswordsDirectory]; [self scheduleStartupAttemptReset]; [self startFreeMemoryMonitoring]; @@ -1022,11 +1022,11 @@ } } -- (void)scheduleDeleteDownloadsDirectory { +- (void)scheduleDeleteTempDownloadsDirectory { [[DeferredInitializationRunner sharedInstance] enqueueBlockNamed:kDeleteDownloads block:^{ - DeleteDownloadsDirectory(); + DeleteTempDownloadsDirectory(); }]; }
diff --git a/ios/chrome/app/tab_opener_unittest.mm b/ios/chrome/app/tab_opener_unittest.mm index 84ed59e..7b7e5987 100644 --- a/ios/chrome/app/tab_opener_unittest.mm +++ b/ios/chrome/app/tab_opener_unittest.mm
@@ -8,7 +8,6 @@ #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/app/application_delegate/tab_opening.h" #import "ios/chrome/app/application_delegate/url_opener.h" -#include "ios/chrome/app/main_controller_private.h" #import "ios/chrome/browser/tabs/tab_model.h" #import "ios/chrome/browser/ui/main/scene_controller.h" #import "ios/chrome/browser/ui/main/scene_state.h" @@ -35,7 +34,6 @@ class TabOpenerTest : public PlatformTest { protected: void TearDown() override { - [main_controller_ stopChromeMain]; PlatformTest::TearDown(); } @@ -53,7 +51,7 @@ swizzle_block_executed_ = YES; EXPECT_EQ(expectedLaunchOptions, options); EXPECT_EQ(expectedStartupInformation, startupInformation); - EXPECT_EQ(main_controller_.sceneController, tabOpener); + EXPECT_EQ(scene_controller_, tabOpener); EXPECT_EQ(expectedAppState, appState); } copy]; URL_opening_handle_launch_swizzler_.reset(new ScopedBlockSwizzler( @@ -63,20 +61,15 @@ swizzle_block_)); } - MainController* GetMainController() { - if (!main_controller_) { - scene_state_ = [[SceneState alloc] init]; - main_controller_ = [[MainController alloc] init]; + SceneController* GetSceneController() { + if (!scene_controller_) { scene_controller_ = [[SceneController alloc] initWithSceneState:scene_state_]; - main_controller_.sceneController = scene_controller_; - scene_controller_.mainController = main_controller_; } - return main_controller_; + return scene_controller_; } private: - MainController* main_controller_; SceneController* scene_controller_; SceneState* scene_state_; @@ -102,7 +95,7 @@ swizzleHandleLaunchOptions(launchOptions, startupInformationMock, appStateMock); - id<TabOpening> tabOpener = GetMainController().sceneController; + id<TabOpening> tabOpener = GetSceneController(); // Action. [tabOpener openTabFromLaunchOptions:launchOptions @@ -122,7 +115,7 @@ swizzleHandleLaunchOptions(nil, startupInformationMock, appStateMock); - id<TabOpening> tabOpener = GetMainController().sceneController; + id<TabOpening> tabOpener = GetSceneController(); // Action. [tabOpener openTabFromLaunchOptions:nil
diff --git a/ios/chrome/browser/autofill/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/autofill_controller_unittest.mm index 1d1bf3a..163024c 100644 --- a/ios/chrome/browser/autofill/autofill_controller_unittest.mm +++ b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
@@ -448,7 +448,7 @@ TEST_F(AutofillControllerTest, ProfileSuggestionsTwoAnonymousForms) { SetUpForSuggestions( [NSString stringWithFormat:@"%@%@", kProfileFormHtml, kProfileFormHtml], - 2); + 1); ForceViewRendering(web_state()->GetView()); ExecuteJavaScript(@"document.forms[0].name.focus()"); WaitForSuggestionRetrieval(/*wait_for_trigger=*/YES);
diff --git a/ios/chrome/browser/download/BUILD.gn b/ios/chrome/browser/download/BUILD.gn index ecc7280e..0f03f89 100644 --- a/ios/chrome/browser/download/BUILD.gn +++ b/ios/chrome/browser/download/BUILD.gn
@@ -79,6 +79,7 @@ "//ios/chrome/browser/download", "//ios/chrome/browser/network_activity", "//ios/chrome/test/fakes", + "//ios/web/common:features", "//ios/web/public", "//ios/web/public/download", "//ios/web/public/test",
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm index 392da41..9167e2a 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
@@ -101,7 +101,7 @@ LogHistogram(download_task.get()); base::FilePath download_dir; - if (!GetDownloadsDirectory(&download_dir)) { + if (!GetTempDownloadsDirectory(&download_dir)) { return; }
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm index d86cc33..1a8e04f 100644 --- a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm +++ b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
@@ -83,7 +83,7 @@ base::FilePath file = task_ptr->GetResponseWriter()->AsFileWriter()->file_path(); base::FilePath download_dir; - ASSERT_TRUE(GetDownloadsDirectory(&download_dir)); + ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir)); EXPECT_TRUE(download_dir.IsParent(file)); histogram_tester()->ExpectBucketCount( @@ -121,7 +121,7 @@ base::FilePath file = task_ptr->GetResponseWriter()->AsFileWriter()->file_path(); base::FilePath download_dir; - ASSERT_TRUE(GetDownloadsDirectory(&download_dir)); + ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir)); EXPECT_TRUE(download_dir.IsParent(file)); histogram_tester()->ExpectBucketCount(
diff --git a/ios/chrome/browser/download/download_directory_util.h b/ios/chrome/browser/download/download_directory_util.h index ff95d88..4af46c21 100644 --- a/ios/chrome/browser/download/download_directory_util.h +++ b/ios/chrome/browser/download/download_directory_util.h
@@ -11,12 +11,16 @@ class FilePath; } -// Fills |directory_path| with the FilePath to the downloads directory. Returns -// true if this is successful. This method does not create the directory, it -// just returns the path. -bool GetDownloadsDirectory(base::FilePath* directory_path); +// Fills |directory_path| with the FilePath to the temporary downloads +// directory. Returns true if this is successful. This method does not create +// the directory, it just returns the path. +bool GetTempDownloadsDirectory(base::FilePath* directory_path); + +// Fills |directory_path| with the FilePath to the downloads directory. This +// method does not create the directory, it just updates the path. +void GetDownloadsDirectory(base::FilePath* directory_path); // Asynchronously deletes downloads directory. -void DeleteDownloadsDirectory(); +void DeleteTempDownloadsDirectory(); #endif // IOS_CHROME_BROWSER_DOWNLOAD_DOWNLOAD_DIRECTORY_UTIL_H_
diff --git a/ios/chrome/browser/download/download_directory_util.mm b/ios/chrome/browser/download/download_directory_util.mm index b860000..0dbb943 100644 --- a/ios/chrome/browser/download/download_directory_util.mm +++ b/ios/chrome/browser/download/download_directory_util.mm
@@ -21,23 +21,15 @@ namespace { // Synchronously deletes downloads directory. -void DeleteDownloadsDirectorySync() { +void DeleteTempDownloadsDirectorySync() { base::FilePath downloads_directory; - if (GetDownloadsDirectory(&downloads_directory)) { + if (GetTempDownloadsDirectory(&downloads_directory)) { DeleteFile(downloads_directory, /*recursive=*/true); } } } // namespace -bool GetDownloadsDirectory(base::FilePath* directory_path) { - // If downloads manager's flag is enabled, moves the downloads folder to - // user's Documents. - if (base::FeatureList::IsEnabled(web::features::kEnablePersistentDownloads)) { - *directory_path = - base::mac::NSStringToFilePath([NSSearchPathForDirectoriesInDomains( - NSDocumentDirectory, NSAllDomainsMask, YES) objectAtIndex:0]); - return true; - } +bool GetTempDownloadsDirectory(base::FilePath* directory_path) { if (!GetTempDir(directory_path)) { return false; } @@ -45,10 +37,14 @@ return true; } -void DeleteDownloadsDirectory() { - // If downloads manager's flag is enabled, keeps downloads folder. - if (!base::FeatureList::IsEnabled(web::features::kEnablePersistentDownloads)) - base::ThreadPool::PostTask( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::BindOnce(&DeleteDownloadsDirectorySync)); +void GetDownloadsDirectory(base::FilePath* directory_path) { + *directory_path = + base::mac::NSStringToFilePath([NSSearchPathForDirectoriesInDomains( + NSDocumentDirectory, NSAllDomainsMask, YES) firstObject]); +} + +void DeleteTempDownloadsDirectory() { + base::ThreadPool::PostTask( + FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + base::BindOnce(&DeleteTempDownloadsDirectorySync)); }
diff --git a/ios/chrome/browser/download/download_directory_util_unittest.mm b/ios/chrome/browser/download/download_directory_util_unittest.mm index 597e1505c..3110b588 100644 --- a/ios/chrome/browser/download/download_directory_util_unittest.mm +++ b/ios/chrome/browser/download/download_directory_util_unittest.mm
@@ -20,20 +20,20 @@ using DownloadDirectoryTest = PlatformTest; -// Tests that DeleteDownloadsDirectory() actually deletes the directory. +// Tests that DeleteTempDownloadsDirectory() actually deletes the directory. TEST_F(DownloadDirectoryTest, Deletion) { base::test::TaskEnvironment envoronment; // Create a new file in downloads directory. base::FilePath dir; - EXPECT_TRUE(GetDownloadsDirectory(&dir)); + EXPECT_TRUE(GetTempDownloadsDirectory(&dir)); EXPECT_TRUE(CreateDirectory(dir)); base::FilePath file = dir.Append("file.txt"); EXPECT_EQ(0, WriteFile(file, "", 0)); ASSERT_TRUE(base::PathExists(file)); // Delete download directory. - DeleteDownloadsDirectory(); + DeleteTempDownloadsDirectory(); // Verify download directory deletion. EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForFileOperationTimeout, ^{
diff --git a/ios/chrome/browser/download/download_manager_tab_helper.mm b/ios/chrome/browser/download/download_manager_tab_helper.mm index aae48fa..db8c864 100644 --- a/ios/chrome/browser/download/download_manager_tab_helper.mm +++ b/ios/chrome/browser/download/download_manager_tab_helper.mm
@@ -8,6 +8,7 @@ #include "base/memory/ptr_util.h" #import "ios/chrome/browser/download/download_manager_tab_helper_delegate.h" #import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h" +#include "ios/web/common/features.h" #import "ios/web/public/download/download_task.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -40,7 +41,10 @@ void DownloadManagerTabHelper::Download( std::unique_ptr<web::DownloadTask> task) { __block std::unique_ptr<web::DownloadTask> block_task = std::move(task); - if (!task_) { + // If downloads are persistent, they cannot be lost once completed. + if (!task_ || (base::FeatureList::IsEnabled( + web::features::kEnablePersistentDownloads) && + task_->GetState() == web::DownloadTask::State::kComplete)) { // The task is the first download for this web state. DidCreateDownload(std::move(block_task)); return;
diff --git a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm index ec2e067d..15074134 100644 --- a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm +++ b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
@@ -6,8 +6,10 @@ #include <memory> +#include "base/test/scoped_feature_list.h" #import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h" #import "ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h" +#include "ios/web/common/features.h" #import "ios/web/public/test/fakes/fake_download_task.h" #import "ios/web/public/test/fakes/test_web_state.h" #include "net/url_request/url_fetcher_response_writer.h" @@ -251,3 +253,49 @@ task_ptr->Cancel(); EXPECT_FALSE(tab_helper()->has_download_task()); } + +// Enables kEnablePersistentDownloads flag. +// Tests creating a second download after the first download is completed. +TEST_F(DownloadManagerTabHelperTest, + DownloadAcceptationOnceCompletedWithPersistentDownloads) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(web::features::kEnablePersistentDownloads); + + web_state_->WasShown(); + ASSERT_FALSE(delegate_.state); + auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType); + task->SetDone(true); + tab_helper()->Download(std::move(task)); + EXPECT_EQ(web::DownloadTask::State::kComplete, *delegate_.state); + + auto task2 = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType); + tab_helper()->Download(std::move(task2)); + + ASSERT_TRUE(delegate_.state); + EXPECT_EQ(web::DownloadTask::State::kNotStarted, *delegate_.state); +} + +// Enables kEnablePersistentDownloads flag. +// Tests creating the second download while the first download is still in +// progress. Second download will be rejected by the delegate. +TEST_F(DownloadManagerTabHelperTest, + DownloadRejectionViaDelegateWithPersistentDownloads) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(web::features::kEnablePersistentDownloads); + + web_state_->WasShown(); + ASSERT_FALSE(delegate_.state); + auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType); + tab_helper()->Download(std::move(task)); + + auto task2 = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType); + const web::FakeDownloadTask* task2_ptr = task2.get(); + task2->SetTransitionType(ui::PAGE_TRANSITION_LINK); + tab_helper()->Download(std::move(task2)); + + ASSERT_TRUE(delegate_.state); + EXPECT_EQ(task2_ptr, delegate_.decidingPolicyForDownload); + // Ask the delegate to discard the new download. + BOOL discarded = [delegate_ decidePolicy:kNewDownloadPolicyDiscard]; + ASSERT_TRUE(discarded); +}
diff --git a/ios/chrome/browser/download/external_app_util.mm b/ios/chrome/browser/download/external_app_util.mm index dd711cc7..2669868 100644 --- a/ios/chrome/browser/download/external_app_util.mm +++ b/ios/chrome/browser/download/external_app_util.mm
@@ -29,9 +29,7 @@ NSURL* GetFilesAppUrl() { base::FilePath download_dir; - if (!GetDownloadsDirectory(&download_dir)) { - return nil; - } + GetDownloadsDirectory(&download_dir); return [NSURL URLWithString:[NSString stringWithFormat:@"shareddocuments://%s",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index a2044d5e..3cef6651 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -422,10 +422,6 @@ {"send-uma-cellular", flag_descriptions::kSendUmaOverAnyNetwork, flag_descriptions::kSendUmaOverAnyNetworkDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kUmaCellular)}, - {"enable-sync-uss-passwords", - flag_descriptions::kEnableSyncUSSPasswordsName, - flag_descriptions::kEnableSyncUSSPasswordsDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(switches::kSyncUSSPasswords)}, {"autofill-no-local-save-on-upload-success", flag_descriptions::kAutofillNoLocalSaveOnUploadSuccessName, flag_descriptions::kAutofillNoLocalSaveOnUploadSuccessDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index ef5a921..dd15571 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -218,10 +218,6 @@ const char kEnablePersistentDownloadsDescription[] = "Enables the new, experimental implementation of persistent downloads"; -const char kEnableSyncUSSPasswordsName[] = "Enable USS for passwords sync"; -const char kEnableSyncUSSPasswordsDescription[] = - "Enables the new, experimental implementation of password sync"; - const char kEnableSyncUSSNigoriName[] = "Enable USS for sync encryption keys"; const char kEnableSyncUSSNigoriDescription[] = "Enables the new, experimental implementation of sync encryption keys";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index c64e21b..6dca4a1 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -185,9 +185,6 @@ extern const char kEnablePersistentDownloadsName[]; extern const char kEnablePersistentDownloadsDescription[]; -extern const char kEnableSyncUSSPasswordsName[]; -extern const char kEnableSyncUSSPasswordsDescription[]; - extern const char kEnableSyncUSSNigoriName[]; extern const char kEnableSyncUSSNigoriDescription[];
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h index cb8b849..897c06e 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/macros.h" +#include "base/strings/string16.h" #include "components/password_manager/core/browser/leak_detection_dialog_utils.h" #include "components/password_manager/core/browser/password_feature_manager_impl.h" #import "components/password_manager/core/browser/password_manager_client.h" @@ -124,7 +125,8 @@ void NotifyStorePasswordCalled() override; void NotifyUserCredentialsWereLeaked( password_manager::CredentialLeakType leak_type, - const GURL& origin) override; + const GURL& origin, + const base::string16& username) override; bool IsSavingAndFillingEnabled(const GURL& url) const override; bool IsFillingEnabled(const GURL& url) const override; const GURL& GetLastCommittedEntryURL() const override;
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm index 15505f10..a4c5f3b5 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -201,7 +201,8 @@ void IOSChromePasswordManagerClient::NotifyUserCredentialsWereLeaked( password_manager::CredentialLeakType leak_type, - const GURL& origin) { + const GURL& origin, + const base::string16& username) { [delegate_ showPasswordBreachForLeakType:leak_type URL:origin]; }
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc index 7dda681..9887218 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc +++ b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
@@ -27,7 +27,6 @@ #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/sync/glue/sync_start_util.h" #include "ios/chrome/browser/sync/profile_sync_service_factory.h" #include "ios/chrome/browser/webdata_services/web_data_service_factory.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -96,9 +95,7 @@ scoped_refptr<password_manager::PasswordStore> store = new password_manager::PasswordStoreDefault(std::move(login_db)); - if (!store->Init(ios::sync_start_util::GetFlareForSyncableService( - context->GetStatePath()), - nullptr)) { + if (!store->Init(nullptr)) { // TODO(crbug.com/479725): Remove the LOG once this error is visible in the // UI. LOG(WARNING) << "Could not initialize password store.";
diff --git a/ios/chrome/browser/passwords/test/test_password_manager_client.mm b/ios/chrome/browser/passwords/test/test_password_manager_client.mm index 0d8d6d6..9deed39 100644 --- a/ios/chrome/browser/passwords/test/test_password_manager_client.mm +++ b/ios/chrome/browser/passwords/test/test_password_manager_client.mm
@@ -22,7 +22,7 @@ TestPasswordManagerClient::TestPasswordManagerClient() : last_committed_url_(kHttpsWebOrigin), password_manager_(this) { store_ = base::MakeRefCounted<TestPasswordStore>(); - store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr); + store_->Init(nullptr); prefs_ = std::make_unique<TestingPrefServiceSimple>(); prefs_->registry()->RegisterBooleanPref( password_manager::prefs::kCredentialsEnableAutosignin, true);
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm index 95c1029..8332f57 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -28,7 +28,6 @@ #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_store.h" -#include "components/password_manager/core/browser/sync/password_model_worker.h" #include "components/reading_list/core/reading_list_model.h" #include "components/sync/base/report_unrecoverable_error.h" #include "components/sync/base/sync_base_switches.h" @@ -37,8 +36,6 @@ #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_util.h" #include "components/sync/engine/passive_model_worker.h" -#include "components/sync/engine/sequenced_model_worker.h" -#include "components/sync/engine/ui_model_worker.h" #include "components/sync_preferences/pref_service_syncable.h" #include "components/sync_sessions/favicon_cache.h" #include "components/sync_sessions/session_sync_service.h" @@ -231,10 +228,6 @@ return history ? history->GetDeleteDirectivesSyncableService() : base::WeakPtr<syncer::SyncableService>(); } - case syncer::PASSWORDS: { - return password_store_ ? password_store_->GetPasswordSyncableService() - : base::WeakPtr<syncer::SyncableService>(); - } default: NOTREACHED(); return base::WeakPtr<syncer::SyncableService>(); @@ -283,16 +276,8 @@ IOSChromeSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) { DCHECK_CURRENTLY_ON(web::WebThread::UI); switch (group) { - case syncer::GROUP_UI: - return new syncer::UIModelWorker( - base::CreateSingleThreadTaskRunner({web::WebThread::UI})); case syncer::GROUP_PASSIVE: return new syncer::PassiveModelWorker(); - case syncer::GROUP_PASSWORD: { - if (!password_store_) - return nullptr; - return new browser_sync::PasswordModelWorker(password_store_); - } default: return nullptr; }
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm index 4c088b7..05633aa 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm +++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
@@ -73,6 +73,19 @@ int IOSChromeSyncedTabDelegate::GetCurrentEntryIndex() const { if (GetSessionStorageIfNeeded()) { + NSInteger lastCommittedIndex = session_storage_.lastCommittedItemIndex; + if (lastCommittedIndex < 0 || + lastCommittedIndex >= + static_cast<NSInteger>(session_storage_.itemStorages.count)) { + // It has been observed that lastCommittedIndex can be invalid (see + // crbug.com/1060553). Returning an invalid index will cause a crash. + // If lastCommittedIndex is invalid, consider the last index as the + // current one. + // As GetSessionStorageIfNeeded just returned true, + // session_storage_.itemStorages.count is not 0 and + // session_storage_.itemStorages.count - 1 is valid. + return session_storage_.itemStorages.count - 1; + } return session_storage_.lastCommittedItemIndex; } return web_state_->GetNavigationManager()->GetLastCommittedItemIndex();
diff --git a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc index b99462e..1644fe04 100644 --- a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc +++ b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -9,7 +9,6 @@ #include <vector> #include "base/command_line.h" -#include "base/feature_list.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "components/browser_sync/browser_sync_switches.h" #include "components/sync/base/model_type.h" @@ -49,7 +48,8 @@ std::vector<syncer::ModelType> datatypes; - // Common types. + // Common types. This excludes PASSWORDS because the password store factory + // is null for testing and hence no controller gets instantiated. datatypes.push_back(syncer::AUTOFILL); datatypes.push_back(syncer::AUTOFILL_PROFILE); datatypes.push_back(syncer::AUTOFILL_WALLET_DATA); @@ -57,12 +57,6 @@ datatypes.push_back(syncer::BOOKMARKS); datatypes.push_back(syncer::DEVICE_INFO); datatypes.push_back(syncer::HISTORY_DELETE_DIRECTIVES); - if (!base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) { - // Password store factory is null for testing. For directory - // implementation, a controller was added anyway. For USS, no controller - // gets added, and hence the type isn't available. - datatypes.push_back(syncer::PASSWORDS); - } datatypes.push_back(syncer::PREFERENCES); datatypes.push_back(syncer::PRIORITY_PREFERENCES); datatypes.push_back(syncer::READING_LIST);
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index 8a8d3b1..9c0db77 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -526,7 +526,7 @@ } base::FilePath download_dir; - if (!GetDownloadsDirectory(&download_dir)) { + if (!GetTempDownloadsDirectory(&download_dir)) { return; }
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm index 4089834..ddba79d 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm
@@ -50,7 +50,7 @@ feature_list.InitAndEnableFeature(kOpenDownloadsInFilesApp); base::FilePath download_dir; - ASSERT_TRUE(GetDownloadsDirectory(&download_dir)); + GetDownloadsDirectory(&download_dir); NSURL* url = GetFilesAppUrl(); ASSERT_TRUE(url);
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h index 9f36622..429cc58 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h
@@ -55,13 +55,6 @@ // Returns the fake omnibox. + (UIView*)fakeOmnibox; -// Swizzles the callback for the search button tap action so it is recorded. -+ (void)swizzleSearchButtonLogging; - -// Resets the swizzle for the search button tap, and return the whether the -// swizzled method was called. -+ (BOOL)resetSearchButtonLogging; - @end #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm index 0ccac6b..75a50f8 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm
@@ -190,18 +190,6 @@ return ntp_home::FakeOmnibox(); } -+ (void)swizzleSearchButtonLogging { - [[ContentSuggestionsTestSingleton sharedInstance] - swizzleLocationBarCoordinatorSearchButton]; -} - -+ (BOOL)resetSearchButtonLogging { - ContentSuggestionsTestSingleton* singleton = - [ContentSuggestionsTestSingleton sharedInstance]; - [singleton resetSwizzle]; - return singleton.locationBarCoordinatorSearchButtonMethodCalled; -} - #pragma mark - Helper + (MockContentSuggestionsProvider*)provider {
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index f24db29..b9a5775a 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -461,29 +461,6 @@ [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]; } -// Tests that tapping the omnibox search button logs correctly. -// It is important for ranking algorithm of omnibox that requests from the -// search button and real omnibox are marked appropriately. -- (void)testTapOmniboxSearchButtonLogsCorrectly { - if ([ChromeEarlGrey isRegularXRegularSizeClass]) { - // This logging only happens on iPhone, since on iPad there's no secondary - // toolbar. - return; - } - [ContentSuggestionsAppInterface swizzleSearchButtonLogging]; - - // Tap the search button. - [[EarlGrey selectElementWithMatcher:grey_accessibilityID( - kToolbarSearchButtonIdentifier)] - performAction:grey_tap()]; - - BOOL tapped = [ContentSuggestionsAppInterface resetSearchButtonLogging]; - - // Check that the page is loaded. - GREYAssertTrue(tapped, - @"The tap on the search button was not correctly logged."); -} - // Tests that tapping the fake omnibox moves the collection. - (void)testTapFakeOmniboxScroll { // Get the collection and its layout. @@ -569,24 +546,6 @@ @"The collection is not scrolled back to its previous position"); } -// Tests tapping the search button when the fake omnibox is scrolled. -- (void)testTapSearchButtonFakeOmniboxScrolled { - if ([ChromeEarlGrey isRegularXRegularSizeClass]) { - // This only happens on iPhone, since on iPad there's no secondary toolbar. - return; - } - - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - ContentSuggestionCollectionView()] - performAction:grey_swipeFastInDirection(kGREYDirectionUp)]; - // Tap the search button. - [[EarlGrey selectElementWithMatcher:grey_accessibilityID( - kToolbarSearchButtonIdentifier)] - performAction:grey_tap()]; - [ChromeEarlGrey - waitForSufficientlyVisibleElementWithMatcher:chrome_test_util::Omnibox()]; -} - - (void)testOpeningNewTab { [ChromeEarlGreyUI openNewTab];
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h index ebf3b60..3d02332 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
@@ -37,12 +37,6 @@ - (void)registerArticleProvider: (ntp_snippets::ContentSuggestionsService*)service; -// Enables the swizzling of the @"focusOmniboxFromSearchButton" selector on the -// location bar coordinator. -- (void)swizzleLocationBarCoordinatorSearchButton; -// Resets the swizzling of the location bar coordinator. -- (void)resetSwizzle; - @end #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_NTP_HOME_PROVIDER_TEST_SINGLETON_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm index a6d1a97a..147d9f37 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
@@ -56,18 +56,6 @@ service->RegisterProvider(std::move(provider)); } -- (void)swizzleLocationBarCoordinatorSearchButton { - _tapped = NO; - _swizzler = std::make_unique<ScopedBlockSwizzler>( - NSClassFromString(@"LocationBarCoordinator"), - NSSelectorFromString(@"focusOmniboxFromSearchButton"), ^{ - _tapped = YES; - }); -} -- (void)resetSwizzle { - _swizzler.reset(); -} - - (BOOL)locationBarCoordinatorSearchButtonMethodCalled { return _tapped; }
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn index 42f2bbc..2ada01022 100644 --- a/ios/chrome/browser/ui/download/BUILD.gn +++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -93,6 +93,7 @@ "//ios/chrome/test:test_support", "//ios/chrome/test/app:test_support", "//ios/chrome/test/fakes", + "//ios/web/common:features", "//ios/web/public/test", "//ios/web/public/test/fakes", "//net:test_support",
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator.mm b/ios/chrome/browser/ui/download/download_manager_coordinator.mm index 67dd59f..d6fed09f 100644 --- a/ios/chrome/browser/ui/download/download_manager_coordinator.mm +++ b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
@@ -15,7 +15,9 @@ #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" #include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" #include "components/strings/grit/components_strings.h" +#include "ios/chrome/browser/download/download_directory_util.h" #include "ios/chrome/browser/download/download_manager_metric_names.h" #import "ios/chrome/browser/download/download_manager_tab_helper.h" #import "ios/chrome/browser/download/external_app_util.h" @@ -350,8 +352,7 @@ - (void)presentOpenInForDownloadManagerViewController: (DownloadManagerViewController*)controller { - base::FilePath path = - _downloadTask->GetResponseWriter()->AsFileWriter()->file_path(); + base::FilePath path = _mediator.GetDownloadPath(); NSURL* URL = [NSURL fileURLWithPath:base::SysUTF8ToNSString(path.value())]; NSArray* customActions = @[ URL ];
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm index 8778f7eb..bca4b33 100644 --- a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
@@ -234,7 +234,12 @@ // one. TEST_F(DownloadManagerCoordinatorTest, DelegateReplacedDownload) { auto task = CreateTestTask(); + base::FilePath path; + ASSERT_TRUE(base::GetTempDir(&path)); + task->Start(std::make_unique<net::URLFetcherFileWriter>( + base::ThreadTaskRunnerHandle::Get(), path)); task->SetDone(true); + [coordinator_ downloadManagerTabHelper:&tab_helper_ didCreateDownload:task.get() webStateIsVisible:YES]; @@ -438,12 +443,14 @@ // These calls will retain coordinator, which should outlive thread bundle. [view_controller.delegate downloadManagerViewControllerDidStartDownload:view_controller]; + + // Complete the download before presenting Open In... menu. + task->SetDone(true); + [view_controller.delegate presentOpenInForDownloadManagerViewController:view_controller]; } - // Complete the download to log UMA. - task->SetDone(true); // Download task is destroyed without opening the file. task = nullptr; histogram_tester_.ExpectTotalCount("Download.IOSDownloadedFileNetError", 0); @@ -649,7 +656,7 @@ // Download file should be located in download directory. base::FilePath file = task.GetResponseWriter()->AsFileWriter()->file_path(); base::FilePath download_dir; - ASSERT_TRUE(GetDownloadsDirectory(&download_dir)); + ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir)); EXPECT_TRUE(download_dir.IsParent(file)); histogram_tester_.ExpectTotalCount("Download.IOSDownloadFileInBackground", 0); @@ -750,6 +757,12 @@ ASSERT_EQ([DownloadManagerViewController class], [viewController class]); // Start the download. + base::FilePath path; + ASSERT_TRUE(base::GetTempDir(&path)); + task.Start(std::make_unique<net::URLFetcherFileWriter>( + base::ThreadTaskRunnerHandle::Get(), path)); + + // Start the download. @autoreleasepool { // This call will retain coordinator, which should outlive thread bundle. [viewController.delegate
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.h b/ios/chrome/browser/ui/download/download_manager_mediator.h index 0e9bcef..8e90eb0 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator.h +++ b/ios/chrome/browser/ui/download/download_manager_mediator.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #import "ios/chrome/browser/ui/download/download_manager_consumer.h" @@ -14,10 +15,6 @@ @protocol DownloadManagerConsumer; -namespace base { -class FilePath; -} // namespace base - namespace net { class URLFetcherFileWriter; } // namespace net @@ -39,6 +36,10 @@ // Sets download task. Must be set to null when task is destroyed. void SetDownloadTask(web::DownloadTask* task); + // Returns the path of the downloaded file after download is completed. + // Returns empty path otherwise (f.e. download is still in progress). + base::FilePath GetDownloadPath(); + // Asynchronously starts download operation. void StartDowloading(); @@ -70,6 +71,7 @@ void OnDownloadUpdated(web::DownloadTask* task) override; void OnDownloadDestroyed(web::DownloadTask* task) override; + base::FilePath download_path_; web::DownloadTask* task_ = nullptr; __weak id<DownloadManagerConsumer> consumer_ = nil; base::WeakPtrFactory<DownloadManagerMediator> weak_ptr_factory_;
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.mm b/ios/chrome/browser/ui/download/download_manager_mediator.mm index 63af89f..066f06c2 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator.mm +++ b/ios/chrome/browser/ui/download/download_manager_mediator.mm
@@ -16,6 +16,7 @@ #include "ios/chrome/browser/download/download_directory_util.h" #import "ios/chrome/browser/download/external_app_util.h" #include "ios/chrome/grit/ios_strings.h" +#include "ios/web/common/features.h" #import "ios/web/public/download/download_task.h" #include "net/base/net_errors.h" #include "net/url_request/url_fetcher_response_writer.h" @@ -47,9 +48,13 @@ } } +base::FilePath DownloadManagerMediator::GetDownloadPath() { + return download_path_; +} + void DownloadManagerMediator::StartDowloading() { base::FilePath download_dir; - if (!GetDownloadsDirectory(&download_dir)) { + if (!GetTempDownloadsDirectory(&download_dir)) { [consumer_ setState:kDownloadManagerStateFailed]; return; } @@ -116,10 +121,32 @@ void DownloadManagerMediator::UpdateConsumer() { DownloadManagerState state = GetDownloadManagerState(); + + if (state == kDownloadManagerStateSucceeded) { + download_path_ = task_->GetResponseWriter()->AsFileWriter()->file_path(); + + if (base::FeatureList::IsEnabled( + web::features::kEnablePersistentDownloads)) { + NSURL* temp_download_url = [NSURL + fileURLWithPath:base::SysUTF8ToNSString(download_path_.value())]; + + base::FilePath user_download_path; + GetDownloadsDirectory(&user_download_path); + user_download_path = user_download_path.Append( + base::UTF16ToUTF8(task_->GetSuggestedFilename())); + NSURL* download_url = [NSURL + fileURLWithPath:base::SysUTF8ToNSString(user_download_path.value())]; + + [[NSFileManager defaultManager] moveItemAtURL:temp_download_url + toURL:download_url + error:nil]; + download_path_ = user_download_path; + } + } + if (state == kDownloadManagerStateSucceeded && !IsGoogleDriveAppInstalled()) { [consumer_ setInstallDriveButtonVisible:YES animated:YES]; } - [consumer_ setState:state]; [consumer_ setCountOfBytesReceived:task_->GetReceivedBytes()]; [consumer_ setCountOfBytesExpectedToReceive:task_->GetTotalBytes()];
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm index de2eac0..ebb26e9 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm +++ b/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm
@@ -9,9 +9,11 @@ #include "base/run_loop.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" +#include "base/test/scoped_feature_list.h" #include "ios/chrome/browser/download/download_directory_util.h" #import "ios/chrome/browser/download/external_app_util.h" #import "ios/chrome/test/fakes/fake_download_manager_consumer.h" +#include "ios/web/common/features.h" #import "ios/web/public/test/fakes/fake_download_task.h" #include "ios/web/public/test/web_task_environment.h" #include "net/base/net_errors.h" @@ -70,8 +72,9 @@ } // Tests starting the download. Verifies that download task is started and its -// file writer is configured to write into download directory. -TEST_F(DownloadManagerMediatorTest, Start) { +// file writer is configured to write into Chrome's temporary download +// directory. +TEST_F(DownloadManagerMediatorTest, StartTempDownload) { task()->SetSuggestedFilename( base::SysNSStringToUTF16(kTestSuggestedFileName)); mediator_.SetDownloadTask(task()); @@ -87,11 +90,43 @@ return task()->GetState() == web::DownloadTask::State::kInProgress; })); + task()->SetDone(true); + EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state); // Download file should be located in download directory. - base::FilePath file = - task()->GetResponseWriter()->AsFileWriter()->file_path(); + base::FilePath file = mediator_.GetDownloadPath(); base::FilePath download_dir; - ASSERT_TRUE(GetDownloadsDirectory(&download_dir)); + ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir)); + EXPECT_TRUE(download_dir.IsParent(file)); +} + +// Tests starting the download. Verifies that download task is started and its +// file writer is configured to write into Chrome's Documents download +// directory. +TEST_F(DownloadManagerMediatorTest, StartDownload) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(web::features::kEnablePersistentDownloads); + + task()->SetSuggestedFilename( + base::SysNSStringToUTF16(kTestSuggestedFileName)); + mediator_.SetDownloadTask(task()); + mediator_.SetConsumer(consumer_); + mediator_.StartDowloading(); + + // Starting download is async for task and sync for consumer. + EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state); + EXPECT_FALSE(consumer_.installDriveButtonVisible); + ASSERT_TRUE( + WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{ + base::RunLoop().RunUntilIdle(); + return task()->GetState() == web::DownloadTask::State::kInProgress; + })); + + task()->SetDone(true); + EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state); + // Download file should be located in download directory. + base::FilePath file = mediator_.GetDownloadPath(); + base::FilePath download_dir; + GetDownloadsDirectory(&download_dir); EXPECT_TRUE(download_dir.IsParent(file)); } @@ -116,9 +151,21 @@ TEST_F(DownloadManagerMediatorTest, ConsumerInstantUpdate) { OCMStub([application_ canOpenURL:GetGoogleDriveAppUrl()]).andReturn(YES); - task()->SetDone(true); task()->SetSuggestedFilename( base::SysNSStringToUTF16(kTestSuggestedFileName)); + mediator_.SetDownloadTask(task()); + mediator_.SetConsumer(consumer_); + mediator_.StartDowloading(); + + // Starting download is async for task and sync for consumer. + EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state); + ASSERT_TRUE( + WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{ + base::RunLoop().RunUntilIdle(); + return task()->GetState() == web::DownloadTask::State::kInProgress; + })); + + task()->SetDone(true); task()->SetTotalBytes(kTestTotalBytes); task()->SetReceivedBytes(kTestReceivedBytes); task()->SetPercentComplete(80); @@ -151,8 +198,19 @@ TEST_F(DownloadManagerMediatorTest, ConsumerSuceededStateUpdate) { OCMStub([application_ canOpenURL:GetGoogleDriveAppUrl()]).andReturn(YES); + task()->SetSuggestedFilename( + base::SysNSStringToUTF16(kTestSuggestedFileName)); mediator_.SetDownloadTask(task()); mediator_.SetConsumer(consumer_); + mediator_.StartDowloading(); + + // Starting download is async for task and sync for consumer. + EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state); + ASSERT_TRUE( + WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{ + base::RunLoop().RunUntilIdle(); + return task()->GetState() == web::DownloadTask::State::kInProgress; + })); task()->SetDone(true); EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state); @@ -165,8 +223,19 @@ ConsumerSuceededStateUpdateWithoutDriveAppInstalled) { OCMStub([application_ canOpenURL:GetGoogleDriveAppUrl()]).andReturn(NO); + task()->SetSuggestedFilename( + base::SysNSStringToUTF16(kTestSuggestedFileName)); mediator_.SetDownloadTask(task()); mediator_.SetConsumer(consumer_); + mediator_.StartDowloading(); + + // Starting download is async for task and sync for consumer. + EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state); + ASSERT_TRUE( + WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{ + base::RunLoop().RunUntilIdle(); + return task()->GetState() == web::DownloadTask::State::kInProgress; + })); task()->SetDone(true); EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state);
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm index acfffcc..95e5c1f 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
@@ -592,11 +592,13 @@ EARL_GREY_TEST_SKIPPED(@"No omnibox button to tap."); } + [ChromeEarlGrey waitForMainTabCount:1]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kToolbarSearchButtonIdentifier)] performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] - assertWithMatcher:firstResponder()]; + + [ChromeEarlGrey waitForMainTabCount:2]; } // Tests share button is enabled only on pages that can be shared.
diff --git a/ios/chrome/browser/ui/toolbar/public/features.mm b/ios/chrome/browser/ui/toolbar/public/features.mm index d75d2c9..d5a34b0 100644 --- a/ios/chrome/browser/ui/toolbar/public/features.mm +++ b/ios/chrome/browser/ui/toolbar/public/features.mm
@@ -15,4 +15,4 @@ "kChangeTabSwitcherPosition", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kToolbarNewTabButton{"ToolbarNewTabButton", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc index 6a66979..fd8dcae 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.cc +++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -33,3 +33,6 @@ const base::Feature kClearSyncedData{"ClearSyncedData", base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kFirstResponderSendAction{ + "FirstResponderSendAction", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h index 430d4b2e4..d5f742c 100644 --- a/ios/chrome/browser/ui/ui_feature_flags.h +++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -38,4 +38,7 @@ // device when signing out from a non-managed account. extern const base::Feature kClearSyncedData; +// Verify if the crash in https://crbug.com/816427 is fixed on iOS 12. +extern const base::Feature kFirstResponderSendAction; + #endif // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/browser/ui/util/uikit_ui_util.mm b/ios/chrome/browser/ui/util/uikit_ui_util.mm index b079cb2e..63c0ac51 100644 --- a/ios/chrome/browser/ui/util/uikit_ui_util.mm +++ b/ios/chrome/browser/ui/util/uikit_ui_util.mm
@@ -65,8 +65,20 @@ } } +// Store a reference to the current first responder. +UIResponder* g_first_responder = nil; + } // namespace +// Category used to get the first responder. +@implementation UIResponder (FirstResponder) + +- (void)cr_markSelfCurrentFirstResponder { + g_first_responder = self; +} + +@end + void SetA11yLabelAndUiAutomationName( NSObject<UIAccessibilityIdentification>* element, int idsAccessibilityLabel, @@ -630,6 +642,18 @@ UIResponder* GetFirstResponder() { DCHECK_CURRENTLY_ON(web::WebThread::UI); + if (base::FeatureList::IsEnabled(kFirstResponderSendAction)) { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + DCHECK(!g_first_responder); + [[UIApplication sharedApplication] + sendAction:@selector(cr_markSelfCurrentFirstResponder) + to:nil + from:nil + forEvent:nil]; + UIResponder* firstResponder = g_first_responder; + g_first_responder = nil; + return firstResponder; + } return GetFirstResponderSubview([UIApplication sharedApplication].keyWindow); }
diff --git a/ios/chrome/browser/ui/webui/web_ui_egtest.mm b/ios/chrome/browser/ui/webui/web_ui_egtest.mm index 1767920..c616b03b 100644 --- a/ios/chrome/browser/ui/webui/web_ui_egtest.mm +++ b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
@@ -127,8 +127,7 @@ // Tests that back navigation functions properly after navigation via anchor // click. -// TODO(crbug.com/1058028): This test is flaky. -- (void)FLAKY_testChromeURLBackNavigationFromAnchorClick { +- (void)testChromeURLBackNavigationFromAnchorClick { [ChromeEarlGrey loadURL:GURL(kChromeUIChromeURLsURL)]; // Tap on chrome://version link on the page. @@ -219,8 +218,7 @@ } // Tests that repeated back/forward navigation from web URL is allowed. -// TODO(crbug.com/1058028): This test is flaky. -- (void)FLAKY_testBackForwardFromWebURL { +- (void)testBackForwardFromWebURL { GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); std::string chromeVersionWebText =
diff --git a/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm b/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm index e76a30bc..b793b46 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm
@@ -58,8 +58,7 @@ personal_data_manager_->SetAutofillWalletImportEnabled(true); password_store_ = new password_manager::TestPasswordStore(); - password_store_->Init(base::RepeatingCallback<void(syncer::ModelType)>(), - nullptr); + password_store_->Init(nullptr); autofill_data_manager_ = [[CWVAutofillDataManager alloc] initWithPersonalDataManager:personal_data_manager_.get()
diff --git a/ios/web_view/internal/passwords/web_view_password_store_factory.mm b/ios/web_view/internal/passwords/web_view_password_store_factory.mm index 5704025..a55964eb 100644 --- a/ios/web_view/internal/passwords/web_view_password_store_factory.mm +++ b/ios/web_view/internal/passwords/web_view_password_store_factory.mm
@@ -97,8 +97,7 @@ scoped_refptr<password_manager::PasswordStore> store = new password_manager::PasswordStoreDefault(std::move(login_db)); - if (!store->Init(base::RepeatingCallback<void(syncer::ModelType)>(), - nullptr)) { + if (!store->Init(nullptr)) { // TODO(crbug.com/479725): Remove the LOG once this error is visible in the // UI. LOG(WARNING) << "Could not initialize password store.";
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm index d1a88c2..3143b04 100644 --- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm +++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -97,8 +97,7 @@ base::ThreadTaskRunnerHandle::Get()); password_store_ = new password_manager::MockPasswordStore; - password_store_->Init(base::RepeatingCallback<void(syncer::ModelType)>(), - nullptr); + password_store_->Init(nullptr); sync_controller_ = [[CWVSyncController alloc] initWithSyncService:mock_sync_service()
diff --git a/ios/web_view/internal/sync/web_view_sync_client.mm b/ios/web_view/internal/sync/web_view_sync_client.mm index fe39b5d..20c0acb9 100644 --- a/ios/web_view/internal/sync/web_view_sync_client.mm +++ b/ios/web_view/internal/sync/web_view_sync_client.mm
@@ -18,13 +18,10 @@ #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_store.h" -#include "components/password_manager/core/browser/sync/password_model_worker.h" #include "components/sync/driver/data_type_controller.h" #include "components/sync/driver/sync_api_component_factory.h" #include "components/sync/driver/sync_util.h" #include "components/sync/engine/passive_model_worker.h" -#include "components/sync/engine/sequenced_model_worker.h" -#include "components/sync/engine/ui_model_worker.h" #include "components/sync_user_events/user_event_service.h" #include "components/version_info/version_info.h" #include "components/version_info/version_string.h" @@ -179,14 +176,8 @@ base::WeakPtr<syncer::SyncableService> WebViewSyncClient::GetSyncableServiceForType(syncer::ModelType type) { - switch (type) { - case syncer::PASSWORDS: - return password_store_ ? password_store_->GetPasswordSyncableService() - : base::WeakPtr<syncer::SyncableService>(); - default: - NOTREACHED(); - return base::WeakPtr<syncer::SyncableService>(); - } + NOTREACHED(); + return base::WeakPtr<syncer::SyncableService>(); } base::WeakPtr<syncer::ModelTypeControllerDelegate> @@ -204,15 +195,8 @@ WebViewSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) { DCHECK_CURRENTLY_ON(web::WebThread::UI); switch (group) { - case syncer::GROUP_UI: - return new syncer::UIModelWorker( - base::CreateSingleThreadTaskRunner({web::WebThread::UI})); case syncer::GROUP_PASSIVE: return new syncer::PassiveModelWorker(); - case syncer::GROUP_PASSWORD: - if (!password_store_) - return nullptr; - return new browser_sync::PasswordModelWorker(password_store_); default: return nullptr; }
diff --git a/media/base/android/android_cdm_factory.cc b/media/base/android/android_cdm_factory.cc index 742d813..a2c20394f 100644 --- a/media/base/android/android_cdm_factory.cc +++ b/media/base/android/android_cdm_factory.cc
@@ -92,11 +92,11 @@ creation_id_, PendingCreation(std::move(factory), std::move(bound_cdm_created_cb))); - raw_factory->Create( - key_system, security_origin, cdm_config, session_message_cb, - session_closed_cb, session_keys_change_cb, session_expiration_update_cb, - base::BindRepeating(&AndroidCdmFactory::OnCdmCreated, - weak_factory_.GetWeakPtr(), creation_id_)); + raw_factory->Create(key_system, security_origin, cdm_config, + session_message_cb, session_closed_cb, + session_keys_change_cb, session_expiration_update_cb, + base::BindOnce(&AndroidCdmFactory::OnCdmCreated, + weak_factory_.GetWeakPtr(), creation_id_)); } void AndroidCdmFactory::OnCdmCreated(
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc index d647c96a..0fe171a 100644 --- a/media/base/android/media_drm_bridge.cc +++ b/media/base/android/media_drm_bridge.cc
@@ -964,8 +964,8 @@ provision_fetcher_->Retrieve( default_url, request_data, - base::Bind(&MediaDrmBridge::ProcessProvisionResponse, - weak_factory_.GetWeakPtr())); + base::BindOnce(&MediaDrmBridge::ProcessProvisionResponse, + weak_factory_.GetWeakPtr())); } void MediaDrmBridge::ProcessProvisionResponse(bool success,
diff --git a/media/base/null_video_sink.h b/media/base/null_video_sink.h index 1d5a31a..3b972a9a 100644 --- a/media/base/null_video_sink.h +++ b/media/base/null_video_sink.h
@@ -43,9 +43,7 @@ } // Sets |stop_cb_|, which will be fired when Stop() is called. - void set_stop_cb(const base::Closure& stop_cb) { - stop_cb_ = stop_cb; - } + void set_stop_cb(base::OnceClosure stop_cb) { stop_cb_ = std::move(stop_cb); } bool is_started() const { return started_; } @@ -84,7 +82,7 @@ const base::TickClock* tick_clock_; // If set, called when Stop() is called. - base::Closure stop_cb_; + base::OnceClosure stop_cb_; // Value passed to RenderCallback::Render(). bool background_render_;
diff --git a/media/base/null_video_sink_unittest.cc b/media/base/null_video_sink_unittest.cc index 33b3aea..4ead7a7 100644 --- a/media/base/null_video_sink_unittest.cc +++ b/media/base/null_video_sink_unittest.cc
@@ -16,7 +16,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -using base::test::RunClosure; +using base::test::RunOnceClosure; using testing::_; using testing::DoAll; using testing::Return; @@ -84,7 +84,7 @@ .WillOnce(Return(test_frame)); WaitableMessageLoopEvent event; EXPECT_CALL(*this, FrameReceived(test_frame)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); event.RunAndWait(); } @@ -103,7 +103,7 @@ .WillOnce(Return(test_frame_2)); EXPECT_CALL(*this, FrameReceived(test_frame)).Times(0); EXPECT_CALL(*this, FrameReceived(test_frame_2)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); event.RunAndWait(); } @@ -147,7 +147,7 @@ EXPECT_CALL(*this, Render(current_time + i * interval, current_time + (i + 1) * interval, false)) .WillOnce( - DoAll(RunClosure(event.GetClosure()), Return(test_frame_2))); + DoAll(RunOnceClosure(event.GetClosure()), Return(test_frame_2))); } } event.RunAndWait();
diff --git a/media/base/test_helpers.cc b/media/base/test_helpers.cc index a59f98c..c815328 100644 --- a/media/base/test_helpers.cc +++ b/media/base/test_helpers.cc
@@ -73,11 +73,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } -base::Closure WaitableMessageLoopEvent::GetClosure() { +base::OnceClosure WaitableMessageLoopEvent::GetClosure() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return BindToCurrentLoop( - base::BindRepeating(&WaitableMessageLoopEvent::OnCallback, - base::Unretained(this), PIPELINE_OK)); + return BindToCurrentLoop(base::BindOnce(&WaitableMessageLoopEvent::OnCallback, + base::Unretained(this), PIPELINE_OK)); } PipelineStatusCallback WaitableMessageLoopEvent::GetPipelineStatusCB() {
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h index a5d01b0..3ab765b6 100644 --- a/media/base/test_helpers.h +++ b/media/base/test_helpers.h
@@ -51,7 +51,7 @@ ~WaitableMessageLoopEvent(); // Returns a thread-safe closure that will signal |this| when executed. - base::Closure GetClosure(); + base::OnceClosure GetClosure(); PipelineStatusCallback GetPipelineStatusCB(); // Runs the current message loop until |this| has been signaled.
diff --git a/media/gpu/android/codec_image_group.cc b/media/gpu/android/codec_image_group.cc index 883458b..4521202 100644 --- a/media/gpu/android/codec_image_group.cc +++ b/media/gpu/android/codec_image_group.cc
@@ -61,7 +61,7 @@ // case, it doesn't need |surface_bundle_|, nor does it need to be notified // if the overlay is destroyed. image->AddUnusedCB( - base::BindRepeating(&CodecImageGroup::OnCodecImageUnused, this)); + base::BindOnce(&CodecImageGroup::OnCodecImageUnused, this)); } void CodecImageGroup::OnCodecImageUnused(CodecImage* image) {
diff --git a/media/gpu/android/codec_surface_bundle.cc b/media/gpu/android/codec_surface_bundle.cc index 616d66f..48dca0a 100644 --- a/media/gpu/android/codec_surface_bundle.cc +++ b/media/gpu/android/codec_surface_bundle.cc
@@ -45,8 +45,8 @@ } else { task_runner->PostTask( FROM_HERE, - base::BindRepeating(&gpu::TextureOwner::ReleaseBackBuffers, - codec_buffer_wait_coordinator_->texture_owner())); + base::BindOnce(&gpu::TextureOwner::ReleaseBackBuffers, + codec_buffer_wait_coordinator_->texture_owner())); } }
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc index 0d39aa9..a4769361 100644 --- a/media/gpu/android/media_codec_video_decoder.cc +++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -527,8 +527,8 @@ if (overlay) { overlay->AddSurfaceDestroyedCallback( - base::Bind(&MediaCodecVideoDecoder::OnSurfaceDestroyed, - weak_factory_.GetWeakPtr())); + base::BindOnce(&MediaCodecVideoDecoder::OnSurfaceDestroyed, + weak_factory_.GetWeakPtr())); target_surface_bundle_ = new CodecSurfaceBundle(std::move(overlay)); } else { target_surface_bundle_ = texture_owner_bundle_; @@ -899,8 +899,8 @@ if (eos_decode_cb_) { // Schedule the EOS DecodeCB to run after all previous frames. video_frame_factory_->RunAfterPendingVideoFrames( - base::Bind(&MediaCodecVideoDecoder::RunEosDecodeCb, - weak_factory_.GetWeakPtr(), reset_generation_)); + base::BindOnce(&MediaCodecVideoDecoder::RunEosDecodeCb, + weak_factory_.GetWeakPtr(), reset_generation_)); } if (drain_type_) OnCodecDrained();
diff --git a/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn index 0b53449..5dd95ec1 100644 --- a/media/gpu/test/BUILD.gn +++ b/media/gpu/test/BUILD.gn
@@ -27,6 +27,7 @@ "//media:test_support", "//media/gpu", "//mojo/core/embedder:embedder", + "//third_party/ffmpeg", "//third_party/libyuv", ] public_deps = [ "//testing/gtest" ]
diff --git a/media/gpu/test/image_quality_metrics.cc b/media/gpu/test/image_quality_metrics.cc index 70e87c3..e90025b 100644 --- a/media/gpu/test/image_quality_metrics.cc +++ b/media/gpu/test/image_quality_metrics.cc
@@ -51,7 +51,7 @@ frame1 = converted_frame1.get(); } if (frame2->format() != PIXEL_FORMAT_I420) { - converted_frame2 = ConvertVideoFrame(frame1, PIXEL_FORMAT_I420); + converted_frame2 = ConvertVideoFrame(frame2, PIXEL_FORMAT_I420); frame2 = converted_frame2.get(); }
diff --git a/media/gpu/test/video.cc b/media/gpu/test/video.cc index 7d9e847..6364c14 100644 --- a/media/gpu/test/video.cc +++ b/media/gpu/test/video.cc
@@ -7,12 +7,25 @@ #include <memory> #include <utility> +#include "base/bind.h" +#include "base/bind_helpers.h" #include "base/files/file_util.h" #include "base/json/json_reader.h" #include "base/numerics/safe_conversions.h" +#include "base/run_loop.h" +#include "base/task/post_task.h" +#include "base/task/task_traits.h" +#include "base/threading/thread.h" #include "base/values.h" - -#define VLOGF(level) VLOG(level) << __func__ << "(): " +#include "media/base/decoder_buffer.h" +#include "media/base/media.h" +#include "media/base/video_decoder_config.h" +#include "media/ffmpeg/ffmpeg_common.h" +#include "media/filters/ffmpeg_demuxer.h" +#include "media/filters/in_memory_url_protocol.h" +#include "media/filters/vpx_video_decoder.h" +#include "media/gpu/macros.h" +#include "testing/gtest/include/gtest/gtest.h" namespace media { namespace test { @@ -67,6 +80,41 @@ return true; } +bool Video::Decode() { + if (codec_ != VideoCodec::kCodecVP9) { + LOG(ERROR) << "Decoding is currently only supported for VP9 videos"; + return false; + } + + // The VpxVideoDecoder requires running on a SequencedTaskRunner, so we can't + // decode the video on the main test thread. + base::Thread decode_thread("DecodeThread"); + if (!decode_thread.Start()) { + LOG(ERROR) << "Failed to start decode thread"; + return false; + } + + std::vector<uint8_t> decompressed_data; + bool success = false; + base::WaitableEvent done; + decode_thread.task_runner()->PostTask( + FROM_HERE, base::BindOnce(&Video::DecodeTask, std::move(data_), + &decompressed_data, &success, &done)); + done.Wait(); + decode_thread.Stop(); + + if (!success) + return false; + + // Set the video's pixel format and clear the profile and codec as the encoded + // data will be replaced with the decompressed video stream. + pixel_format_ = VideoPixelFormat::PIXEL_FORMAT_I420; + profile_ = VIDEO_CODEC_PROFILE_UNKNOWN; + codec_ = kUnknownVideoCodec; + data_ = std::move(decompressed_data); + return true; +} + bool Video::IsLoaded() const { return data_.size() > 0; } @@ -297,6 +345,90 @@ } // static +void Video::DecodeTask(const std::vector<uint8_t> data, + std::vector<uint8_t>* decompressed_data, + bool* success, + base::WaitableEvent* done) { + *success = false; + InitializeMediaLibrary(); + + // Initialize ffmpeg with the compressed video data. + InMemoryUrlProtocol protocol(&data[0], data.size(), false); + FFmpegGlue glue(&protocol); + ASSERT_TRUE(glue.OpenContext()); + + // Find the first VP9 stream in the file. + int stream_index = -1; + VideoDecoderConfig config; + for (size_t i = 0; i < glue.format_context()->nb_streams; ++i) { + AVStream* stream = glue.format_context()->streams[i]; + const AVCodecParameters* codec_parameters = stream->codecpar; + const AVMediaType codec_type = codec_parameters->codec_type; + const AVCodecID codec_id = codec_parameters->codec_id; + if (codec_type == AVMEDIA_TYPE_VIDEO && codec_id == AV_CODEC_ID_VP9) { + *success = AVStreamToVideoDecoderConfig(stream, &config) && + config.IsValidConfig(); + stream_index = i; + break; + } + } + if (!*success) { + done->Signal(); + return; + } + + // Setup the VP9 decoder. + VpxVideoDecoder decoder( + media::OffloadableVideoDecoder::OffloadState::kOffloaded); + media::VideoDecoder::InitCB init_cb = base::BindOnce( + [](bool* success, bool init_success) { *success = init_success; }, + success); + decoder.Initialize( + config, false, nullptr, std::move(init_cb), + base::BindRepeating(&Video::OnFrameDecoded, decompressed_data), + base::NullCallback()); + if (!*success) { + done->Signal(); + return; + } + + // Start decoding and wait until all frames are ready. + AVPacket packet = {}; + while (av_read_frame(glue.format_context(), &packet) >= 0) { + if (packet.stream_index == stream_index) { + media::VideoDecoder::DecodeCB decode_cb = base::BindOnce( + [](bool* success, media::DecodeStatus status) { + *success = (status == media::DecodeStatus::OK); + }, + success); + decoder.Decode(DecoderBuffer::CopyFrom(packet.data, packet.size), + std::move(decode_cb)); + if (!*success) + break; + } + av_packet_unref(&packet); + } + + done->Signal(); +} + +// static +void Video::OnFrameDecoded(std::vector<uint8_t>* data, + scoped_refptr<VideoFrame> frame) { + ASSERT_EQ(frame->format(), VideoPixelFormat::PIXEL_FORMAT_I420); + size_t num_planes = VideoFrame::NumPlanes(frame->format()); + for (size_t plane = 0; plane < num_planes; ++plane) { + size_t current_pos = data->size(); + size_t plane_size = + VideoFrame::PlaneSize(frame->format(), plane, frame->coded_size()) + .GetArea(); + // TODO(dstaessens): Avoid resizing. + data->resize(data->size() + plane_size); + std::memcpy(&data->at(current_pos), frame->data(plane), plane_size); + } +} + +// static base::Optional<VideoCodecProfile> Video::ConvertStringtoProfile( const std::string& profile) { if (profile == "H264PROFILE_BASELINE") {
diff --git a/media/gpu/test/video.h b/media/gpu/test/video.h index c85897b..5dbd260 100644 --- a/media/gpu/test/video.h +++ b/media/gpu/test/video.h
@@ -9,14 +9,18 @@ #include <vector> #include "base/files/file_path.h" -#include "base/macros.h" +#include "base/memory/scoped_refptr.h" #include "base/optional.h" +#include "base/synchronization/waitable_event.h" #include "base/time/time.h" #include "media/base/video_codecs.h" #include "media/base/video_types.h" #include "ui/gfx/geometry/size.h" namespace media { + +class VideoFrame; + namespace test { // The video class provides functionality to load video files and manage their @@ -39,6 +43,11 @@ // Get the video data, will be empty if the video hasn't been loaded yet. const std::vector<uint8_t>& Data() const; + // Decode the video, replacing the video stream data in |data_| with raw video + // data. This is currently only supported for VP9 videos. Returns whether + // decoding was successful. + bool Decode(); + // Get the video's codec. VideoCodec Codec() const; // Get the video's codec profile. @@ -88,6 +97,16 @@ base::Optional<base::FilePath> ResolveFilePath( const base::FilePath& file_path); + // Decode the video on a separate thread. + static void DecodeTask(const std::vector<uint8_t> data, + std::vector<uint8_t>* decompressed_data, + bool* success, + base::WaitableEvent* done); + // Called each time a |frame| is decoded while decoding a video. The decoded + // frame will be appended to the specified |data|. + static void OnFrameDecoded(std::vector<uint8_t>* data, + scoped_refptr<VideoFrame> frame); + // The path where all test video files are stored. // TODO(dstaessens@) Avoid using a static data path here. static base::FilePath test_data_path_;
diff --git a/media/gpu/test/video_encoder/video_encoder_client.cc b/media/gpu/test/video_encoder/video_encoder_client.cc index 1361b138..3920672 100644 --- a/media/gpu/test/video_encoder/video_encoder_client.cc +++ b/media/gpu/test/video_encoder/video_encoder_client.cc
@@ -22,7 +22,6 @@ namespace { -// TODO(crbug.com/1045825): Check IsFlushSupported() before flushing encoder. // TODO(crbug.com/1045825): Support encoding parameter changes. // Callbacks can be called from any thread, but WeakPtrs are not thread-safe. @@ -296,6 +295,13 @@ // Changing the state to flushing will abort any pending encodes. encoder_client_state_ = VideoEncoderClientState::kFlushing; + // If the encoder does not support flush, immediately consider flushing done. + if (!encoder_->IsFlushSupported()) { + FireEvent(VideoEncoder::EncoderEvent::kFlushing); + FlushDoneTask(true); + return; + } + auto flush_done_cb = base::BindOnce( CallbackThunk<decltype(&VideoEncoderClient::FlushDoneTask), bool>, weak_this_, encoder_client_task_runner_,
diff --git a/media/gpu/test/video_encoder/video_encoder_test_environment.cc b/media/gpu/test/video_encoder/video_encoder_test_environment.cc index 6a2d825b..42f011dd 100644 --- a/media/gpu/test/video_encoder/video_encoder_test_environment.cc +++ b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
@@ -7,6 +7,7 @@ #include <utility> #include "gpu/ipc/service/gpu_memory_buffer_factory.h" +#include "media/gpu/macros.h" #include "media/gpu/test/video.h" namespace media { @@ -28,6 +29,24 @@ return nullptr; } + // If the video file has the .webm format it needs to be decoded first. + // TODO(b/151134705): Add support to cache decompressed video files. + if (video->FilePath().MatchesExtension(FILE_PATH_LITERAL(".webm"))) { + VLOGF(1) << "Test video " << video->FilePath() + << " is compressed, decoding..."; + if (!video->Decode()) { + LOG(ERROR) << "Failed to decode " << video->FilePath(); + return nullptr; + } + } + + if (video->PixelFormat() == VideoPixelFormat::PIXEL_FORMAT_UNKNOWN) { + LOG(ERROR) << "Test video " << video->FilePath() + << " has an invalid video pixel format " + << VideoPixelFormatToString(video->PixelFormat()); + return nullptr; + } + return new VideoEncoderTestEnvironment(std::move(video), output_folder); }
diff --git a/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc index 93ddd604..4257f5a 100644 --- a/media/gpu/test/video_frame_validator.cc +++ b/media/gpu/test/video_frame_validator.cc
@@ -12,6 +12,7 @@ #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "media/base/video_frame.h" +#include "media/gpu/macros.h" #include "media/gpu/test/image_quality_metrics.h" #include "media/gpu/test/video_test_helpers.h" #include "media/gpu/video_frame_mapper.h" @@ -313,7 +314,8 @@ auto model_frame = get_model_frame_cb_.Run(frame_index); CHECK(model_frame); double psnr = ComputePSNR(*frame, *model_frame); - if (psnr > tolerance_) + DVLOGF(4) << "frame_index: " << frame_index << ", psnr: " << psnr; + if (psnr < tolerance_) return std::make_unique<PSNRMismatchedFrameInfo>(frame_index, psnr); return nullptr; } @@ -362,7 +364,8 @@ auto model_frame = get_model_frame_cb_.Run(frame_index); CHECK(model_frame); double ssim = ComputeSSIM(*frame, *model_frame); - if (ssim > tolerance_) + DVLOGF(4) << "frame_index: " << frame_index << ", ssim: " << ssim; + if (ssim < tolerance_) return std::make_unique<SSIMMismatchedFrameInfo>(frame_index, ssim); return nullptr; }
diff --git a/media/gpu/test/video_frame_validator.h b/media/gpu/test/video_frame_validator.h index dde57ae..cb2cd5f 100644 --- a/media/gpu/test/video_frame_validator.h +++ b/media/gpu/test/video_frame_validator.h
@@ -179,7 +179,7 @@ // |tolerance_|, the validation on the frame passes. class PSNRVideoFrameValidator : public VideoFrameValidator { public: - constexpr static double kDefaultTolerance = 0.70; + constexpr static double kDefaultTolerance = 20.0; static std::unique_ptr<PSNRVideoFrameValidator> Create( const GetModelFrameCB& get_model_frame_cb, @@ -208,7 +208,7 @@ // |tolerance_|, the validation on the frame passes. class SSIMVideoFrameValidator : public VideoFrameValidator { public: - constexpr static double kDefaultTolerance = 45.0; + constexpr static double kDefaultTolerance = 0.70; static std::unique_ptr<SSIMVideoFrameValidator> Create( const GetModelFrameCB& get_model_frame_cb,
diff --git a/media/gpu/video_encode_accelerator_perf_tests.cc b/media/gpu/video_encode_accelerator_perf_tests.cc index cc38d9e..24eb0e26 100644 --- a/media/gpu/video_encode_accelerator_perf_tests.cc +++ b/media/gpu/video_encode_accelerator_perf_tests.cc
@@ -37,7 +37,7 @@ constexpr const char* help_msg = "Run the video encode accelerator performance tests on the video\n" "specified by <video path>. If no <video path> is given the default\n" - "\"puppets-320x180.nv12.yuv\" video will be used.\n" + "\"bear_320x192_40frames.yuv.webm\" video will be used.\n" "\nThe <video metadata path> should specify the location of a json file\n" "containing the video's metadata. By default <video path>.json will be\n" "used.\n" @@ -52,7 +52,7 @@ // Default video to be used if no test video was specified. constexpr base::FilePath::CharType kDefaultTestVideoPath[] = - FILE_PATH_LITERAL("puppets-320x180.nv12.yuv"); + FILE_PATH_LITERAL("bear_320x192_40frames.yuv.webm"); media::test::VideoEncoderTestEnvironment* g_env;
diff --git a/media/gpu/video_encode_accelerator_tests.cc b/media/gpu/video_encode_accelerator_tests.cc index 272bb07..155a602 100644 --- a/media/gpu/video_encode_accelerator_tests.cc +++ b/media/gpu/video_encode_accelerator_tests.cc
@@ -30,7 +30,7 @@ constexpr const char* help_msg = "Run the video encoder accelerator tests on the video specified by\n" "<video path>. If no <video path> is given the default\n" - "\"puppets-320x180.nv12.yuv\" video will be used.\n" + "\"bear_320x192_40frames.yuv.webm\" video will be used.\n" "\nThe <video metadata path> should specify the location of a json file\n" "containing the video's metadata, such as frame checksums. By default\n" "<video path>.json will be used.\n" @@ -43,7 +43,7 @@ // Default video to be used if no test video was specified. constexpr base::FilePath::CharType kDefaultTestVideoPath[] = - FILE_PATH_LITERAL("puppets-320x180.nv12.yuv"); + FILE_PATH_LITERAL("bear_320x192_40frames.yuv.webm"); media::test::VideoEncoderTestEnvironment* g_env; @@ -71,7 +71,6 @@ // - Vary bitrate // - Flush midstream // - Forcing key frames -// - Add support for webm files // Encode video from start to end. Wait for the kFlushDone event at the end of // the stream, that notifies us all frames have been encoded.
diff --git a/media/mojo/clients/mojo_android_overlay_unittest.cc b/media/mojo/clients/mojo_android_overlay_unittest.cc index 914c020b4..5de8033 100644 --- a/media/mojo/clients/mojo_android_overlay_unittest.cc +++ b/media/mojo/clients/mojo_android_overlay_unittest.cc
@@ -115,7 +115,7 @@ overlay_client_.reset( new MojoAndroidOverlay(provider_receiver_.BindNewPipeAndPassRemote(), std::move(config_), routing_token)); - overlay_client_->AddSurfaceDestroyedCallback(base::Bind( + overlay_client_->AddSurfaceDestroyedCallback(base::BindOnce( &MockClientCallbacks::OnDestroyed, base::Unretained(&callbacks_))); base::RunLoop().RunUntilIdle(); }
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc index f09203e..03f3eea 100644 --- a/media/renderers/audio_renderer_impl_unittest.cc +++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -566,7 +566,7 @@ std::unique_ptr<AudioTimestampHelper> next_timestamp_; // Run during DecodeDecoder() to unblock WaitForPendingRead(). - base::Closure wait_for_pending_decode_cb_; + base::OnceClosure wait_for_pending_decode_cb_; AudioDecoder::InitCB init_decoder_cb_; bool expected_init_result_;
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc index a9b8450..5e5778de 100644 --- a/media/renderers/video_renderer_impl_unittest.cc +++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -39,6 +39,7 @@ using ::base::test::RunClosure; using ::base::test::RunOnceCallback; +using ::base::test::RunOnceClosure; using ::testing::_; using ::testing::AnyNumber; using ::testing::Combine; @@ -234,7 +235,8 @@ SCOPED_TRACE("WaitForEnded()"); WaitableMessageLoopEvent event; - EXPECT_CALL(mock_cb_, OnEnded()).WillOnce(RunClosure(event.GetClosure())); + EXPECT_CALL(mock_cb_, OnEnded()) + .WillOnce(RunOnceClosure(event.GetClosure())); event.RunAndWait(); } @@ -421,7 +423,7 @@ // Buffering state changes must happen before end of stream. testing::InSequence in_sequence; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnEnded()); } SatisfyPendingDecodeWithEndOfStream(); @@ -452,7 +454,7 @@ // Buffering state changes must happen before end of stream. testing::InSequence in_sequence; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnEnded()); } SatisfyPendingDecode(); @@ -518,10 +520,10 @@ // we should be able to call other renderer methods from the Flush callback. static void VideoRendererImplTest_FlushDoneCB(VideoRendererImplTest* test, VideoRenderer* renderer, - const base::Closure& success_cb) { + base::OnceClosure success_cb) { test->QueueFrames("0 10 20 30"); renderer->StartPlayingFrom(base::TimeDelta::FromSeconds(0)); - success_cb.Run(); + std::move(success_cb).Run(); } TEST_F(VideoRendererImplTest, FlushCallbackNoLock) { @@ -637,7 +639,7 @@ WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(20))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(20); event.RunAndWait(); @@ -677,7 +679,7 @@ WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(0))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); StartPlayingFrom(0); EXPECT_TRUE(IsReadPending()); @@ -733,7 +735,7 @@ { WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)) .Times(4) .WillRepeatedly(SaveArg<0>(&last_pipeline_statistics)); @@ -804,7 +806,7 @@ SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH"); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(AnyNumber()); EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); @@ -817,7 +819,7 @@ SCOPED_TRACE("Waiting for BUFFERING_HAVE_NOTHING"); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); renderer_->OnTimeProgressing(); time_source_.StartTicking(); // Jump time far enough forward that no frames are valid. @@ -846,7 +848,7 @@ SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH"); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(AnyNumber()); EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); @@ -864,7 +866,7 @@ AdvanceTimeInMs(1000); renderer_->OnTimeProgressing(); EXPECT_CALL(mock_cb_, FrameReceived(_)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); event.RunAndWait(); ASSERT_EQ(renderer_->effective_frames_queued_for_testing(), 0u); } @@ -874,7 +876,7 @@ SCOPED_TRACE("Waiting for BUFFERING_HAVE_NOTHING"); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); renderer_->OnTimeStopped(); event.RunAndWait(); } @@ -889,7 +891,7 @@ WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(0))); EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); @@ -936,7 +938,7 @@ WaitableMessageLoopEvent event; // Frame "10" should not have been expired. EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(10))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); @@ -1008,7 +1010,7 @@ EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(larger_size)); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(10))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); } @@ -1016,7 +1018,7 @@ // Called is not fired because frame size does not change. WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(20))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); } @@ -1025,7 +1027,7 @@ EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(initial_size)); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(30))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); } @@ -1073,7 +1075,7 @@ // Callback is not fired because opacity does not change. WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(10))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); } @@ -1082,7 +1084,7 @@ EXPECT_CALL(mock_cb_, OnVideoOpacityChange(true)); WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(20))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); } @@ -1090,7 +1092,7 @@ // Callback is not fired because opacity does not change. WaitableMessageLoopEvent event; EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(30))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(10); event.RunAndWait(); } @@ -1203,7 +1205,7 @@ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, BUFFERING_CHANGE_REASON_UNKNOWN)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); @@ -1229,7 +1231,7 @@ EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(60))).Times(0); EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(90))) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); AdvanceTimeInMs(91); @@ -1246,7 +1248,7 @@ .WillOnce(Return(underflow_type == DEMUXER_UNDERFLOW)); EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, underflow_type)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); AdvanceTimeInMs(30); event.RunAndWait(); Mock::VerifyAndClearExpectations(&mock_cb_); @@ -1264,7 +1266,7 @@ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, BUFFERING_CHANGE_REASON_UNKNOWN)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnEnded()); SatisfyPendingDecodeWithEndOfStream(); event.RunAndWait(); @@ -1286,7 +1288,7 @@ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, BUFFERING_CHANGE_REASON_UNKNOWN)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1); EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1); @@ -1306,7 +1308,7 @@ .WillOnce(Return(underflow_type == DEMUXER_UNDERFLOW)); EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, underflow_type)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(60))).Times(1); EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); AdvanceTimeInMs(79); @@ -1330,7 +1332,7 @@ EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, BUFFERING_CHANGE_REASON_UNKNOWN)) - .WillOnce(RunClosure(event.GetClosure())); + .WillOnce(RunOnceClosure(event.GetClosure())); EXPECT_CALL(mock_cb_, OnVideoFrameRateChange(base::Optional<int>(50))); // Note: In the normal underflow case we queue 5 frames here instead of
diff --git a/media/test/data/bear_320x192_40frames.yuv.webm.json b/media/test/data/bear_320x192_40frames.yuv.webm.json new file mode 100644 index 0000000..87e55c5 --- /dev/null +++ b/media/test/data/bear_320x192_40frames.yuv.webm.json
@@ -0,0 +1,7 @@ +{ + "profile": "VP9PROFILE_PROFILE0", + "width": 320, + "height": 192, + "num_frames": 40, + "frame_rate": 30 +}
diff --git a/remoting/host/chromeos/message_box.cc b/remoting/host/chromeos/message_box.cc index df543e6..1575911 100644 --- a/remoting/host/chromeos/message_box.cc +++ b/remoting/host/chromeos/message_box.cc
@@ -72,8 +72,8 @@ message_box_view_(new views::MessageBoxView( views::MessageBoxView::InitParams(message_label))) { DCHECK(message_box_); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, ok_label); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, cancel_label); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, ok_label); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_label); } void MessageBox::Core::Show() {
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index 06be207..9de85c2 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -399,6 +399,7 @@ "//services/network/public/cpp:buildflags", "//services/network/public/mojom", "//services/network/trust_tokens", + "//services/network/trust_tokens:tests", "//services/service_manager/public/cpp", "//services/service_manager/public/cpp/test:test_support", "//testing/gtest", @@ -416,10 +417,6 @@ if (!is_ios) { deps += [ "//services/proxy_resolver:lib" ] } - - if (is_trust_tokens_supported) { - deps += [ "//services/network/trust_tokens:tests" ] - } } jumbo_source_set("test_support") {
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 05bd6dc..059dea47 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -96,6 +96,9 @@ #include "services/network/throttling/network_conditions.h" #include "services/network/throttling/throttling_controller.h" #include "services/network/throttling/throttling_network_transaction_factory.h" +#include "services/network/trust_tokens/sqlite_trust_token_persister.h" +#include "services/network/trust_tokens/trust_token_parameterization.h" +#include "services/network/trust_tokens/trust_token_store.h" #include "services/network/url_loader.h" #include "services/network/url_request_context_builder_mojo.h" @@ -142,12 +145,6 @@ #include "services/network/mdns_responder.h" #endif // BUILDFLAG(ENABLE_MDNS) -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) -#include "services/network/trust_tokens/sqlite_trust_token_persister.h" -#include "services/network/trust_tokens/trust_token_parameterization.h" -#include "services/network/trust_tokens/trust_token_store.h" -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) - #if defined(USE_NSS_CERTS) #include "net/cert_net/nss_ocsp.h" #include "net/cert_net/nss_ocsp_session_url_request.h" @@ -1823,7 +1820,6 @@ DCHECK(!params_->persist_session_cookies); } -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) if (base::FeatureList::IsEnabled(features::kTrustTokens)) { if (params_->trust_token_path) { SQLiteTrustTokenPersister::CreateForFilePath( @@ -1837,7 +1833,6 @@ trust_token_store_ = TrustTokenStore::CreateInMemory(); } } -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) std::unique_ptr<net::StaticHttpUserAgentSettings> user_agent_settings = std::make_unique<net::StaticHttpUserAgentSettings>( @@ -2366,13 +2361,11 @@ } } -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) void NetworkContext::FinishConstructingTrustTokenStore( std::unique_ptr<SQLiteTrustTokenPersister> persister) { DCHECK(!trust_token_store_); trust_token_store_ = std::make_unique<TrustTokenStore>(std::move(persister)); } -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) void NetworkContext::GetOriginPolicyManager( mojo::PendingReceiver<mojom::OriginPolicyManager> receiver) {
diff --git a/services/network/network_context.h b/services/network/network_context.h index 8e52d22..d2480f9 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -94,15 +94,12 @@ class NSSTempCertsCacheChromeOS; class P2PSocketManager; class ProxyLookupRequest; +class QuicTransport; class ResourceScheduler; class ResourceSchedulerClient; -class QuicTransport; -class WebSocketFactory; - -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) class SQLiteTrustTokenPersister; class TrustTokenStore; -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) +class WebSocketFactory; namespace cors { class CorsURLLoaderFactory; @@ -479,7 +476,6 @@ return url_loader_factories_.size(); } -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) // Maintains Trust Tokens protocol state // (https://github.com/WICG/trust-token-api). Used by URLLoader to check // preconditions before annotating requests with protocol-related headers @@ -487,7 +483,6 @@ // // Initialized asynchronously and may be null until initialized. TrustTokenStore* trust_token_store() { return trust_token_store_.get(); } -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) private: URLRequestContextOwner MakeURLRequestContext(); @@ -538,14 +533,12 @@ void InitializeCorsParams(); -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) // If |trust_token_store_| is backed by an asynchronously-constructed (e.g., // SQL-based) persistence layer, |FinishConstructingTrustTokenStore| // constructs and populates |trust_token_store_| once the persister's // asynchronous initialization has finished. void FinishConstructingTrustTokenStore( std::unique_ptr<SQLiteTrustTokenPersister> persister); -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) NetworkService* const network_service_; @@ -582,10 +575,8 @@ mojo::UniqueReceiverSet<mojom::ProxyResolvingSocketFactory> proxy_resolving_socket_factories_; -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) // See the comment for |trust_token_store()|. std::unique_ptr<TrustTokenStore> trust_token_store_; -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) #if !defined(OS_IOS) std::unique_ptr<WebSocketFactory> websocket_factory_;
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index 26077a8..d77d2b0 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -114,6 +114,8 @@ #include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/proxy_config.mojom.h" #include "services/network/test/test_url_loader_client.h" +#include "services/network/trust_tokens/trust_token_parameterization.h" +#include "services/network/trust_tokens/trust_token_store.h" #include "services/network/udp_socket_test_util.h" #include "test_mojo_proxy_resolver_factory.h" #include "testing/gmock/include/gmock/gmock.h" @@ -144,11 +146,6 @@ #include "services/network/mock_mojo_dhcp_wpad_url_client.h" #endif // defined(OS_CHROMEOS) -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) -#include "services/network/trust_tokens/trust_token_parameterization.h" -#include "services/network/trust_tokens/trust_token_store.h" -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) - namespace network { namespace { @@ -6901,7 +6898,6 @@ true /* was_cached */, true /* is_navigation */); } -#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) TEST_F(NetworkContextTest, EnableTrustTokens) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kTrustTokens); @@ -6968,7 +6964,6 @@ EXPECT_FALSE(network_context->trust_token_store()); } -#endif // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED) } // namespace
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn index 2c02d3ae..ee5cce19 100644 --- a/services/network/public/cpp/BUILD.gn +++ b/services/network/public/cpp/BUILD.gn
@@ -10,10 +10,7 @@ buildflag_header("buildflags") { header = "network_service_buildflags.h" - flags = [ - "IS_CT_SUPPORTED=$is_ct_supported", - "IS_TRUST_TOKENS_SUPPORTED=$is_trust_tokens_supported", - ] + flags = [ "IS_CT_SUPPORTED=$is_ct_supported" ] } jumbo_component("cpp") {
diff --git a/services/network/public/cpp/features.gni b/services/network/public/cpp/features.gni index 9f8e6e1..18fef913 100644 --- a/services/network/public/cpp/features.gni +++ b/services/network/public/cpp/features.gni
@@ -8,7 +8,4 @@ # Certificate transparency is not supported on iOS. # TODO(mmenke): It's actually not supported on Android, either. is_ct_supported = !is_ios - - # Trust Tokens is a Web Platform feature, so it isn't supported on iOS. - is_trust_tokens_supported = !is_ios }
diff --git a/services/service_manager/embedder/main.cc b/services/service_manager/embedder/main.cc index 53e9e0a..1b713d5 100644 --- a/services/service_manager/embedder/main.cc +++ b/services/service_manager/embedder/main.cc
@@ -13,6 +13,7 @@ #include "base/debug/stack_trace.h" #include "base/i18n/icu_util.h" #include "base/logging.h" +#include "base/memory/shared_memory_hooks.h" #include "base/message_loop/message_pump_type.h" #include "base/optional.h" #include "base/process/launch.h" @@ -31,6 +32,7 @@ #include "mojo/core/embedder/configuration.h" #include "mojo/core/embedder/embedder.h" #include "mojo/core/embedder/scoped_ipc_support.h" +#include "mojo/public/cpp/base/shared_memory_utils.h" #include "services/service_manager/embedder/main_delegate.h" #include "services/service_manager/embedder/process_type.h" #include "services/service_manager/embedder/set_process_title.h" @@ -39,6 +41,7 @@ #include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service_executable/service_executable_environment.h" #include "services/service_manager/public/cpp/service_executable/switches.h" +#include "services/service_manager/sandbox/sandbox_type.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_paths.h" #include "ui/base/ui_base_switches.h" @@ -374,6 +377,38 @@ return exit_code; } + // Note #1: the installed shared memory hooks require a live instance of + // mojo::core::ScopedIPCSupport to function, which is instantiated below by + // the process type's main function. However, some implementations of the + // service_manager::MainDelegate::Initialize() delegate method allocate + // shared memory, so the hooks cannot be installed before the Initialize() + // call above, or the shared memory allocation will simply fail. + // + // Note #2: some platforms can directly allocated shared memory in a + // sandboxed process. The defines below must be in sync with the + // implementation of mojo::NodeController::CreateSharedBuffer(). +#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA) + // TODO(dcheng): The separate check for |is_broker_process| should not be + // required, but avoid changing the behavior of IsUnsandboxedSandboxType() + // for now. + if (mojo_config.is_broker_process || + service_manager::IsUnsandboxedSandboxType( + service_manager::SandboxTypeFromCommandLine(command_line))) { + // Unsandboxed processes don't need shared memory brokering... because + // they're not sandboxed. + } else if (mojo_config.force_direct_shared_memory_allocation) { + // Don't bother with hooks if direct shared memory allocation has been + // requested. + } else { + // Otherwise, this is a sandboxed process that will need brokering to + // allocate shared memory. + base::SharedMemoryHooks::SetCreateHooks( + &mojo::CreateReadOnlySharedMemoryRegion, + &mojo::CreateUnsafeSharedMemoryRegion, + &mojo::CreateWritableSharedMemoryRegion); + } +#endif // !defined(OS_MACOSX) && !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA) + #if defined(OS_WIN) // Route stdio to parent console (if any) or create one. if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS index db4513d..74ea8134 100644 --- a/testing/buildbot/OWNERS +++ b/testing/buildbot/OWNERS
@@ -12,8 +12,8 @@ per-file *chromium.perf*.json=crouleau@chromium.org per-file *chromium.perf*.json=wenbinzhang@google.com per-file *chromium.perf*.json=hypan@google.com -per-file chromium.webrtc.json=phoglund@chromium.org -per-file chromium.webrtc.fyi.json=phoglund@chromium.org +per-file chromium.webrtc.json=mbonadei@chromium.org +per-file chromium.webrtc.fyi.json=mbonadei@chromium.org # TEAM: infra-dev@chromium.org # COMPONENT: Infra>Client>Chrome
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json index 31e5cda6..7dd70a6 100644 --- a/testing/buildbot/chromium.ci.json +++ b/testing/buildbot/chromium.ci.json
@@ -190522,6 +190522,36 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_target": "//:blink_web_tests" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=web-engine-shell", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--target-cpu=x64" + ], + "isolate_name": "fuchsia_telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "hardware_accelerated_feature_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1", + "os": "Ubuntu-16.04" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_target": "//content/test:fuchsia_telemetry_gpu_integration_test" } ] },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a3f648f..da4e636 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -12645,6 +12645,36 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_target": "//:blink_web_tests" + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=web-engine-shell", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--target-cpu=x64" + ], + "isolate_name": "fuchsia_telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "hardware_accelerated_feature_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "kvm": "1", + "os": "Ubuntu-16.04" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_target": "//content/test:fuchsia_telemetry_gpu_integration_test" } ] },
diff --git a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter index 01833ff7..3b73acd8 100644 --- a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter +++ b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
@@ -67,7 +67,7 @@ -org.chromium.chrome.browser.offlinepages.indicator.OfflineIndicatorControllerTest.testDoNotShowOfflineIndicatorWhenTemporarilyPaused # crbug.com/1061198 --org.chromium.chrome.browser.settings.password.PasswordSettingsTest.testExportMenuDisabled +-org.chromium.chrome.browser.password_manager.settings.PasswordSettingsTest.testExportMenuDisabled # crbug.com/1061201 -org.chromium.chrome.browser.history.HistoryActivityTest.testOpenSelectedItems
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py index e8c0c715..51025b3d 100755 --- a/testing/buildbot/generate_buildbot_json.py +++ b/testing/buildbot/generate_buildbot_json.py
@@ -787,7 +787,8 @@ waterfall, tester_name, tester_config, step_name, test_config) if not result: return None - result['isolate_name'] = 'telemetry_gpu_integration_test' + result['isolate_name'] = test_config.get( + 'isolate_name', 'telemetry_gpu_integration_test') args = result.get('args', []) test_to_run = result.pop('telemetry_test_name', test_name)
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 09176ab..04a0e7f 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -799,6 +799,15 @@ "script": "//testing/scripts/run_flatbuffers_unittests.py", "type": "script", }, + "fuchsia_telemetry_gpu_integration_test": { + "args": [ + "../../content/test/gpu/run_gpu_integration_test_fuchsia.py", + "--output-directory=.", + ], + "label": "//content/test:fuchsia_telemetry_gpu_integration_test", + "script": "//testing/scripts/run_isolated_script_test.py", + "type": "script", + }, "gcm_unit_tests": { "label": "//google_apis/gcm:gcm_unit_tests", "type": "console_test_launcher",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 404e2611..ed9d2e3 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1118,6 +1118,14 @@ 'remove_from': [ 'Android FYI Release (Pixel 2)', ], + # TODO(https://crbug.com/1061094): Remove once argument is not required. + 'modifications': { + 'fuchsia-fyi-x64-rel': { + 'args': [ + '--target-cpu=x64', + ], + }, + }, }, 'headless_browsertests': { 'remove_from': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 162aa72..fd5d65d 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1220,6 +1220,12 @@ 'openscreen_unittests': {} }, + 'fuchsia_gpu_telemetry_tests': { + 'hardware_accelerated_feature': { + 'isolate_name': 'fuchsia_telemetry_gpu_integration_test', + } + }, + 'fuchsia_gtests': { 'angle_unittests': {}, 'base_unittests': {},
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 7994b6ab..58c4bc36 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1794,6 +1794,8 @@ 'additional_compile_targets': [ 'all', ], + 'browser_config': 'web-engine-shell', + 'os_type': 'linux', 'mixins': [ 'linux-xenial', ], @@ -1807,6 +1809,7 @@ 'test_suites': { 'gtest_tests': 'fuchsia_gtests', 'isolated_scripts': 'chromium_webkit_isolated_scripts', + 'gpu_telemetry_tests': 'fuchsia_gpu_telemetry_tests', }, }, 'ios-simulator-code-coverage': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 34b7dd3..dd440ce 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1185,6 +1185,26 @@ ] } ], + "CSSOMViewScrollCoordinates": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "EnableCSSOMViewScrollCoordinates", + "enable_features": [ + "CSSOMViewScrollCoordinates" + ] + } + ] + } + ], "CacheStorageEagerReading": [ { "platforms": [ @@ -5390,26 +5410,6 @@ ] } ], - "SyncUssPasswords'": [ - { - "platforms": [ - "android", - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SyncUSSPasswords" - ] - } - ] - } - ], "TabGridLayoutAndroid": [ { "platforms": [
diff --git a/third_party/android_crazy_linker/BUILD.gn b/third_party/android_crazy_linker/BUILD.gn index e31e6a4..8a949512 100644 --- a/third_party/android_crazy_linker/BUILD.gn +++ b/third_party/android_crazy_linker/BUILD.gn
@@ -152,6 +152,11 @@ configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] + # Disable orderfile instrumentation. Code in this target is in a different + # .so, cannot call unexported instrumentation functions from another one + # (link time error). + configs -= [ "//build/config/android:default_orderfile_instrumentation" ] + # This is used to allow shared memory regions to work on Android Q+ # See http://crbug.com/949804 deps = [ "//third_party/ashmem" ]
diff --git a/third_party/ashmem/BUILD.gn b/third_party/ashmem/BUILD.gn index 5e92b377..e5bd683 100644 --- a/third_party/ashmem/BUILD.gn +++ b/third_party/ashmem/BUILD.gn
@@ -9,4 +9,6 @@ "ashmem-dev.c", "ashmem.h", ] + + configs -= [ "//build/config/android:default_orderfile_instrumentation" ] }
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index e135de6..7f9f00d 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -159,6 +159,11 @@ const base::Feature kRTCOfferExtmapAllowMixed{ "RTCOfferExtmapAllowMixed", base::FEATURE_DISABLED_BY_DEFAULT}; +// Prevents workers from sending IsolateInBackgroundNotification to V8 +// and thus instructs V8 to favor performance over memory on workers. +const base::Feature kV8OptimizeWorkersForPerformance{ + "V8OptimizeWorkersForPerformance", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables negotiation of experimental multiplex codec in SDP. const base::Feature kWebRtcMultiplexCodec{"WebRTC-MultiplexCodec", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 96c6068..48ba4bd 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -45,6 +45,7 @@ BLINK_COMMON_EXPORT extern const base::Feature kRTCGetDisplayMedia; BLINK_COMMON_EXPORT extern const base::Feature kRTCUnifiedPlanByDefault; BLINK_COMMON_EXPORT extern const base::Feature kRTCOfferExtmapAllowMixed; +BLINK_COMMON_EXPORT extern const base::Feature kV8OptimizeWorkersForPerformance; BLINK_COMMON_EXPORT extern const base::Feature kWebRtcMultiplexCodec; BLINK_COMMON_EXPORT extern const base::Feature kWebRtcHideLocalIpsWithMdns;
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 2511123..7b71841 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -632,8 +632,8 @@ # Set permission settings for given origin. experimental command setPermission parameters - # Origin the permission applies to. - string origin + # Origin the permission applies to, all origins if not specified. + optional string origin # Descriptor of permission to override. PermissionDescriptor permission # Setting of the permission. @@ -644,7 +644,8 @@ # Grant specific permissions to the given origin and reject all others. experimental command grantPermissions parameters - string origin + # Origin the permission applies to, all origins if not specified. + optional string origin array of PermissionType permissions # BrowserContext to override permissions. When omitted, default browser context is used. optional BrowserContextID browserContextId
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index f46f457..17d11c19 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom
@@ -3,9 +3,21 @@ // found in the LICENSE file. module blink.mojom; +import "mojo/public/mojom/base/time.mojom"; + +// We need this structure to be able to atomically update the state of the page +// to avoid it being in an inconsistent state (e.g. frozen but visible). +// TODO(yuzus): Replace +// third_party/blink/renderer/platform/scheduler/public/page_lifecycle_state.h +// with this struct. +struct PageLifecycleState { + bool is_frozen; +}; // Used for broadcast messages from browser to renderer for messages that need // to go to all blink::WebViewImpls for a given content::WebContents. There may // be multiple blink::WebViewImpls when there are out-of-process iframes. interface PageBroadcast { + // Notifies the renderer about a change in the lifecycle state of the page. + SetPageLifecycleState(PageLifecycleState state) => (); };
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h index eb89afd..2200b9e 100644 --- a/third_party/blink/public/web/web_widget.h +++ b/third_party/blink/public/web/web_widget.h
@@ -114,14 +114,6 @@ return nullptr; } - // Methods called to mark the beginning and end of input processing work - // before rAF scripts are executed. Only called when gathering main frame - // UMA and UKM. That is, when RecordStartOfFrameMetrics has been called, and - // before RecordEndOfFrameMetrics has been called. Only implement if the - // rAF input update will be called as part of a layer tree view main frame - // update. - virtual void BeginRafAlignedInput() {} - virtual void EndRafAlignedInput() {} // Methods called to mark the beginning and end of the // LayerTreeHost::UpdateLayers method. Only called when gathering main frame
diff --git a/third_party/blink/public/web/web_widget_client.h b/third_party/blink/public/web/web_widget_client.h index 645e689..3b000661 100644 --- a/third_party/blink/public/web/web_widget_client.h +++ b/third_party/blink/public/web/web_widget_client.h
@@ -243,6 +243,10 @@ float minimum, float maximum) {} + // Dispatch any pending input. This method will called before + // dispatching a RequestAnimationFrame to the widget. + virtual void DispatchRafAlignedInput(base::TimeTicks frame_time) {} + // Requests an image decode and will have the |callback| run asynchronously // when it completes. Forces a new main frame to occur that will trigger // pushing the decode through the compositor.
diff --git a/third_party/blink/renderer/bindings/core/v8/dictionary.h b/third_party/blink/renderer/bindings/core/v8/dictionary.h index 6fc37ee..fdd06431 100644 --- a/third_party/blink/renderer/bindings/core/v8/dictionary.h +++ b/third_party/blink/renderer/bindings/core/v8/dictionary.h
@@ -26,6 +26,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_DICTIONARY_H_ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_DICTIONARY_H_ +#include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -44,9 +45,14 @@ public: Dictionary() : isolate_(nullptr) {} - Dictionary(v8::Isolate*, - v8::Local<v8::Value> dictionary_object, - ExceptionState&); + explicit Dictionary(v8::Isolate*, + v8::Local<v8::Value> dictionary_object, + ExceptionState&); + explicit Dictionary(const ScriptValue& script_value) + : isolate_(script_value.GetIsolate()) { + CHECK(script_value.IsObject()); + dictionary_object_ = script_value.V8Value().As<v8::Object>(); + } Dictionary& operator=(const Dictionary&) = default;
diff --git a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h index c705881d..be11f06 100644 --- a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h +++ b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
@@ -100,12 +100,13 @@ namespace bindings { -template <typename T> +template <typename T, typename... ExtraArgs> typename IDLSequence<T>::ImplType VariadicArgumentsToNativeValues( v8::Isolate* isolate, const v8::FunctionCallbackInfo<v8::Value>& info, int start_index, - ExceptionState& exception_state) { + ExceptionState& exception_state, + ExtraArgs... extra_args) { using VectorType = typename IDLSequence<T>::ImplType; const int length = info.Length(); @@ -116,7 +117,7 @@ result.ReserveInitialCapacity(length - start_index); for (int i = start_index; i < length; ++i) { result.UncheckedAppend(NativeValueTraits<T>::ArgumentValue( - isolate, i, info[i], exception_state)); + isolate, i, info[i], exception_state, extra_args...)); if (exception_state.HadException()) return VectorType(); }
diff --git a/third_party/blink/renderer/bindings/core/v8/idl_types.h b/third_party/blink/renderer/bindings/core/v8/idl_types.h index aec6f39d..2974ff8 100644 --- a/third_party/blink/renderer/bindings/core/v8/idl_types.h +++ b/third_party/blink/renderer/bindings/core/v8/idl_types.h
@@ -189,7 +189,7 @@ template <bindings::IDLStringConvMode mode> struct IDLStringBaseV2 final : public IDLBaseHelper<String> {}; using IDLStringV2 = IDLStringBaseV2<bindings::IDLStringConvMode::kDefault>; -using IDLStringTreatNullAsV2 = +using IDLStringTreatNullAsEmptyStringV2 = IDLStringBaseV2<bindings::IDLStringConvMode::kTreatNullAsEmptyString>; // USVString @@ -198,6 +198,36 @@ using IDLUSVStringV2 = IDLUSVStringBaseV2<bindings::IDLStringConvMode::kDefault>; +// [StringContext=TrustedHTML] DOMString +template <bindings::IDLStringConvMode mode> +struct IDLStringStringContextTrustedHTMLBaseV2 final + : public IDLBaseHelper<String> {}; +using IDLStringStringContextTrustedHTMLV2 = + IDLStringStringContextTrustedHTMLBaseV2< + bindings::IDLStringConvMode::kDefault>; +using IDLStringStringContextTrustedHTMLTreatNullAsEmptyStringV2 = + IDLStringStringContextTrustedHTMLBaseV2< + bindings::IDLStringConvMode::kTreatNullAsEmptyString>; + +// [StringContext=TrustedScript] DOMString +template <bindings::IDLStringConvMode mode> +struct IDLStringStringContextTrustedScriptBaseV2 final + : public IDLBaseHelper<String> {}; +using IDLStringStringContextTrustedScriptV2 = + IDLStringStringContextTrustedScriptBaseV2< + bindings::IDLStringConvMode::kDefault>; +using IDLStringStringContextTrustedScriptTreatNullAsEmptyStringV2 = + IDLStringStringContextTrustedScriptBaseV2< + bindings::IDLStringConvMode::kTreatNullAsEmptyString>; + +// [StringContext=TrustedScriptURL] USVString +template <bindings::IDLStringConvMode mode> +struct IDLUSVStringStringContextTrustedScriptURLBaseV2 final + : public IDLBaseHelper<String> {}; +using IDLUSVStringStringContextTrustedScriptURLV2 = + IDLUSVStringStringContextTrustedScriptURLBaseV2< + bindings::IDLStringConvMode::kDefault>; + // object struct IDLObject final : public IDLBaseHelper<ScriptValue> {};
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h index 51b8fc1..db3c7bcaa 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
@@ -87,12 +87,15 @@ static constexpr bool has_null_value = bindings::NativeValueTraitsHasNullValue<ImplType>::value; + template <typename... ExtraArgs> static decltype(auto) ArgumentValue(v8::Isolate* isolate, int argument_index, v8::Local<v8::Value> value, - ExceptionState& exception_state) { + ExceptionState& exception_state, + ExtraArgs... extra_args) { return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue( - isolate, value, exception_state); + isolate, value, exception_state, + std::forward<ExtraArgs>(extra_args)...); } }; @@ -107,12 +110,15 @@ static constexpr bool has_null_value = bindings::NativeValueTraitsHasNullValue<ImplType>::value; + template <typename... ExtraArgs> static decltype(auto) ArgumentValue(v8::Isolate* isolate, int argument_index, v8::Local<v8::Value> value, - ExceptionState& exception_state) { + ExceptionState& exception_state, + ExtraArgs... extra_args) { return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue( - isolate, value, exception_state); + isolate, value, exception_state, + std::forward<ExtraArgs>(extra_args)...); } };
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h index 9f2cb82c..67abed0c 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -294,7 +294,7 @@ // const NativeValueTraitsStringAdapter& x = ...; // F(x); // ToBlinkString<AtomicString> is used. // G(x); // ToBlinkString<String> is used. -class NativeValueTraitsStringAdapter { +class CORE_EXPORT NativeValueTraitsStringAdapter { public: NativeValueTraitsStringAdapter() = default; NativeValueTraitsStringAdapter(const NativeValueTraitsStringAdapter&) = @@ -457,6 +457,116 @@ } }; +template <bindings::IDLStringConvMode mode> +struct NativeValueTraits<IDLStringStringContextTrustedHTMLBaseV2<mode>> + : public NativeValueTraitsBase< + IDLStringStringContextTrustedHTMLBaseV2<mode>> { + static String NativeValue(v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state, + ExecutionContext* execution_context) { + if (TrustedHTML* trusted_html = + V8TrustedHTML::ToImplWithTypeCheck(isolate, value)) { + return trusted_html->toString(); + } + + auto&& string = NativeValueTraits<IDLStringBaseV2<mode>>::NativeValue( + isolate, value, exception_state); + if (exception_state.HadException()) + return String(); + return TrustedTypesCheckForHTML(string, execution_context, exception_state); + } +}; + +template <> +struct CORE_EXPORT + NativeValueTraits<IDLNullable<IDLStringStringContextTrustedHTMLV2>> + : public NativeValueTraitsBase< + IDLNullable<IDLStringStringContextTrustedHTMLV2>> { + static String NativeValue(v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state, + ExecutionContext* execution_context) { + return NativeValueTraits<IDLStringStringContextTrustedHTMLBaseV2< + bindings::IDLStringConvMode::kNullable>>:: + NativeValue(isolate, value, exception_state, execution_context); + } +}; + +template <bindings::IDLStringConvMode mode> +struct NativeValueTraits<IDLStringStringContextTrustedScriptBaseV2<mode>> + : public NativeValueTraitsBase< + IDLStringStringContextTrustedScriptBaseV2<mode>> { + static String NativeValue(v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state, + ExecutionContext* execution_context) { + if (TrustedScript* trusted_script = + V8TrustedScript::ToImplWithTypeCheck(isolate, value)) { + return trusted_script->toString(); + } + + auto&& string = NativeValueTraits<IDLStringBaseV2<mode>>::NativeValue( + isolate, value, exception_state); + if (exception_state.HadException()) + return String(); + return TrustedTypesCheckForScript(string, execution_context, + exception_state); + } +}; + +template <> +struct CORE_EXPORT + NativeValueTraits<IDLNullable<IDLStringStringContextTrustedScriptV2>> + : public NativeValueTraitsBase< + IDLNullable<IDLStringStringContextTrustedScriptV2>> { + static String NativeValue(v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state, + ExecutionContext* execution_context) { + return NativeValueTraits<IDLStringStringContextTrustedScriptBaseV2< + bindings::IDLStringConvMode::kNullable>>:: + NativeValue(isolate, value, exception_state, execution_context); + } +}; + +template <bindings::IDLStringConvMode mode> +struct NativeValueTraits<IDLUSVStringStringContextTrustedScriptURLBaseV2<mode>> + : public NativeValueTraitsBase< + IDLUSVStringStringContextTrustedScriptURLBaseV2<mode>> { + static String NativeValue(v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state, + ExecutionContext* execution_context) { + if (TrustedScriptURL* trusted_script_url = + V8TrustedScriptURL::ToImplWithTypeCheck(isolate, value)) { + return trusted_script_url->toString(); + } + + auto&& string = NativeValueTraits<IDLUSVStringBaseV2<mode>>::NativeValue( + isolate, value, exception_state); + if (exception_state.HadException()) + return String(); + return TrustedTypesCheckForScriptURL(string, execution_context, + exception_state); + } +}; + +template <> +struct CORE_EXPORT + NativeValueTraits<IDLNullable<IDLUSVStringStringContextTrustedScriptURLV2>> + : public NativeValueTraitsBase< + IDLNullable<IDLUSVStringStringContextTrustedScriptURLV2>> { + static String NativeValue(v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state, + ExecutionContext* execution_context) { + return NativeValueTraits<IDLUSVStringStringContextTrustedScriptURLBaseV2< + bindings::IDLStringConvMode::kNullable>>:: + NativeValue(isolate, value, exception_state, execution_context); + } +}; + // Buffer source types template <> struct CORE_EXPORT NativeValueTraits<DOMArrayBuffer>
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index d60d18c..65633c3f 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -609,10 +609,6 @@ "//third_party/blink/renderer/modules/shapedetection/face_detector_options.idl", "//third_party/blink/renderer/modules/shapedetection/landmark.idl", "//third_party/blink/renderer/modules/shapedetection/text_detector.idl", - "//third_party/blink/renderer/modules/sms/navigator_sms.idl", - "//third_party/blink/renderer/modules/sms/sms.idl", - "//third_party/blink/renderer/modules/sms/sms_receiver.idl", - "//third_party/blink/renderer/modules/sms/sms_receiver_options.idl", "//third_party/blink/renderer/modules/speech/speech_grammar.idl", "//third_party/blink/renderer/modules/speech/speech_grammar_list.idl", "//third_party/blink/renderer/modules/speech/speech_recognition.idl",
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py index b92b1629..9c651b6 100644 --- a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py +++ b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -226,10 +226,12 @@ if (real_type.is_boolean or real_type.is_numeric or real_type.is_any or real_type.is_object): - return "IDL{}".format(real_type.type_name) + return "IDL{}".format( + idl_type.type_name_with_extended_attribute_key_values) if real_type.is_string: - return "IDL{}V2".format(real_type.type_name) + return "IDL{}V2".format( + idl_type.type_name_with_extended_attribute_key_values) if real_type.is_array_buffer: return blink_type_info(real_type).typename @@ -417,22 +419,23 @@ def create_definition(symbol_node): if argument_index is None: + func_name = "NativeValue" arguments = ["${isolate}", v8_value_expr, "${exception_state}"] - blink_value_expr = _format( - "NativeValueTraits<{_1}>::NativeValue({_2})", - _1=native_value_tag(idl_type), - _2=", ".join(arguments)) else: + func_name = "ArgumentValue" arguments = [ "${isolate}", str(argument_index), v8_value_expr, "${exception_state}", ] - blink_value_expr = _format( - "NativeValueTraits<{_1}>::ArgumentValue({_2})", - _1=native_value_tag(idl_type), - _2=", ".join(arguments)) + if "StringContext" in idl_type.effective_annotations: + arguments.append("${execution_context}") + blink_value_expr = _format( + "NativeValueTraits<{_1}>::{_2}({_3})", + _1=native_value_tag(idl_type), + _2=func_name, + _3=", ".join(arguments)) if default_value is None: return SymbolDefinitionNode(symbol_node, [ @@ -489,13 +492,17 @@ pattern = ("auto&& ${{{_1}}} = " "bindings::VariadicArgumentsToNativeValues<{_2}>({_3});") - _1 = blink_var_name - _2 = native_value_tag(idl_type.element_type) - _3 = [ + arguments = [ "${isolate}", v8_array, str(v8_array_start_index), "${exception_state}" ] - text = _format(pattern, _1=_1, _2=_2, _3=", ".join(_3)) + if "StringContext" in idl_type.element_type.effective_annotations: + arguments.append("${execution_context}") + text = _format( + pattern, + _1=blink_var_name, + _2=native_value_tag(idl_type.element_type), + _3=", ".join(arguments)) def create_definition(symbol_node): return SymbolDefinitionNode(symbol_node, [
diff --git a/third_party/blink/renderer/bindings/scripts/v8_attributes.py b/third_party/blink/renderer/bindings/scripts/v8_attributes.py index 256afc7..2619a99 100644 --- a/third_party/blink/renderer/bindings/scripts/v8_attributes.py +++ b/third_party/blink/renderer/bindings/scripts/v8_attributes.py
@@ -181,6 +181,10 @@ internal_name = cpp_encoded_property_name(attribute) + cpp_type = idl_type.cpp_type + if idl_type.is_explicit_nullable: + cpp_type = v8_types.cpp_template_type('base::Optional', cpp_type) + context = { # [ActivityLogging] 'activity_logging_world_list_for_getter': @@ -202,7 +206,7 @@ 'context_enabled_feature_name': v8_utilities.context_enabled_feature_name(attribute), 'cpp_name': cpp_name(attribute), - 'cpp_type': idl_type.cpp_type, + 'cpp_type': cpp_type, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'deprecate_as': deprecate_as, 'does_generate_getter': does_generate_getter, @@ -412,6 +416,11 @@ if (context['is_keep_alive_for_gc'] or 'CachedAttribute' in extended_attributes): return 'V8SetReturnValue(info, v8_value)' + if idl_type.is_explicit_nullable: + cpp_return_value = 'cpp_value.value()' + if idl_type.is_frozen_array: + cpp_return_value = 'FreezeV8Object(ToV8(cpp_value.value(), info.Holder(), info.GetIsolate()), info.GetIsolate())' + return 'V8SetReturnValue(info, {})'.format(cpp_return_value) return idl_type.v8_set_return_value( cpp_value, extended_attributes=extended_attributes, @@ -457,8 +466,6 @@ and not attribute.is_static): arguments.append('*impl') arguments.extend(extra_arguments) - if attribute.idl_type.is_explicit_nullable: - arguments.append('is_null') if context['is_getter_raises_exception']: arguments.append('exception_state') if attribute.idl_type.use_output_parameter_for_result: @@ -649,8 +656,6 @@ arguments.append('std::move(cpp_value)') else: arguments.append('cpp_value') - if idl_type.is_explicit_nullable: - arguments.append('is_null') if context['is_setter_raises_exception']: arguments.append('exception_state') if context['use_common_reflection_setter']:
diff --git a/third_party/blink/renderer/bindings/scripts/v8_types.py b/third_party/blink/renderer/bindings/scripts/v8_types.py index 5a3acbe..55422ee 100644 --- a/third_party/blink/renderer/bindings/scripts/v8_types.py +++ b/third_party/blink/renderer/bindings/scripts/v8_types.py
@@ -312,6 +312,8 @@ if idl_type.native_array_element_type: return '' + if idl_type.is_explicit_nullable: + return '' if idl_type.is_numeric_type: return ' = 0' if base_idl_type == 'boolean': @@ -865,11 +867,12 @@ if (idl_type.is_explicit_nullable and code_generation_target == 'attribute_set'): + this_cpp_type = cpp_template_type('base::Optional', this_cpp_type) + expr = '{cpp_type}({expr})'.format( + cpp_type=this_cpp_type, expr=assign_expression) assign_expression = ("is_null " - "? {cpp_type}() " - ": {expr}".format( - cpp_type=this_cpp_type, - expr=assign_expression)) + "? base::nullopt " + ": {expr}".format(expr=expr)) return { 'assign_expression': assign_expression,
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py index ea9a5b9..7e4d9af 100644 --- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py +++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
@@ -202,6 +202,16 @@ sorted(self.effective_annotations.keys()))) @property + def type_name_with_extended_attribute_key_values(self): + name_pieces = [] + name_pieces.append(self.type_name_without_extended_attributes) + annotations = self.effective_annotations + for key in sorted(annotations.keys()): + name_pieces.append(key) + name_pieces.extend(annotations.values_of(key)) + return ''.join(name_pieces) + + @property def type_name_without_extended_attributes(self): raise exceptions.NotImplementedError()
diff --git a/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl b/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl index 2768fc4..1db515e 100644 --- a/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl +++ b/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl
@@ -138,9 +138,6 @@ {% if attribute.is_getter_raises_exception %} {{define_exception_state}} {% endif %} - {% if attribute.is_explicit_nullable %} - bool is_null = false; - {% endif %} {% if attribute.cpp_value_original %} {{attribute.cpp_type}} {{attribute.cpp_value}}({{attribute.cpp_value_original}}); @@ -163,19 +160,23 @@ | trim | indent(2)}} {% endif %} + {% if attribute.is_explicit_nullable %} + if (!{{attribute.cpp_value}}.has_value()) { + {% if attribute.cached_attribute_validation_method %} + // [CachedAttribute] + property_symbol.Set(holder, v8::Null(info.GetIsolate())); + {% endif %} + V8SetReturnValueNull(info); + return; + } + {% endif %} + {% if attribute.cached_attribute_validation_method %} // [CachedAttribute] v8::Local<v8::Value> v8_value({{attribute.cpp_value_to_v8_value}}); property_symbol.Set(holder, v8_value); {% endif %} - {% if attribute.is_explicit_nullable %} - if (is_null) { - V8SetReturnValueNull(info); - return; - } - {% endif %} - {% if attribute.is_keep_alive_for_gc %} // Keep the wrapper object for the return value alive as long as |this| // object is alive in order to save creation time of the wrapper object.
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc index 90c0cd5..d58c677 100644 --- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc +++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc
@@ -1364,16 +1364,14 @@ TestObject* impl = V8TestObject::ToImpl(holder); - bool is_null = false; + base::Optional<bool> cpp_value(impl->booleanOrNullAttribute()); - bool cpp_value(impl->booleanOrNullAttribute(is_null)); - - if (is_null) { + if (!cpp_value.has_value()) { V8SetReturnValueNull(info); return; } - V8SetReturnValueBool(info, cpp_value); + V8SetReturnValue(info, cpp_value.value()); } static void BooleanOrNullAttributeAttributeSetter( @@ -1391,11 +1389,11 @@ bool is_null = IsUndefinedOrNull(v8_value); // Prepare the value to be set. - bool cpp_value = is_null ? bool() : NativeValueTraits<IDLBoolean>::NativeValue(info.GetIsolate(), v8_value, exception_state); + base::Optional<bool> cpp_value = is_null ? base::nullopt : base::Optional<bool>(NativeValueTraits<IDLBoolean>::NativeValue(info.GetIsolate(), v8_value, exception_state)); if (exception_state.HadException()) return; - impl->setBooleanOrNullAttribute(cpp_value, is_null); + impl->setBooleanOrNullAttribute(cpp_value); } static void StringOrNullAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info) { @@ -1429,16 +1427,14 @@ TestObject* impl = V8TestObject::ToImpl(holder); - bool is_null = false; + base::Optional<int32_t> cpp_value(impl->longOrNullAttribute()); - int32_t cpp_value(impl->longOrNullAttribute(is_null)); - - if (is_null) { + if (!cpp_value.has_value()) { V8SetReturnValueNull(info); return; } - V8SetReturnValueInt(info, cpp_value); + V8SetReturnValue(info, cpp_value.value()); } static void LongOrNullAttributeAttributeSetter( @@ -1456,11 +1452,11 @@ bool is_null = IsUndefinedOrNull(v8_value); // Prepare the value to be set. - int32_t cpp_value = is_null ? int32_t() : NativeValueTraits<IDLLong>::NativeValue(info.GetIsolate(), v8_value, exception_state); + base::Optional<int32_t> cpp_value = is_null ? base::nullopt : base::Optional<int32_t>(NativeValueTraits<IDLLong>::NativeValue(info.GetIsolate(), v8_value, exception_state)); if (exception_state.HadException()) return; - impl->setLongOrNullAttribute(cpp_value, is_null); + impl->setLongOrNullAttribute(cpp_value); } static void TestInterfaceOrNullAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 033ce50..d81629a 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1051,7 +1051,6 @@ "css/css_uri_value_test.cc", "css/css_value_test_helper.h", "css/mock_css_paint_image_generator.h", - "display_lock/display_lock_budget_test.cc", "display_lock/display_lock_context_test.cc", "display_lock/display_lock_utilities_test.cc", "dom/attr_test.cc",
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.idl b/third_party/blink/renderer/core/animation/animation_timeline.idl index 0c36488..19013b3 100644 --- a/third_party/blink/renderer/core/animation/animation_timeline.idl +++ b/third_party/blink/renderer/core/animation/animation_timeline.idl
@@ -9,6 +9,7 @@ RuntimeEnabled=WebAnimationsAPI, Exposed=Window ] interface AnimationTimeline { - readonly attribute double? currentTime; + // TODO(crbug.com/1060971): Remove ImplementedAs. + [ImplementedAs=CurrentTime] readonly attribute double? currentTime; [RuntimeEnabled=ScrollTimeline] readonly attribute TimelinePhase phase; };
diff --git a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc index c28611f..f03deda 100644 --- a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc +++ b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/css/css_identifier_value.h" #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h" #include "third_party/blink/renderer/core/css/css_variable_data.h" +#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h" #include "third_party/blink/renderer/core/css/properties/css_property_ref.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" @@ -248,6 +249,8 @@ switch (property_id) { case CSSPropertyID::kTransform: return ComputedTransform(*style); + case CSSPropertyID::kLineHeight: + return ComputedStyleUtils::ComputedValueForLineHeight(*style); default: return CSSProperty::Get(property_id) .CSSValueFromComputedStyle(*style, nullptr /* layout_object */,
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc index 2cac7dee..c2d04d1 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -162,11 +162,10 @@ return ZoomAdjustedPixelValueForLength(fill_size.size.Width(), style); } - CSSValueList* list = CSSValueList::CreateSpaceSeparated(); - list->Append(*ZoomAdjustedPixelValueForLength(fill_size.size.Width(), style)); - list->Append( - *ZoomAdjustedPixelValueForLength(fill_size.size.Height(), style)); - return list; + return MakeGarbageCollected<CSSValuePair>( + ZoomAdjustedPixelValueForLength(fill_size.size.Width(), style), + ZoomAdjustedPixelValueForLength(fill_size.size.Height(), style), + CSSValuePair::kKeepIdenticalValues); } const CSSValue* ComputedStyleUtils::BackgroundImageOrWebkitMaskSize( @@ -738,6 +737,22 @@ style); } +CSSValue* ComputedStyleUtils::ComputedValueForLineHeight( + const ComputedStyle& style) { + const Length& length = style.LineHeight(); + if (length.IsNegative()) + return CSSIdentifierValue::Create(CSSValueID::kNormal); + + if (length.IsPercent()) { + return CSSNumericLiteralValue::Create(length.GetFloatValue() / 100.0, + CSSPrimitiveValue::UnitType::kNumber); + } else { + return ZoomAdjustedPixelValue( + FloatValueForLength(length, style.GetFontDescription().ComputedSize()), + style); + } +} + CSSValueID IdentifierForFamily(const AtomicString& family) { if (family == font_family_names::kWebkitCursive) return CSSValueID::kCursive; @@ -1687,13 +1702,13 @@ return list; } -const CSSValue& ComputedStyleUtils::ValueForBorderRadiusCorner( +CSSValue* ComputedStyleUtils::ValueForBorderRadiusCorner( const LengthSize& radius, const ComputedStyle& style) { - CSSValueList& list = *ValuesForBorderRadiusCorner(radius, style); - if (list.Item(0) == list.Item(1)) - return list.Item(0); - return list; + return MakeGarbageCollected<CSSValuePair>( + ZoomAdjustedPixelValueForLength(radius.Width(), style), + ZoomAdjustedPixelValueForLength(radius.Height(), style), + CSSValuePair::kDropIdenticalValues); } CSSFunctionValue* ValueForMatrixTransform(
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h index eeeaaae6..5ae6563a 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -99,6 +99,7 @@ ValueForContentPositionAndDistributionWithOverflowAlignment( const StyleContentAlignmentData&); static CSSValue* ValueForLineHeight(const ComputedStyle&); + static CSSValue* ComputedValueForLineHeight(const ComputedStyle&); static CSSValueList* ValueForFontFamily(const ComputedStyle&); static CSSPrimitiveValue* ValueForFontSize(const ComputedStyle&); static CSSPrimitiveValue* ValueForFontStretch(const ComputedStyle&); @@ -135,8 +136,8 @@ static CSSValue* ValueForAnimationTimingFunction(const CSSTimingData*); static CSSValueList* ValuesForBorderRadiusCorner(const LengthSize&, const ComputedStyle&); - static const CSSValue& ValueForBorderRadiusCorner(const LengthSize&, - const ComputedStyle&); + static CSSValue* ValueForBorderRadiusCorner(const LengthSize&, + const ComputedStyle&); // TODO(fs): For some properties ('transform') we use the pixel snapped // border-box as the reference box. In other cases ('transform-origin') we use // the "unsnapped" border-box. Maybe use the same (the "unsnapped") in both
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc index 27203a0..7f21a7de 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -730,7 +730,7 @@ const SVGComputedStyle&, const LayoutObject*, bool allow_visited_style) const { - return &ComputedStyleUtils::ValueForBorderRadiusCorner( + return ComputedStyleUtils::ValueForBorderRadiusCorner( style.BorderBottomLeftRadius(), style); } @@ -746,7 +746,7 @@ const SVGComputedStyle&, const LayoutObject*, bool allow_visited_style) const { - return &ComputedStyleUtils::ValueForBorderRadiusCorner( + return ComputedStyleUtils::ValueForBorderRadiusCorner( style.BorderBottomRightRadius(), style); } const CSSValue* BorderBottomStyle::CSSValueFromComputedStyleInternal( @@ -1082,7 +1082,7 @@ const SVGComputedStyle&, const LayoutObject*, bool allow_visited_style) const { - return &ComputedStyleUtils::ValueForBorderRadiusCorner( + return ComputedStyleUtils::ValueForBorderRadiusCorner( style.BorderTopLeftRadius(), style); } @@ -1098,7 +1098,7 @@ const SVGComputedStyle&, const LayoutObject*, bool allow_visited_style) const { - return &ComputedStyleUtils::ValueForBorderRadiusCorner( + return ComputedStyleUtils::ValueForBorderRadiusCorner( style.BorderTopRightRadius(), style); }
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc index 2eef12a..b136374 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -574,57 +574,21 @@ } static void AdjustStateForSubtreeVisibility(ComputedStyle& style, - Element* element) { + Element* element) { if (!element) return; - - bool should_be_visible = style.SubtreeVisibility() == ESubtreeVisibility::kVisible; auto* context = element->GetDisplayLockContext(); - if (!context) { - // Return early if there is no context and we should be visible. - if (should_be_visible) - return; + // The common case for most elements is that we don't have a context and have + // the default (visible) subtree-visibility value. + if (LIKELY(!context && + style.SubtreeVisibility() == ESubtreeVisibility::kVisible)) { + return; + } + + if (!context) context = &element->EnsureDisplayLockContext(); - } - - uint16_t activation_mask = - static_cast<uint16_t>(DisplayLockActivationReason::kAny); - switch (style.SubtreeVisibility()) { - case ESubtreeVisibility::kVisible: - case ESubtreeVisibility::kAuto: - break; - case ESubtreeVisibility::kHidden: - activation_mask = 0; - break; - case ESubtreeVisibility::kHiddenMatchable: - activation_mask &= - ~static_cast<uint16_t>(DisplayLockActivationReason::kViewport); - break; - } - - // Propagate activatable style to context. - context->SetActivatable(activation_mask); - - if (!should_be_visible) { - // Add containment to style if we're invisible. - auto contain = style.Contain() | kContainsStyle | kContainsLayout; - // If we haven't activated, then we should also contain size. This means - // that if we are rendering the element's subtree (i.e. it is either - // unlocked or activated), then we do not have size containment. - if (!context->IsActivated()) - contain |= kContainsSize; - style.SetContain(contain); - - // If we're unlocked and unactivated, then we should lock the context. Note - // that we do this here, since locking the element means we can skip styling - // the subtree. - if (!context->IsLocked() && !context->IsActivated()) - context->StartAcquire(); - } else { - context->ClearActivated(); - if (context->IsLocked()) - context->StartCommit(); - } + context->SetRequestedState(style.SubtreeVisibility()); + context->AdjustElementStyle(&style); } void StyleAdjuster::AdjustComputedStyle(StyleResolverState& state,
diff --git a/third_party/blink/renderer/core/display_lock/BUILD.gn b/third_party/blink/renderer/core/display_lock/BUILD.gn index d7a7d40..b331bb2 100644 --- a/third_party/blink/renderer/core/display_lock/BUILD.gn +++ b/third_party/blink/renderer/core/display_lock/BUILD.gn
@@ -6,20 +6,12 @@ blink_core_sources("display_lock") { sources = [ - "display_lock_budget.cc", - "display_lock_budget.h", "display_lock_context.cc", "display_lock_context.h", "display_lock_utilities.cc", "display_lock_utilities.h", "render_subtree_activation_event.cc", "render_subtree_activation_event.h", - "strict_yielding_display_lock_budget.cc", - "strict_yielding_display_lock_budget.h", - "unyielding_display_lock_budget.cc", - "unyielding_display_lock_budget.h", - "yielding_display_lock_budget.cc", - "yielding_display_lock_budget.h", ] public_deps = [
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget.cc deleted file mode 100644 index 35a62be..0000000 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget.cc +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" - -#include "base/time/default_tick_clock.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_context.h" - -namespace blink { - -DisplayLockBudget::DisplayLockBudget(DisplayLockContext* context) - : clock_(base::DefaultTickClock::GetInstance()), context_(context) {} - -bool DisplayLockBudget::MarkDirtyForPhaseIfNeeded(Phase phase) { - switch (phase) { - case Phase::kStyle: - return context_->MarkForStyleRecalcIfNeeded(); - case Phase::kLayout: - return context_->MarkForLayoutIfNeeded(); - case Phase::kPrePaint: - return context_->MarkAncestorsForPrePaintIfNeeded(); - } - NOTREACHED(); - return false; -} - -bool DisplayLockBudget::IsElementDirtyForPhase(Phase phase) const { - switch (phase) { - case Phase::kStyle: - return context_->IsElementDirtyForStyleRecalc(); - case Phase::kLayout: - return context_->IsElementDirtyForLayout(); - case Phase::kPrePaint: - return context_->IsElementDirtyForPrePaint(); - } - NOTREACHED(); - return false; -} - -void DisplayLockBudget::MarkPhaseAsDirty(Phase marking_phase) { - // Mark the next phase we're scheduled to run. - for (auto phase = static_cast<unsigned>(marking_phase); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (MarkDirtyForPhaseIfNeeded(static_cast<Phase>(phase))) - break; - } -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget.h b/third_party/blink/renderer/core/display_lock/display_lock_budget.h deleted file mode 100644 index aeea5fa3..0000000 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget.h +++ /dev/null
@@ -1,73 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_BUDGET_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_BUDGET_H_ - -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/heap/member.h" - -namespace base { -class TickClock; -} - -namespace blink { - -class DisplayLockContext; -struct LifecycleData; - -class CORE_EXPORT DisplayLockBudget { - public: - enum class Phase : unsigned { - kStyle, - kLayout, - kPrePaint, - kFirst = kStyle, - kLast = kPrePaint - }; - - DisplayLockBudget(DisplayLockContext*); - virtual ~DisplayLockBudget() = default; - - // Returns true if the given phase is allowed to proceed under the current - // budget. - virtual bool ShouldPerformPhase(Phase, const LifecycleData&) = 0; - - // Called just before any calls to ShouldPerformPhase for a new lifecycle. - virtual void OnLifecycleChange(const LifecycleData&) = 0; - - // Notifies the budget that the given phase was completed. - virtual void DidPerformPhase(Phase) = 0; - - // Returns true if according to this budget, we still need a lifecycle update. - // For example, if a budget blocked a needed phase, then it this will return - // true indicating that another frame is needed. - virtual bool NeedsLifecycleUpdates() const = 0; - - // The caller is the owner of the |clock|. The |clock| must outlive the - // DisplayLockBudget. - void SetTickClockForTesting(const base::TickClock* clock) { clock_ = clock; } - - protected: - // Returns true if there is likely to be work for the given phase. - bool IsElementDirtyForPhase(Phase) const; - - void MarkPhaseAsDirty(Phase marking_phase); - - // Marks the element and ancestor chain dirty for the given phase if it's - // needed. Returns true if the ancestors were marked dirty and false - // otherwise. - bool MarkDirtyForPhaseIfNeeded(Phase); - - const base::TickClock* clock_; - - private: - // This is a backpointer to the context, which should always outlive this - // budget, so it's untraced. - UntracedMember<DisplayLockContext> context_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc deleted file mode 100644 index bc87d4ef..0000000 --- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc +++ /dev/null
@@ -1,608 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" - -#include "base/memory/ptr_util.h" -#include "base/test/test_mock_time_task_runner.h" -#include "third_party/blink/renderer/bindings/core/v8/script_function.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_context.h" -#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" -#include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h" -#include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h" -#include "third_party/blink/renderer/core/html_names.h" -#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" -#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" - -namespace blink { - -class DisplayLockBudgetTest : public RenderingTest, - private ScopedCSSSubtreeVisibilityHiddenMatchableForTest { - public: - DisplayLockBudgetTest() : ScopedCSSSubtreeVisibilityHiddenMatchableForTest(true) {} - void SetUp() override { - RenderingTest::SetUp(); - test_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); - } - - base::TimeDelta GetBudget(const YieldingDisplayLockBudget& budget, - const LifecycleData& lifecycle_data) const { - return budget.GetCurrentBudget(lifecycle_data); - } - - void ResetDeadlineForTesting(YieldingDisplayLockBudget& budget, - const LifecycleData& lifecycle_data) { - budget.deadline_ = - base::TimeTicks::Now() + budget.GetCurrentBudget(lifecycle_data); - } - - void ResetBudget(std::unique_ptr<DisplayLockBudget> budget, - DisplayLockContext* context) { - ASSERT_TRUE(context->update_budget_); - context->update_budget_ = std::move(budget); - } - - void LockElement(Element& element) { - element.setAttribute(html_names::kStyleAttr, - "subtree-visibility: hidden"); - UpdateAllLifecyclePhasesForTest(); - } - - void CommitElement(Element& element) { - element.setAttribute(html_names::kStyleAttr, ""); - UpdateAllLifecyclePhasesForTest(); - } - - protected: - scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_; - - private: - base::Optional<RuntimeEnabledFeatures::Backup> features_backup_; -}; - -TEST_F(DisplayLockBudgetTest, UnyieldingBudget) { - // Note that we're not testing the display lock here, just the budget so we - // can do minimal work to ensure we have a context, ignoring containment and - // other requirements. - SetHtmlInnerHTML(R"HTML( - <style> - div { - contain: style layout; - } - </style> - <div id="container"></div> - )HTML"); - - auto* element = GetDocument().getElementById("container"); - LockElement(*element); - - ASSERT_TRUE(element->GetDisplayLockContext()); - UnyieldingDisplayLockBudget budget(element->GetDisplayLockContext()); - - // When acquiring, we need to update the layout with the locked size, so we - // need an update. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - - LifecycleData lifecycle_data; - - // Check everything twice since it shouldn't matter how many times we ask the - // unyielding budget, the results should always be the same. - for (int i = 0; i < 2; ++i) { - // Note that although we only dirtied layout, all phases "should" complete, - // since the budget should never be responsible for blocking phases for any - // reason other than we're out of budget. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout); - budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - } -} - -TEST_F(DisplayLockBudgetTest, StrictYieldingBudget) { - // Note that we're not testing the display lock here, just the budget so we - // can do minimal work to ensure we have a context, ignoring containment and - // other requirements. - SetBodyInnerHTML(R"HTML( - <style> - div { - contain: style layout; - } - </style> - <div id="container"></div> - )HTML"); - - auto* element = GetDocument().getElementById("container"); - LockElement(*element); - - ASSERT_TRUE(element->GetDisplayLockContext()); - StrictYieldingDisplayLockBudget budget(element->GetDisplayLockContext()); - - // When acquiring, we need to update the layout with the locked size, so we - // need an update. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - - LifecycleData lifecycle_data; - - { - // Initially all of the phase checks should return true, since we don't know - // which phase the system wants to process next. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Not doing anything should ensure that we schedule another animation by - // returning true here. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - } - { - lifecycle_data.count++; - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Once we perform a phase, its check should remain true, but the rest - // will be false for this cycle. - budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - if (true) - return; - - // We would need at least one more run to finish everything. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - } - { - lifecycle_data.count++; - // Run the previous block again, now everything will always return true - // since the phase we complete here (style) has already been completed - // before, and we are open to complete a new phase. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Since we already befored style before, no new phase has been processed - // and all phases are allowed to finish. - budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // We would need at least one more run to finish everything. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - } - { - lifecycle_data.count++; - // On the next run, the checks for phases completed before should always - // return true, and as before since we haven't completed a new phase, the - // remainder of the phases should return true for now. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // This check is the same as in the previous block, but is here to verify - // that going through NeedsLifecycleUpdates() and then - // WillStartLifecycleUpdate() again doesn't change the fact that we should - // still perform all of the phases at this point. - budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Let's say layout was clean and we jumped and did prepaint instead, now - // every phase before and including prepaint should be true, the rest are - // locked from completing. - budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Note that since we processed everything, we no longer need lifecycle - // updates. - EXPECT_FALSE(budget.NeedsLifecycleUpdates()); - } - { - // Do one more run to ensure everything is still returning true. - lifecycle_data.count++; - // On the last run, we'll complete all phases. Since there is only one - // remaining phase we haven't done, all of the checks should always return - // true (it's either an old phase or a first uncompleted phase). - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Since we completed everything, we should now be returning false here (no - // more updates needed). - EXPECT_FALSE(budget.NeedsLifecycleUpdates()); - } -} - -TEST_F(DisplayLockBudgetTest, - StrictYieldingBudgetOnlyNeedsUpdatesForDirtyPhases) { - // Note that we're not testing the display lock here, just the budget so we - // can do minimal work to ensure we have a context, ignoring containment and - // other requirements. - SetHtmlInnerHTML(R"HTML( - <style> - div { - contain: style layout; - } - </style> - <div id="container"></div> - )HTML"); - - auto* element = GetDocument().getElementById("container"); - LockElement(*element); - - ASSERT_TRUE(element->GetDisplayLockContext()); - StrictYieldingDisplayLockBudget budget(element->GetDisplayLockContext()); - - // When acquiring, we need to update the layout with the locked size, so we - // need an update. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - - LifecycleData lifecycle_data; - budget.OnLifecycleChange(lifecycle_data); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout); - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - - lifecycle_data.count++; - budget.OnLifecycleChange(lifecycle_data); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - - // Note that since the layout was indicated as done (from the budget - // perspective), it will no longer need updates even though the true layout is - // dirty. This is because it will no longer block layout from synchronously - // completing whenever necessary. - EXPECT_FALSE(budget.NeedsLifecycleUpdates()); -} - -TEST_F(DisplayLockBudgetTest, YieldingBudget) { - // Note that we're not testing the display lock here, just the budget so we - // can do minimal work to ensure we have a context, ignoring containment and - // other requirements. - SetBodyInnerHTML(R"HTML( - <style> - div { - contain: style layout; - } - </style> - <div id="container"></div> - )HTML"); - - auto* element = GetDocument().getElementById("container"); - LockElement(*element); - - ASSERT_TRUE(element->GetDisplayLockContext()); - YieldingDisplayLockBudget budget(element->GetDisplayLockContext()); - budget.SetTickClockForTesting(test_task_runner_->GetMockTickClock()); - - // When acquiring, we need to update the layout with the locked size, so we - // need an update. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - LifecycleData lifecycle_data; - budget.OnLifecycleChange(lifecycle_data); - - // Initially all of the phase checks should return true, since we don't know - // which phase the system wants to process next. - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Not doing anything should ensure that we schedule another animation by - // returning true here. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - - // Advancing the clock a bit will make us still want to the phases. - test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data) / 2); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // However, once we're out of budget, we will only do the next phase. - test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data)); - - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Starting a new lifecycle will reset the budget. - lifecycle_data.count++; - lifecycle_data.start_time = test_task_runner_->NowTicks(); - budget.OnLifecycleChange(lifecycle_data); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Performing a phase still keeps the rest of the phases available for work - // since we haven't advanced the clock. - budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Now that we're out of budget, phases performed previously should remain - // true. - test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data) * 2); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Sanity check here: the element still needs layout. - EXPECT_TRUE(budget.NeedsLifecycleUpdates()); - - // Resetting the budget, and advancing again should yield the same results as - // before, except that we will process at least one more phase. - lifecycle_data.count++; - lifecycle_data.start_time = test_task_runner_->NowTicks(); - budget.OnLifecycleChange(lifecycle_data); - - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data) * 2); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Eventually the budget becomes essentially infinite. - lifecycle_data.count += 60; - budget.OnLifecycleChange(lifecycle_data); - - EXPECT_GT(GetBudget(budget, lifecycle_data), - base::TimeDelta::FromMilliseconds(1e6)); - for (int i = 0; i < 60; ++i) { - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - test_task_runner_->FastForwardBy(base::TimeDelta::FromMillisecondsD(10000)); - } -} - -TEST_F(DisplayLockBudgetTest, YieldingBudgetMarksNextPhase) { - // Note that we're not testing the display lock here, just the budget so we - // can do minimal work to ensure we have a context, ignoring containment and - // other requirements. - SetHtmlInnerHTML(R"HTML( - <style> - #container { - contain: style layout; - } - </style> - <div id="parent"><div id="container"><div id="child"></div></div></div> - )HTML"); - - auto* element = GetDocument().getElementById("container"); - LockElement(*element); - - ASSERT_TRUE(element->GetDisplayLockContext()); - ASSERT_TRUE(element->GetDisplayLockContext()->IsLocked()); - - auto budget_owned = base::WrapUnique( - new YieldingDisplayLockBudget(element->GetDisplayLockContext())); - auto* budget = budget_owned.get(); - budget->SetTickClockForTesting(test_task_runner_->GetMockTickClock()); - { - auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame()); - ScriptState::Scope scope(script_state); - element->GetDisplayLockContext()->UpdateRendering(script_state); - ResetBudget(std::move(budget_owned), element->GetDisplayLockContext()); - } - - // When acquiring, we need to update the layout with the locked size, so we - // need an update. - EXPECT_TRUE(budget->NeedsLifecycleUpdates()); - - // Dirtying the element will cause us to do updates. - GetDocument().getElementById("child")->setInnerHTML("a"); - - auto* parent = GetDocument().getElementById("parent"); - EXPECT_TRUE(budget->NeedsLifecycleUpdates()); - - LifecycleData lifecycle_data; - budget->OnLifecycleChange(lifecycle_data); - - GetDocument().View()->SetInLifecycleUpdateForTest(true); - GetDocument().View()->SetLifecycleDataForTesting(lifecycle_data); - - // Initially all of the phase checks should return true, since we don't know - // which phase the system wants to process next. - EXPECT_TRUE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - GetDocument().View()->CurrentLifecycleData())); - EXPECT_TRUE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - GetDocument().View()->CurrentLifecycleData())); - EXPECT_TRUE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - GetDocument().View()->CurrentLifecycleData())); - - EXPECT_TRUE(parent->NeedsStyleRecalc() || parent->ChildNeedsStyleRecalc()); - EXPECT_TRUE(element->NeedsStyleRecalc() || element->ChildNeedsStyleRecalc()); - - test_task_runner_->FastForwardBy( - GetBudget(*budget, GetDocument().View()->CurrentLifecycleData()) * 2); - EXPECT_TRUE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - GetDocument().View()->CurrentLifecycleData())); - EXPECT_FALSE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - GetDocument().View()->CurrentLifecycleData())); - - GetDocument().UpdateStyleAndLayoutTree(); - EXPECT_FALSE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - GetDocument().View()->CurrentLifecycleData())); - - EXPECT_FALSE(parent->NeedsStyleRecalc() || parent->ChildNeedsStyleRecalc()); - EXPECT_FALSE(element->NeedsStyleRecalc() || element->ChildNeedsStyleRecalc()); - - EXPECT_TRUE(parent->GetLayoutObject()->NeedsLayout()); - EXPECT_TRUE(element->GetLayoutObject()->NeedsLayout()); - - ResetDeadlineForTesting(*budget, - GetDocument().View()->CurrentLifecycleData()); - EXPECT_TRUE( - budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - GetDocument().View()->CurrentLifecycleData())); - - GetDocument().View()->SetInLifecycleUpdateForTest(false); -} - -TEST_F(DisplayLockBudgetTest, UpdateHappensInLifecycleOnly) { - // Note that we're not testing the display lock here, just the budget so we - // can do minimal work to ensure we have a context, ignoring containment and - // other requirements. - SetHtmlInnerHTML(R"HTML( - <style> - #container { - contain: style layout; - } - </style> - <div id="parent"><div id="container"><div id="child"></div></div></div> - )HTML"); - - auto* element = GetDocument().getElementById("container"); - LockElement(*element); - - ASSERT_TRUE(element->GetDisplayLockContext()); - ASSERT_TRUE(element->GetDisplayLockContext()->IsLocked()); - - auto budget_owned = base::WrapUnique( - new UnyieldingDisplayLockBudget(element->GetDisplayLockContext())); - auto* budget = budget_owned.get(); - { - auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame()); - ScriptState::Scope scope(script_state); - element->GetDisplayLockContext()->UpdateRendering(script_state); - ResetBudget(std::move(budget_owned), element->GetDisplayLockContext()); - } - - // When acquiring, we need to update the layout with the locked size, so we - // need an update. - EXPECT_TRUE(budget->NeedsLifecycleUpdates()); - - LifecycleData lifecycle_data; - budget->OnLifecycleChange(lifecycle_data); - - auto* context = element->GetDisplayLockContext(); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle, - lifecycle_data)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout, - lifecycle_data)); - EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint, - lifecycle_data)); - - // Since we're not in a lifecycle, the budget itself should not want to do any - // phases, even though the budget allows it. - EXPECT_FALSE(context->ShouldStyle(DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(context->ShouldLayout(DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(context->ShouldPrePaint(DisplayLockLifecycleTarget::kChildren)); - - GetDocument().GetFrame()->View()->SetInLifecycleUpdateForTest(true); - - EXPECT_TRUE(context->ShouldStyle(DisplayLockLifecycleTarget::kChildren)); - EXPECT_TRUE(context->ShouldLayout(DisplayLockLifecycleTarget::kChildren)); - EXPECT_TRUE(context->ShouldPrePaint(DisplayLockLifecycleTarget::kChildren)); - - GetDocument().GetFrame()->View()->SetInLifecycleUpdateForTest(false); - - EXPECT_FALSE(context->ShouldStyle(DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(context->ShouldLayout(DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(context->ShouldPrePaint(DisplayLockLifecycleTarget::kChildren)); - - // Ensure to flush any tasks scheduled by context calls. - test::RunPendingTasks(); -} -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 990f321..a0a27a2b 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -13,9 +13,6 @@ #include "third_party/blink/renderer/core/css/style_recalc.h" #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" #include "third_party/blink/renderer/core/display_lock/render_subtree_activation_event.h" -#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" -#include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h" -#include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/dom/element.h" @@ -35,13 +32,10 @@ namespace { namespace rejection_names { -const char* kExecutionContextDestroyed = "Execution context destroyed."; const char* kContainmentNotSatisfied = "Containment requirement is not satisfied."; const char* kUnsupportedDisplay = "Element has unsupported display type (display: contents)."; -const char* kElementIsDisconnected = "Element is disconnected."; -const char* kElementIsNested = "Element is nested under a locked element."; } // namespace rejection_names void RecordActivationReason(DisplayLockActivationReason reason) { @@ -87,62 +81,51 @@ UMA_HISTOGRAM_ENUMERATION("Blink.Render.DisplayLockActivationReason", ordered_reason, number_of_reasons); } - -// Helper function that returns an immediately rejected promise. -ScriptPromise GetRejectedPromise(ScriptState* script_state, - const char* rejection_reason) { - auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - auto promise = resolver->Promise(); - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNotAllowedError, rejection_reason)); - return promise; -} - -// Helper function that returns an immediately resolved promise. -ScriptPromise GetResolvedPromise(ScriptState* script_state) { - auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - auto promise = resolver->Promise(); - resolver->Resolve(); - return promise; -} - } // namespace -DisplayLockContext::DisplayLockContext(Element* element, - ExecutionContext* context) - : ExecutionContextLifecycleObserver(context), - element_(element), - document_(&element_->GetDocument()), - state_(this) { +DisplayLockContext::DisplayLockContext(Element* element) + : element_(element), document_(&element_->GetDocument()) { document_->AddDisplayLockContext(this); } -DisplayLockContext::~DisplayLockContext() { - DCHECK_EQ(state_, kUnlocked); +void DisplayLockContext::SetRequestedState(ESubtreeVisibility state) { + if (state_ == state) + return; + state_ = state; + switch (state_) { + case ESubtreeVisibility::kVisible: + RequestUnlock(); + break; + case ESubtreeVisibility::kAuto: + RequestLock(static_cast<uint16_t>(DisplayLockActivationReason::kAny)); + break; + case ESubtreeVisibility::kHidden: + RequestLock(0u); + break; + case ESubtreeVisibility::kHiddenMatchable: + RequestLock( + static_cast<uint16_t>(DisplayLockActivationReason::kAny) & + ~static_cast<uint16_t>(DisplayLockActivationReason::kViewport)); + break; + } +} + +void DisplayLockContext::AdjustElementStyle(ComputedStyle* style) const { + if (state_ == ESubtreeVisibility::kVisible) + return; + // If not visible, element gains style and layout containment. If skipped, it + // also gains size containment. + // https://wicg.github.io/display-locking/#subtree-visibility + auto contain = style->Contain() | kContainsStyle | kContainsLayout; + if (IsLocked()) + contain |= kContainsSize; + style->SetContain(contain); } void DisplayLockContext::Trace(Visitor* visitor) { - visitor->Trace(update_resolver_); visitor->Trace(element_); visitor->Trace(document_); visitor->Trace(whitespace_reattach_set_); - ExecutionContextLifecycleObserver::Trace(visitor); -} - -void DisplayLockContext::Dispose() { - // Note that if we have any resolvers at dispose time, then it's too late to - // reject the promise, since we are not allowed to create new strong - // references to objects already set for destruction (and rejecting would do - // this since the rejection has to be deferred). We need to detach instead. - // TODO(vmpstr): See if there is another earlier time we can detect that we're - // going to be disposed. - FinishUpdateResolver(kDetach); - state_ = kUnlocked; -} - -void DisplayLockContext::ContextDestroyed() { - FinishUpdateResolver(kReject, rejection_names::kExecutionContextDestroyed); - state_ = kUnlocked; } void DisplayLockContext::UpdateActivationObservationIfNeeded() { @@ -160,7 +143,7 @@ // 2. We're activated (in the CSS version), which means that we need to know // when we stop intersecting the viewport so that we can re-lock. bool should_observe = - (IsLocked() || IsActivated()) && + lock_requested_ && IsActivatable(DisplayLockActivationReason::kViewportIntersection) && ConnectedToView(); if (should_observe && !is_observed_) { @@ -176,7 +159,7 @@ } bool DisplayLockContext::NeedsLifecycleNotifications() const { - return HasResolver() || needs_intersection_lock_check_; + return needs_intersection_lock_check_; } void DisplayLockContext::UpdateLifecycleNotificationRegistration() { @@ -197,36 +180,52 @@ } } -void DisplayLockContext::SetActivatable(uint16_t activatable_mask) { - if (IsLocked()) { - // If we're locked, the activatable mask might change the activation - // blocking lock count. If we're not locked, the activation blocking lock - // count will be updated when we changed the state. - // Note that we record this only if we're blocking all activation. That is, - // the lock is considered activatable if any bit is set. - state_.UpdateActivationBlockingCount(activatable_mask_, activatable_mask); +void DisplayLockContext::UpdateActivationBlockingCount(bool was_activatable, + bool is_activatable) { + DCHECK(document_); + if (was_activatable != is_activatable) { + if (was_activatable) + document_->IncrementDisplayLockBlockingAllActivation(); + else + document_->DecrementDisplayLockBlockingAllActivation(); } +} + +void DisplayLockContext::SetActivatable(uint16_t activatable_mask) { + if (activatable_mask == activatable_mask_) + return; + // If we're locked, the activatable mask might change the activation + // blocking lock count. If we're not locked, the activation blocking lock + // count will be updated when we lock. + // Note that we record this only if we're blocking all activation. That is, + // the lock is considered activatable if any bit is set. + if (IsLocked()) + UpdateActivationBlockingCount(activatable_mask_, activatable_mask); + activatable_mask_ = activatable_mask; UpdateActivationObservationIfNeeded(); - // If we're no longer activatable, make sure we clear any existing activation. - // TODO(vmpstr): Figure out if we should clear activation on any activation - // changes not just "something" -> "nothing". - if (!IsActivatable(DisplayLockActivationReason::kAny)) - ClearActivated(); + ClearActivated(); } void DisplayLockContext::StartAcquire() { + DCHECK(lock_requested_); DCHECK(!IsLocked()); - update_budget_.reset(); - state_ = kLocked; + + is_locked_ = true; + document_->AddLockedDisplayLock(); + if (!activatable_mask_) + document_->IncrementDisplayLockBlockingAllActivation(); + UpdateActivationObservationIfNeeded(); needs_intersection_lock_check_ = false; UpdateLifecycleNotificationRegistration(); - // We're no longer activated, so if the signal didn't run yet, we should - // cancel it. - weak_factory_.InvalidateWeakPtrs(); + if (RuntimeEnabledFeatures::CSSSubtreeVisibilityActivationEventEnabled()) { + // We're no longer activated, so if the signal didn't run yet, we should + // cancel it. + weak_factory_.InvalidateWeakPtrs(); + } // If we're already connected then we need to ensure that we update our style // to check for containment later, layout size based on the options, and @@ -251,8 +250,8 @@ // lifecycle update, this will be a no-op. ScheduleAnimation(); - // We need to notify the AX cache (if it exists) to update the childrens - // of |element_| in the AX cache. + // We need to notify the AX cache (if it exists) to update |element_|'s + // children in the AX cache. if (AXObjectCache* cache = element_->GetDocument().ExistingAXObjectCache()) cache->ChildrenChanged(element_); @@ -266,6 +265,7 @@ layout_invalidation_reason::kDisplayLock); is_horizontal_writing_mode_ = layout_object->IsHorizontalWritingMode(); + // GraphicsLayer collection would normally skip layers if paint is blocked // by display-locking (see: CollectDrawableLayersForLayerListRecursively // in LocalFrameView). However, if we don't trigger this collection, then @@ -277,116 +277,14 @@ MarkPaintLayerNeedsRepaint(); } -ScriptPromise DisplayLockContext::UpdateRendering(ScriptState* script_state) { - // Immediately resolve if we're unlocked or disconnected. - if (state_ == kUnlocked || !ConnectedToView()) - return GetResolvedPromise(script_state); - - // If we have a resolver, then we're at least updating already, just return - // the same promise. - if (update_resolver_) { - DCHECK(state_ == kUpdating || state_ == kCommitting) << state_; - return update_resolver_->Promise(); - } - - if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*element_)) { - return GetRejectedPromise(script_state, rejection_names::kElementIsNested); - } - - MakeResolver(script_state, &update_resolver_); - StartUpdateIfNeeded(); - return update_resolver_->Promise(); -} - -bool DisplayLockContext::CleanupAndRejectCommitIfNotConnected() { - // If we're not connected, then the process of committing is the same as just - // unlocking the element. Early out if this conditions *doesn't* hold. - if (ConnectedToView()) - return false; - - state_ = kUnlocked; - update_budget_.reset(); - // Note that we reject the update, but resolve the commit. - FinishUpdateResolver(kReject, rejection_names::kElementIsDisconnected); - return true; -} - -void DisplayLockContext::MakeResolver(ScriptState* script_state, - Member<ScriptPromiseResolver>* resolver) { - DCHECK(ConnectedToView()); - *resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - UpdateLifecycleNotificationRegistration(); -} - -bool DisplayLockContext::HasResolver() const { - return update_resolver_; -} - -void DisplayLockContext::FinishUpdateResolver(ResolverState state, - const char* rejection_reason) { - FinishResolver(&update_resolver_, state, rejection_reason); -} - -void DisplayLockContext::FinishResolver(Member<ScriptPromiseResolver>* resolver, - ResolverState state, - const char* rejection_reason) { - if (!*resolver) - return; - switch (state) { - case kResolve: - // In order to avoid script doing work as a part of the lifecycle update, - // we delay the resolution to be in a task. - GetExecutionContext() - ->GetTaskRunner(TaskType::kMiscPlatformAPI) - ->PostTask(FROM_HERE, WTF::Bind( - +[](ScriptPromiseResolver* resolver) { - resolver->Resolve(); - }, - WrapPersistent(resolver->Get()))); - break; - case kReject: - DCHECK(rejection_reason); - (*resolver)->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNotAllowedError, rejection_reason)); - break; - case kDetach: - (*resolver)->Detach(); - break; - } - *resolver = nullptr; - UpdateLifecycleNotificationRegistration(); -} - -bool DisplayLockContext::ShouldPerformUpdatePhase( - DisplayLockBudget::Phase phase) const { - DCHECK(document_); - if (state_ != kUpdating) - return false; - auto* view = document_->View(); - return view && view->InLifecycleUpdate() && - update_budget_->ShouldPerformPhase(phase, - view->CurrentLifecycleData()); -} - bool DisplayLockContext::ShouldStyle(DisplayLockLifecycleTarget target) const { - return target == DisplayLockLifecycleTarget::kSelf || update_forced_ || - state_ > kUpdating || + return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf || + update_forced_ || (document_->ActivatableDisplayLocksForced() && - IsActivatable(DisplayLockActivationReason::kAny)) || - ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kStyle); + IsActivatable(DisplayLockActivationReason::kAny)); } void DisplayLockContext::DidStyle(DisplayLockLifecycleTarget target) { - if (state_ == kUnlocked) { - // If we're committing without finishing the acquire() first, it's possible - // for the state to be kUnlocked instead of kCommitting. We should still - // mark child reattachment & whitespace reattachment in that case. - MarkElementsForWhitespaceReattachment(); - if (element_->ChildNeedsReattachLayoutTree()) - element_->MarkAncestorsWithChildNeedsReattachLayoutTree(); - return; - } - if (target == DisplayLockLifecycleTarget::kSelf) { if (ForceUnlockIfNeeded()) return; @@ -399,29 +297,17 @@ return; } - bool update_forced = - update_forced_ || (document_->ActivatableDisplayLocksForced() && - IsActivatable(DisplayLockActivationReason::kAny)); - if (state_ != kCommitting && state_ != kUpdating && !update_forced) - return; - if (element_->ChildNeedsReattachLayoutTree()) element_->MarkAncestorsWithChildNeedsReattachLayoutTree(); - blocked_style_traversal_type_ = kStyleUpdateNotRequired; - MarkElementsForWhitespaceReattachment(); - - if (state_ == kUpdating) - update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kStyle); } bool DisplayLockContext::ShouldLayout(DisplayLockLifecycleTarget target) const { - return target == DisplayLockLifecycleTarget::kSelf || update_forced_ || - state_ > kUpdating || + return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf || + update_forced_ || (document_->ActivatableDisplayLocksForced() && - IsActivatable(DisplayLockActivationReason::kAny)) || - ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kLayout); + IsActivatable(DisplayLockActivationReason::kAny)); } void DisplayLockContext::DidLayout(DisplayLockLifecycleTarget target) { @@ -430,31 +316,16 @@ // Since we did layout on children already, we'll clear this. child_layout_was_blocked_ = false; - if (state_ == kUpdating) - update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kLayout); } bool DisplayLockContext::ShouldPrePaint( DisplayLockLifecycleTarget target) const { - return target == DisplayLockLifecycleTarget::kSelf || update_forced_ || - state_ > kUpdating || - ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kPrePaint); + return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf || + update_forced_; } void DisplayLockContext::DidPrePaint(DisplayLockLifecycleTarget target) { - if (target == DisplayLockLifecycleTarget::kSelf) - return; - - if (state_ == kUpdating) - update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kPrePaint); - -#if DCHECK_IS_ON() - if (state_ == kUpdating || state_ == kCommitting) { - // Since we should be under containment, we should have a layer. If we - // don't, then paint might not happen and we'll never resolve. - DCHECK(element_->GetLayoutObject()->HasLayer()); - } -#endif + // This is here for symmetry, but could be removed if necessary. } bool DisplayLockContext::ShouldPaint(DisplayLockLifecycleTarget target) const { @@ -462,8 +333,7 @@ // check |update_forced_| here. In other words, although |update_forced_| // could be true here, we still should not paint. This also holds for // kUpdating state, since updates should not paint. - return target == DisplayLockLifecycleTarget::kSelf || state_ == kCommitting || - state_ == kUnlocked; + return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf; } void DisplayLockContext::DidPaint(DisplayLockLifecycleTarget) { @@ -502,7 +372,7 @@ if (reason_for_metrics == DisplayLockActivationReason::kFindInPage) document_->MarkHasFindInPageSubtreeVisibilityActiveMatch(); - css_is_activated_ = true; + is_activated_ = true; // Since size containment depends on the activatability state, we should // invalidate the style for this element, so that the style adjuster can // properly remove the containment. @@ -512,11 +382,11 @@ } bool DisplayLockContext::IsActivated() const { - return css_is_activated_; + return is_activated_; } void DisplayLockContext::ClearActivated() { - css_is_activated_ = false; + is_activated_ = false; // If we are no longer activated, then we're either committing or acquiring a // lock. In either case, we don't need to rely on lifecycle observations to // become hidden. @@ -570,22 +440,42 @@ } } +bool DisplayLockContext::RequestLock(uint16_t activation_mask) { + SetActivatable(activation_mask); + + if (IsLocked()) { + DCHECK(lock_requested_); + return true; + } + lock_requested_ = true; + + if (IsActivated()) + return false; + + StartAcquire(); + return true; +} + +void DisplayLockContext::RequestUnlock() { + lock_requested_ = false; + ClearActivated(); + if (IsLocked()) + StartCommit(); +} + bool DisplayLockContext::ShouldCommitForActivation( DisplayLockActivationReason reason) const { return IsActivatable(reason) && IsLocked(); } void DisplayLockContext::DidAttachLayoutTree() { - if (state_ >= kUnlocked) - return; - if (auto* layout_object = element_->GetLayoutObject()) is_horizontal_writing_mode_ = layout_object->IsHorizontalWritingMode(); } DisplayLockContext::ScopedForcedUpdate DisplayLockContext::GetScopedForcedUpdate() { - if (state_ >= kCommitting) + if (!is_locked_) return ScopedForcedUpdate(nullptr); DCHECK(!update_forced_); @@ -614,25 +504,23 @@ void DisplayLockContext::StartCommit() { DCHECK(IsLocked()); - if (CleanupAndRejectCommitIfNotConnected()) + if (!ConnectedToView()) { + is_locked_ = false; + UpdateActivationObservationIfNeeded(); return; + } - if (state_ != kUpdating) - ScheduleAnimation(); - - // We might already be unlocked due to above, but we should still mark - // ancestor chains for updates below. - if (state_ < kCommitting) - state_ = kCommitting; - - update_budget_.reset(); + ScheduleAnimation(); + is_locked_ = false; + document_->RemoveLockedDisplayLock(); + if (!activatable_mask_) + document_->DecrementDisplayLockBlockingAllActivation(); + UpdateActivationObservationIfNeeded(); // We skip updating the style dirtiness if we're within style recalc. This is // instead handled by a call to AdjustStyleRecalcChangeForChildren(). - if (!document_->InStyleRecalc()) { - // We're committing without a budget, so ensure we can reach style. + if (!document_->InStyleRecalc()) MarkForStyleRecalcIfNeeded(); - } // We also need to notify the AX cache (if it exists) to update the childrens // of |element_| in the AX cache. @@ -654,35 +542,6 @@ layout_invalidation_reason::kDisplayLock); } -void DisplayLockContext::StartUpdateIfNeeded() { - // We should not be calling this if we're unlocked. - DCHECK_NE(state_, kUnlocked); - // Any state other than kLocked means that we are already in the process of - // updating/committing, so we can piggy back on that process without kicking - // off any new updates. - if (state_ != kLocked) - return; - - // We don't need to mark anything dirty since the budget will take care of - // that for us. - update_budget_ = CreateNewBudget(); - state_ = kUpdating; - ScheduleAnimation(); -} - -std::unique_ptr<DisplayLockBudget> DisplayLockContext::CreateNewBudget() { - switch (BudgetType::kDefault) { - case BudgetType::kDoNotYield: - return base::WrapUnique(new UnyieldingDisplayLockBudget(this)); - case BudgetType::kStrictYieldBetweenLifecyclePhases: - return base::WrapUnique(new StrictYieldingDisplayLockBudget(this)); - case BudgetType::kYieldBetweenLifecyclePhases: - return base::WrapUnique(new YieldingDisplayLockBudget(this)); - } - NOTREACHED(); - return nullptr; -} - void DisplayLockContext::AddToWhitespaceReattachSet(Element& element) { whitespace_reattach_set_.insert(&element); } @@ -898,8 +757,11 @@ if (is_registered_for_lifecycle_notifications_) { if (old_document.View()) old_document.View()->UnregisterFromLifecycleNotifications(this); + if (document_->View()) document_->View()->RegisterForLifecycleNotifications(this); + else + is_registered_for_lifecycle_notifications_ = false; } if (IsLocked()) { @@ -914,11 +776,6 @@ void DisplayLockContext::WillStartLifecycleUpdate(const LocalFrameView& view) { DCHECK(NeedsLifecycleNotifications()); - // If we have an update budget, then forward the call to it, so that it can - // prepare for the lifecycle by propagating the next phase's dirty bits. - if (update_budget_) - update_budget_->OnLifecycleChange(view.CurrentLifecycleData()); - // We might have delayed processing intersection observation update (signal // that we were not intersecting) because this context was nested in another // locked context. At the start of the lifecycle, we should check whether @@ -934,43 +791,6 @@ } void DisplayLockContext::DidFinishLifecycleUpdate(const LocalFrameView& view) { - DCHECK(NeedsLifecycleNotifications()); - if (state_ == kCommitting) { - FinishUpdateResolver(kResolve); - state_ = kUnlocked; - return; - } - - if (state_ != kUpdating) - return; - - // If we became disconnected for any reason, then we should reject the - // update promise and go back to the locked state. - if (!ConnectedToView()) { - FinishUpdateResolver(kReject, rejection_names::kElementIsDisconnected); - update_budget_.reset(); - - if (state_ == kCommitting) { - state_ = kUnlocked; - } else { - state_ = kLocked; - } - return; - } - - if (update_budget_->NeedsLifecycleUpdates()) { - // Note that we post a task to schedule an animation, since rAF requests can - // be ignored if they happen from within a lifecycle update. - GetExecutionContext() - ->GetTaskRunner(TaskType::kMiscPlatformAPI) - ->PostTask(FROM_HERE, WTF::Bind(&DisplayLockContext::ScheduleAnimation, - WrapWeakPersistent(this))); - return; - } - - FinishUpdateResolver(kResolve); - update_budget_.reset(); - state_ = kLocked; } void DisplayLockContext::NotifyWillDisconnect() { @@ -995,16 +815,8 @@ void DisplayLockContext::ScheduleAnimation() { DCHECK(element_); - // We could have posted a task to run ScheduleAnimation if we're updating. - // However, before that task runs, we could have disconnected the element - // already. If that's the case and we don't need to finalize update, then we - // can skip scheduling animation. If we do need to finalize update (ie reset - // update_budget_), then we should still schedule an animation just in case - // one was not scheduled. - if ((!ConnectedToView() && !update_budget_) || !document_ || - !document_->GetPage()) { + if (!ConnectedToView() || !document_ || !document_->GetPage()) return; - } // Schedule an animation to perform the lifecycle phases. document_->GetPage()->Animator().ScheduleVisualUpdate(document_->GetFrame()); @@ -1073,8 +885,7 @@ // commit() isn't in progress, the web author won't know that the element // got unlocked. Figure out how to notify the author. if (auto* reason = ShouldForceUnlock()) { - FinishUpdateResolver(kReject, reason); - state_ = kUnlocked; + is_locked_ = false; return true; } return false; @@ -1086,7 +897,6 @@ // Scoped objects implementation // ----------------------------------------------- - DisplayLockContext::ScopedForcedUpdate::ScopedForcedUpdate( DisplayLockContext* context) : context_(context) {} @@ -1102,57 +912,4 @@ context_->NotifyForcedUpdateScopeEnded(); } -// StateChangeHelper implementation -// ----------------------------------------------- -DisplayLockContext::StateChangeHelper::StateChangeHelper( - DisplayLockContext* context) - : context_(context) {} - -DisplayLockContext::StateChangeHelper& DisplayLockContext::StateChangeHelper:: -operator=(State new_state) { - if (new_state == state_) - return *this; - - bool was_activatable = - context_->IsActivatable(DisplayLockActivationReason::kAny); - bool was_locked = context_->IsLocked(); - - state_ = new_state; - - if (!context_->document_) - return *this; - - bool is_activatable = - context_->IsActivatable(DisplayLockActivationReason::kAny); - bool is_locked = context_->IsLocked(); - - UpdateActivationBlockingCount(!was_locked || was_activatable, - !is_locked || is_activatable); - - // Adjust the total number of locked display locks. - auto& document = *context_->document_; - if (is_locked != was_locked) { - if (was_locked) - document.RemoveLockedDisplayLock(); - else - document.AddLockedDisplayLock(); - } - - context_->UpdateActivationObservationIfNeeded(); - return *this; -} - -void DisplayLockContext::StateChangeHelper::UpdateActivationBlockingCount( - bool old_activatable, - bool new_activatable) { - auto& document = *context_->document_; - // Adjust activation blocking lock counts. - if (old_activatable != new_activatable) { - if (old_activatable) - document.IncrementDisplayLockBlockingAllActivation(); - else - document.DecrementDisplayLockBlockingAllActivation(); - } -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index 83c80cd..4ff7b1e3 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -5,12 +5,8 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_CONTEXT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_CONTEXT_H_ -#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -66,40 +62,10 @@ class CORE_EXPORT DisplayLockContext final : public GarbageCollected<DisplayLockContext>, - public ExecutionContextLifecycleObserver, public LocalFrameView::LifecycleNotificationObserver { USING_GARBAGE_COLLECTED_MIXIN(DisplayLockContext); - USING_PRE_FINALIZER(DisplayLockContext, Dispose); public: - // Determines what type of budget to use. This can be overridden via - // DisplayLockContext::SetBudgetType(). - // - kDoNotYield: - // This will effectively do all of the lifecycle phases when we're - // committing. That is, this is the "no budget" option. - // - kStrictYieldBetweenLifecyclePhases: - // This type always yields between each lifecycle phase, even if that - // phase was quick (note that it still skips phases that don't need any - // updates). - // - kYieldBetweenLifecyclePhases: - // This type will only yield between lifecycle phases (not in the middle - // of one). However, if there is sufficient time left (TODO(vmpstr): - // define this), then it will continue on to the next lifecycle phase. - enum class BudgetType { - kDoNotYield, - kStrictYieldBetweenLifecyclePhases, - kYieldBetweenLifecyclePhases, - kDefault = kYieldBetweenLifecyclePhases - }; - - // The current state of the lock. Note that the order of these matters. - enum State { - kLocked, - kUpdating, - kCommitting, - kUnlocked, - }; - // The type of style that was blocked by this display lock. enum StyleType { kStyleUpdateNotRequired, @@ -125,36 +91,26 @@ UntracedMember<DisplayLockContext> context_ = nullptr; }; - DisplayLockContext(Element*, ExecutionContext*); - ~DisplayLockContext(); + explicit DisplayLockContext(Element*); + ~DisplayLockContext() = default; - // GC functions. - void Trace(Visitor*) override; - void Dispose(); - - // ExecutionContextLifecycleObserver overrides. - void ContextDestroyed() override; - - // Set which reasons activate, as a mask of DisplayLockActivationReason enums. - void SetActivatable(uint16_t activatable_mask); - - // Returns true if this lock has been activated and the activation has not yet - // been cleared. - bool IsActivated() const; - // Clear the activated flag. - void ClearActivated(); + // Called by style to update the current state of subtree-visibility. + void SetRequestedState(ESubtreeVisibility state); + // Called by style to adjust the element's style based on the current state. + void AdjustElementStyle(ComputedStyle* style) const; // Is called by the intersection observer callback to inform us of the // intersection state. void NotifyIsIntersectingViewport(); void NotifyIsNotIntersectingViewport(); - // Acquire the lock, should only be called when unlocked. - void StartAcquire(); - // Initiate a commit. - void StartCommit(); - // Update rendering of the subtree. - ScriptPromise UpdateRendering(ScriptState*); + // Request that this context be locked. Called when style determines that the + // subtree rooted at this element should be skipped, unless things like + // viewport intersection prevent it from doing so. + bool RequestLock(uint16_t activation_mask); + // Request that this context be unlocked. Called when style determines that + // the subtree rooted at this element should be rendered. + void RequestUnlock(); // Lifecycle observation / state functions. bool ShouldStyle(DisplayLockLifecycleTarget) const; @@ -176,25 +132,6 @@ // from and activatable by a specified reason. Note that passing // kAny will return true if the lock is activatable for any // reason. - // - // Important note: This returns the correct value even if the context is not - // currently locked. The implications of this is that the value returned here - // may depend on the method the context was unlocked. For example, in an - // attribute version activation we set the attribute to an empty string, - // making this value be true for all reasons. With a CSS version, however, we - // set |activated_| to true, but retain the style hence IsActivatable values - // don't change on activation. This is important since with a CSS version, we - // re-lock elements that have kViewport activatability and thus need to know - // if kViewport activatability is present even if activation has happened. To - // put this differently, the value returned here should always be consistent - // with either the current value of the attribute or the current value of the - // CSS property that generated this context; the UA can change the attribute - // value, but it cannot change the CSS property value, hence we observe the - // above behavior. - // - // In the common case, if the caller needs to know whether to activate the - // context, it should check whether the context is, in fact, locked in - // addition to this activatability check. bool IsActivatable(DisplayLockActivationReason reason) const; // Trigger commit because of activation from tab order, url fragment, @@ -208,12 +145,10 @@ bool ShouldCommitForActivation(DisplayLockActivationReason reason) const; - // Returns true if this lock is locked. Note from the outside perspective, the - // lock is locked any time the state is not kUnlocked or kCommitting. - bool IsLocked() const { return state_ != kUnlocked && state_ != kCommitting; } + // Returns true if this context is locked. + bool IsLocked() const { return is_locked_; } - // Called when the layout tree is attached. This is used to verify - // containment. + // Called when the layout tree is attached. void DidAttachLayoutTree(); // Returns a ScopedForcedUpdate object which for the duration of its lifetime @@ -286,34 +221,28 @@ } } + // GC functions. + void Trace(Visitor*) override; + private: // Test friends. - friend class DisplayLockBudgetTest; friend class DisplayLockContextRenderingTest; friend class DisplayLockContextTest; // Production friends. - friend class DisplayLockBudget; friend class DisplayLockSuspendedHandle; - class StateChangeHelper { - DISALLOW_NEW(); + // Returns true if this lock has been activated and the activation has not yet + // been cleared. + bool IsActivated() const; - public: - explicit StateChangeHelper(DisplayLockContext*); + void UpdateActivationBlockingCount(bool was_activatable, bool is_activatable); - operator State() const { return state_; } - StateChangeHelper& operator=(State); - void UpdateActivationBlockingCount(bool old_activatable, - bool new_activatable); + // Set which reasons activate, as a mask of DisplayLockActivationReason enums. + void SetActivatable(uint16_t activatable_mask); - private: - State state_ = kUnlocked; - UntracedMember<DisplayLockContext> context_; - }; - - // Initiate an update. - void StartUpdateIfNeeded(); + // Clear the activated flag. + void ClearActivated(); // Marks ancestors of elements in |whitespace_reattach_set_| with // ChildNeedsReattachLayoutTree and clears the set. @@ -337,26 +266,10 @@ // GetScopedForcedUpdate() for more information. void NotifyForcedUpdateScopeEnded(); - // Creates a new update budget based on the BudgetType::kDefault enum. In - // other words, it will create a budget of that type. - // TODO(vmpstr): In tests, we will probably switch the value to test other - // budgets. As well, this makes it easier to change the budget right in the - // enum definitions. - std::unique_ptr<DisplayLockBudget> CreateNewBudget(); - // Helper to schedule an animation to delay lifecycle updates for the next // frame. void ScheduleAnimation(); - // Helper functions to resolve the update/commit promises. - enum ResolverState { kResolve, kReject, kDetach }; - void MakeResolver(ScriptState*, Member<ScriptPromiseResolver>*); - bool HasResolver() const; - void FinishUpdateResolver(ResolverState, const char* reject_reason = nullptr); - void FinishResolver(Member<ScriptPromiseResolver>*, - ResolverState, - const char* reject_reason); - // Checks whether we should force unlock the lock (due to not meeting // containment/display requirements), returns a string from rejection_names // if we should, nullptr if not. Note that this can only be called if the @@ -374,8 +287,6 @@ // when acquiring this lock should immediately resolve the acquire promise. bool ConnectedToView() const; - bool ShouldPerformUpdatePhase(DisplayLockBudget::Phase phase) const; - // During an attempt to commit, clean up state and reject pending resolver // promises if the lock is not connected to the tree. bool CleanupAndRejectCommitIfNotConnected(); @@ -396,11 +307,14 @@ // the notifications. void UpdateLifecycleNotificationRegistration(); - std::unique_ptr<DisplayLockBudget> update_budget_; + // Acquire the lock, should only be called when unlocked. + void StartAcquire(); + // Initiate a commit. + void StartCommit(); - Member<ScriptPromiseResolver> update_resolver_; WeakMember<Element> element_; WeakMember<Document> document_; + ESubtreeVisibility state_ = ESubtreeVisibility::kVisible; // See StyleEngine's |whitespace_reattach_set_|. // Set of elements that had at least one rendered children removed @@ -411,8 +325,6 @@ // style recalc on them. HeapHashSet<Member<Element>> whitespace_reattach_set_; - StateChangeHelper state_; - bool update_forced_ = false; StyleType blocked_style_traversal_type_ = kStyleUpdateNotRequired; @@ -440,9 +352,8 @@ uint16_t activatable_mask_ = static_cast<uint16_t>(DisplayLockActivationReason::kAny); - // State that tracks whether we've been activated. Note that this is only - // valid for CSS version of subtree-visibility. - bool css_is_activated_ = false; + // State that tracks whether we've been activated. + bool is_activated_ = false; // Is set to true if we are registered for lifecycle notifications. bool is_registered_for_lifecycle_notifications_ = false; @@ -453,6 +364,10 @@ // if we are still nested. bool needs_intersection_lock_check_ = false; + // Lock has been requested. + bool lock_requested_ = false; + bool is_locked_ = false; + // TODO(vmpstr): This is only needed while we're still sending activation // events. base::WeakPtrFactory<DisplayLockContext> weak_factory_{this};
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc index bfc8ec75..e8a9771 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -12,7 +12,6 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" -#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" #include "third_party/blink/renderer/core/dom/dom_token_list.h" #include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" @@ -162,12 +161,6 @@ test::RunPendingTasks(); } - void ResetBudget(std::unique_ptr<DisplayLockBudget> budget, - DisplayLockContext* context) { - ASSERT_TRUE(context->update_budget_); - context->update_budget_ = std::move(budget); - } - bool ReattachWasBlocked(DisplayLockContext* context) { return context->reattach_layout_tree_was_blocked_; } @@ -223,7 +216,7 @@ MakeRGB(255, 0, 0)); // Manually commit the lock so that we can verify which dirty bits get // propagated. - element->GetDisplayLockContext()->StartCommit(); + element->GetDisplayLockContext()->RequestUnlock(); element->setAttribute(html_names::kStyleAttr, "color: red;"); auto* child = GetDocument().getElementById("child"); @@ -253,7 +246,7 @@ child->GetComputedStyle()->VisitedDependentColor(GetCSSPropertyColor()), MakeRGB(0, 0, 255)); - child->GetDisplayLockContext()->StartCommit(); + child->GetDisplayLockContext()->RequestUnlock(); child->setAttribute(html_names::kStyleAttr, "color: blue;"); EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc()); EXPECT_FALSE(element->NeedsStyleRecalc()); @@ -717,7 +710,7 @@ // Manually start commit, so that we can verify which dirty bits get // propagated. - element->GetDisplayLockContext()->StartCommit(); + element->GetDisplayLockContext()->RequestUnlock(); EXPECT_TRUE(element->ChildNeedsStyleRecalc()); EXPECT_FALSE(element->NeedsReattachLayoutTree()); EXPECT_FALSE(element->ChildNeedsReattachLayoutTree()); @@ -1105,15 +1098,11 @@ EXPECT_FALSE(non_activatable->GetDisplayLockContext()->IsActivatable( DisplayLockActivationReason::kAny)); - // Now commit the lock for |non_ctivatable|. + // Now commit the lock for |non_activatable|. CommitElement(*non_activatable); EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1); EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0); - EXPECT_TRUE(activatable->GetDisplayLockContext()->IsActivatable( - DisplayLockActivationReason::kAny)); - EXPECT_TRUE(non_activatable->GetDisplayLockContext()->IsActivatable( - DisplayLockActivationReason::kAny)); // Re-acquire the lock for |activatable| again with the activatable flag. LockElement(*activatable, true); @@ -1315,7 +1304,7 @@ // Manually commit the lock so that we can verify which dirty bits get // propagated. CommitElement(*locked_element, false); - locked_element->GetDisplayLockContext()->StartCommit(); + locked_element->GetDisplayLockContext()->RequestUnlock(); EXPECT_FALSE(ancestor_object->EffectiveAllowedTouchActionChanged()); EXPECT_FALSE(handler_object->EffectiveAllowedTouchActionChanged()); @@ -1459,7 +1448,7 @@ // Manually commit the lock so that we can verify which dirty bits get // propagated. CommitElement(*locked_element, false); - locked_element->GetDisplayLockContext()->StartCommit(); + locked_element->GetDisplayLockContext()->RequestUnlock(); EXPECT_FALSE(ancestor_object->EffectiveAllowedTouchActionChanged()); EXPECT_FALSE(descendant_object->EffectiveAllowedTouchActionChanged()); @@ -1613,7 +1602,7 @@ // Manually commit the lock so that we can verify which dirty bits get // propagated. CommitElement(*locked_element, false); - locked_element->GetDisplayLockContext()->StartCommit(); + locked_element->GetDisplayLockContext()->RequestUnlock(); EXPECT_FALSE(ancestor_object->NeedsPaintPropertyUpdate()); EXPECT_FALSE(descendant_object->NeedsPaintPropertyUpdate()); @@ -1638,62 +1627,6 @@ EXPECT_FALSE(handler_object->DescendantNeedsPaintPropertyUpdate()); } -TEST_F(DisplayLockContextTest, DisconnectedWhileUpdating) { - SetHtmlInnerHTML(R"HTML( - <style> - #container { - contain: style layout; - } - </style> - <div id="container"></div> - )HTML"); - - auto* container = GetDocument().getElementById("container"); - LockElement(*container, false); - - EXPECT_TRUE(container->GetDisplayLockContext()->IsLocked()); - EXPECT_FALSE(container->GetDisplayLockContext()->ShouldStyle( - DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(container->GetDisplayLockContext()->ShouldLayout( - DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(container->GetDisplayLockContext()->ShouldPrePaint( - DisplayLockLifecycleTarget::kChildren)); - - auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame()); - { - ScriptState::Scope scope(script_state); - container->GetDisplayLockContext()->UpdateRendering(script_state); - } - auto budget = base::WrapUnique( - new StrictYieldingDisplayLockBudget(container->GetDisplayLockContext())); - ResetBudget(std::move(budget), container->GetDisplayLockContext()); - - // This should style and allow layout, but not actually do layout (thus - // pre-paint would be blocked). Furthermore, this should schedule a task to - // run DisplayLockLifecycleTarget::ScheduleAnimation (since we can't directly - // schedule it from within a lifecycle). - UpdateAllLifecyclePhasesForTest(); - - ASSERT_FALSE(GetDocument().View()->InLifecycleUpdate()); - GetDocument().View()->SetInLifecycleUpdateForTest(true); - EXPECT_TRUE(container->GetDisplayLockContext()->IsLocked()); - EXPECT_TRUE(container->GetDisplayLockContext()->ShouldStyle( - DisplayLockLifecycleTarget::kChildren)); - EXPECT_TRUE(container->GetDisplayLockContext()->ShouldLayout( - DisplayLockLifecycleTarget::kChildren)); - EXPECT_FALSE(container->GetDisplayLockContext()->ShouldPrePaint( - DisplayLockLifecycleTarget::kChildren)); - GetDocument().View()->SetInLifecycleUpdateForTest(false); - - // Now disconnect the element. - container->remove(); - - // Flushing the pending tasks would call ScheduleAnimation, but since we're no - // longer connected and can't schedule from within the element, we should - // gracefully exit (and not crash). - test::RunPendingTasks(); -} - class DisplayLockContextRenderingTest : public RenderingTest, private ScopedCSSSubtreeVisibilityHiddenMatchableForTest { public: @@ -1704,6 +1637,9 @@ bool IsObservingLifecycle(DisplayLockContext* context) const { return context->is_registered_for_lifecycle_notifications_; } + bool IsActivated(DisplayLockContext* context) const { + return context->IsActivated(); + } }; TEST_F(DisplayLockContextRenderingTest, FrameDocumentRemovedWhileAcquire) { @@ -1722,7 +1658,7 @@ auto* target = ChildDocument().getElementById("target"); GetDocument().getElementById("frame")->remove(); - target->EnsureDisplayLockContext().StartAcquire(); + target->EnsureDisplayLockContext().RequestLock(0); } TEST_F(DisplayLockContextRenderingTest, @@ -1871,7 +1807,7 @@ // Verify lock state. auto* inner_context = inner_element->GetDisplayLockContext(); ASSERT_TRUE(inner_context); - EXPECT_TRUE(inner_context->IsActivated()); + EXPECT_TRUE(IsActivated(inner_context)); EXPECT_FALSE(inner_context->IsLocked()); // Lock outer. @@ -1946,7 +1882,7 @@ EXPECT_FALSE(IsObservingLifecycle(inner_context)); // Also we should still be activated and unlocked. - EXPECT_TRUE(inner_context->IsActivated()); + EXPECT_TRUE(IsActivated(inner_context)); EXPECT_FALSE(inner_context->IsLocked()); // Everything should be layout clean. @@ -2005,7 +1941,7 @@ // Verify lock state. auto* inner_context = inner_element->GetDisplayLockContext(); ASSERT_TRUE(inner_context); - EXPECT_TRUE(inner_context->IsActivated()); + EXPECT_TRUE(IsActivated(inner_context)); EXPECT_FALSE(inner_context->IsLocked()); // Lock outer. @@ -2082,7 +2018,7 @@ EXPECT_TRUE(IsObservingLifecycle(inner_context)); // We're unlocked for now. - EXPECT_TRUE(inner_context->IsActivated()); + EXPECT_TRUE(IsActivated(inner_context)); EXPECT_FALSE(inner_context->IsLocked()); // Everything should be layout clean. @@ -2100,7 +2036,7 @@ EXPECT_FALSE(IsObservingLifecycle(inner_context)); // We're locked. - EXPECT_FALSE(inner_context->IsActivated()); + EXPECT_FALSE(IsActivated(inner_context)); EXPECT_TRUE(inner_context->IsLocked()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc deleted file mode 100644 index 3f319b9..0000000 --- a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h" - -#include <algorithm> -#include "third_party/blink/renderer/core/frame/local_frame_view.h" - -namespace blink { - -StrictYieldingDisplayLockBudget::StrictYieldingDisplayLockBudget( - DisplayLockContext* context) - : DisplayLockBudget(context) {} - -bool StrictYieldingDisplayLockBudget::ShouldPerformPhase( - Phase phase, - const LifecycleData& lifecycle_data) { - // We should perform any phase earlier than the one we already completed. - // Also, we should complete a new phase once per cycle. - return (last_completed_phase_ && phase <= *last_completed_phase_) || - !completed_new_phase_this_cycle_; -} - -void StrictYieldingDisplayLockBudget::DidPerformPhase(Phase phase) { - if (!completed_new_phase_this_cycle_ && - (!last_completed_phase_ || phase > *last_completed_phase_)) { - last_completed_phase_ = phase; - completed_new_phase_this_cycle_ = true; - } - -#if DCHECK_IS_ON() - // If we completed a new phase this cycle, then we should not complete any - // later phases in the same cycle. - if (completed_new_phase_this_cycle_) { - DCHECK(last_completed_phase_); - DCHECK(phase <= *last_completed_phase_); - } -#endif -} - -void StrictYieldingDisplayLockBudget::OnLifecycleChange( - const LifecycleData& lifecycle_data) { - // Figure out the next phase we would run. If we had completed a phase before, - // then we should try to complete the next one, otherwise we'll start with the - // first phase. - Phase next_phase = - last_completed_phase_ - ? static_cast<Phase>( - std::min(static_cast<unsigned>(*last_completed_phase_) + 1, - static_cast<unsigned>(Phase::kLast))) - : Phase::kFirst; - - // Mark the next phase we're scheduled to run. - MarkPhaseAsDirty(next_phase); - completed_new_phase_this_cycle_ = false; -} - -bool StrictYieldingDisplayLockBudget::NeedsLifecycleUpdates() const { - if (last_completed_phase_ && *last_completed_phase_ == Phase::kLast) - return false; - - auto next_phase = last_completed_phase_ - ? static_cast<Phase>( - static_cast<unsigned>(*last_completed_phase_) + 1) - : Phase::kFirst; - // Check if any future phase needs updates. - for (auto phase = static_cast<unsigned>(next_phase); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (IsElementDirtyForPhase(static_cast<Phase>(phase))) - return true; - } - return false; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h deleted file mode 100644 index c0b9cba..0000000 --- a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_STRICT_YIELDING_DISPLAY_LOCK_BUDGET_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_STRICT_YIELDING_DISPLAY_LOCK_BUDGET_H_ - -#include "base/optional.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" - -namespace blink { - -// This budget yields between lifecycle phases even if that phase is quick. In -// other words, it will only do one new lifecycle phase at a time, and block the -// future ones. Any lifecycle phases that have already been allowed by this -// budget in the past are not blocked. -class CORE_EXPORT StrictYieldingDisplayLockBudget final - : public DisplayLockBudget { - public: - StrictYieldingDisplayLockBudget(DisplayLockContext*); - ~StrictYieldingDisplayLockBudget() override = default; - - bool ShouldPerformPhase(Phase, const LifecycleData&) override; - void DidPerformPhase(Phase) override; - void OnLifecycleChange(const LifecycleData&) override; - // Returns true if any of the lifecycles that have been previously blocked by - // this budget need updates. Note that this does not check lifecycle phases - // that have already completed by this budget even if they are now dirty - // again. This is done to prevent starvation (ie, it is possible for the - // budget to always schedule more work if something in rAF keeps dirtying - // layout, for example). - bool NeedsLifecycleUpdates() const override; - - protected: - base::Optional<Phase> last_completed_phase_; - bool completed_new_phase_this_cycle_ = false; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_STRICT_YIELDING_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc deleted file mode 100644 index 8ed458b..0000000 --- a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h" - -#include "third_party/blink/renderer/core/frame/local_frame_view.h" - -namespace blink { - -UnyieldingDisplayLockBudget::UnyieldingDisplayLockBudget( - DisplayLockContext* context) - : DisplayLockBudget(context) {} - -bool UnyieldingDisplayLockBudget::ShouldPerformPhase( - Phase, - const LifecycleData& lifecycle_data) { - return true; -} - -void UnyieldingDisplayLockBudget::DidPerformPhase(Phase) {} - -void UnyieldingDisplayLockBudget::OnLifecycleChange( - const LifecycleData& lifecycle_data) { - // Mark all the phases dirty since we have no intention of yielding. - for (auto phase = static_cast<unsigned>(Phase::kFirst); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - MarkDirtyForPhaseIfNeeded(static_cast<Phase>(phase)); - } -} - -bool UnyieldingDisplayLockBudget::NeedsLifecycleUpdates() const { - for (auto phase = static_cast<unsigned>(Phase::kFirst); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (IsElementDirtyForPhase(static_cast<Phase>(phase))) - return true; - } - return false; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h deleted file mode 100644 index 7b3351a..0000000 --- a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_UNYIELDING_DISPLAY_LOCK_BUDGET_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_UNYIELDING_DISPLAY_LOCK_BUDGET_H_ - -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" - -namespace blink { - -// This budget never yields. That is, this is essentially infinite budget that -// will finish all of the lifecycle phases for the locked subtree if given the -// chance. -class CORE_EXPORT UnyieldingDisplayLockBudget final : public DisplayLockBudget { - public: - UnyieldingDisplayLockBudget(DisplayLockContext*); - ~UnyieldingDisplayLockBudget() override = default; - - bool ShouldPerformPhase(Phase, const LifecycleData&) override; - void DidPerformPhase(Phase) override; - void OnLifecycleChange(const LifecycleData&) override; - bool NeedsLifecycleUpdates() const override; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_UNYIELDING_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc deleted file mode 100644 index 431f2fcf..0000000 --- a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc +++ /dev/null
@@ -1,97 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h" - -#include "base/time/tick_clock.h" -#include "third_party/blink/renderer/core/frame/local_frame_view.h" - -#include <algorithm> - -namespace blink { - -YieldingDisplayLockBudget::YieldingDisplayLockBudget( - DisplayLockContext* context) - : DisplayLockBudget(context) {} - -bool YieldingDisplayLockBudget::ShouldPerformPhase( - Phase phase, - const LifecycleData& lifecycle_data) { - // Always perform at least one more phase. - if (phase <= next_phase_from_start_of_lifecycle_) - return true; - - // We should perform any phase earlier than the one we already completed. - if (last_completed_phase_ && phase <= *last_completed_phase_) - return true; - - // Otherwise, we can still do work while we're not past the deadline. - return clock_->NowTicks() < deadline_; -} - -void YieldingDisplayLockBudget::DidPerformPhase(Phase phase) { - if (!last_completed_phase_ || phase > *last_completed_phase_) - last_completed_phase_ = phase; - - // Mark the next phase as dirty so that we can reach it if we need to. - MarkPhaseAsDirty( - static_cast<Phase>(static_cast<unsigned>(*last_completed_phase_) + 1)); -} - -void YieldingDisplayLockBudget::OnLifecycleChange( - const LifecycleData& lifecycle_data) { - if (first_lifecycle_count_ == 0) - first_lifecycle_count_ = lifecycle_data.count; - deadline_ = lifecycle_data.start_time + GetCurrentBudget(lifecycle_data); - - // Figure out the next phase we would run. If we had completed a phase before, - // then we should try to complete the next one, otherwise we'll start with the - // first phase. - next_phase_from_start_of_lifecycle_ = - last_completed_phase_ - ? static_cast<Phase>( - std::min(static_cast<unsigned>(*last_completed_phase_) + 1, - static_cast<unsigned>(Phase::kLast))) - : Phase::kFirst; - MarkPhaseAsDirty(next_phase_from_start_of_lifecycle_); -} - -bool YieldingDisplayLockBudget::NeedsLifecycleUpdates() const { - if (last_completed_phase_ && *last_completed_phase_ == Phase::kLast) - return false; - - auto next_phase = last_completed_phase_ - ? static_cast<Phase>( - static_cast<unsigned>(*last_completed_phase_) + 1) - : Phase::kFirst; - // Check if any future phase needs updates. - for (auto phase = static_cast<unsigned>(next_phase); - phase <= static_cast<unsigned>(Phase::kLast); ++phase) { - if (IsElementDirtyForPhase(static_cast<Phase>(phase))) - return true; - } - return false; -} - -base::TimeDelta YieldingDisplayLockBudget::GetCurrentBudget( - const LifecycleData& lifecycle_data) const { - int lifecycle_count = lifecycle_data.count - first_lifecycle_count_ + 1; - if (base::TimeTicks::IsHighResolution()) { - if (lifecycle_count < 3) - return base::TimeDelta::FromMilliseconds(4); - if (lifecycle_count < 10) - return base::TimeDelta::FromMilliseconds(8); - if (lifecycle_count < 60) - return base::TimeDelta::FromMilliseconds(16); - } else { - // Without a high resolution clock, the resolution can be as bad as 15ms, so - // increase the budgets accordingly to ensure we don't abort before doing - // any phases. - if (lifecycle_count < 60) - return base::TimeDelta::FromMilliseconds(16); - } - return base::TimeDelta::FromMilliseconds(1e9); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h deleted file mode 100644 index 5b1893f..0000000 --- a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_YIELDING_DISPLAY_LOCK_BUDGET_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_YIELDING_DISPLAY_LOCK_BUDGET_H_ - -#include "base/optional.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h" - -namespace blink { - -// This budget yields between lifecycle phases even if that phase is quick. In -// other words, it will only do one new lifecycle phase at a time, and block the -// future ones. Any lifecycle phases that have already been allowed by this -// budget in the past are not blocked. -class CORE_EXPORT YieldingDisplayLockBudget final : public DisplayLockBudget { - public: - YieldingDisplayLockBudget(DisplayLockContext*); - ~YieldingDisplayLockBudget() override = default; - - bool ShouldPerformPhase(Phase, const LifecycleData& lifecycle_data) override; - void DidPerformPhase(Phase) override; - void OnLifecycleChange(const LifecycleData& lifecycle_data) override; - // Returns true if any of the lifecycles that have been previously blocked by - // this budget need updates. Note that this does not check lifecycle phases - // that have already completed by this budget even if they are now dirty - // again. This is done to prevent starvation (ie, it is possible for the - // budget to always schedule more work if something in rAF keeps dirtying - // layout, for example). - bool NeedsLifecycleUpdates() const override; - - protected: - friend class DisplayLockBudgetTest; - - base::TimeDelta GetCurrentBudget(const LifecycleData& lifecycle_data) const; - - private: - unsigned first_lifecycle_count_ = 0; - base::TimeTicks deadline_; - base::Optional<Phase> last_completed_phase_; - Phase next_phase_from_start_of_lifecycle_ = Phase::kFirst; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_YIELDING_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/dom/character_data.cc b/third_party/blink/renderer/core/dom/character_data.cc index 945ae86..55a99d7 100644 --- a/third_party/blink/renderer/core/dom/character_data.cc +++ b/third_party/blink/renderer/core/dom/character_data.cc
@@ -228,7 +228,9 @@ if (parentNode()) { ContainerNode::ChildrenChange change = { ContainerNode::ChildrenChangeType::kTextChanged, - ContainerNode::ChildrenChangeSource::kAPI, + source == kUpdateFromParser + ? ContainerNode::ChildrenChangeSource::kParser + : ContainerNode::ChildrenChangeSource::kAPI, this, previousSibling(), nextSibling(),
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 0afa82a..c9adb0b 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -4798,8 +4798,7 @@ } DisplayLockContext& Element::EnsureDisplayLockContext() { - return *EnsureElementRareData().EnsureDisplayLockContext( - this, GetExecutionContext()); + return *EnsureElementRareData().EnsureDisplayLockContext(this); } // Step 1 of http://domparsing.spec.whatwg.org/#insertadjacenthtml()
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h index e72d697..21c5a80 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data.h +++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -192,11 +192,9 @@ } ResizeObserverDataMap& EnsureResizeObserverData(); - DisplayLockContext* EnsureDisplayLockContext(Element* element, - ExecutionContext* context) { + DisplayLockContext* EnsureDisplayLockContext(Element* element) { if (!display_lock_context_) { - display_lock_context_ = - MakeGarbageCollected<DisplayLockContext>(element, context); + display_lock_context_ = MakeGarbageCollected<DisplayLockContext>(element); } return display_lock_context_.Get(); }
diff --git a/third_party/blink/renderer/core/exported/web_external_widget_impl.h b/third_party/blink/renderer/core/exported/web_external_widget_impl.h index 60ad34f..6cac767a 100644 --- a/third_party/blink/renderer/core/exported/web_external_widget_impl.h +++ b/third_party/blink/renderer/core/exported/web_external_widget_impl.h
@@ -9,10 +9,12 @@ #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/renderer/platform/widget/widget_base.h" +#include "third_party/blink/renderer/platform/widget/widget_base_client.h" namespace blink { -class WebExternalWidgetImpl : public WebExternalWidget { +class WebExternalWidgetImpl : public WebExternalWidget, + public WidgetBaseClient { public: WebExternalWidgetImpl(WebExternalWidgetClient* client, const WebURL& debug_url); @@ -31,11 +33,15 @@ // WebExternalWidget overrides: void SetRootLayer(scoped_refptr<cc::Layer>) override; + // WidgetBaseClient overrides: + void DispatchRafAlignedInput(base::TimeTicks frame_time) override {} + void BeginMainFrame(base::TimeTicks last_frame_time) override {} + private: WebExternalWidgetClient* const client_; const WebURL debug_url_; WebSize size_; - WidgetBase widget_base_; + WidgetBase widget_base_{this}; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 88ec1ff..ece42ca 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -13083,7 +13083,7 @@ ASSERT_TRUE(widget); gfx::Point viewport_offset(7, -11); WebRect viewport_intersection(0, 11, 200, 89); - WebRect mainframe_intersection(0, 0, 200, 140); + WebRect mainframe_intersection(7, -11, 200, 140); FrameOcclusionState occlusion_state = FrameOcclusionState::kUnknown; widget->SetRemoteViewportIntersection( {viewport_offset, viewport_intersection, mainframe_intersection,
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc index 55ddaa7..cfe80a28 100644 --- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc +++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -378,11 +378,7 @@ } void WebPagePopupImpl::BeginFrame(base::TimeTicks last_frame_time) { - if (!page_) - return; - // FIXME: This should use lastFrameTimeMonotonic but doing so - // breaks tests. - PageWidgetDelegate::Animate(*page_, base::TimeTicks::Now()); + widget_base_.BeginMainFrame(last_frame_time); } void WebPagePopupImpl::UpdateLifecycle(LifecycleUpdate requested_update, @@ -431,6 +427,18 @@ return MainFrame().GetEventHandler().KeyEvent(event); } +void WebPagePopupImpl::BeginMainFrame(base::TimeTicks last_frame_time) { + if (!page_) + return; + // FIXME: This should use lastFrameTimeMonotonic but doing so + // breaks tests. + PageWidgetDelegate::Animate(*page_, base::TimeTicks::Now()); +} + +void WebPagePopupImpl::DispatchRafAlignedInput(base::TimeTicks frame_time) { + WidgetClient()->DispatchRafAlignedInput(frame_time); +} + WebInputEventResult WebPagePopupImpl::HandleCharEvent( const WebKeyboardEvent& event) { if (suppress_next_keypress_event_) {
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.h b/third_party/blink/renderer/core/exported/web_page_popup_impl.h index 881ad471..f41fd66 100644 --- a/third_party/blink/renderer/core/exported/web_page_popup_impl.h +++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
@@ -38,6 +38,7 @@ #include "third_party/blink/renderer/core/page/page_widget_delegate.h" #include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/widget/widget_base.h" +#include "third_party/blink/renderer/platform/widget/widget_base_client.h" #include "third_party/blink/renderer/platform/wtf/casting.h" #include "third_party/blink/renderer/platform/wtf/ref_counted.h" @@ -56,7 +57,8 @@ class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup, public PageWidgetEventHandler, public PagePopup, - public RefCounted<WebPagePopupImpl> { + public RefCounted<WebPagePopupImpl>, + public WidgetBaseClient { USING_FAST_MALLOC(WebPagePopupImpl); public: @@ -108,6 +110,10 @@ // PageWidgetEventHandler implementation. WebInputEventResult HandleKeyEvent(const WebKeyboardEvent&) override; + // WidgetBaseClient overrides: + void DispatchRafAlignedInput(base::TimeTicks frame_time) override; + void BeginMainFrame(base::TimeTicks last_frame_time) override; + private: // WebWidget implementation. // NOTE: The WebWidget may still be used after requesting the popup to be @@ -170,7 +176,7 @@ // Base functionality all widgets have. This is a member as to avoid // complicated inheritance structures. - WidgetBase widget_base_; + WidgetBase widget_base_{this}; friend class WebPagePopup; friend class PagePopupChromeClient;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index bcf5d6b..64bc18e 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -1527,21 +1527,6 @@ } } -void WebViewImpl::BeginRafAlignedInput() { - if (MainFrameImpl() && WebFrameWidgetBase::ShouldRecordMainFrameMetrics()) - raf_aligned_input_start_time_.emplace(base::TimeTicks::Now()); -} - -void WebViewImpl::EndRafAlignedInput() { - if (MainFrameImpl() && WebFrameWidgetBase::ShouldRecordMainFrameMetrics()) { - DCHECK(raf_aligned_input_start_time_); - MainFrameImpl()->GetFrame()->View()->EnsureUkmAggregator().RecordSample( - LocalFrameUkmAggregator::kHandleInputEvents, - raf_aligned_input_start_time_.value(), base::TimeTicks::Now()); - } - raf_aligned_input_start_time_.reset(); -} - void WebViewImpl::BeginUpdateLayers() { if (MainFrameImpl()) update_layers_start_time_.emplace(base::TimeTicks::Now()); @@ -2467,6 +2452,18 @@ SetZoomLevel(zoom_level_); } +void WebViewImpl::SetPageLifecycleState( + mojom::blink::PageLifecycleStatePtr state, + SetPageLifecycleStateCallback callback) { + Page* page = GetPage(); + if (!page) + return; + Scheduler()->SetPageFrozen(state->is_frozen); + + // Tell the browser that the freezing or resuming was successful. + std::move(callback).Run(); +} + void WebViewImpl::EnableAutoResizeMode(const WebSize& min_size, const WebSize& max_size) { should_auto_resize_ = true;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index ea6325c..1604c38 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -219,6 +219,10 @@ // Requests a page-scale animation based on the specified point/rect. void AnimateDoubleTapZoom(const gfx::Point&, const WebRect& block_bounds); + // mojom::blink::PageBroadcast method: + void SetPageLifecycleState(mojom::blink::PageLifecycleStatePtr state, + SetPageLifecycleStateCallback callback) override; + float DefaultMinimumPageScaleFactor() const; float DefaultMaximumPageScaleFactor() const; float ClampPageScaleFactorToLimits(float) const; @@ -451,8 +455,6 @@ void SetSuppressFrameRequestsWorkaroundFor704763Only(bool); void BeginFrame(base::TimeTicks last_frame_time); void DidBeginFrame(); - void BeginRafAlignedInput(); - void EndRafAlignedInput(); void BeginUpdateLayers(); void EndUpdateLayers(); void BeginCommitCompositorFrame(); @@ -722,7 +724,6 @@ local_main_frame_host_remote_; // Set when a measurement begins, reset when the measurement is taken. - base::Optional<base::TimeTicks> raf_aligned_input_start_time_; base::Optional<base::TimeTicks> update_layers_start_time_; base::Optional<base::TimeTicks> commit_compositor_frame_start_time_;
diff --git a/third_party/blink/renderer/core/frame/frame_view.cc b/third_party/blink/renderer/core/frame/frame_view.cc index 1855e03..38e4322 100644 --- a/third_party/blink/renderer/core/frame/frame_view.cc +++ b/third_party/blink/renderer/core/frame/frame_view.cc
@@ -159,20 +159,8 @@ } } - PhysicalRect mainframe_intersection_rect; - if (!geometry.UnclippedIntersectionRect().IsEmpty()) { - mainframe_intersection_rect = PhysicalRect::EnclosingRect( - matrix.ProjectQuad(FloatRect(geometry.UnclippedIntersectionRect())) - .BoundingBox()); - - if (mainframe_intersection_rect.IsEmpty()) { - mainframe_document_intersection = IntRect( - FlooredIntPoint(mainframe_intersection_rect.offset), IntSize()); - } else { - mainframe_document_intersection = - EnclosingIntRect(mainframe_intersection_rect); - } - } + mainframe_document_intersection = + EnclosingIntRect(geometry.UnclippedIntersectionRect()); } else if (occlusion_state == FrameOcclusionState::kGuaranteedNotOccluded) { // If the parent LocalFrameView is throttled and out-of-date, then we can't // get any useful information. @@ -184,6 +172,11 @@ WebRect(), occlusion_state, frame.GetMainFrameViewportSize(), frame.GetMainFrameScrollOffset(), can_skip_sticky_frame_tracking}); + if (ShouldReportMainFrameIntersection()) { + GetFrame().Client()->OnMainFrameDocumentIntersectionChanged( + mainframe_document_intersection); + } + UpdateFrameVisibility(!viewport_intersection.IsEmpty()); // We don't throttle 0x0 or display:none iframes, because in practice they are
diff --git a/third_party/blink/renderer/core/frame/frame_view.h b/third_party/blink/renderer/core/frame/frame_view.h index 73d183d22..0ab1d06 100644 --- a/third_party/blink/renderer/core/frame/frame_view.h +++ b/third_party/blink/renderer/core/frame/frame_view.h
@@ -57,6 +57,7 @@ bool RectInParentIsStable(const base::TimeTicks& timestamp) const; protected: + virtual bool ShouldReportMainFrameIntersection() const { return false; } virtual bool NeedsViewportOffset() const { return false; } virtual void SetViewportIntersection( const ViewportIntersectionState& intersection_state) = 0;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index bd3e6c8..ca79027e 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1481,8 +1481,14 @@ // Notify the render frame observers when the main frame intersection changes. if (intersection_state_.main_frame_document_intersection != intersection_state.main_frame_document_intersection) { + // Put the main frame document intersection in the coordinate system of the + // viewport. + IntRect offset_main_frame_intersection = + intersection_state.main_frame_document_intersection; + offset_main_frame_intersection.MoveBy( + IntPoint(intersection_state.viewport_offset)); Client()->OnMainFrameDocumentIntersectionChanged( - intersection_state.main_frame_document_intersection); + offset_main_frame_intersection); } bool can_skip_sticky_frame_tracking =
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 edbd25d..5887569 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3641,12 +3641,6 @@ } } -void LocalFrameView::SetViewportIntersection( - const ViewportIntersectionState& intersection_state) { - GetFrame().Client()->OnMainFrameDocumentIntersectionChanged( - intersection_state.main_frame_document_intersection); -} - PhysicalOffset LocalFrameView::ViewportToFrame( const PhysicalOffset& point_in_viewport) const { PhysicalOffset point_in_root_frame = PhysicalOffset::FromFloatPointRound( @@ -4357,11 +4351,22 @@ // This is the top-level frame, so no mapping necessary. if (frame_->IsMainFrame()) return true; - bool result = rect.InclusiveIntersect(PhysicalRect( - apply_overflow_clip ? frame_->RemoteViewportIntersection() - : frame_->RemoteMainFrameDocumentIntersection())); - if (result) + bool result; + if (apply_overflow_clip) { + result = rect.InclusiveIntersect( + PhysicalRect(frame_->RemoteViewportIntersection())); + if (result) + rect.Move(PhysicalOffset(GetFrame().RemoteViewportOffset())); + } else { + // If we are not applying the overflow clip, the mapping should be in the + // remote viewport's coordinate system. Map rect to the remote viewport's + // coordinate system prior to intersecting. + // RemoteMainFrameDocumentIntersection is in the remote viewport's + // coordinate system. rect.Move(PhysicalOffset(GetFrame().RemoteViewportOffset())); + result = rect.InclusiveIntersect( + PhysicalRect(frame_->RemoteMainFrameDocumentIntersection())); + } return result; }
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 d07e3c35..c66dd9c 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -684,12 +684,13 @@ void UnregisterFromLifecycleNotifications(LifecycleNotificationObserver*); protected: + bool ShouldReportMainFrameIntersection() const override { return true; } void FrameRectsChanged(const IntRect&) override; void SelfVisibleChanged() override; void ParentVisibleChanged() override; void NotifyFrameRectsChangedIfNeeded(); void SetViewportIntersection( - const ViewportIntersectionState& intersection_state) override; + const ViewportIntersectionState& intersection_state) override {} void VisibilityForThrottlingChanged() override; bool LifecycleUpdatesThrottled() const override { return lifecycle_updates_throttled_;
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc index 806c356..c6e0e1ab 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
@@ -16,6 +16,7 @@ #include "third_party/blink/renderer/core/events/web_input_event_conversion.h" #include "third_party/blink/renderer/core/events/wheel_event.h" #include "third_party/blink/renderer/core/exported/web_view_impl.h" +#include "third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" @@ -529,6 +530,25 @@ GetLocalFrameViewForAnimationScrolling()); } +void WebFrameWidgetBase::BeginFrame(base::TimeTicks frame_time) { + widget_base_.BeginMainFrame(frame_time); +} + +void WebFrameWidgetBase::DispatchRafAlignedInput(base::TimeTicks frame_time) { + base::TimeTicks raf_aligned_input_start_time; + if (LocalRootImpl() && ShouldRecordMainFrameMetrics()) { + raf_aligned_input_start_time = base::TimeTicks::Now(); + } + + Client()->DispatchRafAlignedInput(frame_time); + + if (LocalRootImpl() && ShouldRecordMainFrameMetrics()) { + LocalRootImpl()->GetFrame()->View()->EnsureUkmAggregator().RecordSample( + LocalFrameUkmAggregator::kHandleInputEvents, + raf_aligned_input_start_time, base::TimeTicks::Now()); + } +} + void WebFrameWidgetBase::ApplyViewportChangesForTesting( const ApplyViewportChangesArgs& args) { // TODO(dtapuska): Temporarily just call ApplyViewportChanges.
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.h b/third_party/blink/renderer/core/frame/web_frame_widget_base.h index 4e317b6..e63d1ad 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_base.h +++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.h
@@ -22,6 +22,7 @@ #include "third_party/blink/renderer/platform/heap/member.h" #include "third_party/blink/renderer/platform/timer.h" #include "third_party/blink/renderer/platform/widget/widget_base.h" +#include "third_party/blink/renderer/platform/widget/widget_base_client.h" #include "third_party/blink/renderer/platform/wtf/casting.h" namespace cc { @@ -47,7 +48,8 @@ class CORE_EXPORT WebFrameWidgetBase : public GarbageCollected<WebFrameWidgetBase>, - public WebFrameWidget { + public WebFrameWidget, + public WidgetBaseClient { public: explicit WebFrameWidgetBase(WebWidgetClient&); virtual ~WebFrameWidgetBase(); @@ -133,6 +135,10 @@ void DidNotAcquirePointerLock() override; void DidLosePointerLock() override; void ShowContextMenu(WebMenuSourceType) override; + void BeginFrame(base::TimeTicks frame_time) final; + + // WidgetBaseClient methods. + void DispatchRafAlignedInput(base::TimeTicks frame_time) override; // Image decode functionality. void RequestDecode(const PaintImage&, base::OnceCallback<void(bool)>); @@ -279,7 +285,7 @@ // Base functionality all widgets have. This is a member as to avoid // complicated inheritance structures. - WidgetBase widget_base_; + WidgetBase widget_base_{this}; private: void CancelDrag();
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index 86d1e455..3adf286b 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -251,7 +251,7 @@ GetPage()->Animator().SetSuppressFrameRequestsWorkaroundFor704763Only( suppress_frame_requests); } -void WebFrameWidgetImpl::BeginFrame(base::TimeTicks last_frame_time) { +void WebFrameWidgetImpl::BeginMainFrame(base::TimeTicks last_frame_time) { TRACE_EVENT1("blink", "WebFrameWidgetImpl::beginFrame", "frameTime", last_frame_time); DCHECK(!last_frame_time.is_null()); @@ -261,7 +261,7 @@ DocumentLifecycle::AllowThrottlingScope throttling_scope( LocalRootImpl()->GetFrame()->GetDocument()->Lifecycle()); - if (WebFrameWidgetBase::ShouldRecordMainFrameMetrics()) { + if (ShouldRecordMainFrameMetrics()) { SCOPED_UMA_AND_UKM_TIMER( LocalRootImpl()->GetFrame()->View()->EnsureUkmAggregator(), LocalFrameUkmAggregator::kAnimate); @@ -279,22 +279,6 @@ PageWidgetDelegate::DidBeginFrame(*LocalRootImpl()->GetFrame()); } -void WebFrameWidgetImpl::BeginRafAlignedInput() { - if (LocalRootImpl()) { - raf_aligned_input_start_time_.emplace(base::TimeTicks::Now()); - } -} - -void WebFrameWidgetImpl::EndRafAlignedInput() { - if (LocalRootImpl()) { - DCHECK(raf_aligned_input_start_time_); - LocalRootImpl()->GetFrame()->View()->EnsureUkmAggregator().RecordSample( - LocalFrameUkmAggregator::kHandleInputEvents, - raf_aligned_input_start_time_.value(), base::TimeTicks::Now()); - } - raf_aligned_input_start_time_.reset(); -} - void WebFrameWidgetImpl::BeginUpdateLayers() { if (LocalRootImpl()) update_layers_start_time_.emplace(base::TimeTicks::Now());
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h index 8a8eae68e..bdeb135 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -80,10 +80,7 @@ void DidEnterFullscreen() override; void DidExitFullscreen() override; void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) final; - void BeginFrame(base::TimeTicks last_frame_time) override; void DidBeginFrame() override; - void BeginRafAlignedInput() override; - void EndRafAlignedInput() override; void BeginUpdateLayers() override; void EndUpdateLayers() override; void BeginCommitCompositorFrame() override; @@ -134,6 +131,9 @@ HitTestResult CoreHitTestResultAt(const gfx::Point&) override; void ZoomToFindInPageRect(const WebRect& rect_in_root_frame) override; + // WidgetBaseClient overrides: + void BeginMainFrame(base::TimeTicks last_frame_time) override; + void UpdateMainFrameLayoutSize(); // Event related methods: @@ -180,7 +180,6 @@ Member<HTMLPlugInElement> mouse_capture_element_; // Metrics gathering timing information - base::Optional<base::TimeTicks> raf_aligned_input_start_time_; base::Optional<base::TimeTicks> update_layers_start_time_; base::Optional<base::TimeTicks> commit_compositor_frame_start_time_;
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc index 686ccce..b478bb67 100644 --- a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc +++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/renderer/core/exported/web_view_impl.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" +#include "third_party/blink/renderer/platform/scheduler/public/thread.h" namespace blink { @@ -51,20 +52,13 @@ web_view_->SetSuppressFrameRequestsWorkaroundFor704763Only( suppress_frame_requests); } -void WebViewFrameWidget::BeginFrame(base::TimeTicks last_frame_time) { - web_view_->BeginFrame(last_frame_time); -} void WebViewFrameWidget::DidBeginFrame() { web_view_->DidBeginFrame(); } -void WebViewFrameWidget::BeginRafAlignedInput() { - web_view_->BeginRafAlignedInput(); -} - -void WebViewFrameWidget::EndRafAlignedInput() { - web_view_->EndRafAlignedInput(); +void WebViewFrameWidget::BeginMainFrame(base::TimeTicks last_frame_time) { + web_view_->BeginFrame(last_frame_time); } void WebViewFrameWidget::BeginUpdateLayers() {
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.h b/third_party/blink/renderer/core/frame/web_view_frame_widget.h index b9487ab..9cfac00 100644 --- a/third_party/blink/renderer/core/frame/web_view_frame_widget.h +++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
@@ -51,10 +51,7 @@ void DidEnterFullscreen() override; void DidExitFullscreen() override; void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) final; - void BeginFrame(base::TimeTicks last_frame_time) override; void DidBeginFrame() override; - void BeginRafAlignedInput() override; - void EndRafAlignedInput() override; void BeginUpdateLayers() override; void EndUpdateLayers() override; void BeginCommitCompositorFrame() override; @@ -96,6 +93,9 @@ HitTestResult CoreHitTestResultAt(const gfx::Point&) override; void ZoomToFindInPageRect(const WebRect& rect_in_root_frame) override; + // WidgetBaseClient overrides: + void BeginMainFrame(base::TimeTicks last_frame_time) override; + void Trace(Visitor*) override; private:
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc index 586abe8f..7527e93 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
@@ -335,9 +335,6 @@ .Inverse(); intersection_rect_ = PhysicalRect::EnclosingRect( matrix.ProjectQuad(FloatRect(intersection_rect_)).BoundingBox()); - unclipped_intersection_rect_ = PhysicalRect::EnclosingRect( - matrix.ProjectQuad(FloatRect(unclipped_intersection_rect_)) - .BoundingBox()); // intersection_rect_ is in the coordinate system of the implicit root; // map it down the to absolute coordinates for the target's document. } else { @@ -348,10 +345,6 @@ root_geometry.root_to_document_transform .MapQuad(FloatQuad(FloatRect(intersection_rect_))) .BoundingBox()); - unclipped_intersection_rect_ = PhysicalRect::EnclosingRect( - root_geometry.root_to_document_transform - .MapQuad(FloatQuad(FloatRect(unclipped_intersection_rect_))) - .BoundingBox()); } } else { intersection_rect_ = PhysicalRect();
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h index 35e33f4..854c98c 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h +++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
@@ -100,6 +100,9 @@ PhysicalRect TargetRect() const { return target_rect_; } PhysicalRect IntersectionRect() const { return intersection_rect_; } + + // The intersection rect without applying viewport clipping in the coordinate + // system of the root's viewport. PhysicalRect UnclippedIntersectionRect() const { return unclipped_intersection_rect_; }
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager.cc b/third_party/blink/renderer/core/loader/font_preload_manager.cc index 0901ccd0..66ffa3c 100644 --- a/third_party/blink/renderer/core/loader/font_preload_manager.cc +++ b/third_party/blink/renderer/core/loader/font_preload_manager.cc
@@ -196,6 +196,11 @@ render_delay_timeout_ = timeout; } +void FontPreloadManager::DisableTimeoutForTest() { + if (render_delay_timer_.IsActive()) + render_delay_timer_.Stop(); +} + void FontPreloadManager::Trace(Visitor* visitor) { visitor->Trace(finish_observers_); visitor->Trace(document_);
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager.h b/third_party/blink/renderer/core/loader/font_preload_manager.h index 6d3b0c29..a7e4871 100644 --- a/third_party/blink/renderer/core/loader/font_preload_manager.h +++ b/third_party/blink/renderer/core/loader/font_preload_manager.h
@@ -49,6 +49,8 @@ private: friend class FontPreloadManagerTest; + void DisableTimeoutForTest(); + // State of font preloading before lifecycle updates begin enum class State { // Rendering hasn't begun. No font preloading yet.
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager_test.cc b/third_party/blink/renderer/core/loader/font_preload_manager_test.cc index ef68d5fd..8a25406 100644 --- a/third_party/blink/renderer/core/loader/font_preload_manager_test.cc +++ b/third_party/blink/renderer/core/loader/font_preload_manager_test.cc
@@ -38,6 +38,10 @@ using State = FontPreloadManager::State; State GetState() { return GetFontPreloadManager().state_; } + void DisableFontPreloadManagerTimeout() { + GetFontPreloadManager().DisableTimeoutForTest(); + } + Element* GetTarget() { return GetDocument().getElementById("target"); } const Font& GetTargetFont() { @@ -369,6 +373,10 @@ EXPECT_TRUE(GetFontPreloadManager().HasPendingRenderBlockingFonts()); EXPECT_EQ(State::kLoading, GetState()); + // There are test flakes due to FontPreloadManager timeout firing before the + // ResourceFinishObserver gets notified. So we disable the timeout. + DisableFontPreloadManagerTimeout(); + font_resource.Complete(ReadAhemWoff2()); test::RunPendingTasks();
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc index 1bd9250..61275b91 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.cc +++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -700,8 +700,7 @@ mojo::PendingRemote<mojom::blink::NavigationInitiator> navigation_initiator; WTF::Vector<network::mojom::blink::ContentSecurityPolicyPtr> initiator_csp; network::mojom::blink::CSPSourcePtr initiator_self_source; - if (origin_document && origin_document->GetContentSecurityPolicy() - ->ExperimentalFeaturesEnabled()) { + if (origin_document) { initiator_csp = origin_document->GetContentSecurityPolicy() ->ExposeForNavigationalChecks(); initiator_self_source = origin_document->GetContentSecurityPolicy()
diff --git a/third_party/blink/renderer/core/workers/worker_backing_thread.cc b/third_party/blink/renderer/core/workers/worker_backing_thread.cc index ea7ba504..d0313a3 100644 --- a/third_party/blink/renderer/core/workers/worker_backing_thread.cc +++ b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/location.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/web/blink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" @@ -83,7 +84,8 @@ V8PerIsolateData::From(isolate_)->SetThreadDebugger( std::make_unique<WorkerThreadDebugger>(isolate_)); - if (!RuntimeEnabledFeatures::V8OptimizeWorkersForPerformanceEnabled()) { + if (!base::FeatureList::IsEnabled( + features::kV8OptimizeWorkersForPerformance)) { // Optimize for memory usage instead of latency for the worker isolate. // Service Workers that have the fetch event handler run with the Isolate // in foreground notification regardless of this configuration.
diff --git a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc index 92e9f73..5de26fc 100644 --- a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc +++ b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc
@@ -377,7 +377,7 @@ if (!leaf_text_node_) return true; - leaf_text_node_->appendData( + leaf_text_node_->ParserAppendData( ToString(buffered_text_.data(), buffered_text_.size())); buffered_text_.clear(); leaf_text_node_ = nullptr;
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn index 3fea420..fbbf704 100644 --- a/third_party/blink/renderer/modules/BUILD.gn +++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -135,7 +135,6 @@ "//third_party/blink/renderer/modules/sensor", "//third_party/blink/renderer/modules/service_worker", "//third_party/blink/renderer/modules/shapedetection", - "//third_party/blink/renderer/modules/sms", "//third_party/blink/renderer/modules/speech", "//third_party/blink/renderer/modules/srcobject", "//third_party/blink/renderer/modules/storage",
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc index 007bc122..27c3ffa 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
@@ -242,19 +242,16 @@ Vector<NameValueStringConstraint>& mandatory) { Vector<NameValueStringConstraint> mandatory_constraints_vector; if (constraints_in->hasMandatory()) { - bool ok = ParseMandatoryConstraintsDictionary(constraints_in->mandatory(), - mandatory); + bool ok = ParseMandatoryConstraintsDictionary( + Dictionary(constraints_in->mandatory()), mandatory); if (!ok) return false; } if (constraints_in->hasOptional()) { - const Vector<Dictionary>& optional_constraints = constraints_in->optional(); - - for (const auto& constraint : optional_constraints) { - if (constraint.IsUndefinedOrNull()) - return false; - bool ok = ParseOptionalConstraintsVectorElement(constraint, optional); + for (const auto& constraint : constraints_in->optional()) { + bool ok = ParseOptionalConstraintsVectorElement(Dictionary(constraint), + optional); if (!ok) return false; }
diff --git a/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl b/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl index 64ec474..3368c0a 100644 --- a/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl +++ b/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl
@@ -54,6 +54,6 @@ ConstrainBoolean torch; // The "mandatory" and "_optional" members are retained for conformance // with https://www.w3.org/TR/2013/WD-mediacapture-streams-20130903/ - Dictionary mandatory; - sequence<Dictionary> _optional; + object mandatory; + sequence<object> _optional; };
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc index 1d30194..771dab9b 100644 --- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc +++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -190,7 +190,7 @@ public: ReusableMessageLoopEvent() : event_(new media::WaitableMessageLoopEvent()) {} - base::RepeatingClosure GetClosure() const { return event_->GetClosure(); } + base::OnceClosure GetClosure() const { return event_->GetClosure(); } media::PipelineStatusCallback GetPipelineStatusCB() const { return event_->GetPipelineStatusCB();
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index c23e2dd4..60366fc8 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -107,7 +107,6 @@ "//third_party/blink/renderer/modules/sensor/idls.gni", "//third_party/blink/renderer/modules/service_worker/idls.gni", "//third_party/blink/renderer/modules/shapedetection/idls.gni", - "//third_party/blink/renderer/modules/sms/idls.gni", "//third_party/blink/renderer/modules/speech/idls.gni", "//third_party/blink/renderer/modules/srcobject/idls.gni", "//third_party/blink/renderer/modules/storage/idls.gni",
diff --git a/third_party/blink/renderer/modules/sms/BUILD.gn b/third_party/blink/renderer/modules/sms/BUILD.gn deleted file mode 100644 index 6e270728..0000000 --- a/third_party/blink/renderer/modules/sms/BUILD.gn +++ /dev/null
@@ -1,18 +0,0 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/blink/renderer/modules/modules.gni") - -blink_modules_sources("sms") { - sources = [ - "navigator_sms.cc", - "navigator_sms.h", - "sms.cc", - "sms.h", - "sms_metrics.cc", - "sms_metrics.h", - "sms_receiver.cc", - "sms_receiver.h", - ] -}
diff --git a/third_party/blink/renderer/modules/sms/DEPS b/third_party/blink/renderer/modules/sms/DEPS deleted file mode 100644 index c7b1c0d..0000000 --- a/third_party/blink/renderer/modules/sms/DEPS +++ /dev/null
@@ -1,9 +0,0 @@ -include_rules = [ - "+services/metrics/public/cpp/ukm_builders.h", - "+services/metrics/public/cpp/ukm_source_id.h", - "-third_party/blink/renderer/modules", - "+third_party/blink/renderer/modules/event_modules.h", - "+third_party/blink/renderer/modules/event_target_modules.h", - "+third_party/blink/renderer/modules/modules_export.h", - "+third_party/blink/renderer/modules/sms", -]
diff --git a/third_party/blink/renderer/modules/sms/OWNERS b/third_party/blink/renderer/modules/sms/OWNERS deleted file mode 100644 index 39f063f..0000000 --- a/third_party/blink/renderer/modules/sms/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -file://content/browser/sms/OWNERS - -# COMPONENT: Blink>SMS -# TEAM: fugu-dev@chromium.org
diff --git a/third_party/blink/renderer/modules/sms/README.md b/third_party/blink/renderer/modules/sms/README.md deleted file mode 100644 index b2f0832..0000000 --- a/third_party/blink/renderer/modules/sms/README.md +++ /dev/null
@@ -1,3 +0,0 @@ -# SMS Receiver API - -This directory contains code for the renderer side implementation of the SMS Receiver API. For more details, refer to [this README file](https://cs.chromium.org/chromium/src/content/browser/sms/README.md).
diff --git a/third_party/blink/renderer/modules/sms/idls.gni b/third_party/blink/renderer/modules/sms/idls.gni deleted file mode 100644 index a2491bc4..0000000 --- a/third_party/blink/renderer/modules/sms/idls.gni +++ /dev/null
@@ -1,12 +0,0 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -modules_idl_files = [ - "sms.idl", - "sms_receiver.idl", -] - -modules_dictionary_idl_files = [ "sms_receiver_options.idl" ] - -modules_dependency_idl_files = [ "navigator_sms.idl" ]
diff --git a/third_party/blink/renderer/modules/sms/navigator_sms.cc b/third_party/blink/renderer/modules/sms/navigator_sms.cc deleted file mode 100644 index f6a81ef..0000000 --- a/third_party/blink/renderer/modules/sms/navigator_sms.cc +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/modules/sms/navigator_sms.h" - -#include "third_party/blink/renderer/core/frame/navigator.h" -#include "third_party/blink/renderer/modules/sms/sms_receiver.h" -#include "third_party/blink/renderer/platform/bindings/script_state.h" - -namespace blink { - -NavigatorSMS::NavigatorSMS(Navigator& navigator) - : Supplement<Navigator>(navigator) {} - -const char NavigatorSMS::kSupplementName[] = "NavigatorSMS"; - -NavigatorSMS& NavigatorSMS::From(Navigator& navigator) { - NavigatorSMS* supplement = - Supplement<Navigator>::From<NavigatorSMS>(navigator); - if (!supplement) { - supplement = MakeGarbageCollected<NavigatorSMS>(navigator); - Supplement<Navigator>::ProvideTo(navigator, supplement); - } - return *supplement; -} - -SMSReceiver* NavigatorSMS::GetSMSReceiver(ScriptState* script_state) { - if (!sms_receiver_) { - sms_receiver_ = - MakeGarbageCollected<SMSReceiver>(ExecutionContext::From(script_state)); - } - return sms_receiver_.Get(); -} - -SMSReceiver* NavigatorSMS::sms(ScriptState* script_state, - Navigator& navigator) { - return NavigatorSMS::From(navigator).GetSMSReceiver(script_state); -} - -void NavigatorSMS::Trace(Visitor* visitor) { - visitor->Trace(sms_receiver_); - Supplement<Navigator>::Trace(visitor); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/navigator_sms.h b/third_party/blink/renderer/modules/sms/navigator_sms.h deleted file mode 100644 index 4f1a700..0000000 --- a/third_party/blink/renderer/modules/sms/navigator_sms.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_NAVIGATOR_SMS_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_NAVIGATOR_SMS_H_ - -#include "third_party/blink/renderer/core/frame/navigator.h" -#include "third_party/blink/renderer/platform/heap/handle.h" -#include "third_party/blink/renderer/platform/supplementable.h" - -namespace blink { - -class Navigator; -class ScriptState; -class SMSReceiver; - -class NavigatorSMS final : public GarbageCollected<NavigatorSMS>, - public Supplement<Navigator> { - USING_GARBAGE_COLLECTED_MIXIN(NavigatorSMS); - - public: - static const char kSupplementName[]; - - static NavigatorSMS& From(Navigator&); - - static SMSReceiver* sms(ScriptState*, Navigator&); - - explicit NavigatorSMS(Navigator&); - - void Trace(Visitor*) override; - - private: - SMSReceiver* GetSMSReceiver(ScriptState*); - - Member<SMSReceiver> sms_receiver_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_NAVIGATOR_SMS_H_
diff --git a/third_party/blink/renderer/modules/sms/navigator_sms.idl b/third_party/blink/renderer/modules/sms/navigator_sms.idl deleted file mode 100644 index b979116..0000000 --- a/third_party/blink/renderer/modules/sms/navigator_sms.idl +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://github.com/samuelgoto/sms-receiver - -[ - SecureContext, - Exposed=Window, - ImplementedAs=NavigatorSMS, - RuntimeEnabled=SmsReceiver -] partial interface Navigator { - [CallWith=ScriptState] readonly attribute SMSReceiver sms; -};
diff --git a/third_party/blink/renderer/modules/sms/sms.cc b/third_party/blink/renderer/modules/sms/sms.cc deleted file mode 100644 index 9bdcc1a..0000000 --- a/third_party/blink/renderer/modules/sms/sms.cc +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/modules/sms/sms.h" - -#include <utility> - -namespace blink { - -SMS::SMS(const WTF::String& content) : content_(content) {} - -SMS::~SMS() = default; - -const String& SMS::content() const { - return content_; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/sms.h b/third_party/blink/renderer/modules/sms/sms.h deleted file mode 100644 index 3fac1377..0000000 --- a/third_party/blink/renderer/modules/sms/sms.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_H_ - -#include "base/macros.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace blink { - -class SMS final : public ScriptWrappable { - DEFINE_WRAPPERTYPEINFO(); - - public: - // |content| is the raw content of the SMS message. - explicit SMS(const WTF::String& content); - - ~SMS() override; - - // Sms IDL interface. - const String& content() const; - - private: - const String content_; - - DISALLOW_COPY_AND_ASSIGN(SMS); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_H_
diff --git a/third_party/blink/renderer/modules/sms/sms.idl b/third_party/blink/renderer/modules/sms/sms.idl deleted file mode 100644 index a3c624b..0000000 --- a/third_party/blink/renderer/modules/sms/sms.idl +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://github.com/samuelgoto/sms-receiver - -[ - SecureContext, - Exposed=(Window,DedicatedWorker), - RuntimeEnabled=SmsReceiver] -interface SMS { - readonly attribute DOMString content; -};
diff --git a/third_party/blink/renderer/modules/sms/sms_metrics.cc b/third_party/blink/renderer/modules/sms/sms_metrics.cc deleted file mode 100644 index 2c966476..0000000 --- a/third_party/blink/renderer/modules/sms/sms_metrics.cc +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/modules/sms/sms_metrics.h" - -#include "base/metrics/histogram_macros.h" -#include "services/metrics/public/cpp/ukm_builders.h" - -namespace blink { - -void RecordSMSOutcome(SMSReceiverOutcome outcome, - ukm::SourceId source_id, - ukm::UkmRecorder* ukm_recorder) { - DCHECK_NE(source_id, ukm::kInvalidSourceId); - DCHECK(ukm_recorder); - - ukm::builders::SMSReceiver builder(source_id); - builder.SetOutcome(static_cast<int>(outcome)); - builder.Record(ukm_recorder); - - UMA_HISTOGRAM_ENUMERATION("Blink.Sms.Receive.Outcome", outcome); -} - -void RecordSMSSuccessTime(base::TimeDelta duration) { - UMA_HISTOGRAM_MEDIUM_TIMES("Blink.Sms.Receive.TimeSuccess", duration); -} - -void RecordSMSCancelTime(base::TimeDelta duration) { - UMA_HISTOGRAM_MEDIUM_TIMES("Blink.Sms.Receive.TimeCancel", duration); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/sms_metrics.h b/third_party/blink/renderer/modules/sms/sms_metrics.h deleted file mode 100644 index 526da7e..0000000 --- a/third_party/blink/renderer/modules/sms/sms_metrics.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_METRICS_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_METRICS_H_ - -#include <stdint.h> - -#include "services/metrics/public/cpp/ukm_source_id.h" -#include "third_party/blink/public/common/sms/sms_receiver_outcome.h" - -namespace base { -class TimeDelta; -} // namespace base - -namespace ukm { -class UkmRecorder; -} // namespace ukm - -namespace blink { - -// Records the result of a call to the SMSReceiver API. -void RecordSMSOutcome(SMSReceiverOutcome outcome, - ukm::SourceId source_id, - ukm::UkmRecorder* ukm_recorder); - -// Records the time from when the API is called to when the user successfully -// receives the SMS and presses continue to move on with the verification flow. -void RecordSMSSuccessTime(base::TimeDelta duration); - -// Records the time from when the API is called to when the user presses the -// cancel button to abort SMS retrieval. -void RecordSMSCancelTime(base::TimeDelta duration); - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_METRICS_H_
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver.cc b/third_party/blink/renderer/modules/sms/sms_receiver.cc deleted file mode 100644 index 60f7ad31..0000000 --- a/third_party/blink/renderer/modules/sms/sms_receiver.cc +++ /dev/null
@@ -1,147 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <utility> - -#include "third_party/blink/renderer/modules/sms/sms_receiver.h" - -#include "third_party/blink/public/common/browser_interface_broker_proxy.h" -#include "third_party/blink/public/mojom/sms/sms_receiver.mojom-blink.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" -#include "third_party/blink/renderer/bindings/modules/v8/v8_sms_receiver_options.h" -#include "third_party/blink/renderer/core/dom/abort_signal.h" -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/core/dom/dom_exception.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/modules/sms/sms.h" -#include "third_party/blink/renderer/modules/sms/sms_metrics.h" -#include "third_party/blink/renderer/platform/bindings/name_client.h" -#include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/heap/persistent.h" -#include "third_party/blink/renderer/platform/wtf/functional.h" - -namespace blink { - -SMSReceiver::SMSReceiver(ExecutionContext* context) - : ExecutionContextClient(context) {} - -SMSReceiver::~SMSReceiver() = default; - -ScriptPromise SMSReceiver::receive(ScriptState* script_state, - const SMSReceiverOptions* options, - ExceptionState& exception_state) { - ExecutionContext* context = ExecutionContext::From(script_state); - DCHECK(context->IsContextThread()); - - LocalFrame* frame = GetFrame(); - if (!frame) { - exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError, - "Script context has shut down."); - return ScriptPromise(); - } - - if (!frame->IsMainFrame() && frame->IsCrossOriginToMainFrame()) { - exception_state.ThrowDOMException( - DOMExceptionCode::kNotAllowedError, - "Must have the same origin as the top-level frame."); - return ScriptPromise(); - } - - if (options->hasSignal() && options->signal()->aborted()) { - RecordSMSOutcome(SMSReceiverOutcome::kAborted, GetDocument()->UkmSourceID(), - GetDocument()->UkmRecorder()); - exception_state.ThrowDOMException(DOMExceptionCode::kAbortError, - "Request has been aborted."); - return ScriptPromise(); - } - - auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - - if (options->hasSignal()) { - options->signal()->AddAlgorithm(WTF::Bind(&SMSReceiver::Abort, - WrapWeakPersistent(this), - WrapPersistent(resolver))); - } - - requests_.insert(resolver); - - // See https://bit.ly/2S0zRAS for task types. - scoped_refptr<base::SingleThreadTaskRunner> task_runner = - GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI); - - if (!service_) { - GetExecutionContext()->GetBrowserInterfaceBroker().GetInterface( - service_.BindNewPipeAndPassReceiver(task_runner)); - service_.set_disconnect_handler(WTF::Bind( - &SMSReceiver::OnSMSReceiverConnectionError, WrapWeakPersistent(this))); - } - - service_->Receive( - WTF::Bind(&SMSReceiver::OnReceive, WrapPersistent(this), - WrapPersistent(resolver), base::TimeTicks::Now())); - - return resolver->Promise(); -} - -void SMSReceiver::Abort(ScriptPromiseResolver* resolver) { - RecordSMSOutcome(SMSReceiverOutcome::kAborted, GetDocument()->UkmSourceID(), - GetDocument()->UkmRecorder()); - service_->Abort(); - - resolver->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError)); - - requests_.erase(resolver); -} - -void SMSReceiver::OnReceive(ScriptPromiseResolver* resolver, - base::TimeTicks start_time, - mojom::blink::SmsStatus status, - const WTF::String& otp, - const WTF::String& sms) { - requests_.erase(resolver); - - ukm::SourceId source_id = GetDocument()->UkmSourceID(); - ukm::UkmRecorder* recorder = GetDocument()->UkmRecorder(); - - if (status == mojom::blink::SmsStatus::kTimeout) { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kTimeoutError, "SMSReceiver timed out.")); - RecordSMSOutcome(SMSReceiverOutcome::kTimeout, source_id, recorder); - return; - } else if (status == mojom::blink::SmsStatus::kCancelled) { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kAbortError, "SMSReceiver was aborted.")); - RecordSMSCancelTime(base::TimeTicks::Now() - start_time); - RecordSMSOutcome(SMSReceiverOutcome::kCancelled, source_id, recorder); - return; - } - - RecordSMSSuccessTime(base::TimeTicks::Now() - start_time); - RecordSMSOutcome(SMSReceiverOutcome::kSuccess, source_id, recorder); - - resolver->Resolve(MakeGarbageCollected<blink::SMS>(sms)); -} - -void SMSReceiver::OnSMSReceiverConnectionError() { - service_.reset(); - for (ScriptPromiseResolver* request : requests_) { - request->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNotFoundError, "SMSReceiver not available.")); - RecordSMSOutcome(SMSReceiverOutcome::kConnectionError, - GetDocument()->UkmSourceID(), - GetDocument()->UkmRecorder()); - } - requests_.clear(); -} - -void SMSReceiver::Trace(Visitor* visitor) { - ScriptWrappable::Trace(visitor); - ExecutionContextClient::Trace(visitor); - visitor->Trace(requests_); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver.h b/third_party/blink/renderer/modules/sms/sms_receiver.h deleted file mode 100644 index 65a535d0..0000000 --- a/third_party/blink/renderer/modules/sms/sms_receiver.h +++ /dev/null
@@ -1,58 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_RECEIVER_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_RECEIVER_H_ - -#include "base/macros.h" -#include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/sms/sms_receiver.mojom-blink.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" -#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/heap/heap_allocator.h" - -namespace blink { - -class SMSReceiverOptions; -class ScriptPromiseResolver; - -class SMSReceiver final : public ScriptWrappable, - public ExecutionContextClient { - USING_GARBAGE_COLLECTED_MIXIN(SMSReceiver); - DEFINE_WRAPPERTYPEINFO(); - - public: - explicit SMSReceiver(ExecutionContext*); - - ~SMSReceiver() override; - - // SMSReceiver IDL interface. - ScriptPromise receive(ScriptState*, - const SMSReceiverOptions*, - ExceptionState&); - - void Trace(Visitor*) override; - - private: - HeapHashSet<Member<ScriptPromiseResolver>> requests_; - - void Abort(ScriptPromiseResolver* resolver); - - void OnReceive(ScriptPromiseResolver* resolver, - base::TimeTicks start_time, - mojom::blink::SmsStatus status, - const WTF::String& otp, - const WTF::String& sms); - - void OnSMSReceiverConnectionError(); - - mojo::Remote<mojom::blink::SmsReceiver> service_; - - DISALLOW_COPY_AND_ASSIGN(SMSReceiver); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_RECEIVER_H_
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver.idl b/third_party/blink/renderer/modules/sms/sms_receiver.idl deleted file mode 100644 index de97504..0000000 --- a/third_party/blink/renderer/modules/sms/sms_receiver.idl +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://github.com/samuelgoto/sms-receiver - -[ - SecureContext, - Exposed=Window, - RuntimeEnabled=SmsReceiver -] interface SMSReceiver { - [CallWith=ScriptState, RaisesException, MeasureAs=SMSReceiverStart] - Promise<SMS> receive(optional SMSReceiverOptions options = {}); -};
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver_options.idl b/third_party/blink/renderer/modules/sms/sms_receiver_options.idl deleted file mode 100644 index c77820d9..0000000 --- a/third_party/blink/renderer/modules/sms/sms_receiver_options.idl +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://github.com/samuelgoto/sms-receiver - -dictionary SMSReceiverOptions { - AbortSignal signal; -};
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 56e35749..b136fb2e 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1444,6 +1444,7 @@ "webrtc/webrtc_video_utils.h", "widget/widget_base.cc", "widget/widget_base.h", + "widget/widget_base_client.h", "windows_keyboard_codes.h", ]
diff --git a/third_party/blink/renderer/platform/bindings/v8_binding.h b/third_party/blink/renderer/platform/bindings/v8_binding.h index c11a8996..ba23a62 100644 --- a/third_party/blink/renderer/platform/bindings/v8_binding.h +++ b/third_party/blink/renderer/platform/bindings/v8_binding.h
@@ -103,6 +103,11 @@ } template <typename CallbackInfo> +inline void V8SetReturnValue(const CallbackInfo& info, uint64_t value) { + info.GetReturnValue().Set(static_cast<double>(value)); +} + +template <typename CallbackInfo> inline void V8SetReturnValueBool(const CallbackInfo& info, bool v) { info.GetReturnValue().Set(v); }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 0b0d7499..ee459895 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -246,7 +246,7 @@ }, { name: "BlockingDownloadsInSandbox", - status: "test", + status: "stable", }, { name: "BlockingFocusWithoutUserActivation", @@ -1740,10 +1740,6 @@ name: "V8IdleTasks", }, { - name: "V8OptimizeWorkersForPerformance", - status: "experimental", - }, - { // Whether a video element should automatically play fullscreen unless // 'playsinline' is set. name: "VideoAutoFullscreen",
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc index 97205f6..e5b50445 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.cc +++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -4,9 +4,11 @@ #include "third_party/blink/renderer/platform/widget/widget_base.h" +#include "third_party/blink/renderer/platform/widget/widget_base_client.h" + namespace blink { -WidgetBase::WidgetBase() = default; +WidgetBase::WidgetBase(WidgetBaseClient* client) : client_(client) {} WidgetBase::~WidgetBase() = default; @@ -24,4 +26,9 @@ return animation_host_; } +void WidgetBase::BeginMainFrame(base::TimeTicks frame_time) { + client_->DispatchRafAlignedInput(frame_time); + client_->BeginMainFrame(frame_time); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h index 5733406..a4bc0c3 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.h +++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_H_ +#include "base/time/time.h" #include "third_party/blink/renderer/platform/platform_export.h" namespace cc { @@ -13,6 +14,7 @@ } // namespace cc namespace blink { +class WidgetBaseClient; // This class is the foundational class for all widgets that blink creates. // (WebPagePopupImpl, WebFrameWidgetBase) will contain an instance of this @@ -21,7 +23,7 @@ // https://docs.google.com/document/d/10uBnSWBaitGsaROOYO155Wb83rjOPtrgrGTrQ_pcssY/edit?ts=5e3b26f7 class PLATFORM_EXPORT WidgetBase { public: - WidgetBase(); + explicit WidgetBase(WidgetBaseClient* client); virtual ~WidgetBase(); // Set the current compositor hosts. @@ -30,10 +32,15 @@ cc::AnimationHost* AnimationHost() const; cc::LayerTreeHost* LayerTreeHost() const; + // Called to update the document lifecycle, advance the state of animations + // and dispatch rAF. + void BeginMainFrame(base::TimeTicks frame_time); + private: // Not owned, they are owned by the RenderWidget. cc::LayerTreeHost* layer_tree_host_ = nullptr; cc::AnimationHost* animation_host_ = nullptr; + WidgetBaseClient* client_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/widget/widget_base_client.h b/third_party/blink/renderer/platform/widget/widget_base_client.h new file mode 100644 index 0000000..ed9fde5a --- /dev/null +++ b/third_party/blink/renderer/platform/widget/widget_base_client.h
@@ -0,0 +1,28 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_ + +#include "base/time/time.h" + +namespace blink { + +// This class is part of the foundation of all widgets. It provides +// callbacks from the compositing infrastructure that the individual widgets +// will need to implement. +class WidgetBaseClient { + public: + // Dispatch any pending input. This method will called before + // dispatching a RequestAnimationFrame to the widget. + virtual void DispatchRafAlignedInput(base::TimeTicks frame_time) = 0; + + // Called to update the document lifecycle, advance the state of animations + // and dispatch rAF. + virtual void BeginMainFrame(base::TimeTicks frame_time) = 0; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set.h b/third_party/blink/renderer/platform/wtf/linked_hash_set.h index a9b8031..257d2d6 100644 --- a/third_party/blink/renderer/platform/wtf/linked_hash_set.h +++ b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
@@ -1088,11 +1088,20 @@ template <typename IncomingValueType> AddResult insert(IncomingValueType&&); + template <typename IncomingValueType> + AddResult AppendOrMoveToLast(IncomingValueType&&); + + template <typename IncomingValueType> + AddResult PrependOrMoveToFirst(IncomingValueType&&); + // TODO(keinakashima): implement functions related to erase // TODO(keinakashima): implement clear (,RemoveAll, Trace) private: + template <typename IncomingValueType> + AddResult InsertOrMoveBefore(const_iterator, IncomingValueType&&); + HashMap<Value, wtf_size_t> value_to_index_; VectorBackedLinkedList<Value> list_; }; @@ -1149,6 +1158,41 @@ return AddResult(stored_position_iterator.Get(), false); } +template <typename T> +template <typename IncomingValueType> +typename NewLinkedHashSet<T>::AddResult NewLinkedHashSet<T>::AppendOrMoveToLast( + IncomingValueType&& value) { + return InsertOrMoveBefore(end(), std::forward<IncomingValueType>(value)); +} + +template <typename T> +template <typename IncomingValueType> +typename NewLinkedHashSet<T>::AddResult +NewLinkedHashSet<T>::PrependOrMoveToFirst(IncomingValueType&& value) { + return InsertOrMoveBefore(begin(), std::forward<IncomingValueType>(value)); +} + +template <typename T> +template <typename IncomingValueType> +typename NewLinkedHashSet<T>::AddResult NewLinkedHashSet<T>::InsertOrMoveBefore( + const_iterator position, + IncomingValueType&& value) { + typename Map::AddResult result = value_to_index_.insert(value, kNotFound); + + if (result.is_new_entry) { + const_iterator stored_position_iterator = + list_.insert(position, std::forward<IncomingValueType>(value)); + result.stored_value->value = stored_position_iterator.GetIndex(); + return AddResult(stored_position_iterator.Get(), true); + } + + const_iterator stored_position_iterator = + list_.MakeConstIterator(result.stored_value->value); + const_iterator moved_position_iterator = + list_.MoveTo(stored_position_iterator, position); + return AddResult(moved_position_iterator.Get(), false); +} + } // namespace WTF using WTF::LinkedHashSet;
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc b/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc index 0506316..905f96f 100644 --- a/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc +++ b/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc
@@ -54,4 +54,58 @@ EXPECT_TRUE(it == set.end()); } +TEST(NewLinkedHashSetTest, AppendOrMoveToLast) { + using Set = NewLinkedHashSet<int>; + Set set; + Set::AddResult result = set.AppendOrMoveToLast(1); + EXPECT_TRUE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 1); + + result = set.AppendOrMoveToLast(2); + EXPECT_TRUE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 2); + + result = set.AppendOrMoveToLast(1); + EXPECT_FALSE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 1); + + result = set.AppendOrMoveToLast(3); + EXPECT_TRUE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 3); + + Set::const_iterator it = set.begin(); + EXPECT_EQ(*it, 2); + ++it; + EXPECT_EQ(*it, 1); + ++it; + EXPECT_EQ(*it, 3); +} + +TEST(NewLinkedHashSetTest, PrependOrMoveToFirst) { + using Set = NewLinkedHashSet<int>; + Set set; + Set::AddResult result = set.PrependOrMoveToFirst(1); + EXPECT_TRUE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 1); + + result = set.PrependOrMoveToFirst(2); + EXPECT_TRUE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 2); + + result = set.PrependOrMoveToFirst(1); + EXPECT_FALSE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 1); + + result = set.PrependOrMoveToFirst(3); + EXPECT_TRUE(result.is_new_entry); + EXPECT_EQ(*result.stored_value, 3); + + Set::const_iterator it = set.begin(); + EXPECT_EQ(*it, 3); + ++it; + EXPECT_EQ(*it, 1); + ++it; + EXPECT_EQ(*it, 2); +} + } // namespace WTF
diff --git a/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h b/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h index e87d48c..91cbb31 100644 --- a/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h +++ b/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
@@ -127,7 +127,7 @@ // Moves |target| right before |new_position| in a linked list. This operation // is executed by just updating indices of related nodes. - void MoveTo(const_iterator target, const_iterator new_position); + iterator MoveTo(const_iterator target, const_iterator new_position); iterator erase(const_iterator); @@ -472,21 +472,23 @@ } template <typename T> -void VectorBackedLinkedList<T>::MoveTo(const_iterator target, - const_iterator new_position) { +typename VectorBackedLinkedList<T>::iterator VectorBackedLinkedList<T>::MoveTo( + const_iterator target, + const_iterator new_position) { DCHECK(target != end()); RegisterModification(); - if (target == new_position) - return; wtf_size_t target_index = target.GetIndex(); + if (target == new_position) + return MakeIterator(target_index); + Node& target_node = nodes_[target_index]; wtf_size_t new_position_index = new_position.GetIndex(); Node& new_position_node = nodes_[new_position_index]; wtf_size_t prev_index = new_position_node.prev_index_; if (prev_index == target_index) - return; + return MakeIterator(target_index); Unlink(target_node); @@ -494,6 +496,7 @@ new_position_node.prev_index_ = target_index; target_node.prev_index_ = prev_index; target_node.next_index_ = new_position_index; + return MakeIterator(target_index); } template <typename T>
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item index d87ac39..2a05d2ee6 100644 --- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item +++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -1007,253 +1007,7 @@ crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Failure ] crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Failure ] crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Failure Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-001.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-003.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-004.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-005.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure ] -crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multcol-gap-000.xht [ Crash Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-002.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-003.html [ Failure ] -crbug.com/481431 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ] -crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-005.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-002.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-003.html [ Failure ] -crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-004.html [ Failure ] -crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-005.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-000.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-002.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-000.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-fraction-002.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-list-item-001.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-margin-002.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-column-rule-001.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-000.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-000.xht [ Failure ] -crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure ] -crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-px-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-shorthand-001.xht [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-000.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-002.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-003.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-004.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-007.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-005.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-in-inline.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-2.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-3.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-line-overflow.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/basic-rtl.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer.html [ Failure ] -crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/change-height.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/column-break-with-balancing.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-count-with-rules.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-rules.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/columns-shorthand-parsing.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-inner-multicol.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-clipped.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-in-clipped.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-overlapping-will-change.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-resize.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-child-layer-in-next-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-display.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-into-content.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-content.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-spanner-before-content.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-after-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-before-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-spanner-in-content.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-becomes-regular-block.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset-complex-tree.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/filter-in-second-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/fixedpos-child-becomes-static.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-avoidance.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-big-line.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-break.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-content-break.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-edge.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-paginate.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-truncation.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-too-short-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/inline-block-baseline.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inline-getclientrects.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inner-multicol-in-second-column.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/layers-in-multicol.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/line-in-next-row-in-fourth-inner-multicol.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-pushed-down-by-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-too-tall-for-second-outer-row.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-3-multicols-fixed-height.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-extra-block-inbetween.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks-2.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-with-strut-before-first-line.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-fixed-height-with-struts.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-outer-fixed-height.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-clipped-first-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-padding.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-empty-block.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-tall-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/break-before.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance-2.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/list-item.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/orphans-and-widows-balance.html [ Failure ] -crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/newmulticol/regular-block-becomes-multicol.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-at-boundary.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-small-on-line-at-boundary.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/nested-multicol.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/outlines-at-column-boundaries.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-across-columns.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-content.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-unsplittable.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/paginate-block-replaced.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/positive-leading.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/pushed-line-affected-by-float.html [ Failure ] -crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/regular-block-becomes-multicol.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/relayout-and-push-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/relpos-inside-inline-block.html [ Failure ] -crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/scale-transform-text.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/scrollable-basic.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/shadow-breaking.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/single-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/after-float.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/as-inner-multicol.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-exact-fit.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-extra-height.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-some-extra-height.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-and-after-spanner.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-spanner-extra-height.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-exact-fit.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-extra-height.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/height-increase.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-hard-breaks.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-soft-breaks-inside.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/inside-block-with-fixed-height.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-abspos.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-transform.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/list-multi-column-crash.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/overflow-on-multicol.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/remaining-space-in-last-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/span-between-text.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-img.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-last.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-with-margin.html [ Pass ] -crbug.com/824918 virtual/layout_ng_block_frag/fast/multicol/span/trailing-margin-around-spanner.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/two-rows-then-spanner-then-two-rows.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-rl.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/svg-change-column-crash.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/table-cell-content-change.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/table-multicolumn-caption.html [ Failure ] -crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/tall-float2.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unsplittable-inline-block.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-rules.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-avoidance.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-big-line.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-break.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-content-break.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-edge.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-paginate.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-truncation.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/abspos-auto-position-on-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/column-break-with-balancing.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-big-line.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/unsplittable-inline-block.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/widows.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/auto-scrollbar-shrink-to-fit.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/block-after-float-first-child.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-inline-float.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-line-float.html [ Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/forced-break-clearance-unsplittable-content.html [ Failure ] -crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/transformed-clip-before-second-column.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Failure ] -crbug.com/982194 virtual/layout_ng_block_frag/printing/setPrinting.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/* [ Skip ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Failure ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Failure ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-006.html [ Failure ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index de273b6..c744a1a 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -74,10 +74,6 @@ [ Mac ] fast/forms/calendar-picker/month-open-picker-with-f4-key.html [ Skip ] [ Mac ] fast/forms/calendar-picker/week-open-picker-with-f4-key.html [ Skip ] -# These tests are specific to Windows. -crbug.com/1012590 [ Mac ] fast/overflow/rtl-scrollbar-drag-origin.html [ Skip ] -crbug.com/1012590 [ Linux ] fast/overflow/rtl-scrollbar-drag-origin.html [ Skip ] - # Mac does not have menu key. [ Mac ] editing/spelling/spelling-on-context-menu-key.html [ Skip ] [ Mac ] fast/events/context-menu-key-shift-f10-modifiers.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 4f952fc..090dd6d8 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -373,6 +373,11 @@ crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-png.html [ Failure ] crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-svg.html [ Failure ] +# Failures due to pointerMove building synthetic events without button information (main thread only). +crbug.com/1056778 virtual/scroll_customization/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html [ Failure ] +crbug.com/1056778 fast/scrolling/scrollbars/scrollbar-thumb-snapping.html [ Failure ] +crbug.com/1056778 virtual/percent-based-scrolling/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html [ Failure ] + # Most of these fail due to subpixel differences, but a couple are real failures. crbug.com/1044742 [ Win ] external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-animation.html [ Failure ] crbug.com/1044742 [ Mac ] external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-animation.html [ Failure ] @@ -1396,6 +1401,36 @@ crbug.com/829804 virtual/layout_ng_block_frag/printing/webgl-oversized-printing.html [ Skip ] virtual/layout_ng_block_frag/fragmentation/scrolling-contents-scroll.html [ Crash Failure ] +### With LayoutNGBlockFragmentation and LayoutNGFragmentItem enabled: +crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-005.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-in-clipped.html [ Failure ] +crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ] +crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/float-truncation.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/paginate-block-replaced.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/relpos-inside-inline-block.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/table-multicolumn-caption.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-becomes-regular-block.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/height-increase.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/remaining-space-in-last-column.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Failure ] +crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-truncation.html [ Failure ] +crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ] +crbug.com/829028 virtual/layout_ng_block_frag/fragmentation/transformed-clip-before-second-column.html [ Failure ] + ### With LayoutNGFragmentTraversal (and LayoutNGFragmentItem) enabled: crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/CSS2/floats/float-nowrap-3-ref.html [ Crash ] @@ -1800,6 +1835,9 @@ crbug.com/1054509 external/wpt/css/css-transitions/non-rendered-element-004.tentative.html [ Skip ] +crbug.com/1058822 virtual/dark-color-scheme/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html [ Failure ] +crbug.com/1058822 virtual/dark-color-scheme/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html [ Failure ] + # ====== Style team owned tests to here ====== # ====== OOPIF-mode failures from here ====== @@ -4667,9 +4705,6 @@ crbug.com/678493 http/tests/permissions/chromium/test-request-window.html [ Timeout Pass ] crbug.com/678499 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ] -# Also crbug.com/1044496 -crbug.com/747751 [ Win ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Failure Pass Timeout ] - crbug.com/747751 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Pass Timeout ] crbug.com/689781 external/wpt/media-source/mediasource-duration.html [ Failure Pass ] @@ -5257,10 +5292,6 @@ crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Failure Timeout ] crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Pass Failure Timeout ] -# Origin Policy: Skip tests that rely on --feature-enabled=OriginPolicy, so -# they can be run via virtual/origin-policy instead. -crbug.com/751996 external/wpt/origin-policy/* [ Skip ] - crbug.com/854538 [ Win7 ] http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html [ Skip ] # Sheriff 2018-06-21 @@ -5683,7 +5714,6 @@ crbug.com/946699 [ Release ] http/tests/devtools/network/network-filter-service-worker.js [ Pass Timeout ] crbug.com/946711 [ Release ] http/tests/devtools/editor/text-editor-search-switch-editor.js [ Crash Pass Timeout ] crbug.com/946712 [ Release ] http/tests/devtools/elements/styles-2/paste-property.js [ Crash Pass Timeout ] -crbug.com/946713 [ Release ] http/tests/devtools/extensions/extensions-resources.js [ Crash Pass Timeout ] crbug.com/848799 [ Win7 ] http/tests/devtools/coverage/multiple-instances-merge.js [ Pass Timeout ] crbug.com/947383 inspector-protocol/css/reattach-after-editing-styles.js [ Pass Timeout ] @@ -6190,8 +6220,6 @@ # Sheriff 2019-12-02 crbug.com/1029528 [ Linux ] http/tests/devtools/network/oopif-content.js [ Pass Failure ] -crbug.com/1028477 [ Mac ] http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js [ Pass Timeout ] -crbug.com/1028477 [ Win ] http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js [ Pass Timeout ] crbug.com/833100 [ Mac ] external/wpt/battery-status/battery-full-manual.https.html [ Pass Failure ] @@ -6221,7 +6249,6 @@ crbug.com/1029489 http/tests/devtools/elements/elements-linkify-attributes.js [ Pass Failure Timeout ] crbug.com/1029521 virtual/threaded/external/wpt/web-animations/timing-model/animations/updating-the-finished-state.html [ Pass Failure Timeout ] crbug.com/1030258 http/tests/devtools/network/network-cookies-pane.js [ Pass Failure ] -crbug.com/1035309 http/tests/devtools/throttling/mobile-throttling.js [ Pass Failure ] # Enable scroll-snap tests on impl thread # These are currently failing on Mac which needs more investigation, snap-scrolls-visual-viewport seems flaky @@ -6342,7 +6369,6 @@ crbug.com/1042694 fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Pass Timeout ] crbug.com/1042689 [ Linux ] http/tests/devtools/coverage/gutter-css.js [ Pass Timeout ] crbug.com/1042689 [ Win ] http/tests/devtools/coverage/gutter-css.js [ Pass Timeout ] -crbug.com/1042688 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Pass Timeout ] # Sheriff 2020-01-20 crbug.com/1043357 http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html [ Pass Timeout Failure ] @@ -6430,7 +6456,6 @@ crbug.com/1044429 [ Release ] http/tests/devtools/oopif/oopif-navigator.js [ Pass Timeout ] crbug.com/1044430 [ Release ] http/tests/devtools/elements/elements-panel-styles.js [ Pass Timeout ] crbug.com/1044433 [ Release ] http/tests/devtools/editor/text-editor-search-replace.js [ Pass Timeout ] -crbug.com/1044454 [ Release ] http/tests/devtools/changes/changes-highlighter.js [ Pass Timeout ] crbug.com/1044459 [ Release ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Pass Timeout ] crbug.com/1044505 http/tests/devtools/tracing-session-id.js [ Pass Failure Timeout ] crbug.com/1044506 [ Release Win ] http/tests/devtools/tracing-model-storage.js [ Pass Timeout ] @@ -6456,8 +6481,6 @@ crbug.com/1043847 [ Release Win ] virtual/threaded/fast/scroll-snap/snaps-for-different-key-granularity.html [ Pass Timeout ] crbug.com/1043901 [ Release Win ] external/wpt/preload/preload-with-type.html [ Pass Timeout ] crbug.com/1044569 [ Release Linux ] virtual/audio-service/media/controls/doubletap-to-jump-backwards.html [ Pass Failure ] -crbug.com/1044496 [ Release Mac ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Pass Timeout ] -crbug.com/1044496 [ Release Linux ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Pass Timeout ] crbug.com/1044418 [ Release Mac ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass Timeout ] crbug.com/1045472 external/wpt/WebCryptoAPI/wrapKey_unwrapKey/test_wrapKey_unwrapKey.https.html [ Pass Failure ] @@ -6470,20 +6493,17 @@ crbug.com/1045329 external/wpt/animation-worklet/idlharness.any.worker.html [ Pass Timeout ] crbug.com/1045329 virtual/threaded/external/wpt/animation-worklet/idlharness.any.worker.html [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/elements/event-listeners-framework-with-service-worker.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/styles-4/styles-formatting.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/search/search-in-sourcemap.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/animation/animation-after-navigation.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/search/search-in-script.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/appcache/appcache-iframe-manifests.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/fragment.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/coverage/coverage-view.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/editor/text-editor-toggle-tab-moves-focus.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/edit/set-outer-html-body.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Pass Timeout ] @@ -6504,20 +6524,16 @@ crbug.com/1046784 http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/editor/text-editor-block-indent.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/edit/set-outer-html.js [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/search/source-frame-replace-3.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/editor/text-editor-reveal-line.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/network/failed-request-response-mimetype.js [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/search/source-frame-replace-4.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/elements/selected-element-changes-execution-context.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/filtered-item-selection-dialog-rendering.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/coverage/reveal-autoformat.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/file-system-project.js [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/search/source-frame-replace-1.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/forced-layout-in-microtask.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Pass Timeout ] -crbug.com/1046784 http/tests/devtools/application-panel/resources-panel-on-navigation.js [ Pass Timeout ] crbug.com/1046784 http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Pass Timeout ] # Sheriff 2020-01-28 @@ -7025,3 +7041,10 @@ crbug.com/1061131 [ Linux ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-with-scroll-timeline.https.html [ Pass Crash ] crbug.com/1061131 [ Linux ] virtual/threaded-prefer-compositing/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Pass Failure Timeout ] crbug.com/1061131 [ Mac ] virtual/threaded/external/wpt/scroll-animations/two-animations-attach-to-same-scroll-timeline-cancel-one.html [ Pass Failure ] + +# Sheriff 2020-03-13 +crbug.com/1061159 [ Fuchsia ] fast/inspector-support/cssURLQuotes.html [ Pass Failure ] +crbug.com/1061118 fast/loader/subframe-removes-itself.html [ Pass Failure ] +crbug.com/1061043 fast/plugins/keypress-event.html [ Pass Failure ] +crbug.com/1061328 http/tests/loading/onreadystatechange-detach.html [ Pass Failure ] +crbug.com/1061097 http/tests/security/promise-access-control-allow.htm [ Pass Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index bbca432..7df1e1d 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -194,7 +194,7 @@ "fast/multicol", "fragmentation", "printing"], - "args": ["--enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset"] + "args": ["--enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset,LayoutNGFragmentItem"] }, { "prefix": "layout_ng_fragment_traversal",
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json index d3d60d2..e9d9cb3 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
@@ -163222,6 +163222,9 @@ "fonts/math/largeop-displayoperatorminheight5000.woff": [ [] ], + "fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff": [ + [] + ], "fonts/math/limits-lowerlimitbaselinedropmin3000.woff": [ [] ], @@ -499168,6 +499171,10 @@ "53fcc13a1603621c0985dd8ea8d956fd01c974f4", "support" ], + "fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff": [ + "601a424a94b3090c1a1796c18f6557abe716c5d0", + "support" + ], "fonts/math/limits-lowerlimitbaselinedropmin3000.woff": [ "76395db141ced4560ed7164c6f09bf50fe771d3d", "support" @@ -524733,7 +524740,7 @@ "testharness" ], "lint.whitelist": [ - "99a6309956e807a4459d36b94fe13574688d6c67", + "65494c70cfbf446011b404b5b657564b2ec61e35", "support" ], "loading/preloader-css-import-no-quote.tentative.html": [ @@ -525417,7 +525424,7 @@ "testharness" ], "mathml/presentation-markup/scripts/subsup-parameters-2.html": [ - "da7574ac4d0db19cd3174f42be161fbf6d7490bb", + "021512f940f97b7d8071b754ec2775a2c9c9868f", "testharness" ], "mathml/presentation-markup/scripts/underover-1.html": [ @@ -526169,7 +526176,7 @@ "support" ], "mathml/tools/largeop.py": [ - "73d967689bb7dc1101632a883aa08059bf5d7979", + "58ce7aebcf415eed9f5b161dc869dedc0d3e3e61", "support" ], "mathml/tools/limits.py": [ @@ -526225,7 +526232,7 @@ "support" ], "mathml/tools/utils/mathfont.py": [ - "7664c6d2434406090020f20e9ec35e513d0390c6", + "53633c915047413b2a4651ad215f559068bdeb91", "support" ], "mathml/tools/utils/misc.py": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html new file mode 100644 index 0000000..26c5819 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html
@@ -0,0 +1,20 @@ +<!doctype html> +<title>CSS Color Adjustment Test: iframe element with light color-scheme, frame document with dark color-scheme, :root background with alpha</title> +<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect"> +<link rel="match" href="support/dark-frame-alpha.html"> +<link rel="stylesheet" href="support/assert-preferred-dark.css"> +<style> + html, body { + margin: 0; + height: 100%; + } + iframe { + margin: 0; + border: 0; + padding: 0; + width: 100%; + height: 100%; + display: block; + } +</style> +<iframe src="support/dark-frame-alpha.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html new file mode 100644 index 0000000..9e39c0b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html
@@ -0,0 +1,20 @@ +<!doctype html> +<title>CSS Color Adjustment Test: Frames with a dark color-scheme should get an opaque background when embedding element and embedded root color-schemes do not match</title> +<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect"> +<link rel="match" href="support/dark-frame-opaque.html"> +<link rel="stylesheet" href="support/assert-preferred-dark.css"> +<style> + html, body { + margin: 0; + height: 100%; + } + iframe { + margin: 0; + border: 0; + padding: 0; + width: 100%; + height: 100%; + display: block; + } +</style> +<iframe src="support/dark-frame-opaque.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html index ee0f006b..591044f 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html
@@ -1,6 +1,6 @@ <!doctype html> -<title>CSS Color Adjustment Test: Frames with a dark color-scheme should still be transparent</title> -<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-processing"> +<title>CSS Color Adjustment Test: Frames with a dark color-scheme should still be transparent when embedding element and embedded root color-schemes match</title> +<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect"> <link rel="match" href="color-scheme-iframe-background-ref.html"> <link rel="stylesheet" href="support/assert-preferred-dark.css"> -<iframe width="600" height="400" src="support/dark-frame.html"></iframe> +<iframe width="600" height="400" style="color-scheme:dark" src="support/dark-frame.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-alpha.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-alpha.html new file mode 100644 index 0000000..cb5e6d6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-alpha.html
@@ -0,0 +1,9 @@ +<!doctype html> +<style> + :root { + color-scheme: dark; + background-color: rgba(0, 128, 0, 0.5); + } + p { color: lime } +</style> +<p>This text should be lime and the background should be green blended with a dark canvas.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-opaque.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-opaque.html new file mode 100644 index 0000000..ca845ea --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-opaque.html
@@ -0,0 +1,6 @@ +<!doctype html> +<style> + :root { color-scheme: dark } + p { color: green } +</style> +<p>This text should be green and the background should be dark opaque.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html index 4e35eaf..c09c404 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html
@@ -23,7 +23,7 @@ { syntax: '<number>', specified: assert_is_equal_with_range_handling, - computed: (_, result) => assert_is_unit('px', result) + computed: (_, result) => assert_is_unit('number', result) }, { syntax: '<percentage>',
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff b/third_party/blink/web_tests/external/wpt/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff new file mode 100644 index 0000000..601a424a94 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html index da7574a..021512f 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
@@ -20,6 +20,10 @@ font-family: largeop-displayoperatorminheight2000-2AFF-italiccorrection3000; src: url("/fonts/math/largeop-displayoperatorminheight2000-2AFF-italiccorrection3000.woff"); } + @font-face { + font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000; + src: url("/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff"); + } </style> <script> function getBox(aId) { @@ -38,6 +42,7 @@ - In mmultiscripts, prescript pairs are vertically aligned. */ var epsilon = 1; + var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000 function runTests() { test(function() { assert_true(MathMLFeatureDetection.has_mspace()); @@ -52,14 +57,23 @@ test(function() { assert_true(MathMLFeatureDetection.has_mspace()); - var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000 var v = 3000 * emToPx; assert_approx_equals(getBox("base011").right - getBox("sub011").left, v, epsilon, "msub"); assert_approx_equals(getBox("sup012").left, getBox("base012").right, epsilon, "msup"); assert_approx_equals(getBox("sup013").left - getBox("sub013").left, v, epsilon, "msubsup"); assert_approx_equals(getBox("sup014").left - getBox("sub014").left, v, epsilon, "mmultiscripts postscripts"); assert_approx_equals(getBox("sup015").left - getBox("sub015").left, 0, epsilon, "mmultiscripts prescripts"); - }, "NonNull Italic Correction"); + }, "NonNull Italic Correction (MathGlyphVariantRecord)"); + test(function() { + assert_true(MathMLFeatureDetection.has_mspace()); + + var v = 5000 * emToPx; + assert_approx_equals(getBox("base021").right - getBox("sub021").left, v, epsilon, "msub"); + assert_approx_equals(getBox("sup022").left, getBox("base022").right, epsilon, "msup"); + assert_approx_equals(getBox("sup023").left - getBox("sub023").left, v, epsilon, "msubsup"); + assert_approx_equals(getBox("sup024").left - getBox("sub024").left, v, epsilon, "mmultiscripts postscripts"); + assert_approx_equals(getBox("sup025").left - getBox("sub025").left, 0, epsilon, "mmultiscripts prescripts"); + }, "NonNull Italic Correction (GlyphAssembly)"); done(); } </script> @@ -98,7 +112,7 @@ </mmultiscripts> </math> </p> - <h2>NonNull Italic Correction</h2> + <h2>NonNull Italic Correction (MathGlyphVariantRecord)</h2> <p> <math displaystyle="true" style="font-family: largeop-displayoperatorminheight2000-2AFF-italiccorrection3000;"> <msub> @@ -130,5 +144,37 @@ </mmultiscripts> </math> </p> + <h2>NonNull Italic Correction (GlyphAssembly)</h2> + <p> + <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;"> + <msub> + <mo id="base021" lspace="0px" rspace="0px">⫿</mo> + <mspace id="sub021" height="1em" width="1em" style="background: blue"/> + </msub> + </math> + <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;"> + <msup> + <mo id="base022" lspace="0px" rspace="0px">⫿</mo> + <mspace id="sup022" height="1em" width="1em" style="background: blue"/> + </msup> + </math> + <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;"> + <msubsup> + <mo lspace="0px" rspace="0px">⫿</mo> + <mspace id="sub023" height="1em" width="1em" style="background: blue"/> + <mspace id="sup023" height="1em" width="1em" style="background: green"/> + </msubsup> + </math> + <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;"> + <mmultiscripts> + <mo lspace="0px" rspace="0px">⫿</mo> + <mspace id="sub024" height="1em" width="1em" style="background: blue"/> + <mspace id="sup024" height="1em" width="1em" style="background: green"/> + <mprescripts/> + <mspace id="sub025" height="1em" width="1em" style="background: magenta"/> + <mspace id="sup025" height="1em" width="1em" style="background: cyan"/> + </mmultiscripts> + </math> + </p> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py b/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py index 73d967689..58ce7ae 100755 --- a/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py +++ b/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py
@@ -30,3 +30,34 @@ g.italicCorrection = v2 f[nAryWhiteVerticalBarCodePoint].verticalVariants = "uni2AFF uni2AFF.display" mathfont.save(f) + +v1 = 7 * mathfont.em +v2 = 5 * mathfont.em +f = mathfont.create("largeop-displayoperatorminheight%d-2AFF-italiccorrection%d" % (v1, v2)) +f.copyright = "Copyright (c) 2020 Igalia S.L." +f.math.DisplayOperatorMinHeight = v1 +f.math.MinConnectorOverlap = 0 +mathfont.createSquareGlyph(f, nAryWhiteVerticalBarCodePoint) +g = f.createChar(-1, "uni2AFF.bot") +mathfont.drawRectangleGlyph(g, + width = 2 * mathfont.em, + ascent = mathfont.em) +g = f.createChar(-1, "uni2AFF.ext") +mathfont.drawRectangleGlyph(g, + width = mathfont.em, + ascent = 2 * mathfont.em, + padding_left = mathfont.em) +g = f.createChar(-1, "uni2AFF.top") +mathfont.drawRectangleGlyph(g, + width = v2 + mathfont.em, + ascent = mathfont.em, + padding_left = mathfont.em) +f[nAryWhiteVerticalBarCodePoint].verticalVariants = "uni2AFF" +# Part: (glyphName, isExtender, startConnector, endConnector, fullAdvance) +f[nAryWhiteVerticalBarCodePoint].verticalComponents = \ + (("uni2AFF.bot", False, 0, mathfont.em / 2, mathfont.em), + ("uni2AFF.ext", True, mathfont.em / 2, mathfont.em / 2, 2 * mathfont.em), + ("uni2AFF.top", False, mathfont.em / 2, 0, mathfont.em) + ); +f[nAryWhiteVerticalBarCodePoint].verticalComponentItalicCorrection = v2 +mathfont.save(f)
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py b/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py index 7664c6d..53633c91 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py +++ b/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py
@@ -27,14 +27,14 @@ mathFont[ord(" ")].verticalVariants = "space" return mathFont -def drawRectangleGlyph(aGlyph, aWidth, aAscent, aDescent): - p = aGlyph.glyphPen() - p.moveTo(0, -aDescent) - p.lineTo(0, aAscent) - p.lineTo(aWidth, aAscent) - p.lineTo(aWidth, -aDescent) +def drawRectangleGlyph(glyph, width, ascent, descent = 0, padding_left = 0): + p = glyph.glyphPen() + p.moveTo(padding_left, -descent) + p.lineTo(padding_left, ascent) + p.lineTo(padding_left + width, ascent) + p.lineTo(padding_left + width, -descent) p.closePath(); - aGlyph.width = aWidth + glyph.width = padding_left + width def createSquareGlyph(aFont, aCodePoint): g = aFont.createChar(aCodePoint)
diff --git a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-404.https.html b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-404.https.html similarity index 64% rename from third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-404.https.html rename to third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-404.https.html index be738cc..51436be6 100644 --- a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-404.https.html +++ b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-404.https.html
@@ -1,6 +1,6 @@ <!DOCTYPE HTML> <meta charset="utf-8"> -<title>Missing manifest file.</title> +<title>Origin policy manifests delivered with a 404 status code must be ignored</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../resources/origin-policy-test-runner.js"></script> @@ -9,9 +9,9 @@ <script> "use strict"; -<!-- Manifests delivered with 404 status code must be ignored. --> runTestsInSubframe({ hostname: "op99", - testJS: "resources/allow-unsafe-eval.mjs" + testJS: "../content-security/resources/allow-unsafe-eval.mjs", + expectedIds: [] }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-mimetype.https.html b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-mimetype.https.html similarity index 64% rename from third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-mimetype.https.html rename to third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-mimetype.https.html index 1a45077..5231a43 100644 --- a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-mimetype.https.html +++ b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-mimetype.https.html
@@ -1,6 +1,6 @@ <!DOCTYPE HTML> <meta charset="utf-8"> -<title>Valid "content_security/policies" member must be ignored</title> +<title>Origin policy manifests served with the wrong MIME type must be ignored</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../resources/origin-policy-test-runner.js"></script> @@ -11,6 +11,7 @@ "use strict"; runTestsInSubframe({ hostname: "op100", - testJS: "resources/allow-unsafe-eval.mjs" + testJS: "../content-security/resources/allow-unsafe-eval.mjs", + expectedIds: [] }); </script>
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt similarity index 100% rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt rename to third_party/blink/web_tests/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt similarity index 100% rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt rename to third_party/blink/web_tests/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt similarity index 100% rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt rename to third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt similarity index 100% rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt rename to third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.worker-expected.txt similarity index 100% rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.worker-expected.txt rename to third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.worker-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/sms_mock.js b/third_party/blink/web_tests/external/wpt/resources/chromium/sms_mock.js deleted file mode 100644 index 13d12da..0000000 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/sms_mock.js +++ /dev/null
@@ -1,52 +0,0 @@ -'use strict'; - -const SmsProvider = (() => { - - class MockSmsReceiver { - - constructor() { - this.mojoReceiver_ = new blink.mojom.SmsReceiverReceiver(this); - - this.interceptor_ = - new MojoInterfaceInterceptor(blink.mojom.SmsReceiver.$interfaceName); - - this.interceptor_.oninterfacerequest = (e) => { - this.mojoReceiver_.$.bindHandle(e.handle); - } - this.interceptor_.start(); - - this.returnValues_ = {}; - } - - async receive() { - let call = this.returnValues_.receive ? - this.returnValues_.receive.shift() : null; - if (!call) - return; - return call(); - } - - async abort() {} - - pushReturnValuesForTesting(callName, value) { - this.returnValues_[callName] = this.returnValues_[callName] || []; - this.returnValues_[callName].push(value); - return this; - } - - } - - const mockSmsReceiver = new MockSmsReceiver(); - - class SmsProviderChromium { - constructor() { - Object.freeze(this); // Make it immutable. - } - - pushReturnValuesForTesting(callName, callback) { - mockSmsReceiver.pushReturnValuesForTesting(callName, callback); - } - } - - return SmsProviderChromium; -})();
diff --git a/third_party/blink/web_tests/external/wpt/sms/README.md b/third_party/blink/web_tests/external/wpt/sms/README.md deleted file mode 100644 index 1f34178..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/README.md +++ /dev/null
@@ -1,3 +0,0 @@ -# SMS Receiver API - -This directory contains tests for the SMS Receiver API. For more details, refer to [this README file](https://cs.chromium.org/chromium/src/content/browser/sms/README.md).
diff --git a/third_party/blink/web_tests/external/wpt/sms/detached-iframe.https.html b/third_party/blink/web_tests/external/wpt/sms/detached-iframe.https.html deleted file mode 100644 index bde6e25b..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/detached-iframe.https.html +++ /dev/null
@@ -1,24 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>sms on DOMWindow of detached iframe</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> -<iframe id="iframe"></iframe> -<script> -'use strict'; - -promise_test(async t => { - const iframe = document.getElementById('iframe'); - const smsReceiver = iframe.contentWindow.navigator.sms; - iframe.parentNode.removeChild(iframe); - - try { - await smsReceiver.receive(); - assert_unreached('Expected NotSupportedError to be thrown.'); - } catch (error) { - assert_equals(error.name, 'NotSupportedError'); - } -}, 'Return error when frame is inaccessible'); - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/sms/idlharness.https.any.js b/third_party/blink/web_tests/external/wpt/sms/idlharness.https.any.js deleted file mode 100644 index 0c31744..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/idlharness.https.any.js +++ /dev/null
@@ -1,30 +0,0 @@ -// META: script=/resources/WebIDLParser.js -// META: script=/resources/idlharness.js - -// https://github.com/samuelgoto/sms-receiver - -'use strict'; - -promise_test(async (t) => { - const srcs = ['./sms_receiver.idl', - '/interfaces/dom.idl', - '/interfaces/html.idl']; - - const [sms, dom, html] = await Promise.all( - srcs.map(i => fetch(i).then(r => r.text())) - ); - - const idl_array = new IdlArray(); - idl_array.add_idls(sms); - idl_array.add_dependency_idls(dom); - idl_array.add_dependency_idls(html); - - idl_array.add_objects({ - SmsReceiver: ['navigator.sms'], - }); - - idl_array.add_objects({ Navigator: ['navigator'] }) - - idl_array.test(); -}, 'Test IDL implementation of the SMS Receiver API'); -
diff --git a/third_party/blink/web_tests/external/wpt/sms/interceptor.https.html b/third_party/blink/web_tests/external/wpt/sms/interceptor.https.html deleted file mode 100644 index 6dff7903..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/interceptor.https.html +++ /dev/null
@@ -1,134 +0,0 @@ -<!DOCTYPE html> -<link rel="help" href="https://github.com/samuelgoto/sms-receiver"> -<title>Tests the SMS Receiver API</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<!-- - sms_provider.js is a testing framework that enables engines to test the sms - receiver API by intercepting the connection between the browser and the - underlying operating system and mock its behavior. - - Usage: - - 1) Include <script src="./resources/helper.js"></script> in your test. - 2) Set expectations - await expect(receive).andReturn(() => { - // mock behavior - }) - 3) Call navigator.sms.receive() - 4) Verify results - - The mocking API is browser agnostic and is designed such that other engines - could implement it too. - - Here are the symbols that are exposed to tests that need to be implemented - per engine: - - - function receive(): the main/only function that can be mocked. - - function expect(): the main/only function that enables us to mock it. - - enum State {kSuccess, kTimeout}: allows you to mock success/failures. - - --> -<script src="./resources/helper.js"></script> -<script> -'use strict'; - -promise_test(async t => { - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kSuccess, - message: "hello", - }); - }); - - let sms = await navigator.sms.receive(); - - assert_equals(sms.content, "hello"); -}, 'Basic usage'); - -promise_test(async t => { - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kSuccess, - message: "hello1", - }); - }); - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kSuccess, - message: "hello2", - }); - }); - - let sms1 = navigator.sms.receive(); - let sms2 = navigator.sms.receive(); - - let msg2 = await sms2; - let msg1 = await sms1; - - assert_equals(msg1.content, "hello1"); - assert_equals(msg2.content, "hello2"); -}, 'Handle multiple requests in different order.'); - -promise_test(async t => { - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kCancelled, - }); - }); - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kSuccess, - message: "success", - }); - }); - - let cancelled_sms = navigator.sms.receive(); - let successful_sms = navigator.sms.receive(); - - let successful_msg = await successful_sms; - assert_equals(successful_msg.content, "success"); - - try { - await cancelled_sms; - assert_unreached('Expected AbortError to be thrown.'); - } catch (error) { - assert_equals(error.name, "AbortError"); - assert_equals(error.message, "SMSReceiver was aborted."); - } -}, 'Handle multiple requests with success and error.'); - -promise_test(async t => { - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kCancelled, - }); - }); - - try { - await navigator.sms.receive(); - assert_unreached('Expected CancelledError to be thrown.'); - } catch (error) { - assert_equals(error.name, "AbortError"); - assert_equals(error.message, "SMSReceiver was aborted."); - } -}, 'Deal with cancelled requests'); - -promise_test(async t => { - const controller = new AbortController(); - const signal = controller.signal; - - controller.abort(); - await promise_rejects_dom(t, 'AbortError', navigator.sms.receive({signal})); -}, 'Should abort request'); - -promise_test(async t => { - const controller = new AbortController(); - const signal = controller.signal; - - let error = navigator.sms.receive({signal}); - controller.abort(); - await promise_rejects_dom(t, 'AbortError', error); -}, 'Should abort request even while request is in progress.'); - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/sms/resources/helper.js b/third_party/blink/web_tests/external/wpt/sms/resources/helper.js deleted file mode 100644 index d34d6db..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/resources/helper.js +++ /dev/null
@@ -1,66 +0,0 @@ -'use strict'; - -// These tests rely on the User Agent providing an implementation of -// the sms retriever. -// -// In Chromium-based browsers this implementation is provided by a polyfill -// in order to reduce the amount of test-only code shipped to users. To enable -// these tests the browser must be run with these options: -// -// --enable-blink-features=MojoJS,MojoJSTest - -const loadChromiumResources = async () => { - if (!window.MojoInterfaceInterceptor) { - // Do nothing on non-Chromium-based browsers or when the Mojo bindings are - // not present in the global namespace. - return; - } - - const resources = [ - '/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js', - '/gen/mojo/public/mojom/base/time.mojom-lite.js', - '/gen/third_party/blink/public/mojom/sms/sms_receiver.mojom-lite.js', - '/resources/chromium/sms_mock.js', - ]; - - await Promise.all(resources.map(path => { - const script = document.createElement('script'); - script.src = path; - script.async = false; - const promise = new Promise((resolve, reject) => { - script.onload = resolve; - script.onerror = reject; - }); - document.head.appendChild(script); - return promise; - })); - - Status.kSuccess = blink.mojom.SmsStatus.kSuccess; - Status.kTimeout = blink.mojom.SmsStatus.kTimeout; - Status.kCancelled = blink.mojom.SmsStatus.kCancelled; -}; - -const Status = {}; - -async function create_sms_provider() { - if (typeof SmsProvider === 'undefined') { - await loadChromiumResources(); - } - if (typeof SmsProvider == 'undefined') { - throw new Error('Mojo testing interface is not available.'); - } - return new SmsProvider(); -} - -function receive() { - throw new Error("expected to be overriden by tests"); -} - -function expect(call) { - return { - async andReturn(callback) { - const mock = await create_sms_provider(); - mock.pushReturnValuesForTesting(call.name, callback); - } - } -}
diff --git a/third_party/blink/web_tests/external/wpt/sms/resources/iframe.html b/third_party/blink/web_tests/external/wpt/sms/resources/iframe.html deleted file mode 100644 index 38efb15a..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/resources/iframe.html +++ /dev/null
@@ -1,25 +0,0 @@ -<script src="./helper.js"></script> -<script> -'use strict'; - -// Intercept successful calls and return mocked value. -(async function() { - await expect(receive).andReturn(() => { - return Promise.resolve({ - status: Status.kSuccess, - message: "hello", - }); - }); -}()); - -window.onload = function() { - navigator.sms.receive() - .then(sms => { - window.parent.postMessage({result: "Pass", sms: sms.content}, '*'); - }) - .catch(error => { - window.parent.postMessage({result: "Fail", errorType: error.name}, '*'); - }); -} - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/sms/sms-iframe.https.html b/third_party/blink/web_tests/external/wpt/sms/sms-iframe.https.html deleted file mode 100644 index 0809f24..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/sms-iframe.https.html +++ /dev/null
@@ -1,41 +0,0 @@ -<!DOCTYPE html> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src="/common/get-host-info.sub.js"></script> - -<body> - -<script> -'use strict'; - -const host = get_host_info(); -const remoteBaseURL = host.HTTPS_REMOTE_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ; -const localBaseURL = host.HTTPS_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ; - -promise_test(async t => { - const messageWatcher = new EventWatcher(t, window, "message"); - var iframe = document.createElement("iframe"); - iframe.src = localBaseURL + "resources/iframe.html"; - - document.body.appendChild(iframe); - - const message = await messageWatcher.wait_for("message"); - assert_equals(message.data.result, "Pass"); - assert_equals(message.data.sms, "hello"); - -}, "Test SMSReceiver API enabled in same origin iframes"); - -promise_test(async t => { - const messageWatcher = new EventWatcher(t, window, "message"); - var iframe = document.createElement("iframe"); - iframe.src = remoteBaseURL + "resources/iframe.html" - document.body.appendChild(iframe); - - const message = await messageWatcher.wait_for("message"); - assert_equals(message.data.result, "Fail"); - assert_equals(message.data.errorType, "NotAllowedError"); - -}, "Test SMSReceiver API disabled in cross origin iframes"); - -</script> -</body>
diff --git a/third_party/blink/web_tests/external/wpt/sms/sms_receiver.idl b/third_party/blink/web_tests/external/wpt/sms/sms_receiver.idl deleted file mode 100644 index ca8cfdd7..0000000 --- a/third_party/blink/web_tests/external/wpt/sms/sms_receiver.idl +++ /dev/null
@@ -1,24 +0,0 @@ -[SecureContext] -interface mixin NavigatorSMS { - readonly attribute SMSReceiver sms; -}; - -Navigator includes NavigatorSMS; - -[ - SecureContext, - Exposed=(Window,DedicatedWorker)] -interface SMS { - readonly attribute DOMString content; -}; - -dictionary SMSReceiverOptions { - AbortSignal signal; -}; - -[ - SecureContext, - Exposed=Window -] interface SMSReceiver { - Promise<SMS> receive(optional SMSReceiverOptions options); -};
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/HTMLScriptElement-in-xhtml-document.tentative.https.xhtml b/third_party/blink/web_tests/external/wpt/trusted-types/HTMLScriptElement-in-xhtml-document.tentative.https.xhtml new file mode 100644 index 0000000..6cf49f9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/trusted-types/HTMLScriptElement-in-xhtml-document.tentative.https.xhtml
@@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"/> +</head> +<body> +<script> + // This this a regresion test that verifies that in-tree script element in + // an xhtml document still works correctly. The test itself doesn't do much. + test(t => { + t.done(); + }, "Test whether a script element still executes for XHTML documents."); +</script> +</body> +</html> +
diff --git a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin-expected.txt b/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin-expected.txt deleted file mode 100644 index 7cac4da..0000000 --- a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -PASS container.scrollLeft is -715 -PASS container.scrollLeft is -365 -PASS successfullyParsed is true - -TEST COMPLETE - -This test verifies scroll position restores correctly when a thumb drag has been cancelled in RTL mode. -This test is expected to fail on Mac and Linux because those platforms don't cancel scrolling when mouse cursor is out of a certain range. It is Windows-specific behavior.
diff --git a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin.html b/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin.html deleted file mode 100644 index c8087a7..0000000 --- a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin.html +++ /dev/null
@@ -1,45 +0,0 @@ -<!DOCTYPE html> -<style> -#container { - position: absolute; - left: 100px; - top: 0; - width: 300px; - height: 200px; - direction: rtl; - overflow: scroll; -} - -#content { - width: 1000px; - height: 1px; -} -</style> -<div id="container"> - <div id="content"> - </div> -</div> -This test verifies scroll position restores correctly when a thumb drag has been cancelled in RTL mode.<br/> -This test is expected to fail on Mac and Linux because those platforms don't cancel scrolling when mouse cursor is out of a certain range. It is Windows-specific behavior. -<script src="../../resources/js-test.js"></script> -<script> - window.jsTestIsAsync = true; - var container = document.getElementById("container"); - container.scrollLeft = -365; - - if (window.eventSender) { - eventSender.dragMode = false; - eventSender.mouseMoveTo(250, 195); - eventSender.mouseDown(); - - eventSender.mouseMoveTo(100, 195); - requestAnimationFrame(function() { - shouldBe("container.scrollLeft" , "-715"); - eventSender.mouseMoveTo(100, 700); - requestAnimationFrame(function() { - shouldBe("container.scrollLeft" , "-365"); - finishJSTest(); - }); - }); - } -</script>
diff --git a/third_party/blink/web_tests/fast/parser/resources/xhtml-overwrite-frame.xhtml b/third_party/blink/web_tests/fast/parser/resources/xhtml-overwrite-frame.xhtml deleted file mode 100644 index 75e7c09..0000000 --- a/third_party/blink/web_tests/fast/parser/resources/xhtml-overwrite-frame.xhtml +++ /dev/null
@@ -1,12 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> -<script> -function overwrite() { - var testRunner = window.parent.testRunner; - window.frameElement.outerHTML = "PASS (no crash)"; - if (testRunner) - testRunner.notifyDone(); -} - -document.addEventListener("DOMCharacterDataModified", overwrite); -</script> -</html>
diff --git a/third_party/blink/web_tests/fast/parser/xhtml-dom-character-data-modified-crash.html b/third_party/blink/web_tests/fast/parser/xhtml-dom-character-data-modified-crash.html deleted file mode 100644 index eb5bdec..0000000 --- a/third_party/blink/web_tests/fast/parser/xhtml-dom-character-data-modified-crash.html +++ /dev/null
@@ -1,8 +0,0 @@ -<!DOCTYPE html> -<script> -if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.waitUntilDone(); -} -</script> -<iframe src="resources/xhtml-overwrite-frame.xhtml"></iframe>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html index f2698ae..2fb045c9 100644 --- a/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html +++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html
@@ -11,72 +11,91 @@ overflow: scroll; border: 1px solid black; } -.standardLocation { +.ltrLocation { position: absolute; top: 100px; left: 100px; } -.customLocation { - position: absolute; - top: 250px; - left: 100px; -} .space { height: 1000px; width: 1000px; } + +.rtlLocation { + position: absolute; + top: 100px; + left: 300px; +} +.direction_rtl { + direction: rtl; +} </style> + +<!-- Non-custom ltr scroller --> +<div id="standard_ltr" class="appearance ltrLocation"> + <div class="space"></div> +</div> + +<!-- Non-custom rtl scroller --> +<div id="standard_rtl" class="appearance rtlLocation direction_rtl"> + <div class="space"></div> +</div> + <script> - if (window.internals) - internals.settings.setScrollAnimatorEnabled(false); +window.onload = () => { + const TRACK_WIDTH = calculateScrollbarThickness(); + const BUTTON_WIDTH = TRACK_WIDTH; + const MSG = "Horizontal thumb drag beyond the gutter (around the track)" + + " should cause the thumb to snap back to the drag origin."; - let scroll_threshold_crossed = false; - var testThumbSnapBack = async_test('Tests that the thumb snaps back.'); - function pointerActionsCallback() { - const scroller = document.getElementById("standard"); - testThumbSnapBack.step(() => { - assert_true(scroll_threshold_crossed, 'scroll threashold should be crossed'); - assert_equals(scroller.scrollTop, 20, 'scroll offset should snap back'); - }); - testThumbSnapBack.done(); - } - - function inject_input() { - if (!(window.chrome && chrome.gpuBenchmarking)) + promise_test (async () => { + // Scrollbar thumb snapping is a Windows only feature. + if(!navigator.userAgent.includes("Windows")) return; - const standardDivFast = document.getElementById("standard"); - const standardRectFast = standardDivFast.getBoundingClientRect(); - const TRACK_WIDTH = calculateScrollbarThickness(); - const BUTTON_WIDTH = TRACK_WIDTH; - const X = standardRectFast.right - TRACK_WIDTH / 2; - const Y = standardRectFast.top + BUTTON_WIDTH + 5; + const ltrDiv = document.getElementById("standard_ltr"); + const ltrRect = ltrDiv.getBoundingClientRect(); + await waitForCompositorCommit(); + const DRAG_ORIGIN = 10; + ltrDiv.scrollLeft = DRAG_ORIGIN; - // Verify that scrolling occured. - standardDivFast.addEventListener("scroll", function() { - if (standardDivFast.scrollTop == 505) - scroll_threshold_crossed = true; - }); + // Testing the horizontal scrollbar thumb. + const x = ltrRect.left + BUTTON_WIDTH + 2; + const y = ltrRect.bottom - TRACK_WIDTH / 2; - // Testing the vertical scrollbar thumb. - standardDivFast.scrollTop = 20; - var pointerActions = - [{source: "mouse", id: 0, - actions: [ - { name: "pointerDown", x: X, y: Y }, - { name: "pause", duration: 100}, - { name: 'pointerMove', x: X, y: Y + 20 }, - { name: "pause", duration: 100}, - { name: 'pointerMove', x: X + 500, y: Y + 20 }, - { name: "pointerUp", x: X + 500, y: Y + 20 }, - ] - }]; - chrome.gpuBenchmarking.pointerActionSequence(pointerActions, pointerActionsCallback); - } + await mouseMoveTo(x, y); + await mouseDownAt(x, y); + await mouseMoveTo(x + 10, y); + assert_true(ltrDiv.scrollLeft > 200, "Thumb drag should cause a scroll."); + + await mouseMoveTo(x + 10, y + 200); + assert_equals(ltrDiv.scrollLeft, DRAG_ORIGIN, MSG); + await mouseUpAt(x + 10, y + 200); + }, "Tests that the thumb snaps back for ltr direction."); + + promise_test (async () => { + // Scrollbar thumb snapping is a Windows only feature. + if(!navigator.userAgent.includes("Windows")) + return; + + const rtlDiv = document.getElementById("standard_rtl"); + const rtlRect = rtlDiv.getBoundingClientRect(); + await waitForCompositorCommit(); + const DRAG_ORIGIN = -40; + rtlDiv.scrollLeft = DRAG_ORIGIN; + + // Testing the horizontal scrollbar thumb. + const x = rtlRect.right - BUTTON_WIDTH - 5; + const y = rtlRect.bottom - TRACK_WIDTH / 2; + + await mouseMoveTo(x, y); + await mouseDownAt(x, y); + await mouseMoveTo(x - 10, y); + assert_true(rtlDiv.scrollLeft < -200, "Thumb drag should cause a scroll."); + + await mouseMoveTo(x - 10, y + 200); + assert_equals(rtlDiv.scrollLeft, DRAG_ORIGIN, MSG); + await mouseUpAt(x - 10, y + 200); + }, "Tests that the thumb snaps back for rtl direction."); +} </script> -<body id="target" onload="inject_input()"> - <!-- Composited non-custom fast scroller --> - <div id="standard" class="appearance standardLocation fast"> - <div class="space"></div> - </div> -</body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js index 32cedac..9651666 100644 --- a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js +++ b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js
@@ -15,7 +15,7 @@ var frameId2; var frameId3; - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); ApplicationTestRunner.dumpApplicationCache(); ApplicationTestRunner.createAndNavigateIFrame('resources/page-with-manifest.php?manifestId=1', step1);
diff --git a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js index e1c3413..a40a295 100644 --- a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js +++ b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js
@@ -15,7 +15,7 @@ var frameId2; var frameId3; - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); ApplicationTestRunner.startApplicationCacheStatusesRecording(); ApplicationTestRunner.dumpApplicationCache(); ApplicationTestRunner.createAndNavigateIFrame(
diff --git a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js index f3b9596..e070b97 100644 --- a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js +++ b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js
@@ -15,7 +15,7 @@ var frameId1; var frameId2; - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); ApplicationTestRunner.startApplicationCacheStatusesRecording(); ApplicationTestRunner.dumpApplicationCache(); ApplicationTestRunner.createAndNavigateIFrame('resources/with-versioned-manifest.php', step1);
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js index 2a508bb..2859995 100644 --- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js +++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js
@@ -44,7 +44,7 @@ await new Promise(createIndexedDB); await ApplicationTestRunner.createWebSQLDatabase('database-for-test'); - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); UI.panels.resources._sidebar.databasesListTreeElement.firstChild().select(false, true); dumpCurrentState('Initial state:'); await TestRunner.reloadPagePromise();
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js index 959bbef..54b38e9 100644 --- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js +++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js
@@ -67,7 +67,7 @@ dumpCurrentState('Revealed ' + name + ':'); } - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); dumpCurrentState('Initial state:'); await revealResourceWithDisplayName('json-value.js'); await revealResourceWithDisplayName('image.png');
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js index c120296a..372ff00 100644 --- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js +++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js
@@ -45,7 +45,7 @@ await new Promise(createIndexedDB); await ApplicationTestRunner.createWebSQLDatabase('database-for-test'); - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); UI.panels.resources._sidebar.cookieListTreeElement.firstChild().select(false, true); dumpCurrentState('Initial state:'); await TestRunner.reloadPagePromise();
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js index 67799797..99406bf7 100644 --- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js +++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
@@ -35,7 +35,7 @@ await queryView.once(Resources.DatabaseQueryView.Events.SchemaUpdated); return new Promise(resolve => setTimeout(resolve)); } - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); dumpCurrentState('Initial state:'); await TestRunner.evaluateInPagePromise(
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js index b53663f..c6d4eae6 100644 --- a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js +++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
@@ -28,7 +28,7 @@ async function dumpWhenMatches(view, predicate) { await new Promise(resolve => { - function sniffer(usage, quota) { + function sniffer(usage, quota, breakdown) { if (usage !== null && (!predicate || predicate(usage, quota))) resolve(); else @@ -60,7 +60,7 @@ TestRunner.addResult(typeUsage); } } - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); var parent = UI.panels.resources._sidebar._applicationTreeElement; var clearStorageElement = parent.children().find(child => child.title === 'Clear storage');
diff --git a/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js b/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js index b518d412..265f412 100644 --- a/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js +++ b/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js
@@ -12,10 +12,10 @@ TestRunner.waitForUISourceCode('after.css').then(uiSourceCode => uiSourceCode.requestContent()).then(onAfterContent); - function onAfterContent({ content, error, isEncoded }) { + async function onAfterContent({ content, error, isEncoded }) { SourcesTestRunner.waitForScriptSource('before.css', uiSourceCode => uiSourceCode.setWorkingCopy(content)); TestRunner.addSniffer(Changes.ChangesView.prototype, '_renderDiffRows', rowsRendered, true); - UI.viewManager.showView('changes.changes'); + await UI.viewManager.showView('changes.changes'); } function rowsRendered() {
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js index c50f61ba48..0ff04fc 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js
@@ -11,7 +11,7 @@ <span id="inspected" aria-checked="true" role="checkbox"></span> `); - UI.viewManager.showView('accessibility.view') + await UI.viewManager.showView('accessibility.view') .then(() => AccessibilityTestRunner.selectNodeAndWaitForAccessibility('inspected')) .then(runTests);
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js index 41bc4b7..8b29730 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js
@@ -11,7 +11,7 @@ <button id="inspected" role="checkbox" aria-checked="true">ARIA checkbox</button> `); - UI.viewManager.showView('accessibility.view') + await UI.viewManager.showView('accessibility.view') .then(() => AccessibilityTestRunner.selectNodeAndWaitForAccessibility('inspected')) .then(editAriaChecked);
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js index 82866ed..b0382d0 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js
@@ -23,7 +23,7 @@ `); // Save time on style updates. - UI.viewManager.showView('elements'); + await UI.viewManager.showView('elements'); Elements.StylesSidebarPane.prototype.update = function() {}; Elements.MetricsSidebarPane.prototype.update = function() {};
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js index 2f8b559..4b9bb25 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js
@@ -24,7 +24,7 @@ `); // Save time on style updates. - UI.viewManager.showView('elements'); + await UI.viewManager.showView('elements'); Elements.StylesSidebarPane.prototype.update = function() {}; Elements.MetricsSidebarPane.prototype.update = function() {};
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js index 494b5b80..bffa926 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js
@@ -38,12 +38,12 @@ SourcesTestRunner.waitForExecutionContextInTarget(target, step2); } - function step2(executionContext) { + async function step2(executionContext) { TestRunner.addResult('Selecting service worker thread'); SourcesTestRunner.selectThread(executionContext.target()); TestRunner.addResult('Context is service worker: ' + isServiceWorker()); TestRunner.addResult('Dumping listeners'); - UI.viewManager.showView('sources.globalListeners').then(() => { + await UI.viewManager.showView('sources.globalListeners').then(() => { objectEventListenersPane.update(); ElementsTestRunner.expandAndDumpEventListeners(objectEventListenersPane._eventListenersView, step3); });
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js index cccd5d7..266f683 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js
@@ -125,8 +125,8 @@ runAndDumpHighlights('setFirstChildTextContent(\'textTest\', \'\')', textTestNode, next); }, - function testAppendChildWhenHidden(next) { - UI.viewManager.showView('console'); + async function testAppendChildWhenHidden(next) { + await UI.viewManager.showView('console'); runAndDumpHighlights('appendChild(\'childTest\', \'child1\')', childTestNode, next); } ]);
diff --git a/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js b/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js index e5dacc5..08bc2e9 100644 --- a/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js +++ b/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js
@@ -8,8 +8,8 @@ await TestRunner.loadModule('extensions_test_runner'); await TestRunner.loadModule('sources_test_runner'); - TestRunner.clickOnURL = function() { - UI.viewManager.showView("console").then(() => { + TestRunner.clickOnURL = async function() { + await UI.viewManager.showView("console").then(() => { Console.ConsoleView.instance()._updateMessageList(); // Trigger link creation so we can properly await pending live location updates. Needed so we can
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js index a812e79..67201337 100644 --- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js +++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js
@@ -8,7 +8,7 @@ await TestRunner.showPanel('sources'); await TestRunner.addScriptTag('resources/search.js'); - UI.viewManager.showView('sources'); + await UI.viewManager.showView('sources'); SourcesTestRunner.showScriptSource('search.js', didShowScriptSource); function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js index a860e74..1ea595f 100644 --- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js +++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js
@@ -8,7 +8,8 @@ await TestRunner.showPanel('sources'); await TestRunner.addScriptTag('resources/search.js'); - UI.viewManager.showView('sources'); + await UI.viewManager.showView('sources'); + SourcesTestRunner.showScriptSource('search.js', didShowScriptSource); function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js index 4d2b02d23..e971ca9 100644 --- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js +++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js
@@ -8,7 +8,7 @@ await TestRunner.showPanel('sources'); await TestRunner.addScriptTag('resources/search.js'); - UI.viewManager.showView('sources'); + await UI.viewManager.showView('sources'); SourcesTestRunner.showScriptSource('search.js', didShowScriptSource); function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js index 49c5f67..8b0be3c 100644 --- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js +++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js
@@ -8,7 +8,7 @@ await TestRunner.showPanel('sources'); await TestRunner.addScriptTag('resources/search.js'); - UI.viewManager.showView('sources'); + await UI.viewManager.showView('sources'); SourcesTestRunner.showScriptSource('search.js', didShowScriptSource); function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js index 9e946be..a2bea14 100644 --- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js +++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js
@@ -32,7 +32,7 @@ } } - UI.viewManager.showView('sources'); + await UI.viewManager.showView('sources'); SourcesTestRunner.showScriptSource('search.js', didShowScriptSource); function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js index 506a2ee..4dc43cd 100644 --- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js +++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js
@@ -24,7 +24,7 @@ await TestRunner.addScriptTag('source-frame.js'); await TestRunner.addScriptTag('../resources/script.js'); - UI.viewManager.showView('resources'); + await UI.viewManager.showView('resources'); SourcesTestRunner.runDebuggerTestSuite([ function testConsoleMessage(next) { SourcesTestRunner.showScriptSource('source-frame.js', didShowScriptSource); @@ -57,8 +57,8 @@ } }, - function testShowResource(next) { - UI.viewManager.showView('network'); + async function testShowResource(next) { + await UI.viewManager.showView('network'); TestRunner.addSniffer(SourceFrame.SourceFrame.prototype, 'show', didShowSourceFrame); TestRunner.resourceTreeModel.forAllResources(visit);
diff --git a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt index d85dabc..dad28858 100644 --- a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt
@@ -24,7 +24,7 @@ Change to low-end mobile in device mode === THROTTLING STATE === -Network throttling - download: 50000 upload: 50000 latency: 2000 +Network throttling - download: 51200 upload: 51200 latency: 2000 CPU throttling rate: 6 Device mode throttling: Low-end mobile Network panel throttling: Slow 3G @@ -35,7 +35,7 @@ Change network to Fast 3G === THROTTLING STATE === -Network throttling - download: 180000 upload: 84375 latency: 562.5 +Network throttling - download: 188744 upload: 86400 latency: 562.5 CPU throttling rate: 6 Device mode throttling: Custom Network panel throttling: Fast 3G @@ -46,7 +46,7 @@ Change to mid-tier mobile in device mode === THROTTLING STATE === -Network throttling - download: 180000 upload: 84375 latency: 562.5 +Network throttling - download: 188744 upload: 86400 latency: 562.5 CPU throttling rate: 4 Device mode throttling: Mid-tier mobile Network panel throttling: Fast 3G @@ -57,7 +57,7 @@ Change CPU throttling to low-end mobile === THROTTLING STATE === -Network throttling - download: 180000 upload: 84375 latency: 562.5 +Network throttling - download: 188744 upload: 86400 latency: 562.5 CPU throttling rate: 6 Device mode throttling: Custom Network panel throttling: Fast 3G @@ -68,7 +68,7 @@ Change CPU throttling to mid-tier mobile === THROTTLING STATE === -Network throttling - download: 180000 upload: 84375 latency: 562.5 +Network throttling - download: 188744 upload: 86400 latency: 562.5 CPU throttling rate: 4 Device mode throttling: Mid-tier mobile Network panel throttling: Fast 3G
diff --git a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js index 18da20b..769155f 100644 --- a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js +++ b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js
@@ -6,7 +6,7 @@ TestRunner.addResult(`Tests that mobile, network, and CPU throttling interact with each other logically.\n`); await TestRunner.showPanel("network"); await TestRunner.showPanel("timeline"); - UI.viewManager.showView("network.config"); + await UI.viewManager.showView("network.config"); var deviceModeView = new Emulation.DeviceModeView(); @@ -21,7 +21,7 @@ function dumpThrottlingState() { TestRunner.addResult('=== THROTTLING STATE ==='); var {download, upload, latency} = SDK.multitargetNetworkManager.networkConditions(); - TestRunner.addResult(`Network throttling - download: ${download} upload: ${upload} latency: ${latency}`); + TestRunner.addResult(`Network throttling - download: ${Math.round(download)} upload: ${Math.round(upload)} latency: ${latency}`); TestRunner.addResult('CPU throttling rate: ' + MobileThrottling.throttlingManager().cpuThrottlingRate()); TestRunner.addResult('Device mode throttling: ' + deviceModeThrottling._text); TestRunner.addResult('Network panel throttling: ' + networkPanelThrottling.selectedOption().text);
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js index ef95ff8..a8716ee 100644 --- a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js +++ b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js
@@ -27,7 +27,7 @@ } `); - UI.viewManager.showView('timeline'); + await UI.viewManager.showView('timeline'); const panel = UI.panels.timeline; panel._disableCaptureJSProfileSetting.set(true); await PerformanceTestRunner.invokeAsyncWithTimeline('performActions');
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions-expected.txt new file mode 100644 index 0000000..f7e4d08 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions-expected.txt
@@ -0,0 +1,22 @@ +Test that permissions could be granted to all origins +Grant geolocation audioCapture to all + Granted: ["geolocation","audioCapture"] +Query geolocation + => granted +Query microphone + => granted +Resetting all permissions +Query geolocation + => denied +Query microphone + => denied +Testing local permissions override global permissions +Grant geolocation to all + Granted: ["geolocation"] +Grant audioCapture to http://devtools.test:8000 + Granted: ["audioCapture"] +Query geolocation + => denied +Query microphone + => granted +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions.js b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions.js new file mode 100644 index 0000000..41b2a87 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions.js
@@ -0,0 +1,44 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Test that permissions could be granted to all origins`); + + // Reset all permissions initially. + await dp.Browser.resetPermissions(); + + await page.navigate('http://devtools.test:8000/inspector-protocol/resources/empty.html'); + + await grant(undefined, 'geolocation', 'audioCapture'); + await dumpPermission('geolocation'); + await dumpPermission('microphone'); + + testRunner.log('Resetting all permissions'); + await dp.Browser.resetPermissions(); + await dumpPermission('geolocation'); + await dumpPermission('microphone'); + + testRunner.log('Testing local permissions override global permissions'); + await grant(undefined, 'geolocation'); + await grant('http://devtools.test:8000', 'audioCapture'); + await dumpPermission('geolocation'); + await dumpPermission('microphone'); + + testRunner.completeTest(); + + async function grant(origin, ...permissions) { + testRunner.log(`Grant ${permissions.join(' ')} to ${origin || 'all'}`); + const response = await dp.Browser.grantPermissions({ origin, permissions }); + if (response.error) + testRunner.log(' Failed to grant: ' + JSON.stringify(permissions) + ' error: ' + response.error.message); + else + testRunner.log(' Granted: ' + JSON.stringify(permissions)); + } + + async function dumpPermission(name) { + testRunner.log(`Query ${name}`); + const result = await session.evaluateAsync(async (permission) => { + const result = await navigator.permissions.query({name: permission}); + return result.state; + }, name); + testRunner.log(` => ${result}`); + } +})
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/sms-receiver-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/sms-receiver-origin-trial-interfaces.html deleted file mode 100644 index e0097d9..0000000 --- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/sms-receiver-origin-trial-interfaces.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<!-- Generate token with the command: -generate_token.py http://127.0.0.1:8000 SmsReceiver --expire-timestamp=2000000000 --- --> -<meta http-equiv="origin-trial" content="AqptJAocypqw+Nd2rdevpkjUlMBz2si2im0MOtLpKsztHb0CaV25R8qpoQn9Loe/FrswYNlSZSM+8SKwocAUtwoAAABTeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiU21zUmVjZWl2ZXIiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=" /> -<title>SmsReceiver - interfaces exposed by origin trial</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/origin-trials-helper.js"></script> -<script> -test(t => { - OriginTrialsHelper.check_properties_exist(this, - { - 'Navigator': ['sms'], - 'SMSReceiver': ['receive'], - 'SMS': ['content'], - }, - ); -}, "Sms related interfaces in Origin-Trial enabled document."); - -</script>
diff --git a/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html b/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html index 9edb1e1..2c2e1c8 100644 --- a/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html +++ b/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html
@@ -32,21 +32,21 @@ var result = computedStyleMap.get('line-height'); assert_equals(result.constructor.name, CSSUnitValue.name); assert_equals(result.toString(), '10px'); -}, 'Getting a 10% lineHeight results in a CSSUnitValue'); +}, 'Getting a 10% lineHeight results in a px CSSUnitValue'); test(function() { testElement.style.lineHeight = '0.2'; var result = computedStyleMap.get('line-height'); assert_equals(result.constructor.name, CSSUnitValue.name); - assert_equals(result.toString(), '20px'); -}, 'Getting a number lineHeight results in a CSSUnitValue'); + assert_equals(result.toString(), '0.2'); +}, 'Getting a number lineHeight results in a number CSSUnitValue'); test(function() { testElement.style.lineHeight = 'calc(10px + 10%)'; var result = computedStyleMap.get('line-height'); assert_equals(result.constructor.name, CSSUnitValue.name); assert_equals(result.toString(), '20px'); -}, 'Getting a calc lineHeight results in a CSSUnitValue'); +}, 'Getting a calc lineHeight results in a px CSSUnitValue'); test(function() { testElement.style.lineHeight = 'normal';
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/README.txt b/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/README.txt deleted file mode 100644 index 309d6722..0000000 --- a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/README.txt +++ /dev/null
@@ -1,3 +0,0 @@ -# This suite runs the tests in external/wpt/origin-policy with -# --enable-blink-features=OriginPolicy. -# Origin Policy is being standardized here: https://github.com/WICG/origin-policy
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt index 79aceb8..d7605cc0 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1213,10 +1213,6 @@ [Worker] method formData [Worker] method json [Worker] method text -[Worker] interface SMS -[Worker] attribute @@toStringTag -[Worker] getter content -[Worker] method constructor [Worker] interface SecurityPolicyViolationEvent : Event [Worker] attribute @@toStringTag [Worker] getter blockedURI
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 02fbcb288..e2efdc1b 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5438,7 +5438,6 @@ getter scheduling getter serial getter serviceWorker - getter sms getter storage getter usb getter userActivation @@ -6694,14 +6693,6 @@ method formData method json method text -interface SMS - attribute @@toStringTag - getter content - method constructor -interface SMSReceiver - attribute @@toStringTag - method constructor - method receive interface SVGAElement : SVGGraphicsElement attribute @@toStringTag getter href
diff --git a/third_party/webrtc_overrides/BUILD.gn b/third_party/webrtc_overrides/BUILD.gn index 878cd94..4f44c48d2 100644 --- a/third_party/webrtc_overrides/BUILD.gn +++ b/third_party/webrtc_overrides/BUILD.gn
@@ -92,6 +92,7 @@ "//third_party/webrtc/api/audio:audio_frame_api", "//third_party/webrtc/api/task_queue", "//third_party/webrtc/api/video:encoded_image", + "//third_party/webrtc/media:rtc_h264_profile_id", "//third_party/webrtc/media:rtc_media_engine_defaults", "//third_party/webrtc/modules/audio_device:audio_device_default", "//third_party/webrtc/modules/audio_mixer:audio_mixer_impl",
diff --git a/tools/OWNERS b/tools/OWNERS index 53418bb..39d98bf3 100644 --- a/tools/OWNERS +++ b/tools/OWNERS
@@ -47,7 +47,7 @@ per-file roll_webgl_conformance.py=kbr@chromium.org per-file roll_webgl_conformance.py=geofflang@chromium.org per-file roll_webgl_conformance.py=zmo@chromium.org -per-file roll_webrtc.py=phoglund@chromium.org +per-file roll_webrtc.py=mbonadei@chromium.org per-file sort-headers.py=satorux@chromium.org per-file sort-sources.py=satorux@chromium.org
diff --git a/tools/binary_size/libsupersize/parallel_test.py b/tools/binary_size/libsupersize/parallel_test.py index 28fd4b10..449d4d2d 100755 --- a/tools/binary_size/libsupersize/parallel_test.py +++ b/tools/binary_size/libsupersize/parallel_test.py
@@ -9,7 +9,7 @@ import threading import unittest -import parallel as concurrent +import parallel def _ForkTestHelper(arg1, arg2, pickle_me_not, test_instance, parent_pid): @@ -28,61 +28,61 @@ class ConcurrentTest(unittest.TestCase): def testEncodeDictOfLists_Empty(self): test_dict = {} - encoded = concurrent.EncodeDictOfLists(test_dict) - decoded = concurrent.DecodeDictOfLists(encoded) + encoded = parallel.EncodeDictOfLists(test_dict) + decoded = parallel.DecodeDictOfLists(encoded) self.assertEquals(test_dict, decoded) def testEncodeDictOfLists_EmptyValue(self): test_dict = {'foo': []} - encoded = concurrent.EncodeDictOfLists(test_dict) - decoded = concurrent.DecodeDictOfLists(encoded) + encoded = parallel.EncodeDictOfLists(test_dict) + decoded = parallel.DecodeDictOfLists(encoded) self.assertEquals(test_dict, decoded) def testEncodeDictOfLists_AllStrings(self): test_dict = {'foo': ['a', 'b', 'c'], 'foo2': ['a', 'b']} - encoded = concurrent.EncodeDictOfLists(test_dict) - decoded = concurrent.DecodeDictOfLists(encoded) + encoded = parallel.EncodeDictOfLists(test_dict) + decoded = parallel.DecodeDictOfLists(encoded) self.assertEquals(test_dict, decoded) def testEncodeDictOfLists_KeyTransform(self): test_dict = {0: ['a', 'b', 'c'], 9: ['a', 'b']} - encoded = concurrent.EncodeDictOfLists(test_dict, key_transform=str) - decoded = concurrent.DecodeDictOfLists(encoded, key_transform=int) + encoded = parallel.EncodeDictOfLists(test_dict, key_transform=str) + decoded = parallel.DecodeDictOfLists(encoded, key_transform=int) self.assertEquals(test_dict, decoded) def testEncodeDictOfLists_ValueTransform(self): test_dict = {'a': ['0', '1', '2'], 'b': ['3', '4']} expected = {'a': [0, 1, 2], 'b': [3, 4]} - encoded = concurrent.EncodeDictOfLists(test_dict) - decoded = concurrent.DecodeDictOfLists(encoded, value_transform=int) + encoded = parallel.EncodeDictOfLists(test_dict) + decoded = parallel.DecodeDictOfLists(encoded, value_transform=int) self.assertEquals(expected, decoded) def testEncodeDictOfLists_Join_Empty(self): test_dict1 = {} test_dict2 = {} expected = {} - encoded1 = concurrent.EncodeDictOfLists(test_dict1) - encoded2 = concurrent.EncodeDictOfLists(test_dict2) - encoded = concurrent.JoinEncodedDictOfLists([encoded1, encoded2]) - decoded = concurrent.DecodeDictOfLists(encoded) + encoded1 = parallel.EncodeDictOfLists(test_dict1) + encoded2 = parallel.EncodeDictOfLists(test_dict2) + encoded = parallel.JoinEncodedDictOfLists([encoded1, encoded2]) + decoded = parallel.DecodeDictOfLists(encoded) self.assertEquals(expected, decoded) def testEncodeDictOfLists_Join_Singl(self): test_dict1 = {'key1': ['a']} - encoded1 = concurrent.EncodeDictOfLists(test_dict1) - encoded = concurrent.JoinEncodedDictOfLists([encoded1]) - decoded = concurrent.DecodeDictOfLists(encoded) + encoded1 = parallel.EncodeDictOfLists(test_dict1) + encoded = parallel.JoinEncodedDictOfLists([encoded1]) + decoded = parallel.DecodeDictOfLists(encoded) self.assertEquals(test_dict1, decoded) def testEncodeDictOfLists_JoinMultiple(self): test_dict1 = {'key1': ['a']} test_dict2 = {'key2': ['b']} expected = {'key1': ['a'], 'key2': ['b']} - encoded1 = concurrent.EncodeDictOfLists(test_dict1) - encoded2 = concurrent.EncodeDictOfLists({}) - encoded3 = concurrent.EncodeDictOfLists(test_dict2) - encoded = concurrent.JoinEncodedDictOfLists([encoded1, encoded2, encoded3]) - decoded = concurrent.DecodeDictOfLists(encoded) + encoded1 = parallel.EncodeDictOfLists(test_dict1) + encoded2 = parallel.EncodeDictOfLists({}) + encoded3 = parallel.EncodeDictOfLists(test_dict2) + encoded = parallel.JoinEncodedDictOfLists([encoded1, encoded2, encoded3]) + decoded = parallel.DecodeDictOfLists(encoded) self.assertEquals(expected, decoded) def testCallOnThread(self): @@ -95,35 +95,35 @@ self.assertNotEquals(my_thread, main_thread) return 3 - result = concurrent.CallOnThread(callback, 1, arg2=2) + result = parallel.CallOnThread(callback, 1, arg2=2) self.assertEquals(3, result.get()) def testForkAndCall_normal(self): parent_pid = os.getpid() - result = concurrent.ForkAndCall(_ForkTestHelper, - (1, 2, Unpicklable(), self, parent_pid)) + result = parallel.ForkAndCall(_ForkTestHelper, + (1, 2, Unpicklable(), self, parent_pid)) self.assertEquals(3, result.get()) def testForkAndCall_exception(self): parent_pid = os.getpid() - result = concurrent.ForkAndCall(_ForkTestHelper, - (1, 'a', None, self, parent_pid)) + result = parallel.ForkAndCall(_ForkTestHelper, + (1, 'a', None, self, parent_pid)) self.assertRaises(TypeError, result.get) def testBulkForkAndCall_none(self): - results = concurrent.BulkForkAndCall(_ForkTestHelper, []) + results = parallel.BulkForkAndCall(_ForkTestHelper, []) self.assertEquals([], list(results)) def testBulkForkAndCall_few(self): parent_pid = os.getpid() - results = concurrent.BulkForkAndCall( - _ForkTestHelper, [(1, 2, Unpicklable(), self, parent_pid), - (3, 4, None, self, parent_pid)]) + results = parallel.BulkForkAndCall(_ForkTestHelper, + [(1, 2, Unpicklable(), self, parent_pid), + (3, 4, None, self, parent_pid)]) self.assertEquals({3, 7}, set(results)) def testBulkForkAndCall_few_kwargs(self): parent_pid = os.getpid() - results = concurrent.BulkForkAndCall( + results = parallel.BulkForkAndCall( _ForkTestHelper, [(1, 2, Unpicklable()), (3, 4, None)], test_instance=self, parent_pid=parent_pid) @@ -132,13 +132,13 @@ def testBulkForkAndCall_many(self): parent_pid = os.getpid() args = [(1, 2, Unpicklable(), self, parent_pid) for _ in xrange(100)] - results = concurrent.BulkForkAndCall(_ForkTestHelper, args) + results = parallel.BulkForkAndCall(_ForkTestHelper, args) self.assertEquals([3] * 100, list(results)) def testBulkForkAndCall_many_kwargs(self): parent_pid = os.getpid() args = [(1, 2) for _ in xrange(100)] - results = concurrent.BulkForkAndCall( + results = parallel.BulkForkAndCall( _ForkTestHelper, args, pickle_me_not=Unpicklable(), @@ -148,8 +148,8 @@ def testBulkForkAndCall_exception(self): parent_pid = os.getpid() - results = concurrent.BulkForkAndCall(_ForkTestHelper, - [(1, 'a', self, parent_pid)]) + results = parallel.BulkForkAndCall(_ForkTestHelper, + [(1, 'a', self, parent_pid)]) self.assertRaises(TypeError, results.next)
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py index 240146e..09202544 100755 --- a/tools/clang/scripts/build.py +++ b/tools/clang/scripts/build.py
@@ -487,9 +487,10 @@ # Require zlib compression. zlib_dir = AddZlibToPath() - base_cmake_args.append('-DLLVM_ENABLE_ZLIB=FORCE_ON') + base_cmake_args.append('-DLLVM_ENABLE_ZLIB=ON') cflags.append('-I' + zlib_dir) cxxflags.append('-I' + zlib_dir) + ldflags.append('-LIBPATH:' + zlib_dir) if sys.platform == 'darwin': # Use the system libc++abi. @@ -528,9 +529,12 @@ '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR, '-DCMAKE_C_FLAGS=' + ' '.join(cflags), '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags), + '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags), + '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags), + '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags), # Ignore args.disable_asserts for the bootstrap compiler. '-DLLVM_ENABLE_ASSERTIONS=ON', - ] + ] if sys.platform == 'darwin': # On macOS, the bootstrap toolchain needs to have compiler-rt because # dsymutil's link needs libclang_rt.osx.a. Only the x86_64 osx @@ -614,9 +618,12 @@ '-DLLVM_ENABLE_PROJECTS=' + projects, '-DCMAKE_C_FLAGS=' + ' '.join(cflags), '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags), + '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags), + '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags), + '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags), # Build with instrumentation. '-DLLVM_BUILD_INSTRUMENTED=IR', - ] + ] # Build with the bootstrap compiler. if cc is not None: instrument_args.append('-DCMAKE_C_COMPILER=' + cc) if cxx is not None: instrument_args.append('-DCMAKE_CXX_COMPILER=' + cxx) @@ -789,13 +796,16 @@ compiler_rt_args = base_cmake_args + [ '-DCMAKE_C_FLAGS=' + ' '.join(cflags), '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags), + '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags), + '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags), + '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags), '-DCOMPILER_RT_BUILD_BUILTINS=OFF', '-DCOMPILER_RT_BUILD_CRT=OFF', '-DCOMPILER_RT_BUILD_LIBFUZZER=OFF', '-DCOMPILER_RT_BUILD_PROFILE=ON', '-DCOMPILER_RT_BUILD_SANITIZERS=OFF', '-DCOMPILER_RT_BUILD_XRAY=OFF', - ] + ] RunCommand(['cmake'] + compiler_rt_args + [os.path.join(LLVM_DIR, 'llvm')], msvc_arch='x86', env=deployment_env)
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index abc059b0..88df096 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -41,7 +41,7 @@ # Reverting problematic clang rolls is safe, though. CLANG_REVISION = '9284abd0040afecfd619dbcf1b244a8b533291c9' CLANG_SVN_REVISION = 'n344329' -CLANG_SUB_REVISION = 5 +CLANG_SUB_REVISION = 6 PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8], CLANG_SUB_REVISION)
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py index 0aa73fc..aa85505 100755 --- a/tools/clang/scripts/upload_revision.py +++ b/tools/clang/scripts/upload_revision.py
@@ -92,14 +92,10 @@ clang_svn_revision = 'n' + GetCommitCount(clang_git_revision) clang_sub_revision = args.clang_sub_revision - # Needs shell=True on Windows due to git.bat in depot_tools. os.chdir(CHROMIUM_DIR) - git_revision = subprocess.check_output( - ["git", "rev-parse", "origin/master"], shell=is_win).strip() print("Making a patch for Clang {}-{}-{}".format( clang_svn_revision, clang_git_revision[:8], clang_sub_revision)) - print("Chrome revision: {}".format(git_revision)) clang_old_git_revision, clang_old_svn_revision, clang_old_sub_revision = \ PatchRevision(clang_git_revision, clang_svn_revision, clang_sub_revision) @@ -107,7 +103,7 @@ rev_string = "{}-{}-{}".format(clang_svn_revision, clang_git_revision[:8], clang_sub_revision) - Git(["checkout", "-b", "clang-{}".format(rev_string)]) + Git(["checkout", "origin/master", "-b", "clang-{}".format(rev_string)]) Git(["add", UPDATE_PY_PATH]) old_rev_string = "{}-{}-{}".format(clang_old_svn_revision, @@ -119,11 +115,10 @@ old_rev_string, rev_string, commit_message)]) Git(["cl", "upload", "-f", "--bypass-hooks"]) - Git(["cl", "try", "-B", "chromium/try", - "-b", "linux_upload_clang", - "-b", "mac_upload_clang", - "-b", "win_upload_clang", - "-r", git_revision]) + Git([ + "cl", "try", "-B", "chromium/try", "-b", "linux_upload_clang", "-b", + "mac_upload_clang", "-b", "win_upload_clang" + ]) print ("Please, wait until the try bots succeeded " "and then push the binaries to goma.")
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index aa52890..e35d1d8 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -27991,6 +27991,9 @@ <int value="21" label="EXTERNAL_MEDIA"/> <int value="22" label="DOCUMENTS_PROVIDER"/> <int value="23" label="SMB"/> + <int value="24" label="RECENT_AUDIO"/> + <int value="25" label="RECENT_IMAGES"/> + <int value="26" label="RECENT_VIDEOS"/> </enum> <enum name="FileManagerTaskType"> @@ -53719,6 +53722,15 @@ <int value="3" label="Profile deleted"/> </enum> +<enum name="ProfileAvatarState"> + <int value="0" label="Signed In: Gaia avatar"/> + <int value="1" label="Signed In: Modern avatar"/> + <int value="2" label="Signed In: Old avatar"/> + <int value="3" label="Signed Out: Default avatar (Grey silhouette)"/> + <int value="4" label="Signed Out: Modern avatar"/> + <int value="5" label="Signed Out: Old avatar"/> +</enum> + <enum name="ProfileCreateResult"> <int value="0" label="Failed locally"/> <int value="1" label="Failed remotely"/> @@ -53843,6 +53855,14 @@ <int value="17" label="Edit profile button"/> </enum> +<enum name="ProfileNameState"> + <int value="0" label="Gaia name"/> + <int value="1" label="Gaia name and custom name"/> + <int value="2" label="Gaia name and default name (for unambiguity)"/> + <int value="3" label="Custom name only (signed-out)"/> + <int value="4" label="Default name only (signed-out)"/> +</enum> + <enum name="ProfileNetUserCount"> <int value="0" label="Added new user"/> <int value="1" label="Deleted a profile"/> @@ -53953,6 +53973,13 @@ <int value="1" label="Secondary (user-created) profile"/> </enum> +<enum name="ProfileUnconsentedPrimaryAccountType"> + <int value="0" label="Consumer account"/> + <int value="1" label="Enterprise account"/> + <int value="2" label="Child account"/> + <int value="3" label="No account (signed-out)"/> +</enum> + <enum name="ProfileUpgradeEnrollment"> <int value="0" label="User viewed the Upgrade promo card in the user menu."/> <int value="1" label="User selected to view the intro tutorial."/> @@ -59840,6 +59867,9 @@ </enum> <enum name="SigninDiceMigrationStatus"> + <obsolete> + Removed 03/2020. + </obsolete> <int value="0" label="Enabled"/> <int value="1" label="Disabled, ready for migration"/> <int value="2" label="Disabled, not ready for migration"/> @@ -66107,6 +66137,17 @@ <int value="1" label="Was used in draw"/> </enum> +<enum name="UsedMimeTypeHandler"> + <summary> + Reports the default MIME type handler that is being used to display a file. + </summary> + <int value="0" label="PdfExtension"/> + <int value="1" label="QuickOfficeComponentExtension"/> + <int value="2" label="QuickOfficeInternalExtension"/> + <int value="3" label="QuickOfficeExtension"/> + <int value="4" label="TestExtension"/> +</enum> + <enum name="UsedOmnibox"> <int value="0" label="Used Omnibox"/> </enum>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index d536fbe4..8ad50e22 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -55048,6 +55048,17 @@ <summary>Updates grouped by Extension::HistogramType.</summary> </histogram> +<histogram name="Extensions.UsedMimeTypeHandler" enum="UsedMimeTypeHandler" + expires_after="2021-03-01"> + <owner>apotapchuk@chromium.org</owner> + <owner>anqing@chromium.org</owner> + <summary> + Tracks the usage of different MIME type handlers used to view files. It is + recorded when the browser intercepts navigation with one of the type + handlers. + </summary> +</histogram> + <histogram name="Extensions.WebRequest.EventListenerFlag" enum="WebRequestEventListenerFlag" expires_after="never"> <!-- expires-never: For monitoring Web Request API usage statistics. --> @@ -116813,7 +116824,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when CanMakePayment was not called by the merchant. @@ -116825,7 +116836,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the merchant used the CanMakePayment method during a Payment Request. @@ -116837,7 +116848,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> The effect of the CanMakePayment return value on whether Show was called. </summary> @@ -116849,7 +116860,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when CanMakePayment was called by the merchant and returned false. @@ -116862,7 +116873,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when CanMakePayment was called by the merchant and returned true. @@ -116871,7 +116882,8 @@ <histogram name="PaymentRequest.CheckoutFunnel.Aborted" enum="PaymentRequestAbortReason" expires_after="M85"> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary>The reason that lead to an abort of the Payment Request.</summary> </histogram> @@ -116880,7 +116892,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary>When the merchant has processed the user's Payment Request.</summary> </histogram> @@ -116889,13 +116901,14 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary>When a Payment Request gets initiated by the user.</summary> </histogram> <histogram name="PaymentRequest.CheckoutFunnel.NoShow" enum="PaymentRequestNoShowReason" expires_after="2020-05-24"> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> The reason that leads to the Payment Request not being shown to the user. </summary> @@ -116906,7 +116919,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> When the user clicks the "pay" button in the Payment Request UI. </summary> @@ -116917,7 +116930,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> When the browser retrieves the instrument details from the payment app to complete a purchase. @@ -116929,7 +116942,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> When the Payment Request UI gets shown after initialization. </summary> @@ -116940,7 +116953,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> When the Payment Request UI gets skipped to go directly to the payment app. </summary> @@ -116948,7 +116961,8 @@ <histogram name="PaymentRequest.Events" units="bitfield value" expires_after="2020-07-26"> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> A bitfield representing the different events that happened during the Payment Request. @@ -117014,7 +117028,8 @@ <histogram name="PaymentRequest.NumberOfSelectionAdds" units="units" expires_after="2020-07-26"> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> The number of times the user added an entry during a Payment Request. </summary> @@ -117022,23 +117037,26 @@ <histogram name="PaymentRequest.NumberOfSelectionChanges" units="units" expires_after="2020-07-26"> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> The number of times the user changed an entry during a Payment Request. </summary> </histogram> <histogram name="PaymentRequest.NumberOfSelectionEdits" units="units" - expires_after="2020-03-22"> - <owner>sebsg@chromium.org</owner> + expires_after="2020-10-22"> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> The number of times the user edited an entry during a Payment Request. </summary> </histogram> <histogram name="PaymentRequest.NumberOfSuggestionsShown" units="units" - expires_after="2020-03-22"> - <owner>sebsg@chromium.org</owner> + expires_after="2020-10-22"> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> The number of suggestions shown to the user during a payment request. </summary> @@ -117049,7 +117067,7 @@ <obsolete> M62+ Included in PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Tracks what user information is required by merchants to complete a Payment Request. @@ -117061,7 +117079,7 @@ <obsolete> M62+ Included in PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Tracks what payment method was used to complete a transaction in Payment Request. @@ -117156,7 +117174,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when the user did not have a complete suggestion offered for each requested information. @@ -117170,7 +117188,7 @@ Replaced by PaymentRequest.NumberOfSuggestionsShown.PaymentMethod on July 19th 2017. </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when the user did not have a a form of payment on file when the Payment Request was shown. @@ -117183,7 +117201,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when the user did not have suggestions offered for each requested information. @@ -117196,7 +117214,7 @@ <obsolete> M62+ Part of PaymentRequest.Events </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when the user had at least one complete suggestion offered for each requested information. @@ -117209,7 +117227,7 @@ Replaced by PaymentRequest.NumberOfSuggestionsShown.PaymentMethod on July 19th 2017. </obsolete> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> <summary> Whether the flow was completed when the user had a form of payment on file when the Payment Request was shown. @@ -117219,7 +117237,8 @@ <histogram name="PaymentRequest.UserHadSuggestionsForEverything.EffectOnCompletion" enum="PaymentRequestFlowCompletionStatus" expires_after="M85"> - <owner>sebsg@chromium.org</owner> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> <summary> Whether the flow was completed when the user had suggestions offered for each requested information. @@ -127707,6 +127726,48 @@ </summary> </histogram> +<histogram base="true" name="Profile.State.Avatar" enum="ProfileAvatarState" + expires_after="2021-03-11"> + <owner>jkrcal@chromium.org</owner> + <owner>droger@chromium.org</owner> + <summary> + The state of profile avatars as would be displayed to the user in the + profile picker. Recorded on startup of Chrome and whenever Chrome is used + after at least 30 minutes of inactivity. + </summary> +</histogram> + +<histogram base="true" name="Profile.State.LastUsed" units="days" + expires_after="2021-03-11"> + <owner>jkrcal@chromium.org</owner> + <owner>droger@chromium.org</owner> + <summary> + The number of days since a profile was last used. Recorded on startup of + Chrome and whenever Chrome is used after at least 30 minutes of inactivity. + </summary> +</histogram> + +<histogram base="true" name="Profile.State.Name" enum="ProfileNameState" + expires_after="2021-03-11"> + <owner>jkrcal@chromium.org</owner> + <owner>droger@chromium.org</owner> + <summary> + The state of profile name as would be displayed to the user in the profile + picker. Recorded on startup of Chrome and whenever Chrome is used after at + least 30 minutes of inactivity. + </summary> +</histogram> + +<histogram base="true" name="Profile.State.UnconsentedPrimaryAccountType" + enum="ProfileUnconsentedPrimaryAccountType" expires_after="2021-03-11"> + <owner>jkrcal@chromium.org</owner> + <owner>droger@chromium.org</owner> + <summary> + The type of profile's unconsented primary account. Recorded on startup of + Chrome and whenever Chrome is used after at least 30 minutes of inactivity. + </summary> +</histogram> + <histogram name="Profile.SupervisedProfileCreateError" enum="GoogleServiceAuthError" expires_after="2019-02-12"> <obsolete> @@ -140702,6 +140763,10 @@ <histogram name="Scheduling.Renderer.PendingTreeDuration" units="microseconds" expires_after="M81"> + <obsolete> + This duration is reported in EndCommitToActivation and Activation of + CompositorLatency metrics, and is removeded as of 03/2020. + </obsolete> <owner>ericrk@chromium.org</owner> <summary> Time between creating a pending tree and activating that tree. This differs @@ -148180,6 +148245,16 @@ </summary> </histogram> +<histogram name="SharedMemory.MapBlockedForSecurity" enum="BooleanBlocked" + expires_after="M85"> + <owner>dcheng@chromium.org</owner> + <owner>rsesek@chromium.org</owner> + <summary> + Tracks whether an attempt to map shared memory was blocked due to too much + shared memory already being mapped into the address space. + </summary> +</histogram> + <histogram name="SharedMemory.TimeSpentMakingAnonymousMemory" units="ms" expires_after="2015-06-03"> <obsolete> @@ -149527,6 +149602,9 @@ <histogram name="Signin.DiceMigrationStatus" enum="SigninDiceMigrationStatus" expires_after="2020-04-19"> + <obsolete> + Removed 03/2020, as it was equivalent to Signin.SigninAllowed. + </obsolete> <owner>droger@chromium.org</owner> <summary> The Dice migration status, recorded at startup for each profile. @@ -194569,6 +194647,24 @@ <affected-histogram name="UserImage.ProfileDownloadTime"/> </histogram_suffixes> +<histogram_suffixes name="ProfileStateGroup" separator="_"> + <suffix name="ActiveMultiProfile" + label="Recorded only for users with >=2 active profiles; recorded + for all their profiles."/> + <suffix name="All" label="Recorded for every profile of every user."/> + <suffix name="LatentMultiProfileActive" + label="Recorded only for users with >=2 profiles but only one + active; recorded only for the one active profile."/> + <suffix name="LatentMultiProfileOthers" + label="Recorded only for users with >=2 profiles but only one + active; recorded only for the non-active profiles."/> + <suffix name="SingleProfile" label="Recorded only for single-profile users."/> + <affected-histogram name="Profile.State.Avatar"/> + <affected-histogram name="Profile.State.LastUsed"/> + <affected-histogram name="Profile.State.Name"/> + <affected-histogram name="Profile.State.UnconsentedPrimaryAccountType"/> +</histogram_suffixes> + <histogram_suffixes name="ProgressiveScan" separator="_"> <suffix name="33Percent_4MinMax" label="Progressive scan @ 33%, 4 frequency bins."/>
diff --git a/ui/accessibility/ax_language_detection.cc b/ui/accessibility/ax_language_detection.cc index 7a5f844a..0229b26 100644 --- a/ui/accessibility/ax_language_detection.cc +++ b/ui/accessibility/ax_language_detection.cc
@@ -414,7 +414,7 @@ attr_value, kMaxDetectedLanguagesPerPage); // Create vector of AXLanguageSpans. for (const auto& result : top_languages) { - std::vector<SpanInfo> ranges = result.byte_ranges; + const std::vector<SpanInfo>& ranges = result.byte_ranges; for (const auto& span_info : ranges) { language_annotation.push_back( AXLanguageSpan{span_info.start_index, span_info.end_index,
diff --git a/ui/accessibility/mojom/ax_tree_update_mojom_traits.h b/ui/accessibility/mojom/ax_tree_update_mojom_traits.h index d9ee995b..18a8bb8a 100644 --- a/ui/accessibility/mojom/ax_tree_update_mojom_traits.h +++ b/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
@@ -17,14 +17,14 @@ static bool has_tree_data(const ui::AXTreeUpdate& p) { return p.has_tree_data; } - static ui::AXTreeData tree_data(const ui::AXTreeUpdate& p) { + static const ui::AXTreeData& tree_data(const ui::AXTreeUpdate& p) { return p.tree_data; } static int32_t node_id_to_clear(const ui::AXTreeUpdate& p) { return p.node_id_to_clear; } static int32_t root_id(const ui::AXTreeUpdate& p) { return p.root_id; } - static std::vector<ui::AXNodeData> nodes(const ui::AXTreeUpdate& p) { + static const std::vector<ui::AXNodeData>& nodes(const ui::AXTreeUpdate& p) { return p.nodes; } static ax::mojom::EventFrom event_from(const ui::AXTreeUpdate& p) {
diff --git a/ui/chromeos/ime/candidate_window_view.cc b/ui/chromeos/ime/candidate_window_view.cc index 7e887a0..52027104 100644 --- a/ui/chromeos/ime/candidate_window_view.cc +++ b/ui/chromeos/ime/candidate_window_view.cc
@@ -151,7 +151,7 @@ should_show_upper_side_(false), was_candidate_window_open_(false), window_shell_id_(window_shell_id) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); SetCanActivate(false); DCHECK(parent); set_parent_window(parent);
diff --git a/ui/chromeos/ime/infolist_window.cc b/ui/chromeos/ime/infolist_window.cc index 14739f0..7aafeca 100644 --- a/ui/chromeos/ime/infolist_window.cc +++ b/ui/chromeos/ime/infolist_window.cc
@@ -173,7 +173,7 @@ title_font_list_(gfx::Font(kJapaneseFontName, kFontSizeDelta + 15)), description_font_list_( gfx::Font(kJapaneseFontName, kFontSizeDelta + 11)) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); SetCanActivate(false); set_accept_events(false); set_margins(gfx::Insets());
diff --git a/ui/file_manager/base/js/volume_manager_types.js b/ui/file_manager/base/js/volume_manager_types.js index b39305e..c39fbd9 100644 --- a/ui/file_manager/base/js/volume_manager_types.js +++ b/ui/file_manager/base/js/volume_manager_types.js
@@ -126,6 +126,15 @@ // Root directory of an SMB file share. SMB: 'smb', + + // Root directory of recently-modified audio files. + RECENT_AUDIO: 'recent_audio', + + // Root directory of recently-modified image files. + RECENT_IMAGES: 'recent_images', + + // Root directory of recently-modified video files. + RECENT_VIDEOS: 'recent_videos', }; Object.freeze(VolumeManagerCommon.RootType); @@ -163,6 +172,9 @@ VolumeManagerCommon.RootType.EXTERNAL_MEDIA, // 21 VolumeManagerCommon.RootType.DOCUMENTS_PROVIDER, // 22 VolumeManagerCommon.RootType.SMB, // 23 + VolumeManagerCommon.RootType.RECENT_AUDIO, // 24 + VolumeManagerCommon.RootType.RECENT_IMAGES, // 25 + VolumeManagerCommon.RootType.RECENT_VIDEOS, // 26 ]; console.assert( Object.keys(VolumeManagerCommon.RootType).length ===
diff --git a/ui/file_manager/base/js/volume_manager_types_unittest.js b/ui/file_manager/base/js/volume_manager_types_unittest.js index 843af9c2..30fdaef 100644 --- a/ui/file_manager/base/js/volume_manager_types_unittest.js +++ b/ui/file_manager/base/js/volume_manager_types_unittest.js
@@ -34,6 +34,9 @@ // TODO(tapted): Validate this against util.isFakeEntry(..) when // files_app_entry_types is moved to file_manager/base. if (rootType === VolumeManagerCommon.RootType.RECENT || + rootType === VolumeManagerCommon.RootType.RECENT_AUDIO || + rootType === VolumeManagerCommon.RootType.RECENT_IMAGES || + rootType === VolumeManagerCommon.RootType.RECENT_VIDEOS || rootType === VolumeManagerCommon.RootType.DRIVE_FAKE_ROOT || rootType === VolumeManagerCommon.RootType.DEPRECATED_ADD_NEW_SERVICES_MENU) {
diff --git a/ui/file_manager/file_manager/background/js/entry_location_impl.js b/ui/file_manager/file_manager/background/js/entry_location_impl.js index 9c369a7..6e7c301 100644 --- a/ui/file_manager/file_manager/background/js/entry_location_impl.js +++ b/ui/file_manager/file_manager/background/js/entry_location_impl.js
@@ -30,7 +30,7 @@ this.rootType === VolumeManagerCommon.RootType.DRIVE_OFFLINE || this.rootType === VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME || this.rootType === VolumeManagerCommon.RootType.DRIVE_RECENT || - this.rootType === VolumeManagerCommon.RootType.RECENT; + util.isRecentRootType(this.rootType); /** @override */ this.isDriveBased = this.rootType === VolumeManagerCommon.RootType.DRIVE ||
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js index 69db0e1..d935c93 100644 --- a/ui/file_manager/file_manager/common/js/util.js +++ b/ui/file_manager/file_manager/common/js/util.js
@@ -575,13 +575,24 @@ }; /** + * Returns true if the given root type is for a container of recent files. + * @param {VolumeManagerCommon.RootType|null} rootType + * @return {boolean} + */ +util.isRecentRootType = rootType => { + return rootType == VolumeManagerCommon.RootType.RECENT || + rootType == VolumeManagerCommon.RootType.RECENT_AUDIO || + rootType == VolumeManagerCommon.RootType.RECENT_IMAGES || + rootType == VolumeManagerCommon.RootType.RECENT_VIDEOS; +}; + +/** * Returns true if the given entry is the root folder of recent files. * @param {!Entry|!FilesAppEntry} entry Entry or a fake entry. * @returns {boolean} */ util.isRecentRoot = entry => { - return util.isFakeEntry(entry) && - entry.rootType == VolumeManagerCommon.RootType.RECENT; + return util.isFakeEntry(entry) && util.isRecentRootType(entry.rootType); }; /** @@ -1119,6 +1130,12 @@ return str('DRIVE_DIRECTORY_LABEL'); case VolumeManagerCommon.RootType.RECENT: return str('RECENT_ROOT_LABEL'); + case VolumeManagerCommon.RootType.RECENT_AUDIO: + return str('MEDIA_VIEW_AUDIO_ROOT_LABEL'); + case VolumeManagerCommon.RootType.RECENT_IMAGES: + return str('MEDIA_VIEW_IMAGES_ROOT_LABEL'); + case VolumeManagerCommon.RootType.RECENT_VIDEOS: + return str('MEDIA_VIEW_VIDEOS_ROOT_LABEL'); case VolumeManagerCommon.RootType.CROSTINI: return str('LINUX_FILES_ROOT_LABEL'); case VolumeManagerCommon.RootType.MY_FILES:
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js index 17b9514..f175b896 100644 --- a/ui/file_manager/file_manager/foreground/js/directory_model.js +++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -209,8 +209,7 @@ */ isCurrentRootVolumeType_(volumeType) { const rootType = this.getCurrentRootType(); - return rootType != null && - rootType != VolumeManagerCommon.RootType.RECENT && + return rootType != null && !util.isRecentRootType(rootType) && VolumeManagerCommon.getVolumeTypeFromRootType(rootType) === volumeType; } @@ -1308,7 +1307,7 @@ chrome.fileManagerPrivate.DriveConnectionStateType.OFFLINE && (locationInfo && locationInfo.isDriveBased); - if (entry.rootType == VolumeManagerCommon.RootType.RECENT) { + if (util.isRecentRootType(entry.rootType)) { return DirectoryContents.createForRecent( context, /** @type {!FakeEntry} */ (entry), query); }
diff --git a/ui/file_manager/file_manager/foreground/js/last_modified_controller.js b/ui/file_manager/file_manager/foreground/js/last_modified_controller.js index 0b0f6c7..c27d078 100644 --- a/ui/file_manager/file_manager/foreground/js/last_modified_controller.js +++ b/ui/file_manager/file_manager/foreground/js/last_modified_controller.js
@@ -29,8 +29,7 @@ // If the current directory is Recent root, request FileTable to use // modificationByMeTime instead of modificationTime in last modified column. const useModificationByMeTime = - this.directoryModel_.getCurrentRootType() === - VolumeManagerCommon.RootType.RECENT; + util.isRecentRootType(this.directoryModel_.getCurrentRootType()); this.fileTable_.setUseModificationByMeTime(useModificationByMeTime); this.directoryModel_.getFileList().setUseModificationByMeTime( useModificationByMeTime);
diff --git a/ui/file_manager/file_manager/foreground/js/main_window_component.js b/ui/file_manager/file_manager/foreground/js/main_window_component.js index a7dc7c4..e9d3bf1d 100644 --- a/ui/file_manager/file_manager/foreground/js/main_window_component.js +++ b/ui/file_manager/file_manager/foreground/js/main_window_component.js
@@ -487,8 +487,7 @@ onWindowFocus_() { // When the window have got a focus while the current directory is Recent // root, refresh the contents. - if (this.directoryModel_.getCurrentRootType() === - VolumeManagerCommon.RootType.RECENT) { + if (util.isRecentRootType(this.directoryModel_.getCurrentRootType())) { this.directoryModel_.rescan(true /* refresh */); // Do not start the spinner here to silently refresh the contents. }
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js index 21faa38..23e8c9e 100644 --- a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js +++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
@@ -548,12 +548,14 @@ * their file types. * @param {string} label * @param {chrome.fileManagerPrivate.RecentFileType} fileType + * @param {VolumeManagerCommon.RootType} rootType * @return {!NavigationModelFakeItem} */ - const createFilteredRecentModelItem = (label, fileType) => { + const createFilteredRecentModelItem = (label, fileType, rootType) => { const entry = /** @type {!FakeEntry} */ (Object.assign( Object.create(FakeEntry.prototype), this.recentModelItem_.entry)); entry.recentFileType = fileType; + entry.rootType = rootType; return new NavigationModelFakeItem( label, NavigationModelItemType.RECENT, entry); }; @@ -567,13 +569,16 @@ // Unified Media View (Images, Videos and Audio). this.navigationItems_.push(createFilteredRecentModelItem( str('MEDIA_VIEW_AUDIO_ROOT_LABEL'), - chrome.fileManagerPrivate.RecentFileType.AUDIO)); + chrome.fileManagerPrivate.RecentFileType.AUDIO, + VolumeManagerCommon.RootType.RECENT_AUDIO)); this.navigationItems_.push(createFilteredRecentModelItem( str('MEDIA_VIEW_IMAGES_ROOT_LABEL'), - chrome.fileManagerPrivate.RecentFileType.IMAGE)); + chrome.fileManagerPrivate.RecentFileType.IMAGE, + VolumeManagerCommon.RootType.RECENT_IMAGES)); this.navigationItems_.push(createFilteredRecentModelItem( str('MEDIA_VIEW_VIDEOS_ROOT_LABEL'), - chrome.fileManagerPrivate.RecentFileType.VIDEO)); + chrome.fileManagerPrivate.RecentFileType.VIDEO, + VolumeManagerCommon.RootType.RECENT_VIDEOS)); } }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js index 9252f65..a199ded1 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js +++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -1845,7 +1845,7 @@ icon.classList.add('item-icon'); icon.setAttribute('root-type-icon', rootType); - if (rootType === VolumeManagerCommon.RootType.RECENT) { + if (util.isRecentRootType(rootType)) { if (this.dirEntry_.recentFileType) { icon.setAttribute('recent-file-type', this.dirEntry_.recentFileType); } else { // Recent tab scroll fix: crbug.com/1027973.
diff --git a/ui/file_manager/integration_tests/file_manager/directory_tree.js b/ui/file_manager/integration_tests/file_manager/directory_tree.js index 9411c85..d99ef6c 100644 --- a/ui/file_manager/integration_tests/file_manager/directory_tree.js +++ b/ui/file_manager/integration_tests/file_manager/directory_tree.js
@@ -312,13 +312,11 @@ chrome.test.assertTrue(await remoteCall.callRemoteTestUtil( 'requestAnimationFrame', appId, [])); - // Get the scroll limits: see crbug.com/721759 for RTL |scrollRight|. const scrolled = await remoteCall.waitForElementStyles( appId, directoryTree, ['scrollLeft']); - const scrollRight = scrolled.scrollWidth - scrolled.renderedWidth; // Check: the directory tree should not be horizontally scrolled. - const notScrolled = scrolled.scrollLeft === scrollRight; + const notScrolled = scrolled.scrollLeft === 0; chrome.test.assertTrue(notScrolled, 'Tree should not scroll right'); };
diff --git a/ui/file_manager/integration_tests/file_manager/recents.js b/ui/file_manager/integration_tests/file_manager/recents.js index 90f2bac..9aa99baa 100644 --- a/ui/file_manager/integration_tests/file_manager/recents.js +++ b/ui/file_manager/integration_tests/file_manager/recents.js
@@ -68,6 +68,12 @@ await verifyCurrentEntries(appId, expectedEntries); } +async function verifyBreadcrumbsPath(appId, expectedPath) { + const path = + await remoteCall.callRemoteTestUtil('getBreadcrumbPath', appId, []); + chrome.test.assertEq(expectedPath, path); +} + testcase.recentsDownloads = async () => { // Populate downloads. const appId = await setupAndWaitUntilReady( @@ -119,6 +125,9 @@ RootPath.DOWNLOADS, BASIC_LOCAL_ENTRY_SET, []); // ENTRIES.beautiful is recently-modified and has .ogg file extension. await verifyRecentAudio(appId, [ENTRIES.beautiful]); + + // Breadcrumbs path should be '/Audio'. + await verifyBreadcrumbsPath(appId, '/Audio'); }; testcase.recentAudioDownloadsAndDrive = async () => { @@ -136,6 +145,9 @@ RootPath.DOWNLOADS, BASIC_LOCAL_ENTRY_SET, []); // ENTRIES.desktop is recently-modified and has .png file extension. await verifyRecentImages(appId, [ENTRIES.desktop]); + + // Breadcrumbs path should be '/Images'. + await verifyBreadcrumbsPath(appId, '/Images'); }; testcase.recentImagesDownloadsAndDrive = async () => { @@ -152,6 +164,9 @@ RootPath.DOWNLOADS, BASIC_LOCAL_ENTRY_SET.concat([RECENTLY_MODIFIED_VIDEO]), []); await verifyRecentVideos(appId, [RECENTLY_MODIFIED_VIDEO]); + + // Breadcrumbs path should be '/Videos'. + await verifyBreadcrumbsPath(appId, '/Videos'); }; testcase.recentVideosDownloadsAndDrive = async () => {
diff --git a/ui/gfx/range/range_f.cc b/ui/gfx/range/range_f.cc index b3bfc69..553e511 100644 --- a/ui/gfx/range/range_f.cc +++ b/ui/gfx/range/range_f.cc
@@ -14,16 +14,6 @@ namespace gfx { -RangeF RangeF::Intersect(const RangeF& range) const { - float min = std::max(GetMin(), range.GetMin()); - float max = std::min(GetMax(), range.GetMax()); - - if (min >= max) // No intersection. - return InvalidRange(); - - return RangeF(min, max); -} - RangeF RangeF::Intersect(const Range& range) const { RangeF range_f(range.start(), range.end()); return Intersect(range_f);
diff --git a/ui/gfx/range/range_f.h b/ui/gfx/range/range_f.h index 1d58ad4..1d51b29 100644 --- a/ui/gfx/range/range_f.h +++ b/ui/gfx/range/range_f.h
@@ -65,20 +65,35 @@ // Returns true if this range intersects the specified |range|. constexpr bool Intersects(const RangeF& range) const { - return IsValid() && range.IsValid() && - !(range.GetMax() < GetMin() || range.GetMin() >= GetMax()); + return Intersect(range).IsValid(); + } + + // Returns true if this range is contained by the specified |range| or it is + // an empty range and ending the range |range|. (copied from gfx::Range) + constexpr bool IsBoundedBy(const RangeF& range) const { + return IsValid() && range.IsValid() && GetMin() >= range.GetMin() && + GetMax() <= range.GetMax(); } // Returns true if this range contains the specified |range|. constexpr bool Contains(const RangeF& range) const { - return IsValid() && range.IsValid() && GetMin() <= range.GetMin() && - range.GetMax() <= GetMax(); + return range.IsBoundedBy(*this) && + // A non-empty range doesn't contain the range [max, max). + (range.GetMax() != GetMax() || range.is_empty() == is_empty()); } // Computes the intersection of this range with the given |range|. // If they don't intersect, it returns an InvalidRange(). // The returned range is always empty or forward (never reversed). - RangeF Intersect(const RangeF& range) const; + constexpr RangeF Intersect(const RangeF& range) const { + const float min = std::max(GetMin(), range.GetMin()); + const float max = std::min(GetMax(), range.GetMax()); + + return (min < max || Contains(range) || range.Contains(*this)) + ? RangeF(min, max) + : InvalidRange(); + } + RangeF Intersect(const Range& range) const; // Floor/Ceil/Round the start and end values of the given RangeF.
diff --git a/ui/gfx/range/range_unittest.cc b/ui/gfx/range/range_unittest.cc index 42fc5aa97..55fbbcb 100644 --- a/ui/gfx/range/range_unittest.cc +++ b/ui/gfx/range/range_unittest.cc
@@ -311,6 +311,63 @@ } } +TEST(RangeTest, RangeFOperations) { + constexpr gfx::RangeF invalid_range = gfx::RangeF::InvalidRange(); + constexpr gfx::RangeF ranges[] = {{0.f, 0.f}, {0.f, 1.f}, {0.f, 2.f}, + {1.f, 0.f}, {1.f, 1.f}, {1.f, 2.f}, + {2.f, 0.f}, {2.f, 1.f}, {2.f, 2.f}}; + + // Ensures valid behavior over same range. + for (const auto& range : ranges) { + SCOPED_TRACE(range.ToString()); + // A range should contain itself. + EXPECT_TRUE(range.Contains(range)); + // A ranges should intersect with itself. + EXPECT_TRUE(range.Intersects(range)); + } + + // Ensures valid behavior with an invalid range. + for (const auto& range : ranges) { + SCOPED_TRACE(range.ToString()); + EXPECT_FALSE(invalid_range.Contains(range)); + EXPECT_FALSE(invalid_range.Intersects(range)); + EXPECT_FALSE(range.Contains(invalid_range)); + EXPECT_FALSE(range.Intersects(invalid_range)); + } + EXPECT_FALSE(invalid_range.Contains(invalid_range)); + EXPECT_FALSE(invalid_range.Intersects(invalid_range)); + + // Ensures consistent operations between Contains(...) and Intersects(...). + for (const auto& range1 : ranges) { + for (const auto& range2 : ranges) { + SCOPED_TRACE(testing::Message() + << "range1=" << range1 << " range2=" << range2); + if (range1.Contains(range2)) { + EXPECT_TRUE(range1.Intersects(range2)); + EXPECT_EQ(range2.Contains(range1), + range1.EqualsIgnoringDirection(range2)); + } + EXPECT_EQ(range2.Intersects(range1), range1.Intersects(range2)); + + EXPECT_EQ(range1.Intersect(range2) != invalid_range, + range1.Intersects(range2)); + } + } + + // Ranges should behave the same way no matter the direction. + for (const auto& range1 : ranges) { + for (const auto& range2 : ranges) { + SCOPED_TRACE(testing::Message() + << "range1=" << range1 << " range2=" << range2); + EXPECT_EQ(range1.Contains(range2), + range1.Contains(gfx::RangeF(range2.GetMax(), range2.GetMin()))); + EXPECT_EQ( + range1.Intersects(range2), + range1.Intersects(gfx::RangeF(range2.GetMax(), range2.GetMin()))); + } + } +} + TEST(RangeTest, ContainsAndIntersects) { constexpr gfx::Range r1(0, 0); constexpr gfx::Range r2(0, 1); @@ -373,6 +430,68 @@ EXPECT_TRUE(r8.Intersects(r8)); } +TEST(RangeTest, ContainsAndIntersectsRangeF) { + constexpr gfx::RangeF r1(0.f, 0.f); + constexpr gfx::RangeF r2(0.f, 1.f); + constexpr gfx::RangeF r3(1.f, 2.f); + constexpr gfx::RangeF r4(1.f, 0.f); + constexpr gfx::RangeF r5(2.f, 1.f); + constexpr gfx::RangeF r6(0.f, 2.f); + constexpr gfx::RangeF r7(2.f, 0.f); + constexpr gfx::RangeF r8(1.f, 1.f); + + // Ensures Contains(...) handle the open range. + EXPECT_TRUE(r2.Contains(r1)); + EXPECT_TRUE(r4.Contains(r1)); + EXPECT_TRUE(r3.Contains(r5)); + EXPECT_TRUE(r5.Contains(r3)); + + // Ensures larger ranges contains smaller ranges. + EXPECT_TRUE(r6.Contains(r1)); + EXPECT_TRUE(r6.Contains(r2)); + EXPECT_TRUE(r6.Contains(r3)); + EXPECT_TRUE(r6.Contains(r4)); + EXPECT_TRUE(r6.Contains(r5)); + + EXPECT_TRUE(r7.Contains(r1)); + EXPECT_TRUE(r7.Contains(r2)); + EXPECT_TRUE(r7.Contains(r3)); + EXPECT_TRUE(r7.Contains(r4)); + EXPECT_TRUE(r7.Contains(r5)); + + // Ensures Intersects(...) handle the open range. + EXPECT_TRUE(r2.Intersects(r1)); + EXPECT_TRUE(r4.Intersects(r1)); + + // Ensures larger ranges intersects smaller ranges. + EXPECT_TRUE(r6.Intersects(r1)); + EXPECT_TRUE(r6.Intersects(r2)); + EXPECT_TRUE(r6.Intersects(r3)); + EXPECT_TRUE(r6.Intersects(r4)); + EXPECT_TRUE(r6.Intersects(r5)); + + EXPECT_TRUE(r7.Intersects(r1)); + EXPECT_TRUE(r7.Intersects(r2)); + EXPECT_TRUE(r7.Intersects(r3)); + EXPECT_TRUE(r7.Intersects(r4)); + EXPECT_TRUE(r7.Intersects(r5)); + + // Ensures adjacent ranges don't overlap. + EXPECT_FALSE(r2.Intersects(r3)); + EXPECT_FALSE(r5.Intersects(r4)); + + // Ensures empty ranges are handled correctly. + EXPECT_FALSE(r1.Contains(r8)); + EXPECT_FALSE(r2.Contains(r8)); + EXPECT_TRUE(r3.Contains(r8)); + EXPECT_TRUE(r8.Contains(r8)); + + EXPECT_FALSE(r1.Intersects(r8)); + EXPECT_FALSE(r2.Intersects(r8)); + EXPECT_TRUE(r3.Intersects(r8)); + EXPECT_TRUE(r8.Intersects(r8)); +} + TEST(RangeTest, Intersect) { EXPECT_EQ(gfx::Range(0, 1).Intersect({0, 1}), gfx::Range(0, 1)); EXPECT_EQ(gfx::Range(0, 1).Intersect({0, 0}), gfx::Range(0, 0)); @@ -388,6 +507,32 @@ EXPECT_EQ(gfx::Range(2, 1).Intersect({1, 0}), gfx::Range::InvalidRange()); } +TEST(RangeTest, IntersectRangeF) { + EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(0.f, 1.f)), + gfx::RangeF(0.f, 1.f)); + EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(0.f, 0.f)), + gfx::RangeF(0.f, 0.f)); + EXPECT_EQ(gfx::RangeF(0.f, 0.f).Intersect(gfx::RangeF(1.f, 0.f)), + gfx::RangeF(0.f, 0.f)); + EXPECT_EQ(gfx::RangeF(0.f, 4.f).Intersect(gfx::RangeF(2.f, 3.f)), + gfx::RangeF(2.f, 3.f)); + EXPECT_EQ(gfx::RangeF(0.f, 4.f).Intersect(gfx::RangeF(2.f, 7.f)), + gfx::RangeF(2.f, 4.f)); + EXPECT_EQ(gfx::RangeF(0.f, 4.f).Intersect(gfx::RangeF(3.f, 4.f)), + gfx::RangeF(3.f, 4.f)); + + EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(1.f, 1.f)), + gfx::RangeF::InvalidRange()); + EXPECT_EQ(gfx::RangeF(1.f, 1.f).Intersect(gfx::RangeF(1.f, 0.f)), + gfx::RangeF::InvalidRange()); + EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(1.f, 2.f)), + gfx::RangeF::InvalidRange()); + EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(2.f, 1.f)), + gfx::RangeF::InvalidRange()); + EXPECT_EQ(gfx::RangeF(2.f, 1.f).Intersect(gfx::RangeF(1.f, 0.f)), + gfx::RangeF::InvalidRange()); +} + TEST(RangeTest, IsBoundedBy) { constexpr gfx::Range r1(0, 0); constexpr gfx::Range r2(0, 1);
diff --git a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc index fcd35c5..fd97e46 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -73,7 +73,7 @@ void show_close_button() { should_show_close_button_ = true; } void hide_buttons() { should_show_close_button_ = false; - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } void set_should_show_window_title(bool should_show_window_title) { should_show_window_title_ = should_show_window_title;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index c16f93e..e17664e6 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -907,7 +907,7 @@ : BubbleDialogDelegateView(nullptr, BubbleBorder::NONE) { set_shadow(BubbleBorder::NO_ASSETS); SetAnchorRect(gfx::Rect()); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); } ~TestBubbleDialogDelegateView() override = default; @@ -978,7 +978,7 @@ class TestWidthSnapDelegate : public TestBubbleDialogDelegateView { public: TestWidthSnapDelegate(TestAnchor* anchor, bool should_snap) { - DialogDelegate::set_buttons(should_snap ? ui::DIALOG_BUTTON_OK + DialogDelegate::SetButtons(should_snap ? ui::DIALOG_BUTTON_OK : ui::DIALOG_BUTTON_NONE); SetAnchorView(anchor->widget().GetContentsView()); set_margins(gfx::Insets());
diff --git a/ui/views/bubble/info_bubble.cc b/ui/views/bubble/info_bubble.cc index dbf137a..9bcded0 100644 --- a/ui/views/bubble/info_bubble.cc +++ b/ui/views/bubble/info_bubble.cc
@@ -51,7 +51,7 @@ DCHECK(anchor_); SetAnchorView(anchor_); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_margins(LayoutProvider::Get()->GetInsetsMetric( InsetsMetric::INSETS_TOOLTIP_BUBBLE));
diff --git a/ui/views/examples/bubble_example.cc b/ui/views/examples/bubble_example.cc index 4778ab2..7ee00600 100644 --- a/ui/views/examples/bubble_example.cc +++ b/ui/views/examples/bubble_example.cc
@@ -69,7 +69,7 @@ public: ExampleBubble(View* anchor, BubbleBorder::Arrow arrow) : BubbleDialogDelegateView(anchor, arrow) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } protected:
diff --git a/ui/views/examples/dialog_example.cc b/ui/views/examples/dialog_example.cc index 614f7bcc..3261305 100644 --- a/ui/views/examples/dialog_example.cc +++ b/ui/views/examples/dialog_example.cc
@@ -37,10 +37,10 @@ class DialogExample::Delegate : public virtual DialogType { public: explicit Delegate(DialogExample* parent) : parent_(parent) { - DialogDelegate::set_buttons(parent_->GetDialogButtons()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, + DialogDelegate::SetButtons(parent_->GetDialogButtons()); + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, parent_->ok_button_label_->GetText()); - DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, + DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, parent_->cancel_button_label_->GetText()); }
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc index bd8d5da..0463acc 100644 --- a/ui/views/focus/focus_manager_unittest.cc +++ b/ui/views/focus/focus_manager_unittest.cc
@@ -877,7 +877,7 @@ public: explicit TestBubbleDialogDelegateView(View* anchor) : BubbleDialogDelegateView(anchor, BubbleBorder::NONE) { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } ~TestBubbleDialogDelegateView() override = default;
diff --git a/ui/views/touchui/touch_selection_menu_views.cc b/ui/views/touchui/touch_selection_menu_views.cc index 4d5f9bc4..c41d4ae 100644 --- a/ui/views/touchui/touch_selection_menu_views.cc +++ b/ui/views/touchui/touch_selection_menu_views.cc
@@ -41,7 +41,7 @@ DCHECK(owner_); DCHECK(client_); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); set_shadow(BubbleBorder::SMALL_SHADOW); set_parent_window(context); constexpr gfx::Insets kMenuMargins = gfx::Insets(1);
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index e6767db..90c1111 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -1109,7 +1109,7 @@ : modal_type_(modal_type) {} void SetButtons(int buttons) { - DialogDelegate::set_buttons(buttons); + DialogDelegate::SetButtons(buttons); DialogModelChanged(); }
diff --git a/ui/views/widget/root_view_unittest.cc b/ui/views/widget/root_view_unittest.cc index 3d4238d..679f2af 100644 --- a/ui/views/widget/root_view_unittest.cc +++ b/ui/views/widget/root_view_unittest.cc
@@ -732,7 +732,7 @@ public: RootViewTestDialogDelegate() { // Ensure that buttons don't influence the layout. - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); } ~RootViewTestDialogDelegate() override = default;
diff --git a/ui/views/window/dialog_client_view_unittest.cc b/ui/views/window/dialog_client_view_unittest.cc index fd7be9f..390eac2 100644 --- a/ui/views/window/dialog_client_view_unittest.cc +++ b/ui/views/window/dialog_client_view_unittest.cc
@@ -41,7 +41,7 @@ WidgetTest::SetUp(); DialogDelegate::set_use_custom_frame(false); - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE); // Note: not using DialogDelegate::CreateDialogWidget(..), since that can // alter the frame type according to the platform. @@ -86,7 +86,7 @@ // Sets the buttons to show in the dialog and refreshes the dialog. void SetDialogButtons(int dialog_buttons) { - DialogDelegate::set_buttons(dialog_buttons); + DialogDelegate::SetButtons(dialog_buttons); DialogModelChanged(); } @@ -119,7 +119,7 @@ // exceeded. The resulting width is around 160 pixels, but depends on system // fonts. void SetLongCancelLabel() { - DialogDelegate::set_button_label( + DialogDelegate::SetButtonLabel( ui::DIALOG_BUTTON_CANCEL, base::ASCIIToUTF16("Cancel Cancel Cancel")); DialogModelChanged(); } @@ -336,7 +336,7 @@ // Ensure there is no default button since getting a bold font can throw off // the cached sizes. - set_default_button(ui::DIALOG_BUTTON_NONE); + SetDefaultButton(ui::DIALOG_BUTTON_NONE); SetDialogButtons(ui::DIALOG_BUTTON_OK); CheckContentsIsSetToPreferredSize(); @@ -383,7 +383,7 @@ // Ensure there is no default button since getting a bold font can throw off // the cached sizes. - set_default_button(ui::DIALOG_BUTTON_NONE); + SetDefaultButton(ui::DIALOG_BUTTON_NONE); SetDialogButtons(ui::DIALOG_BUTTON_OK); CheckContentsIsSetToPreferredSize();
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index caf94e2..f0fcd58 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc
@@ -321,6 +321,31 @@ observer.OnDialogChanged(); } +void DialogDelegate::SetDefaultButton(int button) { + params_.default_button = button; +} + +void DialogDelegate::SetButtons(int buttons) { + params_.buttons = buttons; +} + +void DialogDelegate::SetButtonLabel(ui::DialogButton button, + base::string16 label) { + params_.button_labels[button] = label; +} + +void DialogDelegate::SetAcceptCallback(base::OnceClosure callback) { + accept_callback_ = std::move(callback); +} + +void DialogDelegate::SetCancelCallback(base::OnceClosure callback) { + cancel_callback_ = std::move(callback); +} + +void DialogDelegate::SetCloseCallback(base::OnceClosure callback) { + close_callback_ = std::move(callback); +} + std::unique_ptr<View> DialogDelegate::DisownExtraView() { return std::move(extra_view_); }
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h index 38d54e83c8..54ea673 100644 --- a/ui/views/window/dialog_delegate.h +++ b/ui/views/window/dialog_delegate.h
@@ -56,7 +56,7 @@ // Text labels for the buttons on this dialog. Any button without a label // here will get the default text for its type from GetDialogButtonLabel. - // Prefer to use this field (via set_button_label) rather than override + // Prefer to use this field (via SetButtonLabel) rather than override // GetDialogButtonLabel - see https://crbug.com/1011446 base::string16 button_labels[ui::DIALOG_BUTTON_LAST + 1]; }; @@ -114,7 +114,7 @@ // overridden. This function should return true if the window can be closed // after it returns, or false if it must remain open. By default, return true // without doing anything. - // DEPRECATED: use |set_cancel_callback| instead. + // DEPRECATED: use |SetCancelCallback| instead. virtual bool Cancel(); // For Dialog boxes, this is called when the user presses the "OK" button, @@ -122,7 +122,7 @@ // has not been overridden. This function should return true if the window // can be closed after it returns, or false if it must remain open. By // default, return true without doing anything. - // DEPRECATED: use |set_accept_callback| instead. + // DEPRECATED: use |SetAcceptCallback| instead. virtual bool Accept(); // Overridden from WidgetDelegate: @@ -172,27 +172,18 @@ // Notifies observers when the result of the DialogModel overrides changes. void DialogModelChanged(); - void set_default_button(int button) { params_.default_button = button; } void set_use_round_corners(bool round) { params_.round_corners = round; } void set_draggable(bool draggable) { params_.draggable = draggable; } bool draggable() const { return params_.draggable; } void set_use_custom_frame(bool use) { params_.custom_frame = use; } bool use_custom_frame() const { return params_.custom_frame; } - void set_buttons(int buttons) { params_.buttons = buttons; } - void set_button_label(ui::DialogButton button, base::string16 label) { - params_.button_labels[button] = label; - } - - void set_accept_callback(base::OnceClosure callback) { - accept_callback_ = std::move(callback); - } - void set_cancel_callback(base::OnceClosure callback) { - cancel_callback_ = std::move(callback); - } - void set_close_callback(base::OnceClosure callback) { - close_callback_ = std::move(callback); - } + void SetDefaultButton(int button); + void SetButtons(int buttons); + void SetButtonLabel(ui::DialogButton button, base::string16 label); + void SetAcceptCallback(base::OnceClosure callback); + void SetCancelCallback(base::OnceClosure callback); + void SetCloseCallback(base::OnceClosure callback); // Returns ownership of the extra view for this dialog, if one was provided // via SetExtraView(). This is only for use by DialogClientView; don't call
diff --git a/ui/views/window/dialog_delegate_unittest.cc b/ui/views/window/dialog_delegate_unittest.cc index ace06841..eeaf5cd 100644 --- a/ui/views/window/dialog_delegate_unittest.cc +++ b/ui/views/window/dialog_delegate_unittest.cc
@@ -113,11 +113,11 @@ dialog_ = new TestDialog(); dialog_->Init(); - dialog_->set_accept_callback( + dialog_->SetAcceptCallback( base::BindLambdaForTesting([&]() { accepted_ = true; })); - dialog_->set_cancel_callback( + dialog_->SetCancelCallback( base::BindLambdaForTesting([&]() { cancelled_ = true; })); - dialog_->set_close_callback( + dialog_->SetCloseCallback( base::BindLambdaForTesting([&]() { closed_ = true; })); } @@ -363,7 +363,7 @@ class InitialFocusTestDialog : public DialogDelegateView { public: InitialFocusTestDialog() { - DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK); + DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK); } ~InitialFocusTestDialog() override = default; @@ -435,9 +435,9 @@ bool cancelled = false; bool accepted = false; - dialog.set_cancel_callback( + dialog.SetCancelCallback( base::BindLambdaForTesting([&]() { cancelled = true; })); - dialog.set_accept_callback( + dialog.SetAcceptCallback( base::BindLambdaForTesting([&]() { accepted = true; })); // At this point DefaultClose() would invoke either Accept() or Cancel(). @@ -454,9 +454,9 @@ bool closed = false; bool accepted = false; - dialog.set_close_callback( + dialog.SetCloseCallback( base::BindLambdaForTesting([&]() { closed = true; })); - dialog.set_accept_callback(base::BindLambdaForTesting([&]() { + dialog.SetAcceptCallback(base::BindLambdaForTesting([&]() { accepted = true; dialog.Close(); }));
diff --git a/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java b/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java index 750e609..927c910d 100644 --- a/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java +++ b/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java
@@ -33,12 +33,15 @@ return Pair.create( null, WebLayer.WebViewCompatibilityResult.FAILURE_UNSUPPORTED_VERSION); } - // Prepend "/." to all library paths. This changes the library path while still pointing to - // the same directory, allowing us to get around a check in the JVM. String[] libraryPaths = getLibraryPaths(remoteContext.getClassLoader()); - for (int i = 0; i < libraryPaths.length; i++) { - assert libraryPaths[i].startsWith("/"); - libraryPaths[i] = "/." + libraryPaths[i]; + // Prepend "/." to all library paths. This changes the library path while still pointing to + // the same directory, allowing us to get around a check in the JVM. This is only necessary + // for N+, where we rely on linker namespaces. + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { + for (int i = 0; i < libraryPaths.length; i++) { + assert libraryPaths[i].startsWith("/"); + libraryPaths[i] = "/." + libraryPaths[i]; + } } ClassLoader classLoader = new PathClassLoader(getAllApkPaths(info.applicationInfo), TextUtils.join(File.pathSeparator, libraryPaths),
diff --git a/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java b/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java index b74cf6c..5a1c2b1 100644 --- a/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java +++ b/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java
@@ -15,6 +15,7 @@ import org.junit.runner.RunWith; import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.MinAndroidSdkLevel; /** * Tests for (@link WebViewCompatibilityHelper}. @@ -23,6 +24,7 @@ public class WebViewCompatibilityHelperTest { @Test @SmallTest + @MinAndroidSdkLevel(Build.VERSION_CODES.N) public void testLibraryPaths() throws Exception { Context appContext = InstrumentationRegistry.getTargetContext(); Context remoteContext = WebLayer.getOrCreateRemoteContext(appContext);
diff --git a/weblayer/shell/android/BUILD.gn b/weblayer/shell/android/BUILD.gn index 18bc3e3..d2fb6f4 100644 --- a/weblayer/shell/android/BUILD.gn +++ b/weblayer/shell/android/BUILD.gn
@@ -5,6 +5,7 @@ import("//android_webview/system_webview_apk_tmpl.gni") import("//build/config/android/config.gni") import("//build/config/android/rules.gni") +import("//build/config/python.gni") import("//third_party/icu/config.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") import("//weblayer/variables.gni") @@ -193,16 +194,15 @@ shared_libraries = [ "//weblayer:libweblayer" ] } -group("weblayer_shell_wpt") { + +python_library("weblayer_shell_wpt") { testonly = true + pydeps_file = "//testing/scripts/run_android_wpt.pydeps" data_deps = [ ":weblayer_shell_apk", ":weblayer_support_apk", "//build/android:test_runner_py", "//chrome/test/chromedriver:chromedriver($host_toolchain)", ] - set_sources_assignment_filter([ "#*" ]) - sources = read_file("//testing/scripts/run_android_wpt.pydeps", "list lines") - data = sources - data += [ "//third_party/blink/web_tests/external/" ] + data = [ "//third_party/blink/web_tests/external/" ] }