diff --git a/DEPS b/DEPS index 4609f26..1a23b52 100644 --- a/DEPS +++ b/DEPS
@@ -307,19 +307,19 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': '276920b7b0ec6cd87c7c9186ab939c266b11cd99', + 'src_internal_revision': '2696be08a419b4e4157477fb1617014b112f234c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '805702da3286417c8cef7014e88007a9c0a36cd0', + 'skia_revision': '26fa4b343fd31d67c35d5aff3690369111fb7cfb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '02228b57718ccf305951c8577401532f7b680ca1', + 'v8_revision': 'a85fd15873a1cdeaa4d4af813b24eaf0d2cad2d0', # 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': 'ed391dae33e6a511e8c669e7e0e7abcfa6d0ae78', + 'angle_revision': '0c1b3609d78f7766ce738c6f99b07bd139f00da5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -338,7 +338,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:13.20230628.0.1', + 'fuchsia_version': 'version:13.20230628.1.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -398,7 +398,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': '4440dd0eae4fd6c9509fa869f7dc73fd8f297a50', + 'devtools_frontend_revision': '0fc332e2fa4d53163b7809c712ad80dc1d577586', # 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. @@ -438,7 +438,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '4765e38cdc27112e4b1f06cea35acac4f66ab652', + 'dawn_revision': '63ff5bd4f9e835fbb08de4fd8c3284ad92a2fc5c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -466,7 +466,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'a35b3c1bf18063ed60cf35443b4aef1b50579d37', + 'nearby_revision': '34128a35deab88cda6352c11a7e53c276db3a2b0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -818,7 +818,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '14e0cef4d2c104adb11da44c94e43ce8d9311b84', + '17807e8aa0987328124156f54dcd6851a133ac8f', 'condition': 'checkout_android and checkout_src_internal', }, @@ -917,7 +917,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': '-EIW043DSedYMFTqrb_9taOmtPa_M7X6MpBO6QvClGkC', + 'version': 'DgMjKYIsmMe_ImYlzSq66LrRSkHhUtdjViHdIyKAYdcC', }, ], 'dep_type': 'cipd', @@ -928,7 +928,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': '2AFNxGmc2yoRcwW7F-RJ8zw_oxLha4XNMY1wqh72a2IC', + 'version': 'IG6cPkDuPLGDtQoAR8_zpjTo7mv_KM-gBbood9i6M4sC', }, ], 'dep_type': 'cipd', @@ -939,7 +939,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'AoSuXtYBzC6rbZTiYNbtwHjoys0ACtJMZv0NJ0qZE7UC', + 'version': 'LSdsz6GGqOVjNGdQXsu1DQj2GVSQe6KiifB4rfAYY0gC', }, ], 'dep_type': 'cipd', @@ -1002,7 +1002,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_toolchain/android_toolchain', - 'version': 'version:2@r25c.cr1', + 'version': 'R_8suM8m0oHbZ1awdxGXvKEFpAOETscbfZxkkMthyk8C', }, ], 'condition': 'checkout_android_native_support', @@ -1013,7 +1013,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'BNS2DL_t6VtNjAQ9hEOz_rqTe-n-hN3VEmmXgu-c7jUC', + 'version': '3pjrxs8xVIvEhmgW2VkbDTbxi1MKlpGwb1cdYHDM9l8C', }, ], 'condition': 'checkout_android', @@ -1260,7 +1260,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'd7c585d21ba146215538158252483538d75a0a58', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '143c720ec13b28fff5fcffa9f6c5d67be406845b', 'condition': 'checkout_src_internal', }, @@ -1730,7 +1730,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e20af3da173383970b9e6c2f2972047bf8800ce3', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '7aece8cd1277b6dac7b9b5d334e6ac79e5642c76', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1915,7 +1915,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6a70dfc1afdaab62379692c89083dbbae89156a3', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'a2e945e0424989abc35b308413df2e42288d154b', + Var('webrtc_git') + '/src.git' + '@' + 'ea668e36a9708a258540f2faf1020246371540b6', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -2040,7 +2040,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'j5QCTK88rOPltaE4QYndDHS9CVZ0d3tdmcxMVM0JPOYC', + 'version': '5CB2fAo0aKQ9Z6g1LxHu1vzLePfe8-htJ-tjYbAQtfYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4204,7 +4204,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '815e70870ec70997a74b88f163aeedf680cd93fe', + '8c0e1f9046e23e636caf29be961b607cbc4ed18c', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn index 166733c..fa38567 100644 --- a/android_webview/browser/BUILD.gn +++ b/android_webview/browser/BUILD.gn
@@ -224,6 +224,7 @@ "//components/embedder_support:embedder_support", "//components/embedder_support/android:util", "//components/embedder_support/origin_trials", + "//components/environment_integrity/android", "//components/favicon_base:favicon_base", "//components/flags_ui", "//components/keyed_service/content",
diff --git a/android_webview/browser/DEPS b/android_webview/browser/DEPS index df92c29..7fd69ad 100644 --- a/android_webview/browser/DEPS +++ b/android_webview/browser/DEPS
@@ -19,6 +19,7 @@ "+components/crash/core", "+components/download/public/common", "+components/embedder_support", + "+components/environment_integrity/android", "+components/favicon_base", "+components/flags_ui", "+components/heap_profiling", @@ -110,6 +111,7 @@ "+third_party/blink/public/common/permissions/permission_utils.h", "+third_party/blink/public/common/storage_key/storage_key.h", "+third_party/blink/public/common/user_agent/user_agent_metadata.h", + "+third_party/blink/public/mojom/environment_integrity/environment_integrity_service.mojom.h", "+third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h", "+third_party/crashpad/crashpad/client", "+third_party/crashpad/crashpad/util",
diff --git a/android_webview/browser/aw_content_browser_client_receiver_bindings.cc b/android_webview/browser/aw_content_browser_client_receiver_bindings.cc index 8b67bc6..4f7c6b2e 100644 --- a/android_webview/browser/aw_content_browser_client_receiver_bindings.cc +++ b/android_webview/browser/aw_content_browser_client_receiver_bindings.cc
@@ -11,6 +11,7 @@ #include "components/autofill/content/browser/content_autofill_driver_factory.h" #include "components/cdm/browser/media_drm_storage_impl.h" #include "components/content_capture/browser/onscreen_content_provider.h" +#include "components/environment_integrity/android/android_environment_integrity_service.h" #include "components/network_hints/browser/simple_network_hints_handler_impl.h" #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" #include "components/prefs/pref_service.h" @@ -22,11 +23,13 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/resource_context.h" +#include "content/public/common/content_features.h" #include "media/mojo/buildflags.h" #include "mojo/public/cpp/bindings/binder_map.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" +#include "third_party/blink/public/mojom/environment_integrity/environment_integrity_service.mojom.h" #if BUILDFLAG(ENABLE_SPELLCHECK) #include "components/spellcheck/browser/spell_check_host_impl.h" @@ -211,6 +214,11 @@ mojo::BinderMapWithContext<content::RenderFrameHost*>* map) { map->Add<network_hints::mojom::NetworkHintsHandler>( base::BindRepeating(&BindNetworkHintsHandler)); + + if (base::FeatureList::IsEnabled(features::kWebEnvironmentIntegrity)) { + map->Add<blink::mojom::EnvironmentIntegrityService>(base::BindRepeating( + &environment_integrity::AndroidEnvironmentIntegrityService::Create)); + } } } // namespace android_webview
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index edf6182..92a585b 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -453,6 +453,8 @@ "This flag won't block MIDI by default in WebView. In fact " + "it makes sure the changes made to do so in " + "Chromium won't affect WebView."), + Flag.baseFeature(BlinkFeatures.REMOVE_NON_STANDARD_APPEARANCE_VALUE, + "Remove non-standard CSS appearance values."), // Add new commandline switches and features above. The final entry should have a // trailing comma for cleaner diffs. };
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index efcc48d3..e5a11a8 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -805,7 +805,7 @@ // animation and just scale down. if (!layer() && !scale_up) { icon_scale_ = 1.0f; - SetIcon(icon_image_); + UpdateIconView(false); return; } @@ -813,7 +813,7 @@ if (!is_folder_) { if (scale_up) { icon_scale_ = kDragDropAppIconScale; - SetIcon(icon_image_); + UpdateIconView(false); layer()->SetTransform(gfx::GetScaleTransform( GetContentsBounds().CenterPoint(), 1 / kDragDropAppIconScale)); } else if (drag_state_ != DragState::kNone) { @@ -947,6 +947,7 @@ void AppListItemView::OnDragDone() { EnsureSelected(); + OnDragEnded(); } void AppListItemView::CancelContextMenu() {
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h index 4b20b3d..33ebc7b 100644 --- a/ash/app_list/views/app_list_item_view.h +++ b/ash/app_list/views/app_list_item_view.h
@@ -278,10 +278,6 @@ // dot for new install. gfx::Rect GetDefaultTitleBoundsForTest(); - // Called when the drag registered for this view ends. - // `drag_end_callback` passed to `GridDelegate::InitiateDrag()`. - void OnDragEnded(); - // Sets the most recent grid index for this item view. Also sets // `has_pending_row_change_` based on whether the grid index change is // considered a row change for the purposes of animating item views between @@ -384,6 +380,10 @@ // `drag_start_callback` passed to `GridDelegate::InitiateDrag()`. void OnDragStarted(); + // Called when the drag registered for this view ends. + // `drag_end_callback` passed to `GridDelegate::InitiateDrag()`. + void OnDragEnded(); + // AppListItemObserver overrides: void ItemIconChanged(AppListConfigType config_type) override; void ItemNameChanged() override;
diff --git a/ash/app_list/views/app_list_item_view_unittest.cc b/ash/app_list/views/app_list_item_view_unittest.cc index 07cde3e7..9802827d 100644 --- a/ash/app_list/views/app_list_item_view_unittest.cc +++ b/ash/app_list/views/app_list_item_view_unittest.cc
@@ -46,8 +46,6 @@ EXPECT_EQ(GetDragState(drag_view_), AppListItemView::DragState::kStarted); GetEventGenerator()->ReleaseTouch(); - EXPECT_EQ(GetDragState(drag_view_), - AppListItemView::DragState::kNone); }), base::DoNothing()); } @@ -381,4 +379,47 @@ EXPECT_TRUE(view->title()->GetVisible()); } +TEST_P(AppListItemViewTestWithDragDropController, + AppItemDragStateResetsAfterDrag) { + CreateAppListItem("TestItem 1"); + + auto* helper = GetAppListTestHelper(); + helper->ShowAppList(); + + auto* apps_grid_view = helper->GetScrollableAppsGridView(); + AppListItemView* view = apps_grid_view->GetItemViewAt(0); + auto* generator = GetEventGenerator(); + ASSERT_EQ(GetDragState(view), AppListItemView::DragState::kNone); + + SetAppListItemViewForTest(view); + + gfx::Point from = view->GetBoundsInScreen().CenterPoint(); + generator->MoveTouch(from); + generator->PressTouch(); + view->FireTouchDragTimerForTest(); + EXPECT_EQ(GetDragState(view), AppListItemView::DragState::kInitialized); + + // Make sure that the item view has a started drag state during drag. + ShellTestApi().drag_drop_controller()->SetLoopClosureForTesting( + base::BindLambdaForTesting([&]() { + drag_started_on_controller_++; + generator->MoveTouchBy(10, 10); + EXPECT_EQ(GetDragState(view), AppListItemView::DragState::kStarted); + generator->MoveMouseTo(apps_grid_view->GetBoundsInScreen().top_right()); + generator->MoveTouchBy(10, 10); + EXPECT_EQ(GetDragState(view), AppListItemView::DragState::kStarted); + helper->Dismiss(); + EXPECT_EQ(GetDragState(view), AppListItemView::DragState::kStarted); + generator->ReleaseTouch(); + }), + base::DoNothing()); + + generator->MoveTouchBy(10, 10); + + EXPECT_EQ(GetDragState(view), AppListItemView::DragState::kNone); + EXPECT_FALSE(view->FireTouchDragTimerForTest()); + EXPECT_FALSE(IsIconScaled(view)); + MaybeCheckDragStartedOnControllerCount(1); +} + } // namespace ash
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index bb1a0bb..4e29fbe 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -454,9 +454,6 @@ std::unique_ptr<ui::LayerTreeOwner> drag_image_layer_owner) { DCHECK(app_list_features::IsDragAndDropRefactorEnabled()); output_drag_op = ui::mojom::DragOperation::kMove; - if (drag_view_) { - drag_view_->OnDragEnded(); - } drag_image_layer_ = std::move(drag_image_layer_owner); EndDrag(/*cancel=*/false); @@ -1128,11 +1125,6 @@ return; } - // TODO(b/261985897): Consider removing the direct call to OnDragEnded. - if (drag_view_) { - drag_view_->OnDragEnded(); - } - // When the drag and drop host is a folder apps grid, close the folder when // drag exits folder grid bounds. // TODO(b/261985897): Add timer to close folder bounds.
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc index 78e4c8bd..c7f6b25 100644 --- a/ash/app_list/views/apps_grid_view_unittest.cc +++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include <algorithm> +#include <list> #include <memory> #include <optional> #include <string> @@ -569,6 +570,12 @@ void InitiateDragForView(AppsGridView::Pointer pointer, AppListItemView* view, AppsGridView* apps_grid_view) { + StartDragForViewAndFireTimer(pointer, view); + TriggerDragFlow(pointer); + } + + void StartDragForViewAndFireTimer(AppsGridView::Pointer pointer, + AppListItemView* view) { DCHECK(view); gfx::Point from = view->GetBoundsInScreen().CenterPoint(); @@ -586,14 +593,16 @@ view->FireMouseDragTimerForTest(); } current_drag_location_ = from; + } + void TriggerDragFlow(AppsGridView::Pointer pointer) { + DCHECK(current_drag_location_.has_value()); // Call UpdateDrag to trigger |apps_grid_view| change to cardified_state - // the cardified state starts only once the drag distance exceeds a drag // threshold, so the pointer has to sufficiently move from the original // position. - // Move in steps, because the drag and drop controller notifies the drop - // target OnDragUpdate(). - current_drag_location_ = from + gfx::Vector2d(10, 10); + current_drag_location_ = + current_drag_location_.value() + gfx::Vector2d(10, 10); UpdateDragInScreen(pointer, current_drag_location_.value(), 2); } @@ -4277,42 +4286,41 @@ AppListFolderItem* folder_item = GetTestModel()->CreateAndPopulateFolderWithApps(2); UpdateLayout(); + auto* shelf_view = GetPrimaryShelf()->GetShelfViewForTesting(); - auto drag_sequence = base::BindLambdaForTesting([&]() { + AppListItemView* const item_view = GetItemViewInTopLevelGrid(2); + ASSERT_TRUE(item_view->is_folder()); + + // TODO(anasalazar): Investigate why Mouse pointer does not + // ExceedDragThresehold in this case to trigger drag. + StartDragForViewAndFireTimer(AppsGridView::TOUCH, item_view); + + std::list<base::OnceClosure> tasks; + tasks.push_back(base::BindLambdaForTesting([&]() { // Verify that item drag has started. ASSERT_TRUE(apps_grid_view_->drag_item()); ASSERT_TRUE(apps_grid_view_->IsDragging()); ASSERT_EQ(folder_item, apps_grid_view_->drag_item()); - + })); + tasks.push_back(base::BindLambdaForTesting([&]() { // Shelf should start handling the drag if it moves within its bounds. - auto* shelf_view = GetPrimaryShelf()->GetShelfViewForTesting(); UpdateDragInScreen( - AppsGridView::MOUSE, + AppsGridView::TOUCH, shelf_view->GetBoundsInScreen().left_center() + gfx::Vector2d(5, 5), /*steps=*/1); ASSERT_FALSE(apps_grid_view_->FireDragToShelfTimerForTest()); EXPECT_TRUE(shelf_view->drag_and_drop_shelf_id().IsNull()); - - // Releasing drag over shelf should not pin the dragged folder. - EndDrag(); - }); - - if (use_drag_drop_refactor()) { - ShellTestApi().drag_drop_controller()->SetLoopClosureForTesting( - drag_sequence, base::DoNothing()); - } - - AppListItemView* const item_view = InitiateDragForItemAtCurrentPageAt( - AppsGridView::MOUSE, 0, 2, apps_grid_view_); - ASSERT_TRUE(item_view->is_folder()); - - if (!use_drag_drop_refactor()) { - drag_sequence.Run(); - } + })); + tasks.push_back( + base::BindLambdaForTesting([&]() { EndDrag(AppsGridView::TOUCH); })); + MaybeRunDragAndDropSequenceForAppList(&tasks, /*is_touch =*/true); EXPECT_FALSE(ShelfModel::Get()->IsAppPinned(folder_item->id())); - MaybeCheckHaptickEventsCount(1); + + // Make sure that the shelf does not have a drag view assigned. + EXPECT_FALSE(shelf_view->drag_image_layer_for_test()); + EXPECT_FALSE(shelf_view->drag_view()); } TEST_P(AppsGridViewDragTest, DragAndPinNotInitiallyVisibleItemToShelf) { @@ -4673,16 +4681,22 @@ // Populate the apps grid and start dragging one of the items. GetTestModel()->PopulateApps(3); UpdateLayout(); - InitiateDragForItemAtCurrentPageAt(AppsGridView::MOUSE, 0, 0, - apps_grid_view_); - // Ensure the cursor type is set to grabbing during the drag. - EXPECT_EQ(ui::mojom::CursorType::kGrabbing, - cursor_manager->GetCursor().type()); + AppListItemView* const item_view = GetItemViewInTopLevelGrid(0); + + StartDragForViewAndFireTimer(AppsGridView::MOUSE, item_view); + + std::list<base::OnceClosure> tasks; + tasks.push_back(base::BindLambdaForTesting([&]() { + // Ensure the cursor type is set to grabbing during the drag. + EXPECT_EQ(ui::mojom::CursorType::kGrabbing, + cursor_manager->GetCursor().type()); + })); + tasks.push_back(base::BindLambdaForTesting([&]() { EndDrag(); })); + MaybeRunDragAndDropSequenceForAppList(&tasks, /*is_touch =*/false); // Release the left mouse button to cancel the drag and verify that the cursor // type is reset. - EndDrag(); EXPECT_EQ(previous_cursor_type, cursor_manager->GetCursor().type()); } @@ -4693,17 +4707,25 @@ // Populate the apps grid and start dragging one of the items. GetTestModel()->PopulateApps(3); UpdateLayout(); - InitiateDragForItemAtCurrentPageAt(AppsGridView::MOUSE, 0, 0, - apps_grid_view_); - // The cursor type should be set to grabbing during the drag. - ASSERT_EQ(ui::mojom::CursorType::kGrabbing, - cursor_manager->GetCursor().type()); + AppListItemView* const item_view = GetItemViewInTopLevelGrid(0); - // Cancel the drag without releasing the left mouse button and verify that the - // cursor is still reset in this case. - GetEventGenerator()->PressAndReleaseKey(ui::VKEY_ESCAPE); - EXPECT_EQ(previous_cursor_type, cursor_manager->GetCursor().type()); + StartDragForViewAndFireTimer(AppsGridView::MOUSE, item_view); + + std::list<base::OnceClosure> tasks; + tasks.push_back(base::BindLambdaForTesting([&]() { + // The cursor type should be set to grabbing during the drag. + ASSERT_EQ(ui::mojom::CursorType::kGrabbing, + cursor_manager->GetCursor().type()); + })); + tasks.push_back(base::BindLambdaForTesting([&]() { + // Cancel the drag without releasing the left mouse button and verify that + // the cursor is still reset in this case. + GetEventGenerator()->PressAndReleaseKey(ui::VKEY_ESCAPE); + EXPECT_EQ(previous_cursor_type, cursor_manager->GetCursor().type()); + })); + tasks.push_back(base::BindLambdaForTesting([&]() { EndDrag(); })); + MaybeRunDragAndDropSequenceForAppList(&tasks, /*is_touch =*/false); } // Verify the cursor type when dragging one item over another item and back. @@ -4717,28 +4739,35 @@ gfx::Point starting_point = item0->GetBoundsInScreen().CenterPoint(); AppListItemView* const item1 = GetItemViewInTopLevelGrid(1); - InitiateDragForItemAtCurrentPageAt(AppsGridView::MOUSE, 0, 0, - apps_grid_view_); + StartDragForViewAndFireTimer(AppsGridView::MOUSE, item0); - // Verify the cursor is grabbing now that the drag has started. - ASSERT_EQ(ui::mojom::CursorType::kGrabbing, - cursor_manager->GetCursor().type()); + std::list<base::OnceClosure> tasks; + tasks.push_back(base::BindLambdaForTesting([&]() { + // Verify the cursor is grabbing now that the drag has started. + ASSERT_EQ(ui::mojom::CursorType::kGrabbing, + cursor_manager->GetCursor().type()); + // Move the first item on top of the second item as if to create a folder, + // but don't actually create a folder. + UpdateDragInScreen(AppsGridView::MOUSE, + item1->GetBoundsInScreen().CenterPoint()); + // Verify the cursor is still grabbing in this state. + ASSERT_EQ(ui::mojom::CursorType::kGrabbing, + cursor_manager->GetCursor().type()); + })); + tasks.push_back(base::BindLambdaForTesting([&]() { + // Move the first item back to its original position. + UpdateDragInScreen(AppsGridView::MOUSE, starting_point); - // Move the first item on top of the second item as if to create a folder, but - // don't actually create a folder. - UpdateDragInScreen(AppsGridView::MOUSE, - item1->GetBoundsInScreen().CenterPoint()); + // The cursor should still be grabbing. + EXPECT_EQ(ui::mojom::CursorType::kGrabbing, + cursor_manager->GetCursor().type()); + })); + tasks.push_back(base::BindLambdaForTesting([&]() { EndDrag(); })); + MaybeRunDragAndDropSequenceForAppList(&tasks, /*is_touch =*/false); - // Verify the cursor is still grabbing in this state. - ASSERT_EQ(ui::mojom::CursorType::kGrabbing, - cursor_manager->GetCursor().type()); - - // Move the first item back to its original position. - UpdateDragInScreen(AppsGridView::MOUSE, starting_point); - - // The cursor should still be grabbing. - EXPECT_EQ(ui::mojom::CursorType::kGrabbing, - cursor_manager->GetCursor().type()); + test_api_->WaitForItemMoveAnimationDone(); + // Verify the cursor is not grabbing in this state. + ASSERT_EQ(ui::mojom::CursorType::kNull, cursor_manager->GetCursor().type()); } TEST_P(AppsGridViewDragTest, NewInstallDotVisibilityDuringDrag) { @@ -4756,18 +4785,21 @@ item_view->item()->SetIsNewInstall(true); ASSERT_TRUE(new_install_dot->GetVisible()); - // Starts a mouse drag and verify new install dot hides during drag. - InitiateDragForItemAtCurrentPageAt(AppsGridView::MOUSE, 0, 0, - apps_grid_view_); - MaybeCheckHaptickEventsCount(1); - EXPECT_FALSE(new_install_dot->GetVisible()); + StartDragForViewAndFireTimer(AppsGridView::MOUSE, item_view); - const gfx::Point to = GetItemRectOnCurrentPageAt(0, 2).CenterPoint(); - UpdateDrag(AppsGridView::MOUSE, to, apps_grid_view_); - EXPECT_FALSE(new_install_dot->GetVisible()); + std::list<base::OnceClosure> tasks; + tasks.push_back(base::BindLambdaForTesting([&]() { + MaybeCheckHaptickEventsCount(1); + EXPECT_FALSE(new_install_dot->GetVisible()); + + const gfx::Point to = GetItemRectOnCurrentPageAt(0, 2).CenterPoint(); + UpdateDrag(AppsGridView::MOUSE, to, apps_grid_view_); + EXPECT_FALSE(new_install_dot->GetVisible()); + })); + tasks.push_back(base::BindLambdaForTesting([&]() { EndDrag(); })); + MaybeRunDragAndDropSequenceForAppList(&tasks, /*is_touch =*/false); // When ending drag, the new install dot should be visible again. - EndDrag(); EXPECT_TRUE(new_install_dot->GetVisible()); }
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index 1b10733..588680a8a 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -2802,7 +2802,8 @@ std::set<ui::ClipboardFormatType> format_types; format_types.insert(GetAppItemFormatType()); - return data.HasAnyFormat(0, format_types); + return data.HasAnyFormat(0, format_types) && + app_info->type == DraggableAppType::kAppGridItem; } void ShelfView::OnDragExited() {
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h index f30f0c5..28a4eee28 100644 --- a/ash/shelf/shelf_view.h +++ b/ash/shelf/shelf_view.h
@@ -316,6 +316,10 @@ default_last_focusable_child_ = default_last_focusable_child; } + ui::LayerTreeOwner* drag_image_layer_for_test() { + return drag_image_layer_.get(); + } + ShelfAppButton* drag_view() { return drag_view_; } const std::vector<size_t>& visible_views_indices() const {
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc index 69d08b9..e1106461 100644 --- a/ash/test/ash_test_base.cc +++ b/ash/test/ash_test_base.cc
@@ -584,6 +584,17 @@ void AshTestBase::MaybeRunDragAndDropSequenceForAppList( std::list<base::OnceClosure>* tasks, bool is_touch) { + // The app list drag and drop require this extra step since drag actually + // starts when the cursor is moved. In the case of the drag and drop refactor, + // this movement is done outside of the LoopClosure, but a second one is + // required since OnDragEnter() is invoked when the drag is updated. + tasks->push_front(base::BindLambdaForTesting([&]() { + if (is_touch) { + GetEventGenerator()->MoveTouchBy(10, 10); + return; + } + GetEventGenerator()->MoveMouseBy(10, 10); + })); if (!app_list_features::IsDragAndDropRefactorEnabled()) { while (!tasks->empty()) { std::move(tasks->front()).Run(); @@ -598,15 +609,7 @@ tasks->pop_front(); }), base::DoNothing()); - tasks->push_front(base::BindLambdaForTesting([&]() { - // Generate OnDragEnter() event for the host view. - if (is_touch) { - GetEventGenerator()->MoveTouchBy(10, 10); - return; - } - GetEventGenerator()->MoveMouseBy(10, 10); - })); - // Start Drag and Drop Sequence by moving the pointer. + if (is_touch) { GetEventGenerator()->MoveTouchBy(10, 10); return;
diff --git a/ash/wm/desks/desk_animation_impl_unittest.cc b/ash/wm/desks/desk_animation_impl_unittest.cc index f3b9bd7..4801a3d 100644 --- a/ash/wm/desks/desk_animation_impl_unittest.cc +++ b/ash/wm/desks/desk_animation_impl_unittest.cc
@@ -225,7 +225,7 @@ NewDesk(); auto* desks_controller = DesksController::Get(); ASSERT_EQ(2u, desks_controller->desks().size()); - EXPECT_TRUE(desks_controller->desks()[0].get()->is_active()); + EXPECT_TRUE(desks_controller->GetDeskAtIndex(0)->is_active()); } private: @@ -258,7 +258,7 @@ waiter.Wait(); // Verify that we have switched desks and are still in overview. - EXPECT_TRUE(desks_controller->desks()[1].get()->is_active()); + EXPECT_TRUE(desks_controller->GetDeskAtIndex(1)->is_active()); ASSERT_TRUE(overview_controller->InOverviewSession()); } @@ -279,7 +279,7 @@ // Activate the second desk by clicking on its mini view and wait for the desk // switch animation. auto* desks_controller = DesksController::Get(); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); EXPECT_EQ(0, desks_controller->GetActiveDeskIndex()); auto* mini_view = desks_bar_view->mini_views().back(); EXPECT_EQ(desk_2, mini_view->desk()); @@ -329,7 +329,7 @@ // Checks that as part of the animation, we have already activated the // expected ending desk. - EXPECT_TRUE(desks_controller->desks()[1].get()->is_active()); + EXPECT_TRUE(desks_controller->GetDeskAtIndex(1)->is_active()); ASSERT_TRUE(overview_controller->InOverviewSession()); // End the swipe animation and wait for the desk activation animation to @@ -342,7 +342,7 @@ // Verify that the original active desk is once again activated (meaning that // we animated back to it), and are still in overview. - EXPECT_TRUE(desks_controller->desks()[0].get()->is_active()); + EXPECT_TRUE(desks_controller->GetDeskAtIndex(0)->is_active()); ASSERT_TRUE(overview_controller->InOverviewSession()); // Verify that the grid bounds haven't changed, especially since we @@ -377,7 +377,7 @@ // desk (not the original active desk) and that the attempt to exit overview // during the animation was unsuccessful. desks_controller->EndSwipeAnimation(); - EXPECT_TRUE(desks_controller->desks()[1].get()->is_active()); + EXPECT_TRUE(desks_controller->GetDeskAtIndex(1)->is_active()); ASSERT_TRUE(overview_controller->InOverviewSession()); }
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index f6431d8b..b98697a 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -560,7 +560,7 @@ auto* controller = DesksController::Get(); EXPECT_EQ(2u, controller->desks().size()); - auto* desk_2 = controller->desks()[1].get(); + auto* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); const auto win_bounds = gfx::Rect{10, 20, 250, 100}; auto win1 = CreateAppWindow(win_bounds); @@ -583,8 +583,8 @@ controller->AddObserver(&observer); NewDesk(); - controller->desks()[0]->SetName(u"test1", /*set_by_user=*/true); - controller->desks()[1]->SetName(u"test2", /*set_by_user=*/true); + controller->GetDeskAtIndex(0)->SetName(u"test1", /*set_by_user=*/true); + controller->GetDeskAtIndex(1)->SetName(u"test2", /*set_by_user=*/true); // Verify that desk name change will trigger // |TestObserver::OnDeskNameChanged()|. Notice when creating a new desk @@ -601,13 +601,13 @@ // Set the first desk with a name which is short enough to be fit in the desk // name view. - controller->desks()[0]->SetName(u"test1", /*set_by_user=*/true); + controller->GetDeskAtIndex(0)->SetName(u"test1", /*set_by_user=*/true); // Set the second desk with a name which is long enough to be truncated in the // desk name view. std::u16string desk_name2( u"test2 a very long desk name to test tooltip text"); - controller->desks()[1]->SetName(desk_name2, /*set_by_user=*/true); + controller->GetDeskAtIndex(1)->SetName(desk_name2, /*set_by_user=*/true); // Start overview. auto* overview_controller = Shell::Get()->overview_controller(); @@ -745,10 +745,10 @@ } // Switch to the third desk. - ActivateDesk(controller->desks()[2].get()); + ActivateDesk(controller->GetDeskAtIndex(2)); // Close the second desk. - RemoveDesk(controller->desks()[1].get()); + RemoveDesk(controller->GetDeskAtIndex(1)); EXPECT_EQ(2u, controller->desks().size()); // The window in the first desk remain unaffected by the second desk removal. @@ -780,7 +780,7 @@ } // Switch to the second desk. - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); // Close the second desk. @@ -788,7 +788,7 @@ EXPECT_EQ(3u, controller->desks().size()); // The previous desk (first) becomes active after closing the second desk. - EXPECT_EQ(controller->desks()[0].get(), controller->active_desk()); + EXPECT_EQ(controller->GetDeskAtIndex(0), controller->active_desk()); // The window in the first desk remain unaffected by the second desk removal. EXPECT_EQ(0, windows[0]->GetProperty(aura::client::kWindowWorkspaceKey)); @@ -833,7 +833,7 @@ TEST_P(DesksTest, DeskActivation) { auto* controller = DesksController::Get(); ASSERT_EQ(1u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1, controller->active_desk()); EXPECT_TRUE(desk_1->is_active()); @@ -847,9 +847,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(4u, controller->desks().size()); - const Desk* desk_2 = controller->desks()[1].get(); - const Desk* desk_3 = controller->desks()[2].get(); - const Desk* desk_4 = controller->desks()[3].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); + const Desk* desk_3 = controller->GetDeskAtIndex(2); + const Desk* desk_4 = controller->GetDeskAtIndex(3); EXPECT_FALSE(controller->AreDesksBeingModified()); ActivateDesk(desk_2); EXPECT_FALSE(controller->AreDesksBeingModified()); @@ -908,7 +908,7 @@ // Moving one window to the second desk should not affect the bounds of either // windows. - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); controller->MoveWindowFromActiveDeskTo( win1.get(), desk_2, win1->GetRootWindow(), DesksMoveWindowFromActiveDeskSource::kDragAndDrop); @@ -929,7 +929,7 @@ auto* controller = DesksController::Get(); ASSERT_EQ(1u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1, controller->active_desk()); EXPECT_TRUE(desk_1->is_active()); @@ -938,9 +938,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(4u, controller->desks().size()); - const Desk* desk_2 = controller->desks()[1].get(); - const Desk* desk_3 = controller->desks()[2].get(); - const Desk* desk_4 = controller->desks()[3].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); + const Desk* desk_3 = controller->GetDeskAtIndex(2); + const Desk* desk_4 = controller->GetDeskAtIndex(3); EXPECT_FALSE(controller->AreDesksBeingModified()); ActivateDesk(desk_2); EXPECT_FALSE(controller->AreDesksBeingModified()); @@ -965,7 +965,7 @@ TEST_P(DesksTest, TransientWindows) { auto* controller = DesksController::Get(); ASSERT_EQ(1u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1, controller->active_desk()); EXPECT_TRUE(desk_1->is_active()); @@ -985,7 +985,7 @@ // Create a new desk and activate it. NewDesk(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(desk_2->windows().empty()); ActivateDesk(desk_2); EXPECT_FALSE(desk_1->is_active()); @@ -1021,7 +1021,7 @@ auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); NewDesk(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); auto win1 = CreateAppWindow(gfx::Rect(10, 10, 250, 100)); @@ -1030,7 +1030,7 @@ auto win3 = CreateAppWindow(gfx::Rect(20, 20, 250, 100)); // Move back to desk_1, so |win0| becomes the most recent. - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ActivateDesk(desk_1); EXPECT_EQ(win0.get(), window_util::GetActiveWindow()); @@ -1064,9 +1064,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(3u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); EXPECT_EQ(desk_1, controller->active_desk()); EXPECT_TRUE(desk_1->is_active()); @@ -1129,8 +1129,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_EQ(desk_1, controller->active_desk()); EXPECT_EQ(3u, desk_1->windows().size()); EXPECT_TRUE(desk_2->windows().empty()); @@ -1236,7 +1236,7 @@ EXPECT_EQ(2u, overview_grid->window_list().size()); // Activate desk_4 (last one on the right) by clicking on its mini view. - const Desk* desk_4 = controller->desks()[3].get(); + const Desk* desk_4 = controller->GetDeskAtIndex(3); EXPECT_EQ(0, controller->GetActiveDeskIndex()); auto* mini_view = desks_bar_view->mini_views().back(); EXPECT_EQ(desk_4, mini_view->desk()); @@ -1329,7 +1329,7 @@ ASSERT_EQ(4u, desks_bar_view->mini_views().size()); // Activate desk_4 (last one on the right) by clicking on its mini view. - const Desk* desk_4 = controller->desks()[3].get(); + const Desk* desk_4 = controller->GetDeskAtIndex(3); EXPECT_FALSE(desk_4->is_active()); const auto* mini_view = desks_bar_view->mini_views().back(); const gfx::Point mini_view_center = @@ -1366,7 +1366,7 @@ mru_tracker->BuildMruWindowList(DesksMruType::kActiveDesk)); // Active desk_4 and enter overview mode, and add a single window. - Desk* desk_4 = controller->desks()[3].get(); + Desk* desk_4 = controller->GetDeskAtIndex(3); ActivateDesk(desk_4); auto* overview_controller = Shell::Get()->overview_controller(); auto win3 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); @@ -1383,7 +1383,7 @@ const auto* desks_bar_view = overview_grid->desks_bar_view(); ASSERT_TRUE(desks_bar_view); ASSERT_EQ(4u, desks_bar_view->mini_views().size()); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); auto* mini_view = desks_bar_view->mini_views().front(); EXPECT_EQ(desk_1, mini_view->desk()); @@ -1454,14 +1454,14 @@ ASSERT_EQ(2u, controller->desks().size()); // Create two windows on desk_1. - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); auto win1 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); wm::ActivateWindow(win0.get()); EXPECT_EQ(win0.get(), window_util::GetActiveWindow()); // Activate desk_2 and create one more window. - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); auto win2 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); auto win3 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); @@ -1567,9 +1567,9 @@ ClickOnView(GetExpandedStateNewDeskButton(GetPrimaryRootDesksBarView()), event_generator); ASSERT_EQ(3u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); ASSERT_TRUE(desk_1->is_active()); controller->RemoveDesk(desk_1, DesksCreationRemovalSource::kButton, @@ -1608,7 +1608,7 @@ const auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); const auto* desks_bar_view = overview_grid->desks_bar_view(); - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); const auto* mini_view = desks_bar_view->mini_views().front(); ClickOnView(mini_view, GetEventGenerator()); EXPECT_FALSE(overview_controller->InOverviewSession()); @@ -1620,8 +1620,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); wm::ActivateWindow(win0.get()); @@ -1661,7 +1661,7 @@ // Create one app window on each desk. auto win0 = CreateAppWindow(gfx::Rect(400, 400)); - ActivateDesk(controller->desks()[1].get()); + ActivateDesk(controller->GetDeskAtIndex(1)); auto win1 = CreateAppWindow(gfx::Rect(400, 400)); // Open the app list. @@ -1670,7 +1670,7 @@ ASSERT_TRUE(app_list_controller->IsVisible()); // Switch back to desk 1. Test that the app list is still open. - ActivateDesk(controller->desks()[0].get()); + ActivateDesk(controller->GetDeskAtIndex(0)); EXPECT_TRUE(app_list_controller->IsVisible()); } @@ -1688,12 +1688,12 @@ // Enter tablet mode and switch to desk 2. Verify the app list has activation // as there are no app windows. TabletModeControllerTestApi().EnterTabletMode(); - ActivateDesk(controller->desks()[1].get()); + ActivateDesk(controller->GetDeskAtIndex(1)); auto* app_list_controller = Shell::Get()->app_list_controller(); ASSERT_EQ(app_list_controller->GetWindow(), window_util::GetActiveWindow()); // Switch back to desk 1. `window` should have activation now. - ActivateDesk(controller->desks()[0].get()); + ActivateDesk(controller->GetDeskAtIndex(0)); EXPECT_EQ(window.get(), window_util::GetActiveWindow()); } @@ -1701,8 +1701,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 200, 150)); @@ -1817,7 +1817,7 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto window = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); wm::ActivateWindow(window.get()); @@ -2025,11 +2025,12 @@ EXPECT_TRUE(overview_controller->InOverviewSession()); EXPECT_EQ(2u, desks_bar_view->mini_views().size()); EXPECT_EQ(2u, controller->desks().size()); - EXPECT_TRUE(base::Contains(controller->desks()[1]->windows(), win1.get())); + EXPECT_TRUE( + base::Contains(controller->GetDeskAtIndex(1)->windows(), win1.get())); // The active desk should still be the first desk, even though a new desk // is created. EXPECT_EQ(DesksController::Get()->active_desk(), - controller->desks()[0].get()); + controller->GetDeskAtIndex(0)); // |overview_grid| should have size equals to 0 now, since |overview_item1| // havs been moved to a new desk. EXPECT_EQ(0u, overview_grid->size()); @@ -2132,7 +2133,8 @@ EXPECT_TRUE(desks_bar_view->IsZeroState()); } EXPECT_EQ(1u, controller->desks().size()); - EXPECT_TRUE(base::Contains(controller->desks()[0]->windows(), win1.get())); + EXPECT_TRUE( + base::Contains(controller->GetDeskAtIndex(0)->windows(), win1.get())); } // Tests that dragging and dropping window to new desk while desks bar view is @@ -2185,7 +2187,8 @@ EXPECT_TRUE(overview_controller->InOverviewSession()); EXPECT_EQ(3u, desks_bar_view->mini_views().size()); EXPECT_EQ(3u, controller->desks().size()); - EXPECT_TRUE(base::Contains(controller->desks()[2]->windows(), win1.get())); + EXPECT_TRUE( + base::Contains(controller->GetDeskAtIndex(2)->windows(), win1.get())); } // Tests that dragging and dropping a window on the new desk button does not @@ -2248,7 +2251,8 @@ EXPECT_EQ(desks_util::GetMaxNumberOfDesks(), desks_bar_view->mini_views().size()); EXPECT_EQ(desks_util::GetMaxNumberOfDesks(), controller->desks().size()); - EXPECT_TRUE(base::Contains(controller->desks()[0]->windows(), win1.get())); + EXPECT_TRUE( + base::Contains(controller->GetDeskAtIndex(0)->windows(), win1.get())); } TEST_P(DesksTest, MruWindowTracker) { @@ -2258,7 +2262,7 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2280,7 +2284,7 @@ EXPECT_EQ(win0.get(), window_list[3]); // Switch back to desk_1 and test both MRU list types. - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ActivateDesk(desk_1); window_list = mru_window_tracker->BuildWindowForCycleList(kActiveDesk); ASSERT_EQ(2u, window_list.size()); @@ -2303,7 +2307,7 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2318,7 +2322,7 @@ EXPECT_EQ(win3.get(), window_util::GetActiveWindow()); // Similarly for desk_1. - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ActivateDesk(desk_1); EXPECT_EQ(win1.get(), window_util::GetActiveWindow()); win1.reset(); @@ -2331,8 +2335,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - auto* desk_1 = controller->desks()[0].get(); - auto* desk_2 = controller->desks()[1].get(); + auto* desk_1 = controller->GetDeskAtIndex(0); + auto* desk_2 = controller->GetDeskAtIndex(1); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); auto win1 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); @@ -2507,14 +2511,14 @@ EXPECT_TRUE(full_screen_state_observer.is_fullscreen()); // Switch to desk 1 and expect the fullscreen state to change. - ActivateDesk(controller->desks()[1].get()); + ActivateDesk(controller->GetDeskAtIndex(1)); EXPECT_EQ(windows[1].get(), window_util::GetActiveWindow()); EXPECT_FALSE(win1_state->IsFullscreen()); EXPECT_FALSE(full_screen_state_observer.is_fullscreen()); // Cycle back to desk 0 and expect the fullscreen state to change back. - ActivateDesk(controller->desks()[0].get()); + ActivateDesk(controller->GetDeskAtIndex(0)); EXPECT_EQ(windows[0].get(), window_util::GetActiveWindow()); EXPECT_TRUE(win0_state->IsFullscreen()); @@ -2528,7 +2532,7 @@ ASSERT_EQ(2u, controller->desks().size()); base::HistogramTester histogram_tester; - ActivateDesk(controller->desks()[1].get()); + ActivateDesk(controller->GetDeskAtIndex(1)); histogram_tester.ExpectTotalCount("Ash.Desks.AnimationLatency.DeskActivation", 1); } @@ -2540,7 +2544,7 @@ ASSERT_EQ(2u, controller->desks().size()); base::HistogramTester histogram_tester; - RemoveDesk(controller->desks()[0].get()); + RemoveDesk(controller->GetDeskAtIndex(0)); histogram_tester.ExpectTotalCount("Ash.Desks.AnimationLatency.DeskRemoval", 1); } @@ -2564,8 +2568,8 @@ // Create and switch to the second desk. NewDesk(); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); auto win3 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); auto win4 = CreateAppWindow(gfx::Rect(750, 50, 200, 200)); @@ -2702,7 +2706,7 @@ EXPECT_EQ(roots[1], win->GetRootWindow()); EXPECT_FALSE(win->IsVisible()); auto* controller = DesksController::Get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(base::Contains(desk_2->windows(), win.get())); } @@ -2877,7 +2881,7 @@ SendKey(ui::VKEY_RETURN); EXPECT_FALSE(overview_grid()->IsDeskNameBeingModified()); EXPECT_FALSE(desk_name_view_2->HasFocus()); - auto* desk_2 = controller()->desks()[1].get(); + auto* desk_2 = controller()->GetDeskAtIndex(1); EXPECT_FALSE(desk_2->is_name_set_by_user()); // Desks restore data should reflect two default-named desks. @@ -2908,8 +2912,8 @@ SendKey(ui::VKEY_RETURN); // Extra whitespace should be trimmed. - auto* desk_1 = controller()->desks()[0].get(); - auto* desk_2 = controller()->desks()[1].get(); + auto* desk_1 = controller()->GetDeskAtIndex(0); + auto* desk_2 = controller()->GetDeskAtIndex(1); EXPECT_EQ(u"code", desk_1->name()); EXPECT_EQ(u"Desk 2", desk_2->name()); EXPECT_TRUE(desk_1->is_name_set_by_user()); @@ -2923,7 +2927,7 @@ // Add a third desk and remove the second. Both operations should not affect // the user-modified desk names. NewDesk(); - auto* desk_3 = controller()->desks()[2].get(); + auto* desk_3 = controller()->GetDeskAtIndex(2); EXPECT_EQ(u"Desk 3", desk_3->name()); EXPECT_TRUE(desk_1->is_name_set_by_user()); EXPECT_FALSE(desk_2->is_name_set_by_user()); @@ -2961,7 +2965,7 @@ // Commit with the enter key. SendKey(ui::VKEY_RETURN); // The name should now revert back to the default value. - auto* desk_1 = controller()->desks()[0].get(); + auto* desk_1 = controller()->GetDeskAtIndex(0); EXPECT_FALSE(desk_1->name().empty()); EXPECT_FALSE(desk_1->is_name_set_by_user()); EXPECT_EQ(u"Desk 1", desk_1->name()); @@ -2982,7 +2986,7 @@ // Press escape key. SendKey(ui::VKEY_ESCAPE); // Name should be previous value. - auto* desk_1 = controller()->desks()[0].get(); + auto* desk_1 = controller()->GetDeskAtIndex(0); EXPECT_FALSE(desk_1->is_name_set_by_user()); EXPECT_EQ(u"Desk 1", desk_1->name()); } @@ -2995,7 +2999,7 @@ auto* desk_name_view = desks_bar_view()->mini_views()[0]->desk_name_view(); EXPECT_TRUE(desk_name_view->HasFocus()); EXPECT_TRUE(desk_name_view->HasSelection()); - auto* desk_1 = controller()->desks()[0].get(); + auto* desk_1 = controller()->GetDeskAtIndex(0); EXPECT_EQ(desk_1->name(), desk_name_view->GetSelectedText()); } @@ -3046,7 +3050,7 @@ SendKey(ui::VKEY_RETURN); // Desk name has been trimmed. - auto* desk_1 = controller()->desks()[0].get(); + auto* desk_1 = controller()->GetDeskAtIndex(0); EXPECT_EQ(DeskTextfield::kMaxLength, desk_1->name().size()); EXPECT_EQ(expected_desk_name, desk_1->name()); EXPECT_TRUE(desk_1->is_name_set_by_user()); @@ -3131,7 +3135,7 @@ TEST_P(TabletModeDesksTest, CantDestroyBackdropWhileHiding) { auto* controller = DesksController::Get(); ASSERT_EQ(1u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); auto window = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); wm::ActivateWindow(window.get()); @@ -3172,8 +3176,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto window = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); wm::ActivateWindow(window.get()); @@ -3246,8 +3250,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); auto window = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); wm::ActivateWindow(window.get()); EXPECT_EQ(window.get(), window_util::GetActiveWindow()); @@ -3361,8 +3365,8 @@ for (size_t i = 0; i < 2 * desks_util::GetMaxNumberOfDesks(); ++i) { NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_1 = desks_controller->desks()[0].get(); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_1 = desks_controller->GetDeskAtIndex(0); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); auto* desk_1_backdrop_controller = GetDeskBackdropController(desk_1, Shell::GetPrimaryRootWindow()); auto* desk_2_backdrop_controller = @@ -3392,8 +3396,8 @@ auto* desks_controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_1 = desks_controller->desks()[0].get(); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); @@ -3453,7 +3457,7 @@ auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); auto* desks_bar_view = overview_grid->desks_bar_view(); auto* mini_view = desks_bar_view->mini_views()[1]; - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); EXPECT_EQ(desk_2, mini_view->desk()); { DeskSwitchAnimationWaiter waiter; @@ -3480,7 +3484,7 @@ overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); desks_bar_view = overview_grid->desks_bar_view(); mini_view = desks_bar_view->mini_views()[0]; - Desk* desk_1 = desks_controller->desks()[0].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1, mini_view->desk()); { DeskSwitchAnimationWaiter waiter; @@ -3528,7 +3532,7 @@ auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); auto* desks_bar_view = overview_grid->desks_bar_view(); auto* mini_view = desks_bar_view->mini_views()[1]; - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); EXPECT_EQ(desk_2, mini_view->desk()); { DeskSwitchAnimationWaiter waiter; @@ -3546,7 +3550,7 @@ overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); desks_bar_view = overview_grid->desks_bar_view(); mini_view = desks_bar_view->mini_views()[0]; - Desk* desk_1 = desks_controller->desks()[0].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1, mini_view->desk()); { DeskSwitchAnimationWaiter waiter; @@ -3566,8 +3570,8 @@ auto* desks_controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_1 = desks_controller->desks()[0].get(); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); split_view_controller()->SnapWindow( @@ -3601,7 +3605,7 @@ auto* desks_controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); split_view_controller()->SnapWindow( win1.get(), SplitViewController::SnapPosition::kPrimary); @@ -3626,7 +3630,7 @@ auto* desks_controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); split_view_controller()->SnapWindow( win1.get(), SplitViewController::SnapPosition::kPrimary); @@ -3654,7 +3658,7 @@ auto* desks_controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); auto* overview_controller = Shell::Get()->overview_controller(); @@ -3670,8 +3674,8 @@ auto* desks_controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_1 = desks_controller->desks()[0].get(); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); @@ -3755,7 +3759,7 @@ ASSERT_TRUE(desks_bar_view); ASSERT_EQ(2u, desks_bar_view->mini_views().size()); auto* desk_2_mini_view = desks_bar_view->mini_views()[1]; - auto* desk_2 = controller->desks()[1].get(); + auto* desk_2 = controller->GetDeskAtIndex(1); EXPECT_EQ(desk_2, desk_2_mini_view->desk()); auto* event_generator = GetEventGenerator(); @@ -3811,7 +3815,7 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, controller->active_desk()); test_api.SetDisplayRotation(display::Display::ROTATE_0, @@ -3821,7 +3825,7 @@ // Switch back to the first desk, and expect that SplitView is not restored, // since the only available window on that desk is not snappable. - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); ActivateDesk(desk_1); EXPECT_EQ(desk_1, controller->active_desk()); EXPECT_FALSE(split_view_controller()->InSplitViewMode()); @@ -3890,7 +3894,7 @@ event_generator); ASSERT_EQ(2u, controller->desks().size()); EXPECT_FALSE(overview_controller->InOverviewSession()); - EXPECT_TRUE(controller->desks()[0]->is_active()); + EXPECT_TRUE(controller->GetDeskAtIndex(0)->is_active()); } TEST_P(DesksTest, AutohiddenShelfAnimatesAfterDeskSwitch) { @@ -3918,7 +3922,7 @@ EXPECT_NE(shown_shelf_bounds, hidden_shelf_bounds); // Go to the second desk. - ActivateDesk(DesksController::Get()->desks()[1].get()); + ActivateDesk(DesksController::Get()->GetDeskAtIndex(1)); // The shelf should now want to show itself. EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState()); @@ -3944,8 +3948,8 @@ // Two virtual desks: |desk_1| (active) and |desk_2|. NewDesk(); ASSERT_EQ(2u, desks_controller->desks().size()); - Desk* desk_1 = desks_controller->desks()[0].get(); - Desk* desk_2 = desks_controller->desks()[1].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); + Desk* desk_2 = desks_controller->GetDeskAtIndex(1); // Two windows on |desk_1|: |win0| (snapped) and |win1|. auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); @@ -4092,8 +4096,8 @@ NewDesk(); auto* controller = DesksController::Get(); - Desk* desk2 = controller->desks()[1].get(); - Desk* desk3 = controller->desks()[2].get(); + Desk* desk2 = controller->GetDeskAtIndex(1); + Desk* desk3 = controller->GetDeskAtIndex(2); ActivateDesk(desk3); // Create a window on |desk3| with a header. @@ -4180,8 +4184,8 @@ void RunTests(const std::vector<const PerDeskZOrderTestCase>& tests) { auto* controller = DesksController::Get(); - auto* desk_1 = controller->desks()[0].get(); - auto* desk_2 = controller->desks()[1].get(); + auto* desk_1 = controller->GetDeskAtIndex(0); + auto* desk_2 = controller->GetDeskAtIndex(1); for (const auto& test : tests) { SCOPED_TRACE(test.test_name); @@ -4849,9 +4853,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(3u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); multi_user_window_manager()->SetWindowOwner(win0.get(), GetUser1AccountId()); EXPECT_TRUE(win0->IsVisible()); @@ -4907,8 +4911,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); multi_user_window_manager()->SetWindowOwner(win0.get(), GetUser1AccountId()); EXPECT_TRUE(win0->IsVisible()); @@ -4979,8 +4983,8 @@ NewDesk(); NewDesk(); ASSERT_EQ(3u, controller->desks().size()); - desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); SwitchActiveUser(GetUser2AccountId()); ActivateDesk(desk_3); auto win6 = CreateAppWindow(gfx::Rect(0, 0, 250, 200)); @@ -5314,9 +5318,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(3u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); EXPECT_TRUE(desk_1->is_active()); const int flags = ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN; DeskSwitchAnimationWaiter waiter; @@ -5342,9 +5346,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(3u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); ActivateDesk(desk_3); EXPECT_TRUE(desk_3->is_active()); const int flags = ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN; @@ -5368,8 +5372,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(desk_1->is_active()); // No desk on left, nothing should happen. const int flags = ui::EF_COMMAND_DOWN; @@ -5401,8 +5405,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(desk_1->is_active()); auto window = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); @@ -5444,8 +5448,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(desk_1->is_active()); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); @@ -5494,8 +5498,8 @@ auto* controller = DesksController::Get(); NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(desk_1->is_active()); // An always-on-top window does not belong to any desk and hence cannot be @@ -5742,7 +5746,7 @@ // Move the app window, it should be removed from the shelf if the feature is // enabled. const bool visible_in_per_desk_shelf = IsPerDeskShelfEnabled() ? false : true; - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); MoveWindowFromActiveDeskTo(app, desk_2); VerifyViewVisibility(browser, true); VerifyViewVisibility(pinned, true); @@ -5772,7 +5776,7 @@ // Switch to desk_2, only the browser app should be visible on the shelf if // the feature is enabled. const bool visible_in_per_desk_shelf = IsPerDeskShelfEnabled() ? false : true; - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); VerifyViewVisibility(browser, true); VerifyViewVisibility(app1, visible_in_per_desk_shelf); @@ -5784,7 +5788,7 @@ // Switch to desk_3, only the browser and the pinned app should be visible on // the shelf if the feature is enabled. - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_3 = controller->GetDeskAtIndex(2); ActivateDesk(desk_3); VerifyViewVisibility(browser, true); VerifyViewVisibility(app1, visible_in_per_desk_shelf); @@ -5794,7 +5798,7 @@ // show again on the shelf. auto win3 = CreateAppWithShelfItem(ShelfItemType::TYPE_APP); aura::Window* app2 = win3.get(); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ActivateDesk(desk_1); VerifyViewVisibility(browser, true); VerifyViewVisibility(app1, true); @@ -5815,13 +5819,13 @@ // Switch to desk_2, no apps should show on the shelf if the feature is // enabled. const bool visible_in_per_desk_shelf = IsPerDeskShelfEnabled() ? false : true; - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); VerifyViewVisibility(app1, visible_in_per_desk_shelf); VerifyViewVisibility(app2, visible_in_per_desk_shelf); // Remove desk_1 (inactive), apps should now show on the shelf. - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); RemoveDesk(desk_1); VerifyViewVisibility(app1, true); VerifyViewVisibility(app2, true); @@ -5838,7 +5842,7 @@ // Switch to desk_2, no apps should show on the shelf if the feature is // enabled. const bool visible_in_per_desk_shelf = IsPerDeskShelfEnabled() ? false : true; - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_2 = controller->GetDeskAtIndex(1); ActivateDesk(desk_2); VerifyViewVisibility(app1, visible_in_per_desk_shelf); @@ -5878,7 +5882,7 @@ // Switch desks. NewDesk(); - ActivateDesk(DesksController::Get()->desks()[1].get()); + ActivateDesk(DesksController::Get()->GetDeskAtIndex(1)); if (IsPerDeskShelfEnabled()) { EXPECT_TRUE(shelf_view->GetTransform().IsIdentity()); } else { @@ -5922,11 +5926,11 @@ ClickOnView(new_desk_button, event_generator); auto* desk_name_view = desks_bar_view->mini_views()[i]->desk_name_view(); EXPECT_TRUE(desk_name_view->HasFocus()); - EXPECT_EQ(std::u16string(), controller->desks()[i]->name()); + EXPECT_EQ(std::u16string(), controller->GetDeskAtIndex(i)->name()); EXPECT_EQ(DesksController::GetDeskDefaultName(i), desk_name_view->GetAccessibleName()); EXPECT_EQ(DesksController::GetDeskDefaultName(i - 1), - controller->desks()[i - 1]->name()); + controller->GetDeskAtIndex(i - 1)->name()); ClickOnView(scroll_right_button, event_generator); } } @@ -6466,8 +6470,8 @@ TEST_P(DesksTest, VisibleOnAllDesksGlobalBounds) { auto* controller = DesksController::Get(); NewDesk(); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto* root = Shell::GetPrimaryRootWindow(); const gfx::Rect window_initial_bounds(1, 1, 200, 200); const gfx::Rect window_moved_bounds(200, 200, 250, 250); @@ -6506,8 +6510,8 @@ TEST_P(DesksTest, VisibleOnAllDesksGlobalZOrder) { auto* controller = DesksController::Get(); NewDesk(); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto* root = Shell::GetPrimaryRootWindow(); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); @@ -6567,8 +6571,8 @@ TEST_P(DesksTest, VisibleOnAllDesksActiveDeskRemoval) { auto* controller = DesksController::Get(); NewDesk(); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto* root = Shell::GetPrimaryRootWindow(); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); @@ -6595,7 +6599,7 @@ TEST_P(DesksTest, VisibleOnAllDesksMinimizedWindow) { auto* controller = DesksController::Get(); NewDesk(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto* root = Shell::GetPrimaryRootWindow(); auto window = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); auto* widget = views::Widget::GetWidgetForNativeWindow(window.get()); @@ -6624,8 +6628,8 @@ auto* controller = DesksController::Get(); auto* root = Shell::GetPrimaryRootWindow(); NewDesk(); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto window = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); auto* widget = views::Widget::GetWidgetForNativeWindow(window.get()); @@ -6650,7 +6654,7 @@ auto* controller = DesksController::Get(); auto* root = Shell::GetPrimaryRootWindow(); NewDesk(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto window = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); auto* widget = views::Widget::GetWidgetForNativeWindow(window.get()); @@ -6675,7 +6679,7 @@ TEST_P(DesksTest, VisibleOnAllDesksMoveWindowToDeskViaContextMenu) { auto* controller = DesksController::Get(); NewDesk(); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); auto window = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); auto* widget = views::Widget::GetWidgetForNativeWindow(window.get()); @@ -6698,7 +6702,7 @@ TEST_P(DesksTest, VisibleOnAllDesksWindowDestruction) { auto* controller = DesksController::Get(); NewDesk(); - const Desk* desk_1 = controller->desks()[0].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); auto* root = Shell::GetPrimaryRootWindow(); auto window = CreateAppWindow(gfx::Rect(0, 0, 100, 100)); @@ -6945,7 +6949,7 @@ ClickOnView(GetZeroStateNewDeskButton(desks_bar_view), event_generator); EXPECT_FALSE(desks_bar_view->IsZeroState()); SendKey(ui::VKEY_RETURN); - EXPECT_EQ(u"Desk 2", DesksController::Get()->desks()[1].get()->name()); + EXPECT_EQ(u"Desk 2", DesksController::Get()->GetDeskAtIndex(1)->name()); // Close desk 'test' should return to zero state and the zero state default // desk button should show current desk's name, which is 'Desk 1'. @@ -6975,7 +6979,7 @@ std::u16string expected_desk_name(DeskTextfield::kMaxLength, L'a'); // Zero state desk button should show the elided name as the DeskNameView. EXPECT_EQ(expected_desk_name, - DesksController::Get()->desks()[0].get()->name()); + DesksController::Get()->GetDeskAtIndex(0)->name()); EXPECT_NE(expected_desk_name, desk_button_text); EXPECT_TRUE(base::StartsWith(base::UTF16ToUTF8(desk_button_text), "aaa", base::CompareCase::SENSITIVE)); @@ -7631,7 +7635,7 @@ // Start at the rightmost, 4th desk. auto* desks_controller = DesksController::Get(); ASSERT_EQ(4u, desks_controller->desks().size()); - desks_controller->ActivateDesk(desks_controller->desks()[3].get(), + desks_controller->ActivateDesk(desks_controller->GetDeskAtIndex(3), DesksSwitchSource::kUserSwitch); ui::ScopedAnimationDurationScaleMode normal_anim( @@ -7841,10 +7845,10 @@ NewDesk(); auto* controller = DesksController::Get(); ASSERT_EQ(4u, controller->desks().size()); - const Desk* desk_1 = controller->desks()[0].get(); - const Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); - Desk* desk_4 = controller->desks()[3].get(); + const Desk* desk_1 = controller->GetDeskAtIndex(0); + const Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); + Desk* desk_4 = controller->GetDeskAtIndex(3); // Let a week elapse. There should be a new entry for four since there were // three created desks and the initial active desk. @@ -8055,9 +8059,9 @@ NewDesk(); NewDesk(); ASSERT_EQ(3u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); ASSERT_TRUE(desk_1->is_active()); // Create two `WindowHolder`s and assign one window to each desk. @@ -8131,8 +8135,8 @@ auto* controller = DesksController::Get(); controller->SendToDeskAtIndex(win1.window(), 0); controller->SendToDeskAtIndex(win2.window(), 1); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); ASSERT_EQ(1u, desk_1->windows().size()); ASSERT_EQ(1u, desk_2->windows().size()); ASSERT_TRUE(desk_1->is_active()); @@ -8188,9 +8192,9 @@ auto* controller = DesksController::Get(); controller->SendToDeskAtIndex(win1.window(), 0); controller->SendToDeskAtIndex(win2.window(), 1); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); - Desk* desk_3 = controller->desks()[2].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); + Desk* desk_3 = controller->GetDeskAtIndex(2); ASSERT_EQ(1u, desk_1->windows().size()); ASSERT_EQ(1u, desk_2->windows().size()); ASSERT_EQ(0u, desk_3->windows().size()); @@ -8211,8 +8215,8 @@ RemoveDesk(desk_2, test_case.desk_close_type); EXPECT_EQ(1u, controller->desks().size()); - EXPECT_NE(desk_1, controller->desks()[0].get()); - EXPECT_NE(desk_2, controller->desks()[0].get()); + EXPECT_NE(desk_1, controller->GetDeskAtIndex(0)); + EXPECT_NE(desk_2, controller->GetDeskAtIndex(0)); switch (test_case.desk_close_type) { case DeskCloseType::kCloseAllWindowsAndWait: @@ -8254,8 +8258,8 @@ auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); controller->SendToDeskAtIndex(window.window(), 0); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); ASSERT_EQ(1u, desk_1->windows().size()); ASSERT_EQ(0u, desk_2->windows().size()); ASSERT_TRUE(desk_1->is_active()); @@ -8281,7 +8285,7 @@ EXPECT_FALSE(desk_1->is_desk_being_removed()); EXPECT_EQ(2u, controller->desks().size()); EXPECT_TRUE(desk_1->is_active()); - EXPECT_EQ(desk_1, controller->desks()[0].get()); + EXPECT_EQ(desk_1, controller->GetDeskAtIndex(0)); EXPECT_FALSE(DesksTestApi::DesksControllerCanUndoDeskRemoval()); EXPECT_TRUE(window.is_valid()); EXPECT_EQ( @@ -8363,7 +8367,7 @@ NewDesk(); auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ASSERT_TRUE(desk_1->is_active()); ASSERT_TRUE(base::Contains(desk_1->windows(), window1.window())); ASSERT_TRUE(base::Contains(desk_1->windows(), window2.window())); @@ -8400,7 +8404,7 @@ NewDesk(); auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ASSERT_TRUE(desk_1->is_active()); ASSERT_TRUE(base::Contains(desk_1->windows(), window1.window())); ASSERT_TRUE(base::Contains(desk_1->windows(), window2.window())); @@ -8431,7 +8435,7 @@ auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ASSERT_TRUE(desk_1->is_active()); ASSERT_TRUE(base::Contains(desk_1->windows(), window1.window())); ASSERT_TRUE(base::Contains(desk_1->windows(), window2.window())); @@ -8459,7 +8463,7 @@ NewDesk(); auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ASSERT_TRUE(desk_1->is_active()); ASSERT_TRUE(base::Contains(desk_1->windows(), window1.window())); ASSERT_TRUE(base::Contains(desk_1->windows(), window2.window())); @@ -8565,8 +8569,8 @@ // Create two initial desks with one window each. NewDesk(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); WindowHolder win1(CreateAppWindow()); WindowHolder win2(CreateAppWindow()); @@ -8607,10 +8611,10 @@ break; case UpdateSource::kCloseDesk: ASSERT_EQ(3u, controller->desks().size()); - RemoveDesk(controller->desks()[2].get()); + RemoveDesk(controller->GetDeskAtIndex(2)); break; case UpdateSource::kMoveActiveDesk: - ASSERT_TRUE(controller->desks()[0]->is_active()); + ASSERT_TRUE(controller->GetDeskAtIndex(0)->is_active()); StartDragDeskPreview(mini_view_1, event_generator); ASSERT_TRUE(desks_bar_view->IsDraggingDesk()); event_generator->MoveMouseTo( @@ -8618,7 +8622,7 @@ event_generator->ReleaseLeftButton(); break; case UpdateSource::kMoveNonActiveDesk: - ASSERT_FALSE(controller->desks()[0]->is_active()); + ASSERT_FALSE(controller->GetDeskAtIndex(0)->is_active()); StartDragDeskPreview(mini_view_2, event_generator); EXPECT_TRUE(desks_bar_view->IsDraggingDesk()); event_generator->MoveMouseTo( @@ -8626,7 +8630,7 @@ event_generator->ReleaseLeftButton(); break; case UpdateSource::kChangeActiveDeskName: - ASSERT_TRUE(controller->desks()[0]->is_active()); + ASSERT_TRUE(controller->GetDeskAtIndex(0)->is_active()); event_generator->MoveMouseTo( desk_name_view_1->GetBoundsInScreen().CenterPoint()); event_generator->ClickLeftButton(); @@ -8637,7 +8641,7 @@ break; case UpdateSource::kChangeNonActiveDeskName: ASSERT_EQ(u"goo", mini_view_1->desk()->name()); - ASSERT_FALSE(controller->desks()[1]->is_active()); + ASSERT_FALSE(controller->GetDeskAtIndex(1)->is_active()); event_generator->MoveMouseTo( desk_name_view_2->GetBoundsInScreen().CenterPoint()); event_generator->ClickLeftButton(); @@ -8779,8 +8783,8 @@ auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); controller->SendToDeskAtIndex(window.window(), 0); - Desk* desk_1 = controller->desks()[0].get(); - Desk* desk_2 = controller->desks()[1].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); + Desk* desk_2 = controller->GetDeskAtIndex(1); ASSERT_EQ(1u, desk_1->windows().size()); ASSERT_EQ(0u, desk_2->windows().size()); ASSERT_TRUE(desk_1->is_active()); @@ -8864,7 +8868,7 @@ ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); // Remove the last desk with close-all. This should show the undo toast. - RemoveDesk(controller->desks()[last_desk_index].get(), + RemoveDesk(controller->GetDeskAtIndex(last_desk_index), DeskCloseType::kCloseAllWindowsAndWait); ASSERT_EQ(desks_util::GetMaxNumberOfDesks() - 1, controller->desks().size()); ASSERT_TRUE(DesksTestApi::DesksControllerCanUndoDeskRemoval()); @@ -8904,7 +8908,7 @@ NewDesk(); auto* controller = DesksController::Get(); ASSERT_EQ(2u, controller->desks().size()); - Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_1 = controller->GetDeskAtIndex(0); ASSERT_TRUE(desk_1->is_active()); EXPECT_TRUE(base::Contains(desk_1->windows(), window.window())); @@ -8944,7 +8948,7 @@ NewDesk(); auto* controller = DesksController::Get(); controller->SendToDeskAtIndex(win1.window(), 1); - Desk* desk = controller->desks()[1].get(); + Desk* desk = controller->GetDeskAtIndex(1); EnterOverview(); @@ -8988,14 +8992,14 @@ // We don't need to save the desk GUID for restore if there is only one desk. NewDesk(); auto* controller = DesksController::Get(); - base::Uuid desk1_guid = controller->desks()[0].get()->uuid(); - base::Uuid desk2_guid = controller->desks()[1].get()->uuid(); + base::Uuid desk1_guid = controller->GetDeskAtIndex(0)->uuid(); + base::Uuid desk2_guid = controller->GetDeskAtIndex(1)->uuid(); EXPECT_THAT(GetDeskRestoreGuids(GetPrimaryUserPrefService()), testing::ElementsAre(desk1_guid, desk2_guid)); // Add a third desk, close the second desk, and check the GUIDs. NewDesk(); - base::Uuid desk3_guid = controller->desks()[2].get()->uuid(); + base::Uuid desk3_guid = controller->GetDeskAtIndex(2)->uuid(); EnterOverview(); CloseDeskFromMiniView(GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()) ->desks_bar_view() @@ -9011,9 +9015,9 @@ NewDesk(); NewDesk(); auto* controller = DesksController::Get(); - base::Uuid desk1_guid = controller->desks()[0].get()->uuid(); - base::Uuid desk2_guid = controller->desks()[1].get()->uuid(); - base::Uuid desk3_guid = controller->desks()[2].get()->uuid(); + base::Uuid desk1_guid = controller->GetDeskAtIndex(0)->uuid(); + base::Uuid desk2_guid = controller->GetDeskAtIndex(1)->uuid(); + base::Uuid desk3_guid = controller->GetDeskAtIndex(2)->uuid(); EXPECT_THAT(GetDeskRestoreGuids(GetPrimaryUserPrefService()), testing::ElementsAre(desk1_guid, desk2_guid, desk3_guid)); @@ -9360,8 +9364,8 @@ while (desks_controller->GetNumberOfDesks() < (int)test.desks.size()) { NewDesk(); } - if (!desks_controller->desks()[test.active_desk]->is_active()) { - ActivateDesk(desks_controller->desks()[test.active_desk].get()); + if (!desks_controller->GetDeskAtIndex(test.active_desk)->is_active()) { + ActivateDesk(desks_controller->GetDeskAtIndex(test.active_desk)); } // Set up shelf. @@ -9611,8 +9615,8 @@ if (desks_controller->GetNumberOfDesks() - 1 < i) { NewDesk(); } - desks_controller->desks()[i]->SetName(base::UTF8ToUTF16(desk_name), - /*set_by_user=*/true); + desks_controller->GetDeskAtIndex(i)->SetName(base::UTF8ToUTF16(desk_name), + /*set_by_user=*/true); EXPECT_THAT(desk_bar_view->mini_views().size(), GetDeskBarView()->IsZeroState() ? 0 @@ -9623,7 +9627,7 @@ auto verify_desks = [&]() { for (int i = 0; i < desks_controller->GetNumberOfDesks(); i++) { - EXPECT_THAT(desks_controller->desks()[i]->name(), + EXPECT_THAT(desks_controller->GetDeskAtIndex(i)->name(), base::UTF8ToUTF16(desk_names[i])); } auto* prefs = @@ -9719,7 +9723,7 @@ OpenDeskBar(); auto* desk_bar_view = GetDeskBarView(); - Desk* desk = DesksController::Get()->desks().front().get(); + Desk* desk = DesksController::Get()->GetDeskAtIndex(0); auto* mini_view = desk_bar_view->FindMiniViewForDesk(desk); auto* desk_name_view = mini_view->desk_name_view(); @@ -9742,7 +9746,7 @@ OpenDeskBar(); auto* desk_bar_view = GetDeskBarView(); - Desk* desk = DesksController::Get()->desks().front().get(); + Desk* desk = DesksController::Get()->GetDeskAtIndex(0); auto* mini_view = desk_bar_view->FindMiniViewForDesk(desk); auto* desk_name_view = mini_view->desk_name_view(); @@ -9765,7 +9769,7 @@ OpenDeskBar(); auto* desk_bar_view = GetDeskBarView(); - Desk* desk = DesksController::Get()->desks().front().get(); + Desk* desk = DesksController::Get()->GetDeskAtIndex(0); auto* mini_view = desk_bar_view->FindMiniViewForDesk(desk); auto* desk_name_view = mini_view->desk_name_view(); @@ -9791,7 +9795,7 @@ OpenDeskBar(); auto* desk_bar_view = GetDeskBarView(); - Desk* desk = DesksController::Get()->desks().front().get(); + Desk* desk = DesksController::Get()->GetDeskAtIndex(0); auto* mini_view = desk_bar_view->FindMiniViewForDesk(desk); auto* desk_name_view = mini_view->desk_name_view(); @@ -9900,10 +9904,8 @@ NewDesk(); auto* controller = DesksController::Get(); - const auto& desks = controller->desks(); - - auto* desk_1 = desks[0].get(); - auto* desk_2 = desks[1].get(); + auto* desk_1 = controller->GetDeskAtIndex(0); + auto* desk_2 = controller->GetDeskAtIndex(1); // Check that we are on desk 1. ASSERT_TRUE(desk_1->is_active()); @@ -9951,10 +9953,8 @@ NewDesk(); auto* controller = DesksController::Get(); - const auto& desks = controller->desks(); - - auto* desk_1 = desks[0].get(); - auto* desk_2 = desks[1].get(); + auto* desk_1 = controller->GetDeskAtIndex(0); + auto* desk_2 = controller->GetDeskAtIndex(1); // Check that renaming the active desk changes the text in the button. ASSERT_TRUE(desk_1->is_active()); @@ -9989,8 +9989,7 @@ NewDesk(); auto* controller = DesksController::Get(); - const auto& desks = controller->desks(); - desks[0]->SetName(u"😃emoji", /*set_by_user=*/true); + controller->GetDeskAtIndex(0)->SetName(u"😃emoji", /*set_by_user=*/true); auto* desk_button = GetDeskButton(); ASSERT_TRUE(desk_button); @@ -10007,7 +10006,7 @@ EnterOverview(); EXPECT_FALSE(GetDeskButtonWidget()->GetLayer()->GetTargetVisibility()); auto* desks_controller = DesksController::Get(); - ActivateDesk(desks_controller->desks()[1].get()); + ActivateDesk(desks_controller->GetDeskAtIndex(1)); EXPECT_TRUE(GetDeskButtonWidget()->GetLayer()->GetTargetVisibility()); } @@ -10015,7 +10014,8 @@ // button. TEST_P(DeskButtonTest, UpdateShelfAlignmentDuringTest) { NewDesk(); - DesksController::Get()->desks()[0]->SetName(u"school", /*set_by_user=*/true); + DesksController::Get()->GetDeskAtIndex(0)->SetName(u"school", + /*set_by_user=*/true); const bool bottom_at_start = GetParam().alignment == ShelfAlignment::kBottom; auto* desk_button = GetDeskButton();
diff --git a/ash/wm/desks/templates/saved_desk_unittest.cc b/ash/wm/desks/templates/saved_desk_unittest.cc index a1ac30ea..b1c6039 100644 --- a/ash/wm/desks/templates/saved_desk_unittest.cc +++ b/ash/wm/desks/templates/saved_desk_unittest.cc
@@ -3314,7 +3314,7 @@ // Activate the second desk which has no windows. Test that all the windows // have their opacity restored. - ActivateDesk(desks_controller->desks()[1].get()); + ActivateDesk(desks_controller->GetDeskAtIndex(1)); EXPECT_EQ(1.f, test_window1->layer()->opacity()); EXPECT_EQ(1.f, test_window2->layer()->opacity()); EXPECT_EQ(1.f, test_window3->layer()->opacity()); @@ -4352,7 +4352,7 @@ // Verify that a new desk has been created and that it has the name of the // saved desk. EXPECT_EQ(2ul, desks_controller->desks().size()); - EXPECT_EQ(kDeskName, desks_controller->desks()[1]->name()); + EXPECT_EQ(kDeskName, desks_controller->GetDeskAtIndex(1)->name()); // Verify that the saved desk has been deleted. EXPECT_TRUE(GetAllEntries().empty());
diff --git a/ash/wm/overview/overview_controller_unittest.cc b/ash/wm/overview/overview_controller_unittest.cc index d2f3d74c..883a03f0 100644 --- a/ash/wm/overview/overview_controller_unittest.cc +++ b/ash/wm/overview/overview_controller_unittest.cc
@@ -675,8 +675,8 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kKeyboard); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk1 = desks_controller->desks()[0].get(); - const Desk* desk2 = desks_controller->desks()[1].get(); + const Desk* desk1 = desks_controller->GetDeskAtIndex(0); + const Desk* desk2 = desks_controller->GetDeskAtIndex(1); ui::ScopedAnimationDurationScaleMode non_zero( ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
diff --git a/ash/wm/overview/overview_highlight_controller_unittest.cc b/ash/wm/overview/overview_highlight_controller_unittest.cc index 1e203c8..5af9a97c 100644 --- a/ash/wm/overview/overview_highlight_controller_unittest.cc +++ b/ash/wm/overview/overview_highlight_controller_unittest.cc
@@ -389,7 +389,7 @@ // Give the second desk a name. The desk name gets exposed as the accessible // name. And the focusable views that are painted in these tests will fail // the accessibility paint checker checks if they lack an accessible name. - desk_controller->desks()[1]->SetName(u"Desk 2", false); + desk_controller->GetDeskAtIndex(1)->SetName(u"Desk 2", false); } OverviewHighlightableView* GetHighlightedView() { @@ -725,8 +725,8 @@ TEST_P(DesksOverviewHighlightControllerTest, CloseHighlightOnMiniView) { const auto* desks_controller = DesksController::Get(); ASSERT_EQ(2u, desks_controller->desks().size()); - auto* desk1 = desks_controller->desks()[0].get(); - auto* desk2 = desks_controller->desks()[1].get(); + auto* desk1 = desks_controller->GetDeskAtIndex(0); + auto* desk2 = desks_controller->GetDeskAtIndex(1); ASSERT_EQ(desk1, desks_controller->active_desk()); ToggleOverview(); @@ -744,7 +744,7 @@ // with desk 2, desk 2 is destroyed. SendKey(ui::VKEY_W, ui::EF_CONTROL_DOWN); EXPECT_EQ(1u, desks_controller->desks().size()); - EXPECT_NE(desk2, desks_controller->desks()[0].get()); + EXPECT_NE(desk2, desks_controller->GetDeskAtIndex(0)); // Go back to zero state since there is only a single desk and mini views // are empty in zero state. @@ -771,7 +771,7 @@ // All should be selected. EXPECT_TRUE(desk_name_view_1->HasSelection()); const auto* desks_controller = DesksController::Get(); - auto* desk_1 = desks_controller->desks()[0].get(); + auto* desk_1 = desks_controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1->name(), desk_name_view_1->GetSelectedText()); // Arrow keys should not change neither the focus nor the highlight. @@ -812,7 +812,7 @@ EXPECT_EQ(desk_name_view_1, GetHighlightedView()); const auto* desks_controller = DesksController::Get(); - auto* desk_1 = desks_controller->desks()[0].get(); + auto* desk_1 = desks_controller->GetDeskAtIndex(0); RemoveDesk(desk_1); // Tabbing again should cause no crashes.
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 9904e1c..9e73292 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -3635,8 +3635,8 @@ generator->ReleaseLeftButton(); auto* controller = DesksController::Get(); EXPECT_EQ(2u, controller->desks().size()); - EXPECT_TRUE( - base::Contains(controller->desks()[1]->windows(), normal_window.get())); + EXPECT_TRUE(base::Contains(controller->GetDeskAtIndex(1)->windows(), + normal_window.get())); } // Tests that the overview item associated with the floated window appears @@ -3879,14 +3879,14 @@ auto* controller = DesksController::Get(); controller->NewDesk(DesksCreationRemovalSource::kKeyboard); - ActivateDesk(controller->desks()[1].get()); + ActivateDesk(controller->GetDeskAtIndex(1)); auto desk2_windows = CreateAppWindows(2); // Activate the desk with 15 windows. There may be more than the windows we // created (i.e. backdrop, nudges), so we assert greater than. - ActivateDesk(controller->desks()[0].get()); - ASSERT_GT(controller->desks()[0]->windows().size(), 15u); - ASSERT_GT(controller->desks()[1]->windows().size(), 2u); + ActivateDesk(controller->GetDeskAtIndex(0)); + ASSERT_GT(controller->GetDeskAtIndex(0)->windows().size(), 15u); + ASSERT_GT(controller->GetDeskAtIndex(1)->windows().size(), 2u); ToggleOverview(); ASSERT_TRUE(InOverviewSession()); @@ -3896,7 +3896,7 @@ GetEventGenerator()->MoveTouchBy(-50, 0); // Remove the desk and continue scrolling. There should be no crash. - RemoveDesk(controller->desks()[1].get(), DeskCloseType::kCombineDesks); + RemoveDesk(controller->GetDeskAtIndex(1), DeskCloseType::kCombineDesks); GetEventGenerator()->MoveTouchBy(-50, 0); }
diff --git a/ash/wm/overview/overview_window_drag_controller_unittest.cc b/ash/wm/overview/overview_window_drag_controller_unittest.cc index bb9ed61..eb3c8be 100644 --- a/ash/wm/overview/overview_window_drag_controller_unittest.cc +++ b/ash/wm/overview/overview_window_drag_controller_unittest.cc
@@ -272,7 +272,7 @@ event_generator->ReleaseTouch(); EXPECT_TRUE(overview_controller->InOverviewSession()); EXPECT_TRUE(overview_grid->empty()); - const Desk* desk_2 = controller->desks()[1].get(); + const Desk* desk_2 = controller->GetDeskAtIndex(1); EXPECT_TRUE(base::Contains(desk_2->windows(), window.get())); EXPECT_TRUE(const_cast<OverviewGrid*>(overview_grid)->no_windows_widget()); } @@ -417,7 +417,7 @@ // Give the second desk a name. The desk name gets exposed as the accessible // name. And the focusable views that are painted in these tests will fail // the accessibility paint checker checks if they lack an accessible name. - desks_controller->desks()[1]->SetName(u"Desk 2", false); + desks_controller->GetDeskAtIndex(1)->SetName(u"Desk 2", false); } }; @@ -526,7 +526,7 @@ // overview mode, there's no desks bar after entering overview mode. Cause we // don't show desks bar for tablet mode when there's only one desk. auto* desks_controller = DesksController::Get(); - DesksController::Get()->RemoveDesk(desks_controller->desks()[1].get(), + DesksController::Get()->RemoveDesk(desks_controller->GetDeskAtIndex(1), DesksCreationRemovalSource::kButton, DeskCloseType::kCombineDesks); EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
diff --git a/ash/wm/window_cycle/window_cycle_controller_unittest.cc b/ash/wm/window_cycle/window_cycle_controller_unittest.cc index 7f9807c..17d1ccf 100644 --- a/ash/wm/window_cycle/window_cycle_controller_unittest.cc +++ b/ash/wm/window_cycle/window_cycle_controller_unittest.cc
@@ -850,11 +850,11 @@ desks_controller->NewDesk(DesksCreationRemovalSource::kButton); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(3u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); - const Desk* desk_3 = desks_controller->desks()[2].get(); + const Desk* desk_3 = desks_controller->GetDeskAtIndex(2); ActivateDesk(desk_3); EXPECT_EQ(desk_3, desks_controller->active_desk()); auto win3 = CreateAppWindow(gfx::Rect(10, 30, 400, 200)); @@ -879,7 +879,7 @@ cycle_controller->HandleCycleWindow( WindowCycleController::WindowCyclingDirection::kForward); CompleteCyclingAndDeskSwitching(cycle_controller); - Desk* desk_1 = desks_controller->desks()[0].get(); + Desk* desk_1 = desks_controller->GetDeskAtIndex(0); EXPECT_EQ(desk_1, desks_controller->active_desk()); EXPECT_EQ(win1.get(), window_util::GetActiveWindow()); histogram_tester.ExpectUniqueSample( @@ -948,8 +948,8 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_0 = desks_controller->desks()[0].get(); - const Desk* desk_1 = desks_controller->desks()[1].get(); + const Desk* desk_0 = desks_controller->GetDeskAtIndex(0); + const Desk* desk_1 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_1); EXPECT_EQ(desk_1, desks_controller->active_desk()); auto win1 = CreateAppWindow(gfx::Rect(300, 200)); @@ -2004,7 +2004,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2075,7 +2075,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2167,7 +2167,7 @@ // Create an empty desk_2 and start alt-tab to enter the all-desks mode. desks_controller->NewDesk(DesksCreationRemovalSource::kButton); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); cycle_controller->StartCycling(/*same_app_only=*/false); @@ -2209,7 +2209,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2243,7 +2243,7 @@ CompleteCycling(cycle_controller); // Activate desk1 and start alt-tab. - const Desk* desk_1 = desks_controller->desks()[0].get(); + const Desk* desk_1 = desks_controller->GetDeskAtIndex(0); ActivateDesk(desk_1); cycle_controller->StartCycling(/*same_app_only=*/false); // Should start alt-tab with the current-desk mode and show only two windows @@ -2277,7 +2277,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2320,7 +2320,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win0 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2360,7 +2360,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); // Activate desk2. ActivateDesk(desk_2); @@ -2416,7 +2416,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); // Activate desk2. ActivateDesk(desk_2); @@ -2446,7 +2446,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2513,7 +2513,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2585,7 +2585,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2692,7 +2692,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win2 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); @@ -2796,7 +2796,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win0 = CreateAppWindow(gfx::Rect(10, 30, 400, 200)); @@ -2976,7 +2976,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); @@ -3068,7 +3068,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); std::unique_ptr<Window> w4 = CreateAppWindow(default_rect); @@ -3106,7 +3106,7 @@ // Put one window on each desk. auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); - ActivateDesk(desks_controller->desks()[1].get()); + ActivateDesk(desks_controller->GetDeskAtIndex(1)); auto win1 = CreateAppWindow(gfx::Rect(0, 0, 300, 200)); // Start cycle. Verify the slider buttons are present. @@ -3298,7 +3298,7 @@ desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); // Activate desk2 and create two windows. - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win1 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); @@ -3335,7 +3335,7 @@ // Switch to the secondary user_2 and setup the profile with four windows. SwitchActiveUser(GetUser2AccountId()); - const Desk* desk_1 = desks_controller->desks()[0].get(); + const Desk* desk_1 = desks_controller->GetDeskAtIndex(0); EXPECT_TRUE(desk_1->is_active()); auto win3 = CreateAppWindow(gfx::Rect(0, 0, 250, 200)); multi_user_window_manager()->SetWindowOwner(win3.get(), GetUser2AccountId()); @@ -3393,7 +3393,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); auto win1 = CreateAppWindow(gfx::Rect(50, 50, 200, 200)); @@ -3415,7 +3415,7 @@ // Switch to user_2 and open up two windows out of four in the current desk. SwitchActiveUser(GetUser2AccountId()); - const Desk* desk_1 = desks_controller->desks()[0].get(); + const Desk* desk_1 = desks_controller->GetDeskAtIndex(0); EXPECT_TRUE(desk_1->is_active()); auto win3 = CreateAppWindow(gfx::Rect(0, 0, 250, 200)); multi_user_window_manager()->SetWindowOwner(win3.get(), GetUser2AccountId()); @@ -3667,7 +3667,7 @@ auto* desks_controller = DesksController::Get(); desks_controller->NewDesk(DesksCreationRemovalSource::kButton); ASSERT_EQ(2u, desks_controller->desks().size()); - const Desk* desk_2 = desks_controller->desks()[1].get(); + const Desk* desk_2 = desks_controller->GetDeskAtIndex(1); ActivateDesk(desk_2); EXPECT_EQ(desk_2, desks_controller->active_desk()); std::unique_ptr<aura::Window> w4(CreateTestWindowWithAppID(std::string("A"))); @@ -3711,7 +3711,7 @@ // Go to desk 1 and start cycling, we should still be on current-desk mode and // see 3 windows of app B. - ActivateDesk(desks_controller->desks()[0].get()); + ActivateDesk(desks_controller->GetDeskAtIndex(0)); generator->PressKey(ui::VKEY_MENU, ui::EF_NONE); generator->PressAndReleaseKey(ui::VKEY_OEM_3, ui::EF_ALT_DOWN); EXPECT_TRUE(cycle_controller->IsAltTabPerActiveDesk());
diff --git a/build/config/chromeos/BUILD.gn b/build/config/chromeos/BUILD.gn index 06060726..d6b383ac 100644 --- a/build/config/chromeos/BUILD.gn +++ b/build/config/chromeos/BUILD.gn
@@ -6,21 +6,6 @@ assert(is_chromeos) -declare_args() { - # The location to a file used to dump symbols ordered by Call-Chain Clustering (C3) - # https://research.fb.com/wp-content/uploads/2017/01/cgo2017-hfsort-final1.pdf? - # to a file, used for generating orderfiles in Chrome OS - dump_call_chain_clustering_order = "" -} - -config("print_orderfile") { - if (dump_call_chain_clustering_order != "") { - _output_orderfile = - rebase_path(dump_call_chain_clustering_order, root_build_dir) - ldflags = [ "-Wl,--print-symbol-order=$_output_orderfile" ] - } -} - config("compiler_cpu_abi") { # Lacros currently uses the *-generic-crosstoolchain.gni files generated # by the simplechrome sdk in build/args/chromeos. These target triples
diff --git a/build/config/clang/clang.gni b/build/config/clang/clang.gni index 3cb0553..69883e6a 100644 --- a/build/config/clang/clang.gni +++ b/build/config/clang/clang.gni
@@ -18,7 +18,7 @@ enable_check_raw_ptr_fields = build_with_chromium && !is_official_build && ((is_linux && !is_castos) || (is_android && !is_cast_android) || is_mac || - is_win || is_chromeos_lacros) + is_win || is_chromeos_lacros || is_chromeos_ash) clang_base_path = default_clang_base_path
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index bb64061..b7ff7ceb 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -203,9 +203,7 @@ current_cpu == "x64")))) } -# TODO(b/287316830): remove this option from ChromeOS once they've migrated away -# from using orderfiles. -if (is_android || (is_chromeos_ash && is_chromeos_device)) { +if (is_android) { # Set the path to use orderfile for linking Chrome # Note that this is for using only one orderfile for linking # the Chrome binary/library. @@ -2816,27 +2814,14 @@ } } -if (is_chromeos_ash && is_chromeos_device) { - # This config is intended to be a temporary to facilitate - # the transition to use orderfile in Chrome OS. Once orderfile - # use becomes a default in Chrome OS, this config should not - # be needed. - config("use_orderfile_for_hugepage") { - if (chrome_orderfile_path != "") { - defines = [ "CHROMEOS_ORDERFILE_USE" ] - } - } -} - -if (is_android || (is_chromeos_ash && is_chromeos_device)) { - # Use orderfile for linking Chrome on Android and Chrome OS. +if (is_android) { + # Use orderfile for linking Chrome on Android. # This config enables using an orderfile for linking in LLD. config("chrome_orderfile_config") { # Don't try to use an orderfile with call graph sorting, except on Android, # where we care about memory used by code, so we still want to mandate # ordering. - if (chrome_orderfile_path != "" && - (is_android || !enable_call_graph_profile_sort)) { + if (chrome_orderfile_path != "") { assert(use_lld) _rebased_orderfile = rebase_path(chrome_orderfile_path, root_build_dir) ldflags = [
diff --git a/build/config/rust.gni b/build/config/rust.gni index b7ac756..7dd7695 100644 --- a/build/config/rust.gni +++ b/build/config/rust.gni
@@ -23,9 +23,8 @@ # should not be removed. enable_rust = build_with_chromium && - # TODO(crbug.com/1386212): Mac and iOS. Note that enabling iOS, without - # enabling Mac for host tools, is not possible. - !is_ios && !(is_official_build && is_mac) && + # TODO(crbug.com/1386212): Mac official. + !(is_official_build && is_mac) && # TODO(crbug.com/1453618): Windows ARM64 is missing clang_rt libs, and # clang_rt.profile is needed when coverage is enabled. !(is_win && use_clang_coverage && target_cpu == "arm64")
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index a0db274..7371628 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -365,10 +365,6 @@ if (is_chromeos_ash) { data_deps += [ "//mojo/core:shared_libraries_for_arc" ] - if (is_chromeos_device) { - configs += [ "//build/config/chromeos:print_orderfile" ] - configs += [ "//build/config/compiler:chrome_orderfile_config" ] - } } # These files are used by the installer so we need a public dep.
diff --git a/chrome/VERSION b/chrome/VERSION index fb694d55..d8e42f2 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=117 MINOR=0 -BUILD=5859 +BUILD=5860 PATCH=0
diff --git a/chrome/android/expectations/lint-baseline.xml b/chrome/android/expectations/lint-baseline.xml index 1647d4c..cf28215 100644 --- a/chrome/android/expectations/lint-baseline.xml +++ b/chrome/android/expectations/lint-baseline.xml
@@ -2681,17 +2681,6 @@ <issue id="WrongConstant" - message="Must be one of: DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_SHOW, DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_CONFIRM, DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_CANCEL, DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_LINK_CLICKED, DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_DISMISS" - errorLine1=" event, DuplicateDownloadDialogEvent.COUNT);" - errorLine2=" ~~~~~"> - <location - file="../../chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadDialog.java" - line="189" - column="53"/> - </issue> - - <issue - id="WrongConstant" message="Must be one of: StreamTabId.DEFAULT, StreamTabId.FOR_YOU, StreamTabId.FOLLOWING" errorLine1=" if (mTabToStreamMap.size() <= tabId) tabId = 0;" errorLine2=" ~">
diff --git a/chrome/android/features/cablev2_authenticator/BUILD.gn b/chrome/android/features/cablev2_authenticator/BUILD.gn index 7c3ab25..03f635dd 100644 --- a/chrome/android/features/cablev2_authenticator/BUILD.gn +++ b/chrome/android/features/cablev2_authenticator/BUILD.gn
@@ -32,6 +32,8 @@ "//third_party/androidx:androidx_vectordrawable_vectordrawable_animated_java", "//third_party/blink/public/mojom:android_mojo_bindings_java", "//ui/android:ui_full_java", + "//url:gurl_java", + "//url:origin_java", ] resources_package = "org.chromium.chrome.browser.webauth.authenticator"
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java index 7bb2a65..70ce88d 100644 --- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java +++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
@@ -32,6 +32,11 @@ import org.chromium.blink.mojom.ResidentKeyRequirement; import org.chromium.components.webauthn.Fido2Api; import org.chromium.components.webauthn.Fido2ApiCall; +import org.chromium.components.webauthn.Fido2CredentialRequest; +import org.chromium.device.DeviceFeatureList; +import org.chromium.device.DeviceFeatureMap; +import org.chromium.url.GURL; +import org.chromium.url.Origin; import java.nio.ByteBuffer; import java.security.NoSuchAlgorithmException; @@ -128,6 +133,35 @@ public void makeCredential(byte[] serializedParams) { PublicKeyCredentialCreationOptions params = PublicKeyCredentialCreationOptions.deserialize(ByteBuffer.wrap(serializedParams)); + + if (DeviceFeatureMap.isEnabled(DeviceFeatureList.WEBAUTHN_CABLE_VIA_CREDMAN)) { + final Fido2CredentialRequest request = new Fido2CredentialRequest(mUi); + final Origin origin = Origin.create(new GURL("https://" + params.relyingParty.id)); + request.handleMakeCredentialRequest(mContext, params, null, params.challenge, origin, + (status, response) + -> { + mTaskRunner.postTask( + () + -> CableAuthenticatorJni.get() + .onAuthenticatorAttestationResponse(CTAP2_OK, + response.attestationObject, + // DPK was never default-enabled and thus + // isn't wired up here. + /*devicePublicKeySignature=*/null, + response.prf)); + mUi.onAuthenticatorResult(Result.REGISTER_OK); + }, + (status) -> { + mTaskRunner.postTask(() + -> CableAuthenticatorJni.get() + .onAuthenticatorAttestationResponse( + CTAP2_ERR_OPERATION_DENIED, + null, null, false)); + mUi.onAuthenticatorResult(Result.REGISTER_ERROR); + }); + return; + } + mAttestationAcceptable = params.authenticatorSelection.residentKey == ResidentKeyRequirement.DISCOURAGED; @@ -155,6 +189,35 @@ PublicKeyCredentialRequestOptions params = PublicKeyCredentialRequestOptions.deserialize(ByteBuffer.wrap(serializedParams)); + if (DeviceFeatureMap.isEnabled(DeviceFeatureList.WEBAUTHN_CABLE_VIA_CREDMAN)) { + final Fido2CredentialRequest request = new Fido2CredentialRequest(mUi); + final Origin origin = Origin.create(new GURL("https://" + params.relyingPartyId)); + request.handleGetAssertionRequest(mContext, params, /*frameHost=*/null, + /*maybeClientDataHash=*/params.challenge, origin, origin, + /*payment=*/null, + (status, response) + -> { + response.info.clientDataJson = new byte[0]; + ByteBuffer buffer = response.serialize(); + byte[] serialized = new byte[buffer.remaining()]; + buffer.get(serialized); + mTaskRunner.postTask(() + -> CableAuthenticatorJni.get() + .onAuthenticatorAssertionResponse( + CTAP2_OK, serialized)); + mUi.onAuthenticatorResult(Result.SIGN_OK); + }, + (status) -> { + mTaskRunner.postTask( + () + -> CableAuthenticatorJni.get() + .onAuthenticatorAssertionResponse( + CTAP2_ERR_OPERATION_DENIED, null)); + mUi.onAuthenticatorResult(Result.SIGN_ERROR); + }); + return; + } + Fido2ApiCall call = new Fido2ApiCall(mContext); Parcel args = call.start(); Fido2ApiCall.PendingIntentResult result = new Fido2ApiCall.PendingIntentResult();
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java index fb0fa2d..a651214 100644 --- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java +++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java
@@ -7,6 +7,7 @@ import android.Manifest.permission; import android.app.Activity; import android.app.KeyguardManager; +import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; @@ -17,6 +18,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -33,10 +35,12 @@ import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat; import org.chromium.base.BuildInfo; +import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; +import org.chromium.content_public.browser.WebAuthenticationDelegate; import org.chromium.device.DeviceFeatureList; import org.chromium.device.DeviceFeatureMap; import org.chromium.ui.permissions.ActivityAndroidPermissionDelegate; @@ -48,13 +52,18 @@ /** * A fragment that provides a UI for various caBLE v2 actions. */ -public class CableAuthenticatorUI extends Fragment implements OnClickListener { +public class CableAuthenticatorUI + extends Fragment implements OnClickListener, WebAuthenticationDelegate.IntentSender { private static final String TAG = "CableAuthenticatorUI"; // ENABLE_BLUETOOTH_REQUEST_CODE is a random int used to identify responses // to a request to enable Bluetooth. (Request codes can only be 16-bit.) private static final int ENABLE_BLUETOOTH_REQUEST_CODE = 64907; + // PLAY_SERVICES_REQUEST_CODE is a random int used to identify responses + // to a request to Play Services. (Request codes can only be 16-bit.) + private static final int PLAY_SERVICES_REQUEST_CODE = 13466; + // BLE_SCREEN_DELAY_SECS is the number of seconds that the screen for BLE // enabling will show before the request to actually enable BLE (which // causes Android to draw on top of it) is made. @@ -145,6 +154,9 @@ // mActivityStarted is set to true by `onResume`. Some event transitions are suppressed until // this flag has been set. private boolean mActivityStarted; + // mFidoCallback holds the callback from `Fido2CredentialRequest` while a + // request to Play Services is outstanding. + private Callback<Pair<Integer, Intent>> mFidoCallback; // These are top-level views that can fill this activity. private View mErrorView; @@ -663,17 +675,34 @@ return; } - if (requestCode != ENABLE_BLUETOOTH_REQUEST_CODE) { + if (requestCode == PLAY_SERVICES_REQUEST_CODE) { + mFidoCallback.onResult(new Pair(resultCode, data)); + } else if (requestCode == ENABLE_BLUETOOTH_REQUEST_CODE) { + if (resultCode != Activity.RESULT_OK) { + getActivity().finish(); + return; + } + onEvent(Event.BLE_ENABLED); + } else { mAuthenticator.onActivityResult(requestCode, resultCode, data); - return; } + } - if (resultCode != Activity.RESULT_OK) { - getActivity().finish(); - return; + @Override + public boolean showIntent(PendingIntent intent, Callback<Pair<Integer, Intent>> callback) { + mFidoCallback = callback; + try { + startIntentSenderForResult(intent.getIntentSender(), PLAY_SERVICES_REQUEST_CODE, + null, // fillInIntent, + 0, // flagsMask, + 0, // flagsValue, + 0, // extraFlags, + Bundle.EMPTY); + } catch (android.content.IntentSender.SendIntentException e) { + Log.e(TAG, "SendIntentException", e); + return false; } - - onEvent(Event.BLE_ENABLED); + return true; } void onAuthenticatorConnected() {}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java index 85efbcd9c..983bfb8 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java
@@ -12,6 +12,8 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; +import org.chromium.base.ResettersForTesting; +import org.chromium.build.BuildConfig; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.tab.Tab; @@ -42,12 +44,15 @@ String getLastSearchTerm(Tab tab); } - private static LastSearchTermProvider sLastSearchTermProviderForTests; + private static LastSearchTermProvider sLastSearchTermProviderForTesting; private static SharedPreferences getSharedPreferences() { if (sPref == null) { sPref = ContextUtils.getApplicationContext().getSharedPreferences( PREFERENCES_NAME, Context.MODE_PRIVATE); + if (BuildConfig.IS_FOR_TEST) { + ResettersForTesting.register(() -> sPref = null); + } } return sPref; } @@ -166,7 +171,6 @@ * @param id The ID of the {@link PseudoTab}. * @param title The title */ - @VisibleForTesting public static void setTitleForTesting(int id, String title) { cacheTitle(id, title); } @@ -228,7 +232,6 @@ * @param id The ID of the {@link PseudoTab}. * @param rootId The root ID */ - @VisibleForTesting public static void setRootIdForTesting(int id, int rootId) { cacheRootId(id, rootId); } @@ -256,7 +259,6 @@ * @param id The ID of the {@link PseudoTab}. * @param timestampMillis The timestamp */ - @VisibleForTesting public static void setTimestampMillisForTesting(int id, long timestampMillis) { cacheTimestampMillis(id, timestampMillis); } @@ -292,8 +294,8 @@ */ @VisibleForTesting static @Nullable String findLastSearchTerm(Tab tab) { - if (sLastSearchTermProviderForTests != null) { - return sLastSearchTermProviderForTests.getLastSearchTerm(tab); + if (sLastSearchTermProviderForTesting != null) { + return sLastSearchTermProviderForTesting.getLastSearchTerm(tab); } assert tab.getWebContents() != null; NavigationController controller = tab.getWebContents().getNavigationController(); @@ -348,9 +350,9 @@ * Set the LastSearchTermProvider for testing. * @param lastSearchTermProvider The mocking object. */ - @VisibleForTesting static void setLastSearchTermMockForTesting(LastSearchTermProvider lastSearchTermProvider) { - sLastSearchTermProviderForTests = lastSearchTermProvider; + sLastSearchTermProviderForTesting = lastSearchTermProvider; + ResettersForTesting.register(() -> sLastSearchTermProviderForTesting = null); } /** @@ -358,20 +360,11 @@ * @param id The ID of the {@link PseudoTab}. * @param searchTerm The last search term */ - @VisibleForTesting public static void setLastSearchTermForTesting(int id, String searchTerm) { cacheLastSearchTerm(id, searchTerm); } /** - * Clear everything in the storage. - */ - @VisibleForTesting - public static void clearAllForTesting() { - getSharedPreferences().edit().clear().apply(); - } - - /** * Remove all the observers. */ public void destroy() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageService.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageService.java index 6d0fd7d..931d7e5 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageService.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageService.java
@@ -15,6 +15,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.chromium.base.ResettersForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthManager; @@ -41,7 +42,6 @@ /** * TODO(crbug.com/1227656): Remove this when we support all the Android versions. */ - @VisibleForTesting public static Boolean sIsPromoEnabledForTesting; /** @@ -50,8 +50,7 @@ * triggering and simply call the next set of actions which would have been call, if * the re-auth was indeed successful. */ - @VisibleForTesting - public static Boolean sTriggerReviewActionWithoutReauthForTesting; + private static Boolean sTriggerReviewActionWithoutReauthForTesting; @VisibleForTesting public final int mMaxPromoMessageCount = 10; @@ -297,9 +296,14 @@ return mSharedPreferencesManager.readBoolean(INCOGNITO_REAUTH_PROMO_CARD_ENABLED, true); } - @VisibleForTesting + public static void setTriggerReviewActionWithoutReauthForTesting(boolean enabled) { + sTriggerReviewActionWithoutReauthForTesting = enabled; + ResettersForTesting.register(() -> sTriggerReviewActionWithoutReauthForTesting = null); + } + public static void setIsPromoEnabledForTesting(@Nullable Boolean enabled) { sIsPromoEnabledForTesting = enabled; + ResettersForTesting.register(() -> sIsPromoEnabledForTesting = null); } private void disableIncognitoReauthPromoMessage() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java index 2ac3fb8..fd51370723 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -12,10 +12,10 @@ import android.view.View; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import androidx.appcompat.content.res.AppCompatResources; import org.chromium.base.Callback; +import org.chromium.base.ResettersForTesting; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.tab.Tab; @@ -720,38 +720,33 @@ } } - @VisibleForTesting int getCurrentTabIdForTesting() { return mCurrentTabId; } - @VisibleForTesting void setCurrentTabIdForTesting(int tabId) { + var oldValue = mCurrentTabId; mCurrentTabId = tabId; + ResettersForTesting.register(() -> mCurrentTabId = oldValue); } - @VisibleForTesting KeyboardVisibilityDelegate.KeyboardVisibilityListener getKeyboardVisibilityListenerForTesting() { return mKeyboardVisibilityListener; } - @VisibleForTesting boolean getIsUpdatingTitleForTesting() { return mIsUpdatingTitle; } - @VisibleForTesting String getCurrentGroupModifiedTitleForTesting() { return mCurrentGroupModifiedTitle; } - @VisibleForTesting Callback<Integer> getToolbarMenuCallbackForTesting() { return mToolbarMenuCallback; } - @VisibleForTesting Runnable getScrimClickRunnableForTesting() { return mScrimClickRunnable; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java index ece4713..237a782 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
@@ -33,6 +33,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.tab_ui.R; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; @@ -705,9 +706,17 @@ ((TextView) (mAnimationCardView.findViewById(R.id.tab_title))) .setTextColor(((TextView) (view.findViewById(R.id.tab_title))).getTextColors()); - ((ImageView) (mAnimationCardView.findViewById(R.id.tab_thumbnail))) - .setImageDrawable( - ((ImageView) (view.findViewById(R.id.tab_thumbnail))).getDrawable()); + TabGridThumbnailView originalThumbnailView = + (TabGridThumbnailView) view.findViewById(R.id.tab_thumbnail); + TabGridThumbnailView animationThumbnailView = + (TabGridThumbnailView) mAnimationCardView.findViewById(R.id.tab_thumbnail); + if (originalThumbnailView.isPlaceholder()) { + animationThumbnailView.setImageDrawable(null); + } else { + animationThumbnailView.setImageDrawable(originalThumbnailView.getDrawable()); + animationThumbnailView.setImageMatrix(originalThumbnailView.getImageMatrix()); + animationThumbnailView.setScaleType(originalThumbnailView.getScaleType()); + } ImageView actionButton = mAnimationCardView.findViewById(R.id.action_button); actionButton.setImageDrawable( @@ -880,62 +889,51 @@ return mSnackBarContainer; } - @VisibleForTesting Animator getCurrentDialogAnimatorForTesting() { return mCurrentDialogAnimator; } - @VisibleForTesting Animator getCurrentUngroupBarAnimatorForTesting() { return mCurrentUngroupBarAnimator; } - @VisibleForTesting int getUngroupBarStatusForTesting() { return mUngroupBarStatus; } - @VisibleForTesting AnimatorSet getShowDialogAnimationForTesting() { return mShowDialogAnimation; } - @VisibleForTesting int getBackgroundColorForTesting() { return mBackgroundDrawableColor; } - @VisibleForTesting int getUngroupBarBackgroundColorForTesting() { return mUngroupBarBackgroundColor; } - @VisibleForTesting int getUngroupBarHoveredBackgroundColorForTesting() { return mUngroupBarHoveredBackgroundColor; } - @VisibleForTesting int getUngroupBarTextColorForTesting() { return mUngroupBarTextColor; } - @VisibleForTesting int getUngroupBarHoveredTextColorForTesting() { return mUngroupBarHoveredTextColor; } - @VisibleForTesting static void setSourceRectCallbackForTesting(Callback<RectF> callback) { sSourceRectCallbackForTesting = callback; + ResettersForTesting.register(() -> sSourceRectCallbackForTesting = null); } - @VisibleForTesting ScrimCoordinator getScrimCoordinatorForTesting() { return mScrimCoordinator; } - @VisibleForTesting VisibilityListener getVisibilityListenerForTesting() { return mVisibilityListener; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java index 22ad04d..5abd9d6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java
@@ -19,6 +19,7 @@ import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; +import org.chromium.base.ResettersForTesting; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.profiles.Profile; @@ -453,32 +454,36 @@ return out; } - @VisibleForTesting void setActionsOnAllRelatedTabsForTesting(boolean flag) { + var oldValue = mActionsOnAllRelatedTabs; mActionsOnAllRelatedTabs = flag; + ResettersForTesting.register(() -> mActionsOnAllRelatedTabs = oldValue); } - @VisibleForTesting void setHoveredTabIndexForTesting(int index) { + var oldValue = mHoveredTabIndex; mHoveredTabIndex = index; + ResettersForTesting.register(() -> mHoveredTabIndex = oldValue); } - @VisibleForTesting void setSelectedTabIndexForTesting(int index) { + var oldValue = mSelectedTabIndex; mSelectedTabIndex = index; + ResettersForTesting.register(() -> mSelectedTabIndex = oldValue); } - @VisibleForTesting void setUnGroupTabIndexForTesting(int index) { + var oldValue = mUnGroupTabIndex; mUnGroupTabIndex = index; + ResettersForTesting.register(() -> mUnGroupTabIndex = oldValue); } - @VisibleForTesting void setCurrentActionStateForTesting(int actionState) { + var oldValue = mCurrentActionState; mCurrentActionState = actionState; + ResettersForTesting.register(() -> mCurrentActionState = oldValue); } - @VisibleForTesting boolean hasDragFlagForTesting(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int flags = getMovementFlags(recyclerView, viewHolder); return (flags >> 16) != 0;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java index 559232f..76a5ebe 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -26,6 +26,7 @@ import org.chromium.base.BuildInfo; import org.chromium.base.Callback; +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.browser.tab.TabUtils; import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData; import org.chromium.chrome.tab_ui.R; @@ -470,8 +471,8 @@ } } - @VisibleForTesting static void setThumbnailFeatureForTesting(TabListMediator.ThumbnailFetcher fetcher) { sThumbnailFetcherForTesting = fetcher; + ResettersForTesting.register(() -> sThumbnailFetcherForTesting = null); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 7c77f6b..c8825701 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -37,6 +37,7 @@ import org.chromium.base.Callback; import org.chromium.base.Log; +import org.chromium.base.ResettersForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; @@ -1111,9 +1112,10 @@ sTabClosedFromMapTabClosedFromMap.put(tabId, TabClosedFrom.GRID_TAB_SWITCHER_GROUP); } - @VisibleForTesting void setActionOnAllRelatedTabsForTesting(boolean actionOnAllRelatedTabs) { + var oldValue = mActionsOnAllRelatedTabs; mActionsOnAllRelatedTabs = actionOnAllRelatedTabs; + ResettersForTesting.register(() -> mActionsOnAllRelatedTabs = oldValue); } private List<Tab> getRelatedTabsForId(int id) { @@ -1374,7 +1376,6 @@ return getRelatedTabsForId(tabId).size() == 1; } - @VisibleForTesting public Set<Integer> getViewedTabIdsForTesting() { return sViewedTabIds; } @@ -2003,7 +2004,6 @@ } } - @VisibleForTesting View.AccessibilityDelegate getAccessibilityDelegateForTesting() { return mAccessibilityDelegate; } @@ -2050,13 +2050,13 @@ return TabModel.INVALID_TAB_INDEX; } - @VisibleForTesting Tab getTabToAddDelayedForTesting() { return mTabToAddDelayed; } - @VisibleForTesting void setComponentNameForTesting(String name) { + var oldValue = mComponentName; mComponentName = name; + ResettersForTesting.register(() -> mComponentName = oldValue); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorBookmarkAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorBookmarkAction.java index 2160e02..cb52dff8 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorBookmarkAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorBookmarkAction.java
@@ -7,9 +7,9 @@ import android.app.Activity; import android.graphics.drawable.Drawable; -import androidx.annotation.VisibleForTesting; import androidx.appcompat.content.res.AppCompatResources; +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.browser.bookmarks.BookmarkModel; import org.chromium.chrome.browser.bookmarks.BookmarkUtils; import org.chromium.chrome.browser.profiles.Profile; @@ -108,8 +108,9 @@ return false; } - @VisibleForTesting void setDelegateForTesting(TabSelectionEditorBookmarkActionDelegate delegate) { + var oldValue = mDelegate; mDelegate = delegate; + ResettersForTesting.register(() -> mDelegate = oldValue); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareAction.java index 87e7178..2ebfced7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareAction.java
@@ -13,10 +13,10 @@ import android.graphics.drawable.InsetDrawable; import androidx.annotation.IntDef; -import androidx.annotation.VisibleForTesting; import androidx.appcompat.content.res.AppCompatResources; import org.chromium.base.Callback; +import org.chromium.base.ResettersForTesting; import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; import org.chromium.chrome.browser.tab.Tab; @@ -221,13 +221,13 @@ || UNSUPPORTED_SCHEMES.contains(url.getScheme()); } - @VisibleForTesting void setSkipUrlCheckForTesting(boolean skip) { mSkipUrlCheckForTesting = skip; + ResettersForTesting.register(() -> mSkipUrlCheckForTesting = false); } - @VisibleForTesting static void setIntentCallbackForTesting(Callback<Intent> callback) { sIntentCallbackForTesting = callback; + ResettersForTesting.register(() -> sIntentCallbackForTesting = null); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java index be2a5327..5c9a6fa4 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -14,11 +14,11 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import androidx.recyclerview.widget.RecyclerView.ViewHolder; import org.chromium.base.Callback; import org.chromium.base.Promise; +import org.chromium.base.ResettersForTesting; import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordHistogram; @@ -360,7 +360,6 @@ coordinator.getContext().getColor(R.color.omnibox_focused_fading_background_color)); } - @VisibleForTesting public static boolean hasAppendedMessagesForTesting() { return sAppendedMessagesForTesting; } @@ -577,31 +576,28 @@ } @Override - @VisibleForTesting public void setBitmapCallbackForTesting(Callback<Bitmap> callback) { TabListMediator.ThumbnailFetcher.sBitmapCallbackForTesting = callback; + ResettersForTesting.register( + () -> TabListMediator.ThumbnailFetcher.sBitmapCallbackForTesting = null); } @Override - @VisibleForTesting public int getBitmapFetchCountForTesting() { return TabListMediator.ThumbnailFetcher.sFetchCountForTesting; } @Override - @VisibleForTesting public void resetBitmapFetchCountForTesting() { TabListMediator.ThumbnailFetcher.sFetchCountForTesting = 0; } @Override - @VisibleForTesting public int getSoftCleanupDelayForTesting() { return mMediator.getSoftCleanupDelayForTesting(); } @Override - @VisibleForTesting public int getCleanupDelayForTesting() { return mMediator.getCleanupDelayForTesting(); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java index 1ebdc79..d9ab861 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java
@@ -19,9 +19,9 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import org.chromium.base.Log; +import org.chromium.base.ResettersForTesting; import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; @@ -631,12 +631,11 @@ doneHiding(); } - @VisibleForTesting public void setPerfListenerForTesting(PerfListener perfListener) { mPerfListenerForTesting = perfListener; + ResettersForTesting.register(() -> mPerfListenerForTesting = null); } - @VisibleForTesting public TabSwitcher getTabSwitcherForTesting() { return mTabSwitcher; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index 033f529..0fde273 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -30,6 +30,7 @@ import org.chromium.base.CallbackController; import org.chromium.base.Log; import org.chromium.base.ObserverList; +import org.chromium.base.ResettersForTesting; import org.chromium.base.StrictModeContext; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.metrics.RecordHistogram; @@ -562,7 +563,6 @@ } } - @VisibleForTesting int getSoftCleanupDelayForTesting() { return getSoftCleanupDelay(); } @@ -578,7 +578,6 @@ DEFAULT_SOFT_CLEANUP_DELAY_MS); } - @VisibleForTesting int getCleanupDelayForTesting() { return getCleanupDelay(); } @@ -1043,6 +1042,7 @@ */ void setSoftCleanupDelayForTesting(int timeoutMs) { mSoftCleanupDelayMsForTesting = timeoutMs; + ResettersForTesting.register(() -> mSoftCleanupDelayMsForTesting = null); } /** @@ -1050,6 +1050,7 @@ */ void setCleanupDelayForTesting(int timeoutMs) { mCleanupDelayMsForTesting = timeoutMs; + ResettersForTesting.register(() -> mCleanupDelayMsForTesting = null); } /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index 9d6d7494..548b5611 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -10,6 +10,7 @@ import android.content.Context; import org.chromium.base.Log; +import org.chromium.base.ResettersForTesting; import org.chromium.base.SysUtils; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.flags.BooleanCachedFieldTrialParameter; @@ -88,7 +89,9 @@ * Set whether the longpress entry for TabSelectionEditor is enabled. Currently only in tests. */ public static void setTabSelectionEditorLongPressEntryEnabledForTesting(boolean enabled) { + var oldValue = sTabSelectionEditorLongPressEntryEnabled; sTabSelectionEditorLongPressEntryEnabled = enabled; + ResettersForTesting.register(() -> sTabSelectionEditorLongPressEntryEnabled = oldValue); } /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestrator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestrator.java index 78402d61..a44c740 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestrator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestrator.java
@@ -14,6 +14,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.ObserverList; +import org.chromium.base.ResettersForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -169,14 +170,10 @@ } } - @VisibleForTesting protected void setMinTimeBetweenPreFetchesForTesting(int minTimeBetweenPrefetchesMs) { + var oldValue = mMinTimeBetweenPrefetchesMs; mMinTimeBetweenPrefetchesMs = minTimeBetweenPrefetchesMs; - } - - @VisibleForTesting - protected void restoreMinTimeBetweenPrefetchesForTesting() { - mMinTimeBetweenPrefetchesMs = MIN_TIME_BETWEEN_PREFETCHES_DEFAULT_MS; + ResettersForTesting.register(() -> mMinTimeBetweenPrefetchesMs = oldValue); } private boolean isBackoffEnabled() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java index 8d4f105b..dafc925f 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java
@@ -20,7 +20,6 @@ import androidx.test.filters.MediumTest; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -69,20 +68,13 @@ public void setUp() { IncognitoReauthManager.setIsIncognitoReauthFeatureAvailableForTesting(true); IncognitoReauthPromoMessageService.setIsPromoEnabledForTesting(true); - IncognitoReauthPromoMessageService.sTriggerReviewActionWithoutReauthForTesting = true; + IncognitoReauthPromoMessageService.setTriggerReviewActionWithoutReauthForTesting(true); mActivityTestRule.startMainActivityOnBlankPage(); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); } - @After - public void tearDown() { - IncognitoReauthManager.setIsIncognitoReauthFeatureAvailableForTesting(null); - IncognitoReauthPromoMessageService.setIsPromoEnabledForTesting(null); - IncognitoReauthPromoMessageService.sTriggerReviewActionWithoutReauthForTesting = null; - } - @Test @MediumTest @Feature({"RenderTest"}) @@ -129,4 +121,4 @@ onView(withText(R.string.incognito_reauth_snackbar_text)).check(matches(isDisplayed())); mRenderTestRule.render(cta.findViewById(R.id.snackbar), "incognito_reauth_promo_snackbar"); } -} \ No newline at end of file +}
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceAlertsMessageCardTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceAlertsMessageCardTest.java index defa608..543ba31 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceAlertsMessageCardTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceAlertsMessageCardTest.java
@@ -123,10 +123,6 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mPriceDropNotificationManager.deleteChannelForTesting(); } - PriceTrackingFeatures.setPriceTrackingEnabledForTesting(null); - PriceTrackingFeatures.setIsSignedInAndSyncEnabledForTesting(null); - PriceDropNotificationManagerImpl.setNotificationManagerForTesting(null); - ShoppingFeatures.setShoppingListEligibleForTesting(null); ActivityTestUtils.clearActivityOrientation(mActivityTestRule.getActivity()); Intents.release(); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java index 12a01ed..ebf1de8 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -219,7 +219,6 @@ @After public void tearDown() throws Exception { - TabSelectionEditorShareAction.setIntentCallbackForTesting(null); ActivityTestUtils.clearActivityOrientation(sActivityTestRule.getActivity()); Intents.release(); final ChromeTabbedActivity cta = sActivityTestRule.getActivity(); @@ -569,8 +568,6 @@ // Verify no selection action occurred to switch the selected tab in the tab model Criteria.checkThat( sActivityTestRule.getActivity().getCurrentTabModel().index(), Matchers.is(1)); - - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } @Test @@ -607,7 +604,6 @@ .getBottomControlOffset() == 0); waitForView(allOf(withId(R.id.toolbar_left_button), isCompletelyDisplayed())); - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } @Test @@ -1442,7 +1438,6 @@ // With a custom homepage exit the app. CriteriaHelper.pollUiThread(() -> cta.isDestroyed()); - HomepagePolicyManager.setInstanceForTests(null); } @Test
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java index df66f97..656f6bc 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java
@@ -23,7 +23,6 @@ import androidx.test.filters.MediumTest; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -65,7 +64,7 @@ public void setUp() { IncognitoReauthManager.setIsIncognitoReauthFeatureAvailableForTesting(true); IncognitoReauthPromoMessageService.setIsPromoEnabledForTesting(true); - IncognitoReauthPromoMessageService.sTriggerReviewActionWithoutReauthForTesting = true; + IncognitoReauthPromoMessageService.setTriggerReviewActionWithoutReauthForTesting(true); mActivityTestRule.startMainActivityOnBlankPage(); TabUiTestHelper.verifyTabSwitcherLayoutType(mActivityTestRule.getActivity()); @@ -73,13 +72,6 @@ mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); } - @After - public void tearDown() { - IncognitoReauthManager.setIsIncognitoReauthFeatureAvailableForTesting(null); - IncognitoReauthPromoMessageService.setIsPromoEnabledForTesting(null); - IncognitoReauthPromoMessageService.sTriggerReviewActionWithoutReauthForTesting = null; - } - @Test @MediumTest public void testIncognitoReauthPromoShown() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java index e450f7d..b03873b 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
@@ -1043,7 +1043,6 @@ @Override public void tearDownTest() throws Exception { TestThreadUtils.runOnUiThreadBlocking(() -> { - PriceTrackingFeatures.setPriceTrackingEnabledForTesting(null); mStripMCP.destroy(); mGridMCP.destroy(); mSelectableMCP.destroy();
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java index 5792bb5..624a7f70 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
@@ -178,7 +178,6 @@ @After public void tearDown() { - TabSelectionEditorShareAction.setIntentCallbackForTesting(null); if (mTabSelectionEditorCoordinator != null) { if (sActivityTestRule.getActivity().findViewById(R.id.app_menu_list) != null) { Espresso.pressBack();
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageCardTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageCardTest.java index 71a37e6..4c3e97ab 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageCardTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageCardTest.java
@@ -181,6 +181,7 @@ @Test @MediumTest + @DisabledTest(message = "https://crbug.com/1458843") @CommandLineFlags.Add({BASE_PARAMS + ENABLE_CLOSE_SUGGESTION_PARAM}) public void closeTabSuggestionReviewedAndDismissed() { CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java index 2429cfe..2c4b758 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java
@@ -1960,8 +1960,6 @@ // Verify no selection action occurred to switch the selected tab in the tab model Criteria.checkThat( mActivityTestRule.getActivity().getCurrentTabModel().index(), Matchers.is(1)); - - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } @Test @@ -1985,8 +1983,6 @@ TabSelectionEditorTestingRobot mSelectionEditorRobot = new TabSelectionEditorTestingRobot(); mSelectionEditorRobot.resultRobot.verifyTabSelectionEditorIsVisible(); - - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } @Test @@ -2017,8 +2013,6 @@ // verify clicking the tab worked. Criteria.checkThat( mActivityTestRule.getActivity().getCurrentTabModel().index(), Matchers.is(0)); - - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } @Test
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java index f79548d..d8be2ac3 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java
@@ -22,7 +22,6 @@ import androidx.test.espresso.ViewAssertion; import androidx.test.filters.MediumTest; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -75,11 +74,6 @@ TabGridViewBinder.setThumbnailFeatureForTesting(mNullThumbnailProvider); } - @After - public void tearDown() { - TabGridViewBinder.setThumbnailFeatureForTesting(null); - } - @Test @MediumTest @EnableFeatures({ChromeFeatureList.THUMBNAIL_CACHE_REFACTOR})
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java index fc9ac97e..64965f8 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
@@ -88,13 +88,7 @@ @After public void tearDown() { - TabAttributeCache.clearAllForTesting(); PseudoTab.clearForTesting(); - - // This is necessary to get the cache behavior correct. - Runtime runtime = Runtime.getRuntime(); - runtime.runFinalization(); - runtime.gc(); } @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java index 07463272..93ed45a6 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java
@@ -132,8 +132,6 @@ @After public void tearDown() { mCache.destroy(); - TabAttributeCache.setLastSearchTermMockForTesting(null); - TabAttributeCache.clearAllForTesting(); } @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageServiceUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageServiceUnitTest.java index 8e0230d..40be73b4 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageServiceUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageServiceUnitTest.java
@@ -107,8 +107,6 @@ when(mUserPrefsJniMock.get(mProfileMock)).thenReturn(mPrefServiceMock); IncognitoReauthManager.setIsIncognitoReauthFeatureAvailableForTesting(false); - IncognitoReauthSettingUtils.setIsDeviceScreenLockEnabledForTesting(false); - IncognitoReauthPromoMessageService.setIsPromoEnabledForTesting(null); mSharedPreferenceManager = SharedPreferencesManager.getInstance(); } @@ -126,7 +124,6 @@ @After public void tearDown() { - Profile.setLastUsedProfileForTesting(null); verifyNoMoreInteractions(mProfileMock, mContextMock, mSnackbarManagerMock); }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageServiceUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageServiceUnitTest.java index 92ce508..82d5da4 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageServiceUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageServiceUnitTest.java
@@ -10,7 +10,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -55,12 +54,6 @@ mIphMessageService = new IphMessageService(mIphController); } - @After - public void tearDown() { - Profile.setLastUsedProfileForTesting(null); - TrackerFactory.setTrackerForTests(null); - } - @Test public void testReview() { mIphMessageService.review();
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/PriceMessageServiceUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/PriceMessageServiceUnitTest.java index 24eb450b..2ebef1d6 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/PriceMessageServiceUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/PriceMessageServiceUnitTest.java
@@ -16,7 +16,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -104,11 +103,6 @@ mMessageService.addObserver(mMessageObserver); } - @After - public void tearDown() { - PriceTrackingFeatures.setPriceTrackingEnabledForTesting(null); - } - @Test(expected = AssertionError.class) public void testPrepareMessage_PriceWelcome_MessageDisabled() { PriceTrackingUtilities.SHARED_PREFERENCES_MANAGER.writeBoolean(
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java index afa14f2..135dc651 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
@@ -843,8 +843,6 @@ verify(mOnLongPressTabItemEventListener).onLongPressEvent(TAB1_ID); assertTrue(mItemTouchHelperCallback.shouldBlockAction()); - - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } @Test @@ -864,8 +862,6 @@ verify(mOnLongPressTabItemEventListener, never()).onLongPressEvent(TAB1_ID); assertFalse(mItemTouchHelperCallback.shouldBlockAction()); - - TabUiFeatureUtilities.setTabSelectionEditorLongPressEntryEnabledForTesting(false); } private void verifyDrag(
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index 0b9ce4e..c4f43a5c 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -124,7 +124,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tasks.pseudotab.PseudoTab; -import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_management.PriceMessageService.PriceTabData; import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListMode; @@ -474,9 +473,6 @@ public void tearDown() { CachedFeatureFlags.resetFlagsForTesting(); PseudoTab.clearForTesting(); - TabAttributeCache.clearAllForTesting(); - getGroupTitleSharedPreferences().edit().clear(); - PriceTrackingFeatures.setPriceTrackingEnabledForTesting(null); } private static SharedPreferences getGroupTitleSharedPreferences() {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareActionUnitTest.java index 32e52c4..ad14701 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareActionUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorShareActionUnitTest.java
@@ -15,7 +15,6 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.test.filters.SmallTest; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -104,11 +103,6 @@ mAction.configure(mTabModelSelector, mSelectionDelegate, mDelegate, false); } - @After - public void tearDown() { - TabSelectionEditorShareAction.setIntentCallbackForTesting(null); - } - @Test @SmallTest public void testInherentActionProperties() {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java index 028fa49..cafb8df 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
@@ -277,6 +277,5 @@ tabSuggestionsOrchestrator.mTabContextObserver.mTabModelObserver.didAddTab( null, 0, TabCreationState.LIVE_IN_FOREGROUND, false); Assert.assertEquals(expectedSuggestions, suggestions.size()); - tabSuggestionsOrchestrator.restoreMinTimeBetweenPrefetchesForTesting(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index bc8a33e..6e7ceb85 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2298,12 +2298,10 @@ QuickDeleteMetricsDelegate.QuickDeleteAction.MENU_ITEM_CLICKED); ViewStub animationStub = findViewById(R.id.quick_delete_animation_stub); - QuickDeleteController quickDeleteController = new QuickDeleteController(this, - new QuickDeleteDelegateImpl(), getModalDialogManager(), getSnackbarManager(), - getLayoutManager(), mTabModelSelector, + new QuickDeleteController(this, new QuickDeleteDelegateImpl(), getModalDialogManager(), + getSnackbarManager(), getLayoutManager(), mTabModelSelector, animationStub != null ? animationStub.inflate() : findViewById(R.id.quick_delete_animation_layout)); - quickDeleteController.triggerQuickDeleteFlow(); } else { return super.onMenuOrKeyboardAction(id, fromMenu); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index 258299c..1c75c3d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -1309,8 +1309,6 @@ recordDisplayDimensions(); int playServicesVersion = PlayServicesVersionInfo.getApkVersionNumber(); - RecordHistogram.recordBooleanHistogram( - "Android.PlayServices.Installed", playServicesVersion > 0); RecordHistogram.recordSparseHistogram( "Android.PlayServices.Version", playServicesVersion);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt.java index 986493b5..c3f4dfd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt.java
@@ -20,6 +20,7 @@ import com.google.android.material.textfield.TextInputLayout; +import org.chromium.base.ResettersForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.chrome.R; @@ -270,7 +271,9 @@ } void setAddressEditorForTesting(AddressEditorCoordinator addressEditor) { + var oldValue = mAddressEditor; mAddressEditor = addressEditor; + ResettersForTesting.register(() -> mAddressEditor = oldValue); } View getDialogViewForTesting() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadDialog.java index 922ea3d3..9a1830f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadDialog.java
@@ -8,11 +8,9 @@ import android.text.style.ClickableSpan; import android.view.View; -import androidx.annotation.IntDef; import androidx.annotation.NonNull; import org.chromium.base.Callback; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.download.dialogs.DownloadDialogUtils; import org.chromium.chrome.browser.download.interstitial.NewDownloadTab; @@ -28,26 +26,6 @@ * default model dialog from ModalDialogManager. */ public class DuplicateDownloadDialog { - /** - * Events related to the duplicate download dialog, used for UMA reporting. - * These values are persisted to logs. Entries should not be renumbered and - * numeric values should never be reused. - */ - @IntDef({DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_SHOW, - DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_CONFIRM, - DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_CANCEL, - DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_LINK_CLICKED, - DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_DISMISS}) - private @interface DuplicateDownloadDialogEvent { - int DUPLICATE_DOWNLOAD_DIALOG_SHOW = 0; - int DUPLICATE_DOWNLOAD_DIALOG_CONFIRM = 1; - int DUPLICATE_DOWNLOAD_DIALOG_CANCEL = 2; - int DUPLICATE_DOWNLOAD_DIALOG_LINK_CLICKED = 3; - int DUPLICATE_DOWNLOAD_DIALOG_DISMISS = 4; - - int COUNT = 5; - } - private ModalDialogManager mModalDialogManager; private PropertyModel mPropertyModel; @@ -94,8 +72,6 @@ } modalDialogManager.showDialog(mPropertyModel, ModalDialogManager.ModalDialogType.TAB); - recordDuplicateDownloadDialogEvent( - !pageUrl.isEmpty(), DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_SHOW); } @NonNull @@ -111,9 +87,6 @@ modalDialogManager.dismissDialog(model, isConfirm ? DialogDismissalCause.POSITIVE_BUTTON_CLICKED : DialogDismissalCause.NEGATIVE_BUTTON_CLICKED); - recordDuplicateDownloadDialogEvent(!pageUrl.isEmpty(), - isConfirm ? DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_CONFIRM - : DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_CANCEL); } @Override @@ -124,8 +97,6 @@ if (callback != null && dismissalCause != DialogDismissalCause.NEGATIVE_BUTTON_CLICKED) { callback.onResult(false); - recordDuplicateDownloadDialogEvent(!pageUrl.isEmpty(), - DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_DISMISS); } if (context instanceof AsyncInitializationActivity) { NewDownloadTab.closeExistingNewDownloadTab( @@ -141,8 +112,6 @@ */ private void closeDialog(boolean isOfflinePage) { mModalDialogManager.dismissDialog(mPropertyModel, DialogDismissalCause.ACTION_ON_CONTENT); - recordDuplicateDownloadDialogEvent( - isOfflinePage, DuplicateDownloadDialogEvent.DUPLICATE_DOWNLOAD_DIALOG_LINK_CLICKED); } /** @@ -175,17 +144,4 @@ } }); } - - /** - * Collects duplicate download dialog UI event metrics. - * @param isOfflinePage Whether this is an offline page download. - * @param event The UI event to collect. - */ - private static void recordDuplicateDownloadDialogEvent( - boolean isOfflinePage, @DuplicateDownloadDialogEvent int event) { - RecordHistogram.recordEnumeratedHistogram(isOfflinePage - ? "Download.DuplicateDialogEvent.OfflinePage" - : "Download.DuplicateDialogEvent.Download", - event, DuplicateDownloadDialogEvent.COUNT); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfo.java index 4c924aa4..e1ada7f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfo.java
@@ -16,7 +16,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.TaskTraits; import org.chromium.components.policy.AbstractAppRestrictionsProvider; @@ -183,10 +182,6 @@ if (startTime > 0) { mCompletionElapsedRealtimeMs = SystemClock.elapsedRealtime(); long runTime = mCompletionElapsedRealtimeMs - startTime; - RecordHistogram.recordTimesHistogram( - "Enterprise.FirstRun.AppRestrictionLoadTime", runTime); - RecordHistogram.recordMediumTimesHistogram( - "Enterprise.FirstRun.AppRestrictionLoadTime.Medium", runTime); Log.d(TAG, String.format(Locale.US, "Policy received. Runtime: [%d], result: [%s]", runTime, isAppRestricted));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepagePolicyManager.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepagePolicyManager.java index fe08000733..b4fb9509 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepagePolicyManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepagePolicyManager.java
@@ -9,6 +9,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.ObserverList; +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.Pref; @@ -101,9 +102,10 @@ sInstance = null; } - @VisibleForTesting public static void setInstanceForTests(HomepagePolicyManager instance) { + var oldValue = sInstance; sInstance = instance; + ResettersForTesting.register(() -> sInstance = oldValue); } @VisibleForTesting @@ -221,9 +223,9 @@ return UserPrefs.get(Profile.getLastUsedRegularProfile()); } - @VisibleForTesting public static void setPrefServiceForTesting(PrefService prefService) { sPrefServiceForTesting = prefService; + ResettersForTesting.register(() -> sPrefServiceForTesting = null); } @VisibleForTesting @@ -242,7 +244,6 @@ return mIsInitializedWithNative; } - @VisibleForTesting ObserverList<HomepagePolicyStateListener> getListenersForTesting() { return mListeners; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java index 5ee1dd34..9de66697b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.payments; +import static org.chromium.chrome.browser.autofill.editors.EditorProperties.ALLOW_DELETE; import static org.chromium.chrome.browser.autofill.editors.EditorProperties.ALL_KEYS; import static org.chromium.chrome.browser.autofill.editors.EditorProperties.CANCEL_RUNNABLE; import static org.chromium.chrome.browser.autofill.editors.EditorProperties.DONE_RUNNABLE; @@ -221,6 +222,7 @@ mContext.getString(R.string.autofill_profile_editor_country)) .with(DROPDOWN_KEY_VALUE_LIST, AutofillProfileBridge.getSupportedCountries()) + .with(IS_REQUIRED, false) .build(); } @@ -322,6 +324,7 @@ .with(DONE_RUNNABLE, this::onDone) .with(CANCEL_RUNNABLE, this::onCancel) .with(FORM_VALID, true) + .with(ALLOW_DELETE, false) .build(); mEditorMCP = PropertyModelChangeProcessor.create( mEditorModel, mEditorDialog, EditorDialogViewBinder::bindEditorDialogView); @@ -588,6 +591,8 @@ field.set(REQUIRED_ERROR_MESSAGE, mContext.getString( R.string.pref_edit_dialog_field_required_validation_message)); + } else { + field.set(IS_REQUIRED, false); } field.set(CUSTOM_ERROR_MESSAGE, getAddressError(component.id));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java index 9ddefd2..b859fc1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.payments; +import static org.chromium.chrome.browser.autofill.editors.EditorProperties.ALLOW_DELETE; import static org.chromium.chrome.browser.autofill.editors.EditorProperties.ALL_KEYS; import static org.chromium.chrome.browser.autofill.editors.EditorProperties.CANCEL_RUNNABLE; import static org.chromium.chrome.browser.autofill.editors.EditorProperties.DONE_RUNNABLE; @@ -302,6 +303,7 @@ .with(DONE_RUNNABLE, this::onDone) .with(CANCEL_RUNNABLE, this::onCancel) .with(FORM_VALID, true) + .with(ALLOW_DELETE, false) .build(); mEditorMCP = PropertyModelChangeProcessor.create(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java index de7bfe8f..2a3a870 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
@@ -200,7 +200,7 @@ mActivityTestRule.startMainActivityOnBlankPage(); runOnUiThreadBlocking(() -> { mBookmarkModel = mActivityTestRule.getActivity().getBookmarkModelForTesting(); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); }); // Use a custom port so the links are consistent for render tests. mActivityTestRule.getEmbeddedTestServerRule().setServerPort(TEST_PORT);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java index d5e909d..b2f022e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java
@@ -102,7 +102,7 @@ MockitoAnnotations.initMocks(this); runOnUiThreadBlocking(() -> { PersonalDataManager.setInstanceForTesting(mPersonalDataManager); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); when(mIdentityServicesProvider.getIdentityManager(any())).thenReturn(mIdentityManager); }); @@ -120,7 +120,6 @@ @Override public void tearDownTest() throws Exception { runOnUiThreadBlocking(mPrompt::dismiss); - PersonalDataManager.setInstanceForTesting(null); super.tearDownTest(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java index 97f1084a..d86c9d5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java
@@ -731,7 +731,7 @@ private void setUpMockSyncService(boolean enabled, Set<Integer> selectedTypes) { TestThreadUtils.runOnUiThreadBlocking( - () -> SyncServiceFactory.overrideForTests(mSyncService)); + () -> SyncServiceFactory.setInstanceForTesting(mSyncService)); when(mSyncService.isSyncFeatureEnabled()).thenReturn(enabled); when(mSyncService.getSelectedTypes()).thenReturn(selectedTypes); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java index c9ecb60..94852fc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
@@ -86,15 +86,13 @@ @Before public void setUp() throws InterruptedException { initMocks(this); - TestThreadUtils.runOnUiThreadBlocking( - () -> SyncServiceFactory.overrideForTests(mMockSyncService)); + SyncServiceFactory.setInstanceForTesting(mMockSyncService); setSyncable(false); mActivityTestRule.startMainActivityOnBlankPage(); } @After public void tearDown() { - TestThreadUtils.runOnUiThreadBlocking(() -> SyncServiceFactory.resetForTests()); TemplateUrlServiceFactory.setInstanceForTesting(null); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoProfileDestroyerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoProfileDestroyerIntegrationTest.java index 64a15345..baaa9721 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoProfileDestroyerIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoProfileDestroyerIntegrationTest.java
@@ -13,7 +13,6 @@ import androidx.test.filters.MediumTest; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -64,11 +63,6 @@ }); } - @After - public void tearDown() { - AutocompleteControllerProvider.setControllerForTesting(null); - } - @Test @MediumTest @Feature({"OffTheRecord"})
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java index a42751a5..35a0710 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java
@@ -84,7 +84,7 @@ // By default sync is off. Tests can override this later. setSyncServiceState(false, false); TestThreadUtils.runOnUiThreadBlocking( - () -> SyncServiceFactory.overrideForTests(mMockSyncService)); + () -> SyncServiceFactory.setInstanceForTesting(mMockSyncService)); // This initializes the browser, so some tests can do setup before PasswordSettings is // launched. ChromeTabbedActivityTestRule.startMainActivityOnBlankPage() is more commonly
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTestHelper.java index 3154f0f..42988dc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTestHelper.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTestHelper.java
@@ -19,7 +19,6 @@ import org.chromium.chrome.browser.password_manager.PasswordManagerHelper; import org.chromium.chrome.browser.settings.SettingsActivity; import org.chromium.chrome.browser.settings.SettingsActivityTestRule; -import org.chromium.chrome.browser.sync.SyncServiceFactory; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList; @@ -66,7 +65,6 @@ } TestThreadUtils.runOnUiThreadBlocking(() -> { PasswordManagerHandlerProvider.getInstance().resetPasswordManagerHandlerForTest(); - SyncServiceFactory.resetForTests(); }); setPasswordSource(null); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java index 145bd1c..ad11b13 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java
@@ -61,7 +61,7 @@ mPasswordsPref = (ChromeBasePreference) mainSettings.findPreference(MainSettings.PREF_PASSWORDS); TestThreadUtils.runOnUiThreadBlocking( - () -> SyncServiceFactory.overrideForTests(mSyncService)); + () -> SyncServiceFactory.setInstanceForTesting(mSyncService)); } /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java index 459728be..0014c531 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -561,6 +561,7 @@ } @Test + @DisabledTest(message = "crbug.com/1166647") @SmallTest public void testNewIntentDiscardsQuery() { final SearchActivity searchActivity = startSearchActivity();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java index 448c39c0..341c533 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java
@@ -27,15 +27,18 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule; +import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; import org.chromium.components.content_settings.ContentSettingValues; import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.components.content_settings.CookieControlsBreakageConfidenceLevel; import org.chromium.components.content_settings.CookieControlsBridge; import org.chromium.components.content_settings.CookieControlsEnforcement; import org.chromium.components.content_settings.CookieControlsMode; import org.chromium.components.content_settings.CookieControlsObserver; import org.chromium.components.content_settings.CookieControlsStatus; import org.chromium.components.content_settings.PrefNames; +import org.chromium.components.page_info.PageInfoFeatures; import org.chromium.components.user_prefs.UserPrefs; import org.chromium.content_public.browser.test.util.JavaScriptUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -73,6 +76,29 @@ mBlockedCookies = blockedCookies; mHelper.notifyCalled(); } + + @Override + public void onStatusChanged(@CookieControlsStatus int status, + @CookieControlsEnforcement int enforcement, long expiration) { + mStatus = status; + mEnforcement = enforcement; + mExpiration = expiration; + mHelper.notifyCalled(); + } + + @Override + public void onSitesCountChanged(int allowedSites, int blockedSites) { + mAllowedSites = allowedSites; + mBlockedSites = blockedSites; + mHelper.notifyCalled(); + } + + @Override + public void onBreakageConfidenceLevelChanged( + @CookieControlsBreakageConfidenceLevel int level) { + mLevel = level; + mHelper.notifyCalled(); + } } @ClassRule @@ -89,8 +115,12 @@ private CookieControlsBridge mCookieControlsBridge; private int mStatus; private int mEnforcement; + private long mExpiration; private int mAllowedCookies; private int mBlockedCookies; + private int mAllowedSites; + private int mBlockedSites; + private int mLevel; @Before public void setUp() throws Exception { @@ -100,6 +130,10 @@ mStatus = CookieControlsStatus.UNINITIALIZED; mAllowedCookies = -1; mBlockedCookies = -1; + mAllowedSites = -1; + mBlockedSites = -1; + mLevel = CookieControlsBreakageConfidenceLevel.UNINITIALIZED; + mExpiration = -1; } @After @@ -295,4 +329,171 @@ assertEquals(0, mAllowedCookies); assertEquals(0, mBlockedCookies); } + + // Tests with the UserBypassUI flag enabled. + + @Test + @SmallTest + @Features.EnableFeatures(PageInfoFeatures.USER_BYPASS_UI_NAME) + public void testCookieBridgeWithTPCookiesDisabledUserBypass() throws Exception { + TestThreadUtils.runOnUiThreadBlocking(() -> { + // Set CookieControlsMode Pref to Off + UserPrefs.get(Profile.getLastUsedRegularProfile()) + .setInteger(PrefNames.COOKIE_CONTROLS_MODE, CookieControlsMode.OFF); + }); + int currentCallCount = mCallbackHelper.getCallCount(); + + // Navigate to a page + final String url = mTestServer.getURL("/chrome/test/data/android/cookie.html"); + Tab tab = sActivityTestRule.loadUrlInNewTab(url, false); + + // Create cookie bridge and wait for desired callbacks. + TestThreadUtils.runOnUiThreadBlocking(() -> { + mCookieControlsBridge = + new CookieControlsBridge(mCallbackHandler, tab.getWebContents(), null); + }); + + mCallbackHelper.waitForCallback(currentCallCount, 2); + assertEquals(CookieControlsStatus.DISABLED, mStatus); + assertEquals(CookieControlsEnforcement.NO_ENFORCEMENT, mEnforcement); + assertEquals(0, mAllowedSites); + assertEquals(0, mBlockedSites); + } + + @Test + @SmallTest + @Features.EnableFeatures(PageInfoFeatures.USER_BYPASS_UI_NAME) + public void testCookieBridgeWith3PCookiesEnabledUserBypass() throws Exception { + TestThreadUtils.runOnUiThreadBlocking(() -> { + UserPrefs.get(Profile.getLastUsedRegularProfile()) + .setInteger( + PrefNames.COOKIE_CONTROLS_MODE, CookieControlsMode.BLOCK_THIRD_PARTY); + }); + int currentCallCount = mCallbackHelper.getCallCount(); + + // Navigate to a page + final String url = mTestServer.getURL("/chrome/test/data/android/cookie.html"); + Tab tab = sActivityTestRule.loadUrlInNewTab(url, false); + + // Create cookie bridge and wait for desired callbacks. + TestThreadUtils.runOnUiThreadBlocking(() -> { + mCookieControlsBridge = + new CookieControlsBridge(mCallbackHandler, tab.getWebContents(), null); + }); + + mCallbackHelper.waitForCallback(currentCallCount, 2); + assertEquals(CookieControlsStatus.ENABLED, mStatus); + assertEquals(CookieControlsEnforcement.NO_ENFORCEMENT, mEnforcement); + assertEquals(0, mAllowedSites); + assertEquals(0, mBlockedSites); + } + + @Test + @SmallTest + @Features.EnableFeatures(PageInfoFeatures.USER_BYPASS_UI_NAME) + public void testCookieBridgeWithChangingAllowedCookiesCountUserBypass() throws Exception { + int currentCallCount = mCallbackHelper.getCallCount(); + + // Navigate to a page + final String url = mTestServer.getURL("/chrome/test/data/android/cookie.html"); + Tab tab = sActivityTestRule.loadUrlInNewTab(url, false); + + // Create cookie bridge and wait for desired callbacks. + TestThreadUtils.runOnUiThreadBlocking(() -> { + mCookieControlsBridge = + new CookieControlsBridge(mCallbackHandler, tab.getWebContents(), null); + }); + + mCallbackHelper.waitForCallback(currentCallCount, 2); + assertEquals(CookieControlsStatus.DISABLED, mStatus); + assertEquals(CookieControlsEnforcement.NO_ENFORCEMENT, mEnforcement); + assertEquals(0, mAllowedSites); + assertEquals(0, mBlockedSites); + + // Try to set a cookie on the page when cookies are allowed. + currentCallCount = mCallbackHelper.getCallCount(); + JavaScriptUtils.executeJavaScriptAndWaitForResult(tab.getWebContents(), "setCookie()"); + mCallbackHelper.waitForCallback(currentCallCount, 1); + assertEquals(1, mAllowedSites); + assertEquals(0, mBlockedSites); + } + + @Test + @SmallTest + @Features.EnableFeatures(PageInfoFeatures.USER_BYPASS_UI_NAME) + public void testCookieBridgeWithChangingBlockedCookiesCountUserBypass() throws Exception { + TestThreadUtils.runOnUiThreadBlocking(() -> { + UserPrefs.get(Profile.getLastUsedRegularProfile()) + .setInteger( + PrefNames.COOKIE_CONTROLS_MODE, CookieControlsMode.BLOCK_THIRD_PARTY); + // Block all cookies + WebsitePreferenceBridge.setCategoryEnabled( + Profile.getLastUsedRegularProfile(), ContentSettingsType.COOKIES, false); + }); + int currentCallCount = mCallbackHelper.getCallCount(); + + // Navigate to a page + final String url = mTestServer.getURL("/chrome/test/data/android/cookie.html"); + Tab tab = sActivityTestRule.loadUrlInNewTab(url, false); + + // Create cookie bridge and wait for desired callbacks. + TestThreadUtils.runOnUiThreadBlocking(() -> { + mCookieControlsBridge = + new CookieControlsBridge(mCallbackHandler, tab.getWebContents(), null); + }); + + mCallbackHelper.waitForCallback(currentCallCount, 2); + assertEquals(CookieControlsStatus.ENABLED, mStatus); + assertEquals(CookieControlsEnforcement.NO_ENFORCEMENT, mEnforcement); + assertEquals(0, mAllowedSites); + assertEquals(0, mBlockedSites); + + // Try to set a cookie on the page when cookies are blocked. + currentCallCount = mCallbackHelper.getCallCount(); + JavaScriptUtils.executeJavaScriptAndWaitForResult(tab.getWebContents(), "setCookie()"); + mCallbackHelper.waitForCallback(currentCallCount, 1); + assertEquals(0, mAllowedSites); + assertEquals(1, mBlockedSites); + } + + @Test + @SmallTest + @Features.EnableFeatures(PageInfoFeatures.USER_BYPASS_UI_NAME) + public void testCookieBridgeWithIncognitoSettingUserBypass() throws Exception { + TestThreadUtils.runOnUiThreadBlocking(() -> { + // Set CookieControlsMode Pref to IncognitoOnly + UserPrefs.get(Profile.getLastUsedRegularProfile()) + .setInteger(PrefNames.COOKIE_CONTROLS_MODE, CookieControlsMode.INCOGNITO_ONLY); + }); + int currentCallCount = mCallbackHelper.getCallCount(); + + // Navigate to a normal page + final String url = mTestServer.getURL("/chrome/test/data/android/cookie.html"); + Tab tab = sActivityTestRule.loadUrlInNewTab(url, false); + + // Create cookie bridge and wait for desired callbacks. + TestThreadUtils.runOnUiThreadBlocking(() -> { + mCookieControlsBridge = + new CookieControlsBridge(mCallbackHandler, tab.getWebContents(), null); + }); + + mCallbackHelper.waitForCallback(currentCallCount, 2); + assertEquals(CookieControlsStatus.DISABLED, mStatus); + assertEquals(CookieControlsEnforcement.NO_ENFORCEMENT, mEnforcement); + assertEquals(0, mAllowedSites); + assertEquals(0, mBlockedSites); + + // Make new incognito page now + Tab incognitoTab = sActivityTestRule.loadUrlInNewTab(url, true); + TestThreadUtils.runOnUiThreadBlocking(() -> { + mCookieControlsBridge = new CookieControlsBridge(mCallbackHandler, + incognitoTab.getWebContents(), + Profile.fromWebContents(incognitoTab.getWebContents()).getOriginalProfile()); + }); + mCallbackHelper.waitForCallback(currentCallCount, 2); + assertEquals(CookieControlsStatus.ENABLED, mStatus); + assertEquals(CookieControlsEnforcement.NO_ENFORCEMENT, mEnforcement); + assertEquals(0, mAllowedSites); + assertEquals(0, mBlockedSites); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java index 7f3c2da1..282ed79 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
@@ -8,7 +8,6 @@ import androidx.test.filters.LargeTest; -import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; @@ -87,15 +86,8 @@ // SyncService. mActivityTestRule.startMainActivityOnBlankPage(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mFakeSyncServiceImpl = new FakeSyncServiceImpl(); - SyncServiceFactory.overrideForTests(mFakeSyncServiceImpl); - }); - } - - @After - public void tearDown() { - TestThreadUtils.runOnUiThreadBlocking(() -> { SyncServiceFactory.resetForTests(); }); + mFakeSyncServiceImpl = new FakeSyncServiceImpl(); + SyncServiceFactory.setInstanceForTesting(mFakeSyncServiceImpl); } @AfterClass
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java index 6fe7d36..bfd818a8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
@@ -171,7 +171,6 @@ } } - private Context mContext; private FakeServerHelper mFakeServerHelper; private SyncService mSyncService; private final SigninTestRule mSigninTestRule = new SigninTestRule(); @@ -182,10 +181,9 @@ private void ruleTearDown() { TestThreadUtils.runOnUiThreadBlocking(() -> { + mSyncService = null; mFakeServerHelper = null; FakeServerHelper.destroyInstance(); - SyncServiceFactory.resetForTests(); - mSyncService = null; }); } @@ -193,7 +191,7 @@ /**Getters for Test variables */ public Context getTargetContext() { - return mContext; + return ApplicationProvider.getApplicationContext(); } public FakeServerHelper getFakeServerHelper() { @@ -359,11 +357,9 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { SyncService syncService = createSyncServiceImpl(); if (syncService != null) { - SyncServiceFactory.overrideForTests(syncService); + SyncServiceFactory.setInstanceForTesting(syncService); } mSyncService = SyncServiceFactory.get(); - - mContext = ApplicationProvider.getApplicationContext(); mFakeServerHelper = FakeServerHelper.createInstanceAndGet(); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseActivityTest.java index 2954c8a0..53e4d08 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/PassphraseActivityTest.java
@@ -14,7 +14,6 @@ import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -43,11 +42,6 @@ mContext = ApplicationProvider.getApplicationContext(); } - @After - public void tearDown() { - TestThreadUtils.runOnUiThreadBlocking(() -> SyncServiceFactory.resetForTests()); - } - /** * This is a regression test for http://crbug.com/469890. */ @@ -98,7 +92,7 @@ return TestThreadUtils.runOnUiThreadBlockingNoException(() -> { // PSS has to be constructed on the UI thread. FakeSyncServiceImpl fakeSyncService = new FakeSyncServiceImpl(); - SyncServiceFactory.overrideForTests(fakeSyncService); + SyncServiceFactory.setInstanceForTesting(fakeSyncService); return fakeSyncService; }); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptTest.java index f47082d5..f49f08fb 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptTest.java
@@ -17,7 +17,6 @@ import androidx.test.filters.SmallTest; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -93,7 +92,7 @@ public void setUp() { MockitoAnnotations.initMocks(this); PersonalDataManager.setInstanceForTesting(mPersonalDataManager); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); when(mIdentityServicesProvider.getIdentityManager(any())).thenReturn(mIdentityManager); @@ -106,11 +105,6 @@ mJniMocker.mock(AutofillProfileBridgeJni.TEST_HOOKS, mAutofillProfileBridgeJni); } - @After - public void tearDown() { - PersonalDataManager.setInstanceForTesting(null); - } - private void createAndShowPrompt(boolean isUpdate) { createAndShowPrompt(isUpdate, NO_MIGRATION); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java index 8caa168..9ef0af2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java
@@ -95,7 +95,7 @@ mJniMocker.mock(LargeIconBridgeJni.TEST_HOOKS, mMockLargeIconBridgeJni); // Setup service mocks. - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); Mockito.doReturn(mSigninManager).when(mIdentityServicesProvider).getSigninManager(mProfile); Mockito.doReturn(mIdentityManager).when(mSigninManager).getIdentityManager();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java index 7c72320..9c08293 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -299,7 +299,7 @@ mBookmarkUiPrefs.setBookmarkRowDisplayPref(BookmarkRowDisplayPref.COMPACT); // Setup sync/identify mocks. - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); doReturn(mSigninManager).when(mIdentityServicesProvider).getSigninManager(any()); doReturn(mIdentityManager).when(mSigninManager).getIdentityManager();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinatorUnitTest.java index 814a4ad9..8f6b30f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinatorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinatorUnitTest.java
@@ -51,7 +51,7 @@ CustomTabsConnection.setInstanceForTesting(connection); SyncService syncService = Mockito.mock(SyncService.class); - SyncServiceFactory.overrideForTests(syncService); + SyncServiceFactory.setInstanceForTesting(syncService); enablePageInsights(testValues, connection, syncService); assertTrue("PageInsightsHub should be enabled", isPageInsightsEnabledSync());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java index 7c8cc4d..dba6dd2c 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
@@ -25,7 +25,6 @@ import org.robolectric.shadows.ShadowUserManager; import org.chromium.base.ContextUtils; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.task.TaskTraits; import org.chromium.base.task.test.ShadowPostTask; @@ -36,9 +35,6 @@ import org.chromium.components.policy.PolicySwitches; import org.chromium.content_public.browser.test.util.TestThreadUtils; -import java.util.Arrays; -import java.util.List; - /** * Unit test for {@link FirstRunAppRestrictionInfo}. */ @@ -46,10 +42,6 @@ @Config(manifest = Config.NONE, shadows = {ShadowPostTask.class, ShadowUserManager.class}) @LooperMode(LooperMode.Mode.LEGACY) public class FirstRunAppRestrictionInfoTest { - private static final List<String> HISTOGRAM_NAMES = - Arrays.asList("Enterprise.FirstRun.AppRestrictionLoadTime", - "Enterprise.FirstRun.AppRestrictionLoadTime.Medium"); - @Mock private Bundle mMockBundle; @@ -82,13 +74,6 @@ FirstRunAppRestrictionInfo.setInitializedInstanceForTest(null); } - private void verifyHistograms(int expectedCallCount) { - for (String name : HISTOGRAM_NAMES) { - Assert.assertEquals("Histogram record count doesn't match.", expectedCallCount, - RecordHistogram.getHistogramTotalCountForTesting(name)); - } - } - @Test @SmallTest public void testInitWithRestriction() { @@ -115,7 +100,6 @@ Assert.assertEquals(withRestriction, appResCallbackHelper.getOnlyPayloadBlocking()); Assert.assertEquals(1, completionCallbackHelper.getCallCount()); - verifyHistograms(1); } @Test @@ -167,8 +151,6 @@ Assert.assertEquals(1, completionCallbackHelper1.getCallCount()); Assert.assertEquals(1, completionCallbackHelper2.getCallCount()); Assert.assertEquals(1, completionCallbackHelper3.getCallCount()); - - verifyHistograms(1); } @Test @@ -194,7 +176,6 @@ "CallbackHelper should not triggered yet.", 0, appResCallbackHelper.getCallCount()); Assert.assertEquals("CallbackHelper should not triggered yet.", 0, completionCallbackHelper.getCallCount()); - verifyHistograms(0); } @Test @@ -207,6 +188,5 @@ -> FirstRunAppRestrictionInfo.takeMaybeInitialized().getHasAppRestriction( appResCallbackHelper::notifyCalled)); Assert.assertTrue(appResCallbackHelper.getOnlyPayloadBlocking()); - verifyHistograms(1); } }
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 51777c8..fdb7b2c 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3350,6 +3350,7 @@ "//components/embedder_support/android:util", "//components/embedder_support/android:web_contents_delegate", "//components/endpoint_fetcher:endpoint_fetcher", + "//components/environment_integrity/android", "//components/external_intents/android", "//components/favicon/android", "//components/favicon/core:database",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 9a24503..01552ae 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -136,6 +136,7 @@ "+components/embedder_support", "+components/encrypted_messages", "+components/enterprise", + "+components/environment_integrity/android", "+components/error_page/content/browser", "+components/exo", "+components/external_intents",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 31d6a57..4d1ef2d 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -8829,6 +8829,11 @@ flag_descriptions::kFedCmWithoutThirdPartyCookiesDescription, kOsAll, FEATURE_VALUE_TYPE(features::kFedCmWithoutThirdPartyCookies)}, + {"fedcm-without-well-known-enforcement", + flag_descriptions::kFedCmWithoutWellKnownEnforcementName, + flag_descriptions::kFedCmWithoutWellKnownEnforcementDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFedCmWithoutWellKnownEnforcement)}, + {"web-identity-mdocs", flag_descriptions::kWebIdentityMDocsName, flag_descriptions::kWebIdentityMDocsDescription, kOsAndroid, FEATURE_VALUE_TYPE(features::kWebIdentityMDocs)},
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index b8c1605..7cde249 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1729,6 +1729,8 @@ "login/saml/saml_profile_prefs.h", "login/screen_manager.cc", "login/screen_manager.h", + "login/screens/add_child_screen.cc", + "login/screens/add_child_screen.h", "login/screens/app_downloading_screen.cc", "login/screens/app_downloading_screen.h", "login/screens/arc_vm_data_migration_screen.cc", @@ -4283,8 +4285,12 @@ "accessibility/autoclick_test_utils.h", "accessibility/caret_bounds_changed_waiter.cc", "accessibility/caret_bounds_changed_waiter.h", + "accessibility/fullscreen_magnifier_test_helper.cc", + "accessibility/fullscreen_magnifier_test_helper.h", "accessibility/html_test_utils.cc", "accessibility/html_test_utils.h", + "accessibility/magnifier_animation_waiter.cc", + "accessibility/magnifier_animation_waiter.h", "accessibility/select_to_speak_test_utils.cc", "accessibility/select_to_speak_test_utils.h", "accessibility/service/fake_accessibility_service.cc",
diff --git a/chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.cc b/chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.cc new file mode 100644 index 0000000..819737f9 --- /dev/null +++ b/chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.cc
@@ -0,0 +1,137 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.h" + +#include "ash/accessibility/magnifier/fullscreen_magnifier_controller.h" +#include "ash/shell.h" +#include "base/functional/bind.h" +#include "chrome/browser/ash/accessibility/accessibility_manager.h" +#include "chrome/browser/ash/accessibility/magnification_manager.h" +#include "chrome/browser/ash/accessibility/magnifier_animation_waiter.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/common/extensions/extension_constants.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/accessibility_notification_waiter.h" +#include "extensions/browser/browsertest_util.h" +#include "extensions/browser/extension_host_test_helper.h" +#include "ui/accessibility/ax_mode.h" + +namespace ash { + +namespace { + +FullscreenMagnifierController* GetFullscreenMagnifierController() { + return Shell::Get()->fullscreen_magnifier_controller(); +} + +gfx::Rect GetViewPort() { + return GetFullscreenMagnifierController()->GetViewportRect(); +} + +} // namespace + +FullscreenMagnifierTestHelper::FullscreenMagnifierTestHelper( + gfx::Point center_position_on_load) + : center_position_on_load_(center_position_on_load) { + AccessibilityManager::Get()->SetMagnifierBoundsObserverForTest( + base::BindRepeating( + &FullscreenMagnifierTestHelper::OnMagnifierBoundsChanged, + weak_ptr_factory_.GetWeakPtr())); +} +FullscreenMagnifierTestHelper::~FullscreenMagnifierTestHelper() = default; + +void FullscreenMagnifierTestHelper::LoadURLAndMagnifier( + Browser* browser, + const std::string& url) { + auto* web_contents = browser->tab_strip_model()->GetActiveWebContents(); + content::AccessibilityNotificationWaiter waiter( + web_contents, ui::kAXModeComplete, ax::mojom::Event::kLoadComplete); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser, GURL(url))); + ASSERT_TRUE(waiter.WaitForNotification()); + + LoadMagnifier(browser->profile()); +} + +void FullscreenMagnifierTestHelper::LoadMagnifier(Profile* profile) { + extensions::ExtensionHostTestHelper host_helper( + profile, extension_misc::kAccessibilityCommonExtensionId); + ASSERT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled()); + MagnificationManager::Get()->SetMagnifierEnabled(true); + + // FullscreenMagnifierController moves the magnifier window with animation + // when the magnifier is first enabled. It will move the mouse cursor + // when the animation completes. Wait until the animation completes, so that + // the mouse movement won't affect the position of magnifier window later. + MagnifierAnimationWaiter magnifier_waiter(GetFullscreenMagnifierController()); + magnifier_waiter.Wait(); + host_helper.WaitForHostCompletedFirstLoad(); + + // Start in a known location. + MoveMagnifierWindow(center_position_on_load_.x(), + center_position_on_load_.y()); + ASSERT_EQ(GetViewPort().CenterPoint(), center_position_on_load_); + + WaitForMagnifierJSReady(profile); + + // Confirms that magnifier is enabled. + ASSERT_TRUE(MagnificationManager::Get()->IsMagnifierEnabled()); + // Check default scale is as expected. + ASSERT_EQ(2.0f, GetFullscreenMagnifierController()->GetScale()); +} + +void FullscreenMagnifierTestHelper::MoveMagnifierWindow(int x_center, + int y_center) { + gfx::Rect bounds = GetViewPort(); + GetFullscreenMagnifierController()->MoveWindow(x_center - bounds.width() / 2, + y_center - bounds.height() / 2, + /*animate=*/false); + WaitForMagnifierBoundsChangedTo(gfx::Point(x_center, y_center)); +} + +void FullscreenMagnifierTestHelper::WaitForMagnifierBoundsChanged() { + base::RunLoop loop; + bounds_changed_waiter_ = loop.QuitClosure(); + loop.Run(); +} + +void FullscreenMagnifierTestHelper::WaitForMagnifierBoundsChangedTo( + gfx::Point center_point) { + while (GetViewPort().CenterPoint() != center_point) { + WaitForMagnifierBoundsChanged(); + } +} + +void FullscreenMagnifierTestHelper::WaitForMagnifierJSReady(Profile* profile) { + base::ScopedAllowBlockingForTesting allow_blocking; + std::string script = base::StringPrintf(R"JS( + (async function() { + window.accessibilityCommon.setFeatureLoadCallbackForTest('magnifier', + () => { + window.accessibilityCommon.magnifier_.setIsInitializingForTest( + false); + chrome.test.sendScriptResult('ready'); + }); + })(); + )JS"); + base::Value result = + extensions::browsertest_util::ExecuteScriptInBackgroundPage( + profile, extension_misc::kAccessibilityCommonExtensionId, script); + ASSERT_EQ("ready", result); +} + +void FullscreenMagnifierTestHelper::OnMagnifierBoundsChanged() { + if (!bounds_changed_waiter_) { + return; + } + + std::move(bounds_changed_waiter_).Run(); + + // Wait for any additional animation to complete. + MagnifierAnimationWaiter magnifier_waiter(GetFullscreenMagnifierController()); + magnifier_waiter.Wait(); +} + +} // namespace ash
diff --git a/chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.h b/chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.h new file mode 100644 index 0000000..1b4bf08 --- /dev/null +++ b/chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.h
@@ -0,0 +1,56 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_ACCESSIBILITY_FULLSCREEN_MAGNIFIER_TEST_HELPER_H_ +#define CHROME_BROWSER_ASH_ACCESSIBILITY_FULLSCREEN_MAGNIFIER_TEST_HELPER_H_ + +#include <string> + +#include "base/functional/callback_forward.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/web_contents.h" + +class Browser; +class Profile; + +namespace ash { + +// Helper class for fullscreen magnifier tests. +class FullscreenMagnifierTestHelper { + public: + // Set `center_position_on_load` to a non-zero point to load the magnifier + // centered at a certain viewport each time LoadMagnifier/LoadURLAndMagnifier + // are called. + FullscreenMagnifierTestHelper( + gfx::Point center_position_on_load = gfx::Point(0, 0)); + FullscreenMagnifierTestHelper(const FullscreenMagnifierTestHelper&) = delete; + FullscreenMagnifierTestHelper& operator=( + const FullscreenMagnifierTestHelper&) = delete; + ~FullscreenMagnifierTestHelper(); + + // Loads a page with the given URL and then starts up Magnifier. + void LoadURLAndMagnifier(Browser* browser, const std::string& url); + + // Loads the magnifier and waits for load complete before returning. + void LoadMagnifier(Profile* profile); + + // Moves the magnifier window and waits for the bounds to change. + void MoveMagnifierWindow(int x_center, int y_center); + + // Waits for the next time the magnifier bounds change. + void WaitForMagnifierBoundsChanged(); + + private: + void WaitForMagnifierBoundsChangedTo(gfx::Point center_point); + void WaitForMagnifierJSReady(Profile* profile); + void OnMagnifierBoundsChanged(); + + gfx::Point center_position_on_load_; + base::OnceClosure bounds_changed_waiter_; + base::WeakPtrFactory<FullscreenMagnifierTestHelper> weak_ptr_factory_{this}; +}; + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_ACCESSIBILITY_FULLSCREEN_MAGNIFIER_TEST_HELPER_H_
diff --git a/chrome/browser/ash/accessibility/magnification_controller_browsertest.cc b/chrome/browser/ash/accessibility/magnification_controller_browsertest.cc index b7d7dfbf4..0625fa7 100644 --- a/chrome/browser/ash/accessibility/magnification_controller_browsertest.cc +++ b/chrome/browser/ash/accessibility/magnification_controller_browsertest.cc
@@ -8,14 +8,12 @@ #include "ash/constants/ash_pref_names.h" #include "ash/shell.h" #include "base/command_line.h" -#include "base/memory/weak_ptr.h" -#include "base/run_loop.h" #include "build/build_config.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/ash/accessibility/accessibility_test_utils.h" +#include "chrome/browser/ash/accessibility/fullscreen_magnifier_test_helper.h" #include "chrome/browser/ash/accessibility/html_test_utils.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" -#include "chrome/browser/ash/accessibility/magnifier_animation_waiter.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/test/base/in_process_browser_test.h" @@ -24,7 +22,6 @@ #include "content/public/test/accessibility_notification_waiter.h" #include "content/public/test/browser_test.h" #include "extensions/browser/browsertest_util.h" -#include "extensions/browser/extension_host_test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/keyboard_codes_posix.h" @@ -53,16 +50,15 @@ } // namespace class FullscreenMagnifierControllerTest : public InProcessBrowserTest { - protected: - FullscreenMagnifierControllerTest() {} - + public: + FullscreenMagnifierControllerTest() = default; FullscreenMagnifierControllerTest(const FullscreenMagnifierControllerTest&) = delete; FullscreenMagnifierControllerTest& operator=( const FullscreenMagnifierControllerTest&) = delete; + ~FullscreenMagnifierControllerTest() override = default; - ~FullscreenMagnifierControllerTest() override {} - + protected: void SetUpCommandLine(base::CommandLine* command_line) override { // Make screens sufficiently wide to host 2 browsers side by side. command_line->AppendSwitchASCII("ash-host-window-bounds", "1200x800"); @@ -74,97 +70,9 @@ aura::Window* root_window = Shell::Get()->GetPrimaryRootWindow(); generator_ = std::make_unique<ui::test::EventGenerator>(root_window); - AccessibilityManager::Get()->SetMagnifierBoundsObserverForTest( - base::BindRepeating( - &FullscreenMagnifierControllerTest::MagnifierBoundsChanged, - weak_ptr_factory_.GetWeakPtr())); - } - - // Loads a page with the given URL and then starts up Magnifier. - void LoadURLAndMagnifier(const std::string& url) { - content::AccessibilityNotificationWaiter waiter( - GetWebContents(), ui::kAXModeComplete, ax::mojom::Event::kLoadComplete); - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(url))); - ASSERT_TRUE(waiter.WaitForNotification()); - - LoadMagnifier(); - } - - void LoadMagnifier() { - extensions::ExtensionHostTestHelper host_helper( - browser()->profile(), extension_misc::kAccessibilityCommonExtensionId); - MagnificationManager::Get()->SetMagnifierEnabled(true); - - // FullscreenMagnifierController moves the magnifier window with animation - // when the magnifier is first enabled. It will move the mouse cursor - // when the animation completes. Wait until the animation completes, so that - // the mouse movement won't affect the position of magnifier window later. - MagnifierAnimationWaiter magnifier_waiter( - GetFullscreenMagnifierController()); - magnifier_waiter.Wait(); - host_helper.WaitForHostCompletedFirstLoad(); - // Start in a known location, centered on the screen. - MoveMagnifierWindow(600, 400); - ASSERT_EQ(GetViewPort().CenterPoint(), gfx::Point(600, 400)); - - WaitForMagnifierJSReady(); - - // Confirms that magnifier is enabled. - ASSERT_TRUE(MagnificationManager::Get()->IsMagnifierEnabled()); - // Check default scale is as expected. - EXPECT_EQ(2.0f, GetFullscreenMagnifierController()->GetScale()); - } - - void WaitForMagnifierJSReady() { - base::ScopedAllowBlockingForTesting allow_blocking; - std::string script = base::StringPrintf(R"JS( - (async function() { - window.accessibilityCommon.setFeatureLoadCallbackForTest('magnifier', - () => { - window.accessibilityCommon.magnifier_.setIsInitializingForTest( - false); - chrome.test.sendScriptResult('ready'); - }); - })(); - )JS"); - base::Value result = - extensions::browsertest_util::ExecuteScriptInBackgroundPage( - browser()->profile(), - extension_misc::kAccessibilityCommonExtensionId, script); - ASSERT_EQ("ready", result); - } - - void MoveMagnifierWindow(int x_center, int y_center) { - gfx::Rect bounds = GetViewPort(); - GetFullscreenMagnifierController()->MoveWindow( - x_center - bounds.width() / 2, y_center - bounds.height() / 2, - /*animate=*/false); - WaitForMagnifierBoundsChangedTo(gfx::Point(x_center, y_center)); - } - - void WaitForMagnifierBoundsChangedTo(gfx::Point center_point) { - while (GetViewPort().CenterPoint() != center_point) { - WaitForMagnifierBoundsChanged(); - } - } - - void WaitForMagnifierBoundsChanged() { - base::RunLoop loop; - bounds_changed_waiter_ = loop.QuitClosure(); - loop.Run(); - } - - void MagnifierBoundsChanged() { - if (!bounds_changed_waiter_) - return; - - std::move(bounds_changed_waiter_).Run(); - - // Wait for any additional animation to complete. - MagnifierAnimationWaiter magnifier_waiter( - GetFullscreenMagnifierController()); - magnifier_waiter.Wait(); + helper_ = + std::make_unique<FullscreenMagnifierTestHelper>(gfx::Point(600, 400)); } content::WebContents* GetWebContents() { @@ -178,30 +86,32 @@ element_id.c_str()))); } - std::unique_ptr<ui::test::EventGenerator> generator_; + ui::test::EventGenerator* generator() { return generator_.get(); } + FullscreenMagnifierTestHelper* helper() { return helper_.get(); } private: + std::unique_ptr<ui::test::EventGenerator> generator_; + std::unique_ptr<FullscreenMagnifierTestHelper> helper_; std::unique_ptr<ExtensionConsoleErrorObserver> console_observer_; - base::OnceClosure bounds_changed_waiter_; - base::WeakPtrFactory<FullscreenMagnifierControllerTest> weak_ptr_factory_{ - this}; }; IN_PROC_BROWSER_TEST_F(FullscreenMagnifierControllerTest, FollowFocusOnWebButton) { - LoadURLAndMagnifier(std::string(kDataURIPrefix) + kTestHtmlContent); + helper()->LoadURLAndMagnifier(browser(), + std::string(kDataURIPrefix) + kTestHtmlContent); // Move magnifier window to exclude the button. const gfx::Rect button_bounds = GetControlBoundsInRoot(GetWebContents(), "test_button"); - MoveMagnifierWindow(button_bounds.right() + GetViewPort().width(), - button_bounds.bottom() + GetViewPort().height()); + helper()->MoveMagnifierWindow( + button_bounds.right() + GetViewPort().width(), + button_bounds.bottom() + GetViewPort().height()); const gfx::Rect view_port_before_focus = GetViewPort(); EXPECT_FALSE(view_port_before_focus.Contains(button_bounds)); // Set the focus on the button. SetFocusOnElement("test_button"); - WaitForMagnifierBoundsChanged(); + helper()->WaitForMagnifierBoundsChanged(); // Verify the magnifier window has moved to contain the button. const gfx::Rect view_port_after_focus = GetViewPort(); @@ -213,7 +123,7 @@ browser()->profile()->GetPrefs()->SetInteger( prefs::kAccessibilityScreenMagnifierMouseFollowingMode, static_cast<int>(MagnifierMouseFollowingMode::kContinuous)); - LoadMagnifier(); + helper()->LoadMagnifier(browser()->profile()); // Screen resolution 1200x800. gfx::Point center_point(600, 400); @@ -223,7 +133,7 @@ // Move left and down. The viewport should move towards the mouse but not // all the way to it. gfx::Point mouse_point = gfx::Point(500 - i * 50, 500 + i * 50); - generator_->MoveMouseTo(mouse_point); + generator()->MoveMouseTo(mouse_point); // No need to wait: Without going through the extension loop needed for // focus observation, the movement is all within the same process. EXPECT_GT(GetViewPort().CenterPoint().x(), mouse_point.x()); @@ -239,26 +149,26 @@ browser()->profile()->GetPrefs()->SetInteger( prefs::kAccessibilityScreenMagnifierMouseFollowingMode, static_cast<int>(MagnifierMouseFollowingMode::kEdge)); - LoadMagnifier(); + helper()->LoadMagnifier(browser()->profile()); // Screen resolution 1200x800. gfx::Point initial_center = GetViewPort().CenterPoint(); gfx::Point mouse_point(550, 450); - generator_->MoveMouseTo(mouse_point); + generator()->MoveMouseTo(mouse_point); // No need to wait: Without going through the extension loop needed for focus // observation, the movement is all within the same process. EXPECT_EQ(GetViewPort().CenterPoint(), initial_center); // Move left and down. The viewport should not move as we are still within it. gfx::Point new_mouse_point = gfx::Point(500, 500); - generator_->MoveMouseTo(new_mouse_point); + generator()->MoveMouseTo(new_mouse_point); EXPECT_EQ(GetViewPort().CenterPoint(), initial_center); // Move mouse to the left/bottom edge. The viewport should move in that // direction. Note we have to scale the mouse point based on the magnifer // scale to actually reach the edge of the viewport. new_mouse_point = gfx::Point(0, 800); - generator_->MoveMouseTo(new_mouse_point); + generator()->MoveMouseTo(new_mouse_point); EXPECT_GT(GetViewPort().CenterPoint().x(), new_mouse_point.x()); EXPECT_LT(GetViewPort().CenterPoint().x(), initial_center.x()); EXPECT_LT(GetViewPort().CenterPoint().y(), new_mouse_point.y()); @@ -267,23 +177,23 @@ IN_PROC_BROWSER_TEST_F(FullscreenMagnifierControllerTest, ChangeZoomWithAccelerator) { - LoadMagnifier(); + helper()->LoadMagnifier(browser()->profile()); // Press keyboard shortcut to zoom in. Default zoom is 2.0. - generator_->PressAndReleaseKey(ui::VKEY_BRIGHTNESS_UP, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN); + generator()->PressAndReleaseKey(ui::VKEY_BRIGHTNESS_UP, + ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN); float scale = GetFullscreenMagnifierController()->GetScale(); EXPECT_LT(2.0f, scale); // Keyboard shortcut to zoom out. - generator_->PressAndReleaseKey(ui::VKEY_BRIGHTNESS_DOWN, - ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN); + generator()->PressAndReleaseKey(ui::VKEY_BRIGHTNESS_DOWN, + ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN); // Note the scale might not be 2.0 again. EXPECT_GT(scale, GetFullscreenMagnifierController()->GetScale()); } IN_PROC_BROWSER_TEST_F(FullscreenMagnifierControllerTest, ChangeZoomWithPrefs) { - LoadMagnifier(); + helper()->LoadMagnifier(browser()->profile()); // Change the bounds pref. browser()->profile()->GetPrefs()->SetDouble(
diff --git a/chrome/browser/ash/login/debug_overlay_browsertest.cc b/chrome/browser/ash/login/debug_overlay_browsertest.cc index 59c4aee..938bccf 100644 --- a/chrome/browser/ash/login/debug_overlay_browsertest.cc +++ b/chrome/browser/ash/login/debug_overlay_browsertest.cc
@@ -21,8 +21,8 @@ constexpr char kDebugOverlay[] = "debuggerOverlay"; constexpr char kScreensPanel[] = "DebuggerPanelScreens"; -constexpr int kOobeScreensCount = 48; -constexpr int kLoginScreensCount = 45; +constexpr int kOobeScreensCount = 49; +constexpr int kLoginScreensCount = 46; constexpr int kOsInstallScreensCount = 2; std::string ElementsInPanel(const std::string& panel) {
diff --git a/chrome/browser/ash/login/error_screens_histogram_helper.cc b/chrome/browser/ash/login/error_screens_histogram_helper.cc index dcf41ea3..9de58e3f 100644 --- a/chrome/browser/ash/login/error_screens_histogram_helper.cc +++ b/chrome/browser/ash/login/error_screens_histogram_helper.cc
@@ -30,6 +30,8 @@ return "UpdateRequired"; case ErrorScreensHistogramHelper::ErrorParentScreen::kUserCreation: return "UserCreation"; + case ErrorScreensHistogramHelper::ErrorParentScreen::kAddChild: + return "AddChild"; } }
diff --git a/chrome/browser/ash/login/error_screens_histogram_helper.h b/chrome/browser/ash/login/error_screens_histogram_helper.h index f9ff238..97912a9 100644 --- a/chrome/browser/ash/login/error_screens_histogram_helper.h +++ b/chrome/browser/ash/login/error_screens_histogram_helper.h
@@ -30,6 +30,7 @@ kUpdate, kUpdateRequired, kUserCreation, + kAddChild, }; explicit ErrorScreensHistogramHelper(ErrorParentScreen parent_screen);
diff --git a/chrome/browser/ash/login/screens/add_child_screen.cc b/chrome/browser/ash/login/screens/add_child_screen.cc new file mode 100644 index 0000000..085ee4a --- /dev/null +++ b/chrome/browser/ash/login/screens/add_child_screen.cc
@@ -0,0 +1,142 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/login/screens/add_child_screen.h" + +#include <string> + +#include "ash/public/cpp/login_screen.h" +#include "chrome/browser/ash/login/error_screens_histogram_helper.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" +#include "chrome/browser/ash/login/wizard_context.h" +#include "chrome/browser/ui/webui/ash/login/add_child_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/error_screen_handler.h" +#include "chromeos/ash/components/network/network_state.h" +#include "chromeos/ash/components/network/network_state_handler.h" + +namespace ash { +namespace { + +constexpr char kUserActionBack[] = "child-back"; +constexpr char kUserActionChildSignIn[] = "child-signin"; +constexpr char kUserActionChildAccountCreate[] = "child-account-create"; + +} // namespace + +// static +std::string AddChildScreen::GetResultString(Result result) { + switch (result) { + case Result::CHILD_SIGNIN: + return "SignInAsChild"; + case Result::CHILD_ACCOUNT_CREATE: + return "CreateChildAccount"; + case Result::ENTERPRISE_ENROLL: + return "EnterpriseEnroll"; + case Result::KIOSK_ENTERPRISE_ENROLL: + return "KioskEnterpriseEnroll"; + case Result::BACK: + return "Back"; + case Result::SKIPPED: + return BaseScreen::kNotApplicable; + } +} + +AddChildScreen::AddChildScreen(base::WeakPtr<AddChildScreenView> view, + ErrorScreen* error_screen, + const ScreenExitCallback& exit_callback) + : BaseScreen(AddChildScreenView::kScreenId, OobeScreenPriority::DEFAULT), + view_(std::move(view)), + histogram_helper_(std::make_unique<ErrorScreensHistogramHelper>( + ErrorScreensHistogramHelper::ErrorParentScreen::kAddChild)), + error_screen_(error_screen), + exit_callback_(exit_callback) { + network_state_informer_ = base::MakeRefCounted<NetworkStateInformer>(); + network_state_informer_->Init(); +} + +AddChildScreen::~AddChildScreen() = default; + +bool AddChildScreen::MaybeSkip(WizardContext& context) { + if (context.skip_post_login_screens_for_tests) { + exit_callback_.Run(Result::SKIPPED); + return true; + } + + return false; +} + +void AddChildScreen::ShowImpl() { + if (!view_) { + return; + } + + scoped_observation_.Observe(network_state_informer_.get()); + + UpdateState(NetworkError::ERROR_REASON_UPDATE); + + if (!error_screen_visible_) { + view_->Show(); + } + + histogram_helper_->OnScreenShow(); +} + +void AddChildScreen::HideImpl() { + scoped_observation_.Reset(); + error_screen_visible_ = false; + error_screen_->SetParentScreen(OOBE_SCREEN_UNKNOWN); + error_screen_->Hide(); +} + +void AddChildScreen::OnUserAction(const base::Value::List& args) { + const std::string& action_id = args[0].GetString(); + if (action_id == kUserActionChildSignIn) { + context()->sign_in_as_child = true; + context()->is_child_gaia_account_new = false; + exit_callback_.Run(Result::CHILD_SIGNIN); + } else if (action_id == kUserActionChildAccountCreate) { + context()->sign_in_as_child = true; + context()->is_child_gaia_account_new = true; + exit_callback_.Run(Result::CHILD_ACCOUNT_CREATE); + } else if (action_id == kUserActionBack) { + exit_callback_.Run(Result::BACK); + } else { + BaseScreen::OnUserAction(args); + } +} + +bool AddChildScreen::HandleAccelerator(LoginAcceleratorAction action) { + if (action == LoginAcceleratorAction::kStartEnrollment) { + exit_callback_.Run(Result::ENTERPRISE_ENROLL); + return true; + } + if (action == LoginAcceleratorAction::kStartKioskEnrollment) { + exit_callback_.Run(Result::KIOSK_ENTERPRISE_ENROLL); + return true; + } + return false; +} + +void AddChildScreen::UpdateState(NetworkError::ErrorReason reason) { + NetworkStateInformer::State state = network_state_informer_->state(); + const bool is_online = NetworkStateInformer::IsOnline(state, reason); + if (!is_online) { + error_screen_visible_ = true; + error_screen_->SetParentScreen(AddChildScreenView::kScreenId); + error_screen_->ShowNetworkErrorMessage(state, reason); + histogram_helper_->OnErrorShow(error_screen_->GetErrorState()); + } else { + error_screen_->HideCaptivePortal(); + if (error_screen_visible_ && + error_screen_->GetParentScreen() == AddChildScreenView::kScreenId) { + error_screen_visible_ = false; + error_screen_->SetParentScreen(OOBE_SCREEN_UNKNOWN); + error_screen_->Hide(); + view_->Show(); + histogram_helper_->OnErrorHide(); + } + } +} + +} // namespace ash
diff --git a/chrome/browser/ash/login/screens/add_child_screen.h b/chrome/browser/ash/login/screens/add_child_screen.h new file mode 100644 index 0000000..6ef8ab4 --- /dev/null +++ b/chrome/browser/ash/login/screens/add_child_screen.h
@@ -0,0 +1,98 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_LOGIN_SCREENS_ADD_CHILD_SCREEN_H_ +#define CHROME_BROWSER_ASH_LOGIN_SCREENS_ADD_CHILD_SCREEN_H_ + +#include <memory> +#include <string> + +#include "base/functional/callback.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/scoped_observation.h" +#include "chrome/browser/ash/login/error_screens_histogram_helper.h" +#include "chrome/browser/ash/login/screens/base_screen.h" +#include "chrome/browser/ash/login/screens/error_screen.h" +#include "chrome/browser/ui/webui/ash/login/add_child_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/network_state_informer.h" + +namespace ash { + +class AddChildScreenView; + +// Controller for the add child screen. +class AddChildScreen + : public BaseScreen, + public NetworkStateInformer::NetworkStateInformerObserver { + public: + using TView = AddChildScreenView; + + enum class Result { + CHILD_SIGNIN, + CHILD_ACCOUNT_CREATE, + ENTERPRISE_ENROLL, + BACK, + KIOSK_ENTERPRISE_ENROLL, + SKIPPED, + }; + + using ScreenExitCallback = base::RepeatingCallback<void(Result result)>; + + explicit AddChildScreen(base::WeakPtr<AddChildScreenView> view, + ErrorScreen* error_screen, + const ScreenExitCallback& exit_callback); + + AddChildScreen(const AddChildScreen&) = delete; + AddChildScreen& operator=(const AddChildScreen&) = delete; + + // NetworkStateInformer::NetworkStateInformerObserver implementation: + void UpdateState(NetworkError::ErrorReason reason) override; + + ~AddChildScreen() override; + + static std::string GetResultString(Result result); + + void set_exit_callback_for_testing(const ScreenExitCallback& callback) { + exit_callback_ = callback; + } + + const ScreenExitCallback& get_exit_callback_for_testing() { + return exit_callback_; + } + + private: + // BaseScreen: + bool MaybeSkip(WizardContext& context) override; + void ShowImpl() override; + void HideImpl() override; + void OnUserAction(const base::Value::List& args) override; + bool HandleAccelerator(LoginAcceleratorAction action) override; + + base::WeakPtr<AddChildScreenView> view_; + + scoped_refptr<NetworkStateInformer> network_state_informer_; + + std::unique_ptr<ErrorScreensHistogramHelper> histogram_helper_; + + base::ScopedObservation<NetworkStateInformer, NetworkStateInformerObserver> + scoped_observation_{this}; + + raw_ptr<ErrorScreen> error_screen_ = nullptr; + + // TODO(crbug.com/1154669) Refactor error screen usage + bool error_screen_visible_ = false; + + ScreenExitCallback exit_callback_; +}; + +} // namespace ash + +// TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos +// source migration is finished. +namespace chromeos { +using ::ash ::AddChildScreen; +} + +#endif // CHROME_BROWSER_ASH_LOGIN_SCREENS_ADD_CHILD_SCREEN_H_
diff --git a/chrome/browser/ash/login/screens/add_child_screen_browsertest.cc b/chrome/browser/ash/login/screens/add_child_screen_browsertest.cc new file mode 100644 index 0000000..1e6f7357 --- /dev/null +++ b/chrome/browser/ash/login/screens/add_child_screen_browsertest.cc
@@ -0,0 +1,157 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "chrome/browser/ash/login/screens/add_child_screen.h" + +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/login_screen_test_api.h" +#include "base/test/test_future.h" +#include "chrome/browser/ash/login/enrollment/enrollment_screen_view.h" +#include "chrome/browser/ash/login/oobe_screen.h" +#include "chrome/browser/ash/login/test/device_state_mixin.h" +#include "chrome/browser/ash/login/test/js_checker.h" +#include "chrome/browser/ash/login/test/login_manager_mixin.h" +#include "chrome/browser/ash/login/test/network_portal_detector_mixin.h" +#include "chrome/browser/ash/login/test/oobe_base_test.h" +#include "chrome/browser/ash/login/test/oobe_screen_exit_waiter.h" +#include "chrome/browser/ash/login/test/oobe_screen_waiter.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" +#include "chrome/browser/ash/login/wizard_controller.h" +#include "chrome/browser/ui/webui/ash/login/add_child_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/error_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/gaia_info_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/gaia_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/offline_login_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/user_creation_screen_handler.h" +#include "chrome/test/base/fake_gaia_mixin.h" +#include "content/public/test/browser_test.h" + +namespace ash { +namespace { + +constexpr char kAddChildId[] = "add-child"; + +const test::UIPath kAddChildDialog = {kAddChildId, "childSignInDialog"}; +const test::UIPath kChildCreateButton = {kAddChildId, "childCreateButton"}; +const test::UIPath kChildSignInButton = {kAddChildId, "childSignInButton"}; +const test::UIPath kBackButton = {kAddChildId, "childBackButton"}; +const test::UIPath kNextButton = {kAddChildId, "childNextButton"}; + +class AddChildScreenTest : public OobeBaseTest { + public: + AddChildScreenTest() = default; + ~AddChildScreenTest() override = default; + + void SetUpOnMainThread() override { + AddChildScreen* add_child_screen = + WizardController::default_controller()->GetScreen<AddChildScreen>(); + + original_callback_ = add_child_screen->get_exit_callback_for_testing(); + add_child_screen->set_exit_callback_for_testing(base::BindRepeating( + &AddChildScreenTest::HandleScreenExit, base::Unretained(this))); + + OobeBaseTest::SetUpOnMainThread(); + } + + void TearDownOnMainThread() override { OobeBaseTest::TearDownOnMainThread(); } + + void ShowAddChildScreen() { + OobeScreenExitWaiter(GetFirstSigninScreen()).Wait(); + WizardController::default_controller()->AdvanceToScreen( + AddChildScreenView::kScreenId); + } + + void SelectSetUpMethodOnChildScreen(test::UIPath element_id) { + ShowAddChildScreen(); + ASSERT_FALSE(LoginScreenTestApi::IsEnterpriseEnrollmentButtonShown()); + test::OobeJS().ExpectVisiblePath(kAddChildDialog); + test::OobeJS().ClickOnPath(element_id); + test::OobeJS().TapOnPath(kNextButton); + } + + void WaitForScreenExit() { + if (result_.has_value()) { + return; + } + base::test::TestFuture<void> waiter; + quit_closure_ = waiter.GetCallback(); + EXPECT_TRUE(waiter.Wait()); + } + + AddChildScreen::ScreenExitCallback original_callback_; + absl::optional<AddChildScreen::Result> result_; + + protected: + DeviceStateMixin device_state_{ + &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED}; + + NetworkPortalDetectorMixin network_portal_detector_{&mixin_host_}; + + private: + void HandleScreenExit(AddChildScreen::Result result) { + result_ = result; + original_callback_.Run(result); + if (quit_closure_) { + std::move(quit_closure_).Run(); + } + } + + base::OnceClosure quit_closure_; + + base::test::ScopedFeatureList feature_list_; + FakeGaiaMixin fake_gaia_{&mixin_host_}; +}; + +IN_PROC_BROWSER_TEST_F(AddChildScreenTest, CreateChild) { + SelectSetUpMethodOnChildScreen(kChildCreateButton); + WaitForScreenExit(); + EXPECT_TRUE(LoginDisplayHost::default_host() + ->GetWizardContextForTesting() + ->sign_in_as_child); + EXPECT_TRUE(LoginDisplayHost::default_host() + ->GetWizardContextForTesting() + ->is_child_gaia_account_new); + EXPECT_EQ(result_.value(), AddChildScreen::Result::CHILD_ACCOUNT_CREATE); + OobeScreenWaiter(GaiaView::kScreenId).Wait(); +} + +IN_PROC_BROWSER_TEST_F(AddChildScreenTest, SignInForChild) { + SelectSetUpMethodOnChildScreen(kChildSignInButton); + WaitForScreenExit(); + EXPECT_TRUE(LoginDisplayHost::default_host() + ->GetWizardContextForTesting() + ->sign_in_as_child); + EXPECT_FALSE(LoginDisplayHost::default_host() + ->GetWizardContextForTesting() + ->is_child_gaia_account_new); + EXPECT_EQ(result_.value(), AddChildScreen::Result::CHILD_SIGNIN); + OobeScreenWaiter(GaiaView::kScreenId).Wait(); +} + +IN_PROC_BROWSER_TEST_F(AddChildScreenTest, BackButton) { + ShowAddChildScreen(); + test::OobeJS().ExpectVisiblePath(kAddChildDialog); + test::OobeJS().ClickOnPath(kBackButton); + WaitForScreenExit(); + + EXPECT_EQ(result_.value(), AddChildScreen::Result::BACK); + OobeScreenWaiter(UserCreationView::kScreenId).Wait(); +} + +IN_PROC_BROWSER_TEST_F(AddChildScreenTest, NetworkOffline) { + ShowAddChildScreen(); + OobeScreenWaiter(AddChildScreenView::kScreenId).Wait(); + network_portal_detector_.SimulateDefaultNetworkState( + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE); + + OobeScreenWaiter(ErrorScreenView::kScreenId).Wait(); + test::OobeJS().ExpectVisiblePath( + {"error-message", "error-guest-signin-link"}); + + network_portal_detector_.SimulateDefaultNetworkState( + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE); + OobeScreenWaiter(AddChildScreenView::kScreenId).Wait(); +} + +} // namespace +} // namespace ash
diff --git a/chrome/browser/ash/login/screens/user_creation_screen.cc b/chrome/browser/ash/login/screens/user_creation_screen.cc index 4b758d57..02953184 100644 --- a/chrome/browser/ash/login/screens/user_creation_screen.cc +++ b/chrome/browser/ash/login/screens/user_creation_screen.cc
@@ -21,8 +21,7 @@ namespace { constexpr char kUserActionSignIn[] = "signin"; -constexpr char kUserActionChildSignIn[] = "child-signin"; -constexpr char kUserActionChildAccountCreate[] = "child-account-create"; +constexpr char kUserActionAddChild[] = "add-child"; constexpr char kUserActionCancel[] = "cancel"; UserCreationScreen::UserCreationScreenExitTestDelegate* test_exit_delegate = @@ -35,10 +34,8 @@ switch (result) { case Result::SIGNIN: return "SignIn"; - case Result::CHILD_SIGNIN: - return "SignInAsChild"; - case Result::CHILD_ACCOUNT_CREATE: - return "CreateChildAccount"; + case Result::ADD_CHILD: + return "AddChild"; case Result::ENTERPRISE_ENROLL: return "EnterpriseEnroll"; case Result::KIOSK_ENTERPRISE_ENROLL: @@ -129,14 +126,8 @@ if (action_id == kUserActionSignIn) { context()->sign_in_as_child = false; RunExitCallback(Result::SIGNIN); - } else if (action_id == kUserActionChildSignIn) { - context()->sign_in_as_child = true; - context()->is_child_gaia_account_new = false; - RunExitCallback(Result::CHILD_SIGNIN); - } else if (action_id == kUserActionChildAccountCreate) { - context()->sign_in_as_child = true; - context()->is_child_gaia_account_new = true; - RunExitCallback(Result::CHILD_ACCOUNT_CREATE); + } else if (action_id == kUserActionAddChild) { + RunExitCallback(Result::ADD_CHILD); } else if (action_id == kUserActionCancel) { context()->is_user_creation_enabled = false; RunExitCallback(Result::CANCEL);
diff --git a/chrome/browser/ash/login/screens/user_creation_screen.h b/chrome/browser/ash/login/screens/user_creation_screen.h index 3be5b63..289380f 100644 --- a/chrome/browser/ash/login/screens/user_creation_screen.h +++ b/chrome/browser/ash/login/screens/user_creation_screen.h
@@ -25,8 +25,7 @@ public: enum class Result { SIGNIN, - CHILD_SIGNIN, - CHILD_ACCOUNT_CREATE, + ADD_CHILD, ENTERPRISE_ENROLL, CANCEL, SKIPPED,
diff --git a/chrome/browser/ash/login/screens/user_creation_screen_browsertest.cc b/chrome/browser/ash/login/screens/user_creation_screen_browsertest.cc index 183ed15..4f18d58d 100644 --- a/chrome/browser/ash/login/screens/user_creation_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/user_creation_screen_browsertest.cc
@@ -31,15 +31,10 @@ const test::UIPath kUserCreationDialog = {kUserCreationId, "userCreationDialog"}; -const test::UIPath kChildSignInDialog = {kUserCreationId, "childSignInDialog"}; const test::UIPath kSelfButton = {kUserCreationId, "selfButton"}; const test::UIPath kChildButton = {kUserCreationId, "childButton"}; const test::UIPath kBackButton = {kUserCreationId, "backButton"}; const test::UIPath kNextButton = {kUserCreationId, "nextButton"}; -const test::UIPath kChildCreateButton = {kUserCreationId, "childCreateButton"}; -const test::UIPath kChildSignInButton = {kUserCreationId, "childSignInButton"}; -const test::UIPath kChildBackButton = {kUserCreationId, "childBackButton"}; -const test::UIPath kChildNextButton = {kUserCreationId, "childNextButton"}; class UserCreationScreenTest : public OobeBaseTest, @@ -67,15 +62,6 @@ test::OobeJS().TapOnPath(kNextButton); } - void SelectSetUpMethodOnChildScreen(test::UIPath element_id) { - OobeScreenWaiter(UserCreationView::kScreenId).Wait(); - ASSERT_FALSE(LoginScreenTestApi::IsEnterpriseEnrollmentButtonShown()); - test::OobeJS().ExpectHiddenPath(kUserCreationDialog); - test::OobeJS().ExpectVisiblePath(kChildSignInDialog); - test::OobeJS().ClickOnPath(element_id); - test::OobeJS().TapOnPath(kChildNextButton); - } - void WaitForScreenExit() { if (screen_result_.has_value()) return; @@ -127,50 +113,11 @@ } } -// Verify flow for setting up the device for a child with a newly created gaia -// account. -IN_PROC_BROWSER_TEST_F(UserCreationScreenTest, CreateAccountForChild) { +IN_PROC_BROWSER_TEST_F(UserCreationScreenTest, SelectChild) { SelectUserTypeOnUserCreationScreen(kChildButton); - SelectSetUpMethodOnChildScreen(kChildCreateButton); WaitForScreenExit(); - EXPECT_TRUE(LoginDisplayHost::default_host() - ->GetWizardContextForTesting() - ->sign_in_as_child); - EXPECT_TRUE(LoginDisplayHost::default_host() - ->GetWizardContextForTesting() - ->is_child_gaia_account_new); - EXPECT_EQ(screen_result_.value(), - UserCreationScreen::Result::CHILD_ACCOUNT_CREATE); - OobeScreenWaiter(GaiaView::kScreenId).Wait(); -} - -// Verify flow for setting up the device for a child with an existing gaia -// account. -IN_PROC_BROWSER_TEST_F(UserCreationScreenTest, SignInForChild) { - SelectUserTypeOnUserCreationScreen(kChildButton); - SelectSetUpMethodOnChildScreen(kChildSignInButton); - WaitForScreenExit(); - EXPECT_TRUE(LoginDisplayHost::default_host() - ->GetWizardContextForTesting() - ->sign_in_as_child); - EXPECT_FALSE(LoginDisplayHost::default_host() - ->GetWizardContextForTesting() - ->is_child_gaia_account_new); - EXPECT_EQ(screen_result_.value(), UserCreationScreen::Result::CHILD_SIGNIN); - OobeScreenWaiter(GaiaView::kScreenId).Wait(); -} - -// Verify back button is hidden during the oobe flow (when no existing users). -IN_PROC_BROWSER_TEST_F(UserCreationScreenTest, Cancel) { - SelectUserTypeOnUserCreationScreen(kChildButton); - - test::OobeJS().ExpectHiddenPath(kUserCreationDialog); - test::OobeJS().ExpectVisiblePath(kChildSignInDialog); - test::OobeJS().TapOnPath(kChildBackButton); - - test::OobeJS().ExpectVisiblePath(kUserCreationDialog); - test::OobeJS().ExpectHiddenPath(kChildSignInDialog); - test::OobeJS().ExpectHiddenPath(kBackButton); + EXPECT_EQ(screen_result_.value(), UserCreationScreen::Result::ADD_CHILD); + OobeScreenWaiter(AddChildScreenView::kScreenId).Wait(); } // Verify enterprise enrollment button is available during the oobe flow (when @@ -218,15 +165,6 @@ ASSERT_FALSE(LoginScreenTestApi::IsEnterpriseEnrollmentButtonShown()); test::OobeJS().ExpectVisiblePath(kUserCreationDialog); - test::OobeJS().ClickOnPath(kChildButton); - test::OobeJS().TapOnPath(kNextButton); - - test::OobeJS().ExpectHiddenPath(kUserCreationDialog); - test::OobeJS().ExpectVisiblePath(kChildSignInDialog); - test::OobeJS().TapOnPath(kChildBackButton); - - test::OobeJS().ExpectVisiblePath(kUserCreationDialog); - test::OobeJS().ExpectHiddenPath(kChildSignInDialog); test::OobeJS().ExpectVisiblePath(kBackButton); test::OobeJS().TapOnPath(kBackButton);
diff --git a/chrome/browser/ash/login/users/chrome_user_manager.cc b/chrome/browser/ash/login/users/chrome_user_manager.cc index 967327a..dc877b9 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager.cc +++ b/chrome/browser/ash/login/users/chrome_user_manager.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/browser_process.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" -#include "components/user_manager/user_names.h" #include "components/user_manager/user_type.h" namespace ash { @@ -44,27 +43,6 @@ LoginState::Get()->SetLoggedInState(logged_in_state, logged_in_user_type); } -bool ChromeUserManager::GetPlatformKnownUserId( - const std::string& user_email, - AccountId* out_account_id) const { - if (user_email == user_manager::kStubUserEmail) { - *out_account_id = user_manager::StubAccountId(); - return true; - } - - if (user_email == user_manager::kStubAdUserEmail) { - *out_account_id = user_manager::StubAdAccountId(); - return true; - } - - if (user_email == user_manager::kGuestUserName) { - *out_account_id = user_manager::GuestAccountId(); - return true; - } - - return false; -} - LoginState::LoggedInUserType ChromeUserManager::GetLoggedInUserType( const user_manager::User& active_user, bool is_current_user_owner) const {
diff --git a/chrome/browser/ash/login/users/chrome_user_manager.h b/chrome/browser/ash/login/users/chrome_user_manager.h index 8463640..c93c94c2 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager.h +++ b/chrome/browser/ash/login/users/chrome_user_manager.h
@@ -33,8 +33,6 @@ void UpdateLoginState(const user_manager::User* active_user, const user_manager::User* primary_user, bool is_current_user_owner) const override; - bool GetPlatformKnownUserId(const std::string& user_email, - AccountId* out_account_id) const override; // Returns current ChromeUserManager or NULL if instance hasn't been // yet initialized.
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 93b3c2c..963c3467 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -51,6 +51,7 @@ #include "chrome/browser/ash/login/login_wizard.h" #include "chrome/browser/ash/login/oobe_screen.h" #include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h" +#include "chrome/browser/ash/login/screens/add_child_screen.h" #include "chrome/browser/ash/login/screens/app_downloading_screen.h" #include "chrome/browser/ash/login/screens/arc_vm_data_migration_screen.h" #include "chrome/browser/ash/login/screens/assistant_optin_flow_screen.h" @@ -131,6 +132,7 @@ #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/webui/ash/login/add_child_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_downloading_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_launch_splash_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/arc_vm_data_migration_screen_handler.h" @@ -807,6 +809,12 @@ base::BindRepeating(&WizardController::OnUserCreationScreenExit, weak_factory_.GetWeakPtr()))); + append(std::make_unique<AddChildScreen>( + oobe_ui->GetView<AddChildScreenHandler>()->AsWeakPtr(), + oobe_ui->GetErrorScreen(), + base::BindRepeating(&WizardController::OnAddChildScreenExit, + weak_factory_.GetWeakPtr()))); + append(std::make_unique<EduCoexistenceLoginScreen>( base::BindRepeating(&WizardController::OnEduCoexistenceLoginScreenExit, weak_factory_.GetWeakPtr()))); @@ -981,6 +989,10 @@ SetCurrentScreen(GetScreen(GaiaInfoScreenView::kScreenId)); } +void WizardController::ShowAddChildScreen() { + SetCurrentScreen(GetScreen(AddChildScreenView::kScreenId)); +} + void WizardController::ShowEnrollmentScreen() { // Update the enrollment configuration and start the screen. prescribed_enrollment_config_ = @@ -1215,13 +1227,8 @@ QuickStartScreen::FlowState::CONTINUING_AFTER_ENROLLMENT_CHECKS); AdvanceToScreen(QuickStartView::kScreenId); break; - case UserCreationScreen::Result::CHILD_SIGNIN: - GetScreen<GaiaScreen>()->LoadOnlineForChildSignin(); - AdvanceToScreen(GaiaView::kScreenId); - break; - case UserCreationScreen::Result::CHILD_ACCOUNT_CREATE: - GetScreen<GaiaScreen>()->LoadOnlineForChildSignup(); - AdvanceToScreen(GaiaView::kScreenId); + case UserCreationScreen::Result::ADD_CHILD: + ShowAddChildScreen(); break; case UserCreationScreen::Result::ENTERPRISE_ENROLL: ShowEnrollmentScreenIfEligible(); @@ -1315,6 +1322,35 @@ } } +void WizardController::OnAddChildScreenExit(AddChildScreen::Result result) { + OnScreenExit(AddChildScreenView::kScreenId, + AddChildScreen::GetResultString(result)); + switch (result) { + case AddChildScreen::Result::CHILD_SIGNIN: + GetScreen<GaiaScreen>()->LoadOnlineForChildSignin(); + AdvanceToScreen(GaiaView::kScreenId); + break; + case AddChildScreen::Result::CHILD_ACCOUNT_CREATE: + GetScreen<GaiaScreen>()->LoadOnlineForChildSignup(); + AdvanceToScreen(GaiaView::kScreenId); + break; + case AddChildScreen::Result::ENTERPRISE_ENROLL: + ShowEnrollmentScreenIfEligible(); + break; + case AddChildScreen::Result::KIOSK_ENTERPRISE_ENROLL: + wizard_context_->enrollment_preference_ = + WizardContext::EnrollmentPreference::kKiosk; + ShowEnrollmentScreenIfEligible(); + break; + case AddChildScreen::Result::SKIPPED: + AdvanceToSigninScreen(); + break; + case AddChildScreen::Result::BACK: + AdvanceToScreen(UserCreationView::kScreenId); + break; + } +} + void WizardController::OnSamlConfirmPasswordScreenExit( SamlConfirmPasswordScreen::Result result) { OnScreenExit(SamlConfirmPasswordView::kScreenId, @@ -2515,6 +2551,8 @@ ShowDisplaySizeScreen(); } else if (screen_id == ChoobeScreenView::kScreenId) { ShowChoobeScreen(); + } else if (screen_id == AddChildScreenView::kScreenId) { + ShowAddChildScreen(); } else if (screen_id == TpmErrorView::kScreenId || screen_id == GaiaPasswordChangedView::kScreenId || screen_id == FamilyLinkNoticeView::kScreenId ||
diff --git a/chrome/browser/ash/login/wizard_controller.h b/chrome/browser/ash/login/wizard_controller.h index 70cca3d9..a97efdc9 100644 --- a/chrome/browser/ash/login/wizard_controller.h +++ b/chrome/browser/ash/login/wizard_controller.h
@@ -23,6 +23,7 @@ #include "chrome/browser/ash/login/enrollment/enrollment_screen.h" #include "chrome/browser/ash/login/oobe_screen.h" #include "chrome/browser/ash/login/screen_manager.h" +#include "chrome/browser/ash/login/screens/add_child_screen.h" #include "chrome/browser/ash/login/screens/assistant_optin_flow_screen.h" #include "chrome/browser/ash/login/screens/choobe_screen.h" #include "chrome/browser/ash/login/screens/consolidated_consent_screen.h" @@ -330,6 +331,7 @@ void ShowGaiaPasswordChangedScreen(std::unique_ptr<UserContext> user_context); void ShowDrivePinningScreen(); void ShowGaiaInfoScreen(); + void ShowAddChildScreen(); // Shows images login screen. void ShowLoginScreen(); @@ -416,6 +418,7 @@ void OnDisplaySizeScreenExit(DisplaySizeScreen::Result result); void OnDrivePinningScreenExit(DrivePinningScreen::Result result); void OnGaiaInfoScreenExit(GaiaInfoScreen::Result result); + void OnAddChildScreenExit(AddChildScreen::Result result); // Callback invoked once it has been determined whether the device is disabled // or not.
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc index 48e5890..d4762203 100644 --- a/chrome/browser/ash/login/wizard_controller_browsertest.cc +++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -3150,26 +3150,15 @@ OobeScreenWaiter(GaiaView::kScreenId).Wait(); } -IN_PROC_BROWSER_TEST_F(GaiaInfoTest, SkipGaiaInfoForChildAccountCreation) { +IN_PROC_BROWSER_TEST_F(GaiaInfoTest, SkipGaiaInfoForChildAccount) { WaitForOobeUI(); WizardController::default_controller()->AdvanceToScreen( UserCreationView::kScreenId); - test::OobeJS().ClickOnPath({"user-creation", "childButton"}); - test::OobeJS().ClickOnPath({"user-creation", "nextButton"}); - test::OobeJS().ClickOnPath({"user-creation", "childCreateButton"}); - test::OobeJS().ClickOnPath({"user-creation", "childNextButton"}); - OobeScreenWaiter(GaiaView::kScreenId).Wait(); -} + OobeScreenWaiter(UserCreationView::kScreenId).Wait(); -IN_PROC_BROWSER_TEST_F(GaiaInfoTest, SkipGaiaInfoForChildSignIn) { - WaitForOobeUI(); - WizardController::default_controller()->AdvanceToScreen( - UserCreationView::kScreenId); test::OobeJS().ClickOnPath({"user-creation", "childButton"}); test::OobeJS().ClickOnPath({"user-creation", "nextButton"}); - test::OobeJS().ClickOnPath({"user-creation", "childSignInButton"}); - test::OobeJS().ClickOnPath({"user-creation", "childNextButton"}); - OobeScreenWaiter(GaiaView::kScreenId).Wait(); + OobeScreenWaiter(AddChildScreenView::kScreenId).Wait(); } class WizardControllerGaiaTest : public GaiaInfoTest { @@ -3226,8 +3215,8 @@ test::OobeJS().ClickOnPath({"user-creation", "childButton"}); test::OobeJS().ClickOnPath({"user-creation", "nextButton"}); - test::OobeJS().ClickOnPath({"user-creation", std::get<1>(GetParam())}); - test::OobeJS().ClickOnPath({"user-creation", "childNextButton"}); + test::OobeJS().ClickOnPath({"add-child", std::get<1>(GetParam())}); + test::OobeJS().ClickOnPath({"add-child", "childNextButton"}); OobeScreenWaiter(GaiaView::kScreenId).Wait();
diff --git a/chrome/browser/ash/printing/cups_proxy_service_delegate_impl.h b/chrome/browser/ash/printing/cups_proxy_service_delegate_impl.h index dd73a96b..8f1fa17 100644 --- a/chrome/browser/ash/printing/cups_proxy_service_delegate_impl.h +++ b/chrome/browser/ash/printing/cups_proxy_service_delegate_impl.h
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "base/task/single_thread_task_runner.h" #include "chrome/browser/ash/printing/printer_configurer.h" @@ -66,10 +67,10 @@ PrinterSetupResult result); // Current/active Profile. Not owned. - Profile* const profile_; + const raw_ptr<Profile, ExperimentalAsh> profile_; // Handle to a CupsPrintersManager associated with profile_. Not owned. - CupsPrintersManager* const printers_manager_; + const raw_ptr<CupsPrintersManager, ExperimentalAsh> printers_manager_; SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<CupsProxyServiceDelegateImpl> weak_factory_{this};
diff --git a/chrome/browser/ash/printing/zeroconf_printer_detector_fuzzer.cc b/chrome/browser/ash/printing/zeroconf_printer_detector_fuzzer.cc index 37570cb..79ff730 100644 --- a/chrome/browser/ash/printing/zeroconf_printer_detector_fuzzer.cc +++ b/chrome/browser/ash/printing/zeroconf_printer_detector_fuzzer.cc
@@ -11,6 +11,7 @@ #include <vector> #include "base/functional/bind.h" +#include "base/memory/raw_ptr.h" #include "base/task/sequenced_task_runner.h" #include "base/test/task_environment.h" #include "chrome/browser/ash/printing/zeroconf_printer_detector.h" @@ -103,7 +104,9 @@ base::Unretained(this))); } - local_discovery::ServiceDiscoveryDeviceLister::Delegate* delegate_ = nullptr; + raw_ptr<local_discovery::ServiceDiscoveryDeviceLister::Delegate, + ExperimentalAsh> + delegate_ = nullptr; std::string service_type_; std::vector<CallToDelegate> calls_; };
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorMediator.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorMediator.java index aabac3f..02ff6fc 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorMediator.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorMediator.java
@@ -202,6 +202,7 @@ .with(DROPDOWN_KEY_VALUE_LIST, getSupportedCountries(isAccountAddressProfile() && mUserFlow != CREATE_NEW_ADDRESS_PROFILE)) + .with(IS_REQUIRED, false) .build(); // Honorific prefix is present only for autofill settings. @@ -212,6 +213,7 @@ .with(LABEL, mContext.getString( R.string.autofill_profile_editor_honorific_prefix)) + .with(IS_REQUIRED, false) .build() : null; @@ -252,6 +254,7 @@ ? new PropertyModel.Builder(TEXT_ALL_KEYS) .with(TEXT_INPUT_TYPE, PLAIN_TEXT_INPUT) .with(LABEL, "Label") + .with(IS_REQUIRED, false) .build() : null; @@ -404,6 +407,8 @@ // into account for the error. field.set(IS_REQUIRED, true); field.set(REQUIRED_ERROR_MESSAGE, message); + } else { + field.set(IS_REQUIRED, false); } final boolean isFullLine = component.isFullLine || component.id == AddressField.LOCALITY
diff --git a/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java b/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java index 08090a6..424b2e39 100644 --- a/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java +++ b/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java
@@ -177,7 +177,7 @@ runOnUiThreadBlocking(() -> { when(mSyncService.isSyncFeatureEnabled()).thenReturn(false); when(mSyncService.getSelectedTypes()).thenReturn(new HashSet()); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); when(mPersonalDataManager.isCountryEligibleForAccountStorage(anyString())) .thenReturn(true);
diff --git a/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/AddressEditorTest.java b/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/AddressEditorTest.java index 2a5066a..8d4f162 100644 --- a/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/AddressEditorTest.java +++ b/chrome/browser/autofill/android/junit/src/org/chromium/chrome/browser/autofill/editors/AddressEditorTest.java
@@ -217,7 +217,7 @@ when(mSyncService.isSyncFeatureEnabled()).thenReturn(false); when(mSyncService.getSelectedTypes()).thenReturn(new HashSet()); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); when(mPersonalDataManager.isCountryEligibleForAccountStorage(anyString())).thenReturn(true); PersonalDataManager.setInstanceForTesting(mPersonalDataManager);
diff --git a/chrome/browser/browsing_data/navigation_entry_remover.cc b/chrome/browser/browsing_data/navigation_entry_remover.cc index b25c336..7366a0a1 100644 --- a/chrome/browser/browsing_data/navigation_entry_remover.cc +++ b/chrome/browser/browsing_data/navigation_entry_remover.cc
@@ -217,13 +217,6 @@ DCHECK(!profile->IsOffTheRecord()); DCHECK(!deletion_info.is_from_expiration()); - // For debugging crbug.com/1424800. Remove once this has been resolved. - LOG(ERROR) << "RemoveNavigationEntries(), deleted_rows count = " - << deletion_info.deleted_rows().size() - << ", is_from_expiration = " << deletion_info.is_from_expiration() - << ", deletion_reason = " - << static_cast<int>(deletion_info.deletion_reason()); - base::flat_set<GURL> url_set; if (!deletion_info.time_range().IsValid()) url_set = CreateUrlSet(deletion_info.deleted_rows());
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 1c737a4..2b129ab 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -144,8 +144,10 @@ #include "chrome/browser/ui/webui/feed_internals/feed_internals_ui.h" #include "chrome/common/offline_page_auto_fetcher.mojom.h" #include "components/commerce/core/commerce_feature_list.h" +#include "components/environment_integrity/android/android_environment_integrity_service.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom.h" +#include "third_party/blink/public/mojom/environment_integrity/environment_integrity_service.mojom.h" #include "third_party/blink/public/mojom/installedapp/installed_app_provider.mojom.h" #else #include "chrome/browser/badging/badge_manager.h" @@ -875,6 +877,10 @@ } map->Add<blink::mojom::ShareService>(base::BindRepeating( &ForwardToJavaWebContents<blink::mojom::ShareService>)); + if (base::FeatureList::IsEnabled(features::kWebEnvironmentIntegrity)) { + map->Add<blink::mojom::EnvironmentIntegrityService>(base::BindRepeating( + &environment_integrity::AndroidEnvironmentIntegrityService::Create)); + } #if BUILDFLAG(ENABLE_UNHANDLED_TAP) map->Add<blink::mojom::UnhandledTapNotifier>(
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 6114a4f4..cc1e161 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5739,6 +5739,17 @@ DCHECK(browser_context); DCHECK(factories); +#if !BUILDFLAG(IS_ANDROID) + if (content::IsolatedWebAppsPolicy::AreIsolatedWebAppsEnabled( + browser_context) && + !browser_context->ShutdownStarted()) { + factories->emplace( + chrome::kIsolatedAppScheme, + web_app::IsolatedWebAppURLLoaderFactory::CreateForServiceWorker( + browser_context)); + } +#endif // !BUILDFLAG(IS_ANDROID) + #if BUILDFLAG(ENABLE_EXTENSIONS) DCHECK(!ChromeContentBrowserClientExtensionsPart:: AreExtensionsDisabledForProfile(browser_context)); @@ -7655,7 +7666,8 @@ content::BrowserContext* browser_context, int32_t error_code) { #if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled(features::kIsolatedWebApps) && + if (content::IsolatedWebAppsPolicy::AreIsolatedWebAppsEnabled( + browser_context) && url.SchemeIs(chrome::kIsolatedAppScheme)) { content::mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_override_info =
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 6157c045..5bce4c7 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -69,6 +69,8 @@ "extensions/login_screen/login/cleanup/cleanup_manager.h", "extensions/login_screen/login/cleanup/extension_cleanup_handler.cc", "extensions/login_screen/login/cleanup/extension_cleanup_handler.h", + "extensions/login_screen/login/cleanup/web_app_cleanup_handler.cc", + "extensions/login_screen/login/cleanup/web_app_cleanup_handler.h", "extensions/login_screen/login/external_logout_request/external_logout_request_event_handler.cc", "extensions/login_screen/login/external_logout_request/external_logout_request_event_handler.h", "extensions/login_screen/login/external_logout_request/external_logout_request_event_handler_factory.cc",
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_ash.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_ash.cc index 1e4f802..85f30b3 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_ash.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_ash.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/files_cleanup_handler.h" #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/lacros_cleanup_handler.h" #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/print_jobs_cleanup_handler.h" +#include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h" namespace chromeos { @@ -27,6 +28,7 @@ constexpr char kFilesCleanupHandlerHistogramName[] = "Files"; constexpr char kLacrosCleanupHandlerHistogramName[] = "Lacros"; constexpr char kPrintJobsCleanupHandlerHistogramName[] = "PrintJobs"; +constexpr char kWebAppCleanupHandlerHistogramName[] = "WebApp"; } // namespace @@ -53,6 +55,8 @@ std::make_unique<PrintJobsCleanupHandler>()}); cleanup_handlers_.insert({kExtensionCleanupHandlerHistogramName, std::make_unique<ExtensionCleanupHandler>()}); + cleanup_handlers_.insert({kWebAppCleanupHandlerHistogramName, + std::make_unique<WebAppCleanupHandler>()}); } } // namespace chromeos
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_lacros.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_lacros.cc index 1b0ae94..58338e4 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_lacros.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_manager_lacros.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/browser_cleanup_handler.h" #include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.h" +#include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h" #include "chromeos/lacros/lacros_service.h" #include "content/public/browser/browser_context.h" @@ -18,6 +19,7 @@ constexpr char kLacrosBrowserCleanupHandlerHistogramName[] = "LacrosBrowser"; constexpr char kLacrosExtensionCleanupHandlerHistogramName[] = "LacrosExtension"; +constexpr char kLacrosWebAppCleanupHandlerHistogramName[] = "LacrosWebApp"; } // namespace @@ -39,6 +41,8 @@ std::make_unique<BrowserCleanupHandler>()}); cleanup_handlers_.insert({kLacrosExtensionCleanupHandlerHistogramName, std::make_unique<ExtensionCleanupHandler>()}); + cleanup_handlers_.insert({kLacrosWebAppCleanupHandlerHistogramName, + std::make_unique<WebAppCleanupHandler>()}); } void CleanupManagerLacros::OnLacrosCleanupTriggered(
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.h b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.h index f4a40547..1dbdcc5 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.h +++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.h
@@ -19,7 +19,6 @@ // By uninstalling the apps/extensions, we make sure all user data is removed // and after that, we reinstall the force-installed, component and external // component extensions. -// TODO(mpetrisor, b:202150852) Add browser tests. class ExtensionCleanupHandler : public CleanupHandler { public: ExtensionCleanupHandler();
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.cc new file mode 100644 index 0000000..54acaf9 --- /dev/null +++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.cc
@@ -0,0 +1,36 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/web_applications/web_app_command_scheduler.h" +#include "chrome/browser/web_applications/web_app_provider.h" + +namespace chromeos { + +WebAppCleanupHandler::WebAppCleanupHandler() = default; + +WebAppCleanupHandler::~WebAppCleanupHandler() = default; + +void WebAppCleanupHandler::Cleanup(CleanupHandlerCallback callback) { + Profile* profile = ProfileManager::GetActiveUserProfile(); + if (!profile) { + std::move(callback).Run("There is no active user"); + return; + } + + auto* provider = web_app::WebAppProvider::GetForWebApps(profile); + if (!provider) { + std::move(callback).Run("There is no WebAppProvider"); + return; + } + + provider->scheduler().UninstallAllUserInstalledWebApps( + webapps::WebappUninstallSource::kHealthcareUserInstallCleanup, + std::move(callback)); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h new file mode 100644 index 0000000..e655021 --- /dev/null +++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h
@@ -0,0 +1,25 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_CLEANUP_WEB_APP_CLEANUP_HANDLER_H_ +#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_CLEANUP_WEB_APP_CLEANUP_HANDLER_H_ + +#include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/cleanup_handler.h" +#include "components/webapps/browser/uninstall_result_code.h" + +namespace chromeos { + +// A cleanup handler which uninstalls the user-installed web apps. +class WebAppCleanupHandler : public CleanupHandler { + public: + WebAppCleanupHandler(); + ~WebAppCleanupHandler() override; + + // CleanupHandler: + void Cleanup(CleanupHandlerCallback callback) override; +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_CLEANUP_WEB_APP_CLEANUP_HANDLER_H_
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler_browsertest.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler_browsertest.cc new file mode 100644 index 0000000..d5871ec --- /dev/null +++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler_browsertest.cc
@@ -0,0 +1,184 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler.h" + +#include <string> + +#include "base/test/test_future.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" +#include "chrome/browser/web_applications/policy/web_app_policy_constants.h" +#include "chrome/browser/web_applications/preinstalled_web_app_manager.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test_observers.h" +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_helpers.h" +#include "chrome/browser/web_applications/web_app_id.h" +#include "chrome/browser/web_applications/web_app_install_info.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/scoped_user_pref_update.h" +#include "components/webapps/browser/installable/installable_metrics.h" +#include "content/public/test/browser_test.h" +#include "url/gurl.h" + +namespace web_app { + +namespace { + +const std::u16string kApp1Title = u"Example App1"; +constexpr char kApp1StartURL[] = "https://example_url1.com/"; +constexpr char kApp1InstallURL[] = "https://example_url1.com/install"; + +constexpr char kApp2InstallURL[] = "https://example_url2.com/install"; + +const std::u16string kApp3Title = u"Example App3"; +constexpr char kApp3StartURL[] = "https://example_url3.com/"; +constexpr char kApp3InstallURL[] = "https://example_url3.com/install"; + +const std::u16string kApp4Title = u"Example App4"; +constexpr char kApp4StartURL[] = "https://example_url4.com/"; +constexpr char kApp4InstallURL[] = "https://example_url4.com/install"; + +} // namespace + +class WebAppCleanupHandlerBrowserTest : public WebAppControllerBrowserTest { + protected: + WebAppCleanupHandlerBrowserTest() = default; + ~WebAppCleanupHandlerBrowserTest() override = default; + + void SetUp() override { + PreinstalledWebAppManager::SkipStartupForTesting(); + WebAppControllerBrowserTest::SetUp(); + } + + AppId InstallWebApp(std::u16string title, + GURL start_url, + GURL install_url, + webapps::WebappInstallSource install_source) { + auto app_info = std::make_unique<WebAppInstallInfo>( + GenerateManifestIdFromStartUrlOnly(start_url)); + app_info->title = title; + app_info->start_url = start_url; + app_info->install_url = install_url; + return test::InstallWebApp(profile(), std::move(app_info), + /*overwrite_existing_manifest_fields=*/false, + install_source); + } + + AppId InstallWebAppFromPolicy(const std::string& install_url) { + WebAppTestInstallWithOsHooksObserver observer(profile()); + observer.BeginListening(); + { + base::Value::Dict app_policy; + app_policy.Set(web_app::kUrlKey, install_url); + ScopedListPrefUpdate update(profile()->GetPrefs(), + prefs::kWebAppInstallForceList); + update->Append(std::move(app_policy)); + } + AppId app_id = observer.Wait(); + return app_id; + } + + WebAppRegistrar& registrar_unsafe() { return provider().registrar_unsafe(); } + + chromeos::WebAppCleanupHandler web_app_cleanup_handler_; +}; + +IN_PROC_BROWSER_TEST_F(WebAppCleanupHandlerBrowserTest, + NoUserInstalledWebApps) { + AppId app_id1 = + InstallWebApp(kApp1Title, GURL(kApp1StartURL), GURL(kApp1InstallURL), + webapps::WebappInstallSource::EXTERNAL_DEFAULT); + AppId app_id2 = InstallWebAppFromPolicy(kApp2InstallURL); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id2)); + + base::test::TestFuture<const absl::optional<std::string>&> future; + web_app_cleanup_handler_.Cleanup(future.GetCallback()); + EXPECT_EQ(future.Get(), absl::nullopt); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id2)); +} + +IN_PROC_BROWSER_TEST_F(WebAppCleanupHandlerBrowserTest, + UninstallsUserInstalledWebApps) { + AppId app_id1 = + InstallWebApp(kApp1Title, GURL(kApp1StartURL), GURL(kApp1InstallURL), + webapps::WebappInstallSource::EXTERNAL_DEFAULT); + AppId app_id2 = InstallWebAppFromPolicy(kApp2InstallURL); + + // User-installed apps. + AppId app_id3 = + InstallWebApp(kApp3Title, GURL(kApp3StartURL), GURL(kApp3InstallURL), + webapps::WebappInstallSource::AUTOMATIC_PROMPT_BROWSER_TAB); + AppId app_id4 = + InstallWebApp(kApp4Title, GURL(kApp4StartURL), GURL(kApp4InstallURL), + webapps::WebappInstallSource::SYNC); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id2)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id3)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id4)); + + base::test::TestFuture<const absl::optional<std::string>&> future; + web_app_cleanup_handler_.Cleanup(future.GetCallback()); + EXPECT_EQ(future.Get(), absl::nullopt); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id2)); + EXPECT_FALSE(registrar_unsafe().IsInstalled(app_id3)); + EXPECT_FALSE(registrar_unsafe().IsInstalled(app_id4)); +} + +IN_PROC_BROWSER_TEST_F(WebAppCleanupHandlerBrowserTest, + DoesNotUninstallUserAndPolicyInstalledApp) { + AppId app_id1 = + InstallWebApp(kApp1Title, GURL(kApp1StartURL), GURL(kApp1InstallURL), + webapps::WebappInstallSource::EXTERNAL_DEFAULT); + AppId app_id2 = InstallWebAppFromPolicy(kApp2InstallURL); + + // App that is both installed by the user and by policy. + AppId app_id3 = + InstallWebApp(kApp3Title, GURL(kApp3InstallURL), GURL(kApp3InstallURL), + webapps::WebappInstallSource::SYNC); + AppId policy_app_id = InstallWebAppFromPolicy(kApp3InstallURL); + EXPECT_EQ(policy_app_id, app_id3); + + // User-installed app. + AppId app_id4 = + InstallWebApp(kApp4Title, GURL(kApp4StartURL), GURL(kApp4InstallURL), + webapps::WebappInstallSource::AUTOMATIC_PROMPT_BROWSER_TAB); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id2)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id3)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id4)); + + // Web App 3 has two install sources out if which one is a user install source + // (kSync). + const WebApp* web_app3 = registrar_unsafe().GetAppById(app_id3); + EXPECT_TRUE(web_app3->GetSources().test(WebAppManagement::kSync)); + EXPECT_TRUE(web_app3->GetSources().test(WebAppManagement::kPolicy)); + + base::test::TestFuture<const absl::optional<std::string>&> future; + web_app_cleanup_handler_.Cleanup(future.GetCallback()); + EXPECT_EQ(future.Get(), absl::nullopt); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id2)); + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id3)); + EXPECT_FALSE(registrar_unsafe().IsInstalled(app_id4)); + + // Web App 3 is still installed but the user install source (kSync) is + // removed. + EXPECT_FALSE(web_app3->GetSources().test(WebAppManagement::kSync)); + EXPECT_TRUE(web_app3->GetSources().test(WebAppManagement::kPolicy)); +} + +} // namespace web_app
diff --git a/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/ShoppingFeatures.java b/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/ShoppingFeatures.java index f7099d9..7f97aec4 100644 --- a/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/ShoppingFeatures.java +++ b/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/ShoppingFeatures.java
@@ -4,8 +4,7 @@ package org.chromium.chrome.browser.commerce; -import androidx.annotation.VisibleForTesting; - +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileManager; import org.chromium.components.commerce.core.ShoppingService; @@ -26,8 +25,8 @@ return service.isShoppingListEligible(); } - @VisibleForTesting public static void setShoppingListEligibleForTesting(Boolean eligible) { sShoppingListEligibleForTestsing = eligible; + ResettersForTesting.register(() -> sShoppingListEligibleForTestsing = null); } -} \ No newline at end of file +}
diff --git a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceDropNotificationManagerImpl.java b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceDropNotificationManagerImpl.java index 9aa89c8..cab7ec4 100644 --- a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceDropNotificationManagerImpl.java +++ b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceDropNotificationManagerImpl.java
@@ -28,6 +28,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.IntentUtils; import org.chromium.base.Log; +import org.chromium.base.ResettersForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.bookmarks.BookmarkModel; import org.chromium.chrome.browser.bookmarks.BookmarkModelObserver; @@ -409,10 +410,10 @@ * * @param notificationManager that will be set. */ - @VisibleForTesting public static void setNotificationManagerForTesting( NotificationManagerProxy notificationManager) { sNotificationManagerForTesting = notificationManager; + ResettersForTesting.register(() -> sNotificationManagerForTesting = null); } /** @@ -420,16 +421,15 @@ * * @param bookmarkModel The bookmark bridge to use. */ - @VisibleForTesting public static void setBookmarkModelForTesting(BookmarkModel bookmarkModel) { sBookmarkModelForTesting = bookmarkModel; + ResettersForTesting.register(() -> sBookmarkModelForTesting = null); } /** * Delete price drop notification channel for testing. */ @Override - @VisibleForTesting @RequiresApi(Build.VERSION_CODES.O) public void deleteChannelForTesting() { mNotificationManager.deleteNotificationChannel(
diff --git a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeatures.java b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeatures.java index 64d1aa1..a34f934 100644 --- a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeatures.java +++ b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeatures.java
@@ -7,6 +7,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.FeatureList; +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.browser.commerce.ShoppingServiceFactory; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; @@ -75,9 +76,9 @@ Profile.getLastUsedRegularProfile()); } - @VisibleForTesting public static void setIsSignedInAndSyncEnabledForTesting(Boolean isSignedInAndSyncEnabled) { sIsSignedInAndSyncEnabledForTesting = isSignedInAndSyncEnabled; + ResettersForTesting.register(() -> sIsSignedInAndSyncEnabledForTesting = null); } /** @@ -127,8 +128,8 @@ return isPriceTrackingEligible(); } - @VisibleForTesting public static void setPriceTrackingEnabledForTesting(Boolean enabled) { sPriceTrackingEnabledForTesting = enabled; + ResettersForTesting.register(() -> sPriceTrackingEnabledForTesting = null); } }
diff --git a/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java b/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java index 5615dcaa..7c198e0 100644 --- a/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java +++ b/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java
@@ -10,7 +10,6 @@ import androidx.test.filters.SmallTest; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; @@ -68,8 +67,7 @@ IdentityServicesProvider.setInstanceForTests(mIdentityServicesProviderMock); when(mIdentityServicesProviderMock.getIdentityManager(any(Profile.class))) .thenReturn(mIdentityManagerMock); - TestThreadUtils.runOnUiThreadBlocking( - () -> SyncServiceFactory.overrideForTests(mSyncServiceMock)); + SyncServiceFactory.setInstanceForTesting(mSyncServiceMock); setMbbStatus(true); setSignedInStatus(true); @@ -77,14 +75,6 @@ PriceTrackingFeatures.setPriceTrackingEnabledForTesting(true); } - @After - public void tearDown() { - TestThreadUtils.runOnUiThreadBlocking(() -> SyncServiceFactory.resetForTests()); - IdentityServicesProvider.setInstanceForTests(null); - PriceTrackingFeatures.setIsSignedInAndSyncEnabledForTesting(null); - PriceTrackingFeatures.setPriceTrackingEnabledForTesting(null); - } - @UiThreadTest @Test @SmallTest
diff --git a/chrome/browser/content_settings/one_time_permission_provider.cc b/chrome/browser/content_settings/one_time_permission_provider.cc index df21b62..af9ee26 100644 --- a/chrome/browser/content_settings/one_time_permission_provider.cc +++ b/chrome/browser/content_settings/one_time_permission_provider.cc
@@ -50,38 +50,42 @@ return false; } - value_map_.GetLock().Acquire(); - // This block handles transitions from Allow Once to Ask/Block by clearing - // the one time grant and letting the pref provider handle the permission as - // usual. - if (constraints.session_model() != content_settings::SessionModel::OneTime) { - value_map_.DeleteValue(primary_pattern, secondary_pattern, - content_settings_type); - value_map_.GetLock().Release(); + // Custom scope because NotifyObservers also requires value_map_'s exclusive + // lock. + { + base::AutoLock lock(value_map_.GetLock()); + + // This block handles transitions from Allow Once to Ask/Block by clearing + // the one time grant and letting the pref provider handle the permission as + // usual. + if (constraints.session_model() != + content_settings::SessionModel::OneTime) { + value_map_.DeleteValue(primary_pattern, secondary_pattern, + content_settings_type); + + permissions::PermissionUmaUtil::RecordOneTimePermissionEvent( + content_settings_type, + permissions::OneTimePermissionEvent::REVOKED_MANUALLY); + + return false; + } + + DCHECK_EQ(content_settings::ValueToContentSetting(value), + CONTENT_SETTING_ALLOW); + + content_settings::RuleMetaData metadata; + base::Time now = clock_->Now(); + metadata.set_last_modified(now); + metadata.SetExpirationAndLifetime(now + base::Days(1), base::Days(1)); + metadata.set_session_model(content_settings::SessionModel::OneTime); + + value_map_.SetValue(primary_pattern, secondary_pattern, + content_settings_type, std::move(value), metadata); permissions::PermissionUmaUtil::RecordOneTimePermissionEvent( content_settings_type, - permissions::OneTimePermissionEvent::REVOKED_MANUALLY); - - return false; + permissions::OneTimePermissionEvent::GRANTED_ONE_TIME); } - - DCHECK_EQ(content_settings::ValueToContentSetting(value), - CONTENT_SETTING_ALLOW); - - content_settings::RuleMetaData metadata; - base::Time now = clock_->Now(); - metadata.set_last_modified(now); - metadata.SetExpirationAndLifetime(now + base::Days(1), base::Days(1)); - metadata.set_session_model(content_settings::SessionModel::OneTime); - - value_map_.SetValue(primary_pattern, secondary_pattern, content_settings_type, - std::move(value), metadata); - - permissions::PermissionUmaUtil::RecordOneTimePermissionEvent( - content_settings_type, - permissions::OneTimePermissionEvent::GRANTED_ONE_TIME); - value_map_.GetLock().Release(); NotifyObservers(primary_pattern, secondary_pattern, content_settings_type); // We need to handle transitions from Allow to Allow Once gracefully. @@ -198,13 +202,15 @@ } rule_iterator.reset(); - value_map_.GetLock().Acquire(); - for (const auto& pattern : patterns_to_delete) { - value_map_.DeleteValue(pattern.primary_pattern, pattern.secondary_pattern, - content_setting_type); + // Custom scope because NotifyObservers also requires value_map_'s exclusive + // lock. + { + base::AutoLock lock(value_map_.GetLock()); + for (const auto& pattern : patterns_to_delete) { + value_map_.DeleteValue(pattern.primary_pattern, pattern.secondary_pattern, + content_setting_type); + } } - value_map_.GetLock().Release(); - for (const auto& pattern : patterns_to_delete) { NotifyObservers(pattern.primary_pattern, pattern.secondary_pattern, content_setting_type);
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc index aaf04f9..bac77d3 100644 --- a/chrome/browser/devtools/devtools_browsertest.cc +++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -42,6 +42,7 @@ #include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/browser/extensions/extension_management_constants.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/unpacked_installer.h" @@ -3114,6 +3115,79 @@ ASSERT_EQ(nullptr, window); } +class DevToolsExtensionHostsPolicyTest : public DevToolsExtensionTest { + protected: + DevToolsExtensionHostsPolicyTest() { + provider_.SetDefaultReturns( + /*is_initialization_complete_return=*/true, + /*is_first_policy_load_complete_return=*/true); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); + } + void SetUpInProcessBrowserTestFixture() override { + DevToolsExtensionTest::SetUpInProcessBrowserTestFixture(); + + base::Value::Dict settings; + settings.Set( + "*", base::Value::Dict() + .Set(extensions::schema_constants::kPolicyBlockedHosts, + base::Value::List().Append("*://*.example.com")) + .Set(extensions::schema_constants::kPolicyAllowedHosts, + base::Value::List().Append("*://public.example.com"))); + + policy::PolicyMap policies; + policies.Set(policy::key::kExtensionSettings, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_CLOUD, base::Value(std::move(settings)), + nullptr); + provider_.UpdateChromePolicy(policies); + } + + void Run(const std::string& test_page, bool expect_success) { + extensions::TestExtensionDir dir; + + dir.WriteManifest( + BuildExtensionManifest("Runtime Hosts Policy", "devtools.html")); + dir.WriteFile( + FILE_PATH_LITERAL("devtools.html"), + "<html><head><script src='devtools.js'></script></head></html>"); + dir.WriteFile(FILE_PATH_LITERAL("devtools.js"), + base::StringPrintf(R"( + chrome.devtools.network.getHAR((result) => { + setInterval(() => { + top.postMessage( + {testOutput: ('isError' in result !== %d) ? 'PASS' : 'FAIL'}, + '*' + ); + }, 10); + });)", + expect_success)); + + const Extension* extension = LoadExtensionFromPath(dir.UnpackedPath()); + ASSERT_TRUE(extension); + RunTest("waitForTestResultsAsMessage", test_page); + } + + testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_; + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(DevToolsExtensionHostsPolicyTest, + CantInspectBlockedHost) { + GURL url(embedded_test_server()->GetURL("example.com", kArbitraryPage)); + Run(url.spec(), /*expect_success*/ false); +} +IN_PROC_BROWSER_TEST_F(DevToolsExtensionHostsPolicyTest, + CantInspectBlockedSubdomainHost) { + GURL url(embedded_test_server()->GetURL("foo.example.com", kArbitraryPage)); + Run(url.spec(), /*expect_success*/ false); +} +IN_PROC_BROWSER_TEST_F(DevToolsExtensionHostsPolicyTest, + CanInspectAllowedHttpHost) { + GURL url( + embedded_test_server()->GetURL("public.example.com", kArbitraryPage)); + Run(url.spec(), /*expect_success*/ true); +} + // Times out. See https://crbug.com/819285. IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsTest, DISABLED_InputDispatchEventsToOOPIF) {
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index a0d37e6a..184855d 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -35,6 +35,7 @@ #include "chrome/browser/devtools/devtools_file_watcher.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/devtools/url_constants.h" +#include "chrome/browser/extensions/extension_management.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" @@ -1542,6 +1543,9 @@ base::Value::List results; base::Value::List component_extension_origins; bool have_user_installed_devtools_extensions = false; + extensions::ExtensionManagement* management = + extensions::ExtensionManagementFactory::GetForBrowserContext( + web_contents_->GetBrowserContext()); for (const scoped_refptr<const extensions::Extension>& extension : registry->enabled_extensions()) { if (extensions::Manifest::IsComponentLocation(extension->location())) { @@ -1564,6 +1568,19 @@ web_contents_->GetPrimaryMainFrame()->GetProcess()->GetID(), url::Origin::Create(extension->url())); + base::Value::List runtime_allowed_hosts; + std::vector<std::string> allowed_hosts = + management->GetPolicyAllowedHosts(extension.get()).ToStringVector(); + for (auto& host : allowed_hosts) { + runtime_allowed_hosts.Append(std::move(host)); + } + base::Value::List runtime_blocked_hosts; + std::vector<std::string> blocked_hosts = + management->GetPolicyBlockedHosts(extension.get()).ToStringVector(); + for (auto& host : blocked_hosts) { + runtime_blocked_hosts.Append(std::move(host)); + } + base::Value::Dict extension_info; extension_info.Set("startPage", url.spec()); extension_info.Set("name", extension->name()); @@ -1572,6 +1589,11 @@ extensions::mojom::APIPermissionID::kExperimental)); extension_info.Set("allowFileAccess", extensions::util::AllowFileAccess( extension->id(), profile_)); + extension_info.Set( + "hostsPolicy", + base::Value::Dict() + .Set("runtimeAllowedHosts", std::move(runtime_allowed_hosts)) + .Set("runtimeBlockedHosts", std::move(runtime_blocked_hosts))); results.Append(std::move(extension_info)); if (!(extensions::Manifest::IsPolicyLocation(extension->location()) ||
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc index d602f985..77246c0 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -17,6 +17,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/rand_util.h" @@ -601,7 +602,19 @@ if (path.MatchesExtension(extensions::kExtensionFileExtension)) return false; #endif - return download_prefs_->IsAutoOpenEnabled(url, path); + + bool should_open = download_prefs_->IsAutoOpenEnabled(url, path); + int64_t file_type_uma_value = + safe_browsing::FileTypePolicies::GetInstance()->UmaValueForFile(path); + if (should_open) { + base::UmaHistogramSparse("SBClientDownload.AutoOpenEnabledFileType", + file_type_uma_value); + } else { + base::UmaHistogramSparse("SBClientDownload.AutoOpenDisabledFileType", + file_type_uma_value); + } + + return should_open; } bool ChromeDownloadManagerDelegate::ShouldAutomaticallyOpenFileByPolicy(
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc index c3d099e..4ba03a98 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -388,7 +388,6 @@ installed); } } - } // namespace // static @@ -743,6 +742,7 @@ case ExtensionInstallPrompt::Result::ACCEPTED: case ExtensionInstallPrompt::Result::ACCEPTED_WITH_WITHHELD_PERMISSIONS: { #if BUILDFLAG(ENABLE_SUPERVISED_USERS) + // TODO(b/202064235): The only user of this branch is ChromeOs v1 flow. supervised_user::SupervisedUserService* service = SupervisedUserServiceFactory::GetForProfile(profile_); // Handle parent permission for child accounts on ChromeOS. @@ -913,6 +913,13 @@ RequestExtensionApproval(contents); return; } +#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + // Shows a parental permission dialog directly bypassing the extension + // install dialog view. The parental permission dialog contains a superset + // of data from the extension install dialog: requested extension + // permissions and also parent's password input. + PromptForParentApproval(); + return; #endif // BUILDFLAG(IS_CHROMEOS) } }
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc index a27a979..2b6869a5 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -512,6 +512,8 @@ private: // Create another embedded test server to avoid starting the same one twice. std::unique_ptr<net::EmbeddedTestServer> embedded_test_server_; + // TODO(b/289179073): Replace ash::LoggedInUserMixin with + // supervised_user::SupervisionMixin so this fixture runs everywhere. ash::LoggedInUserMixin logged_in_user_mixin_; absl::optional<NextDialogAction> next_dialog_action_; base::test::ScopedFeatureList feature_list_;
diff --git a/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java b/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java index 8e9d7c0..c2feb48 100644 --- a/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java +++ b/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java
@@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.chromium.base.ResettersForTesting; import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.feature_engagement.Tracker; @@ -15,7 +16,7 @@ * This factory creates Tracker for the given {@link Profile}. */ public final class TrackerFactory { - private static Tracker sTestTracker; + private static Tracker sTrackerForTesting; // Don't instantiate me. private TrackerFactory() {} @@ -28,7 +29,7 @@ * @return The {@link Tracker} for the given profile object. */ public static Tracker getTrackerForProfile(Profile profile) { - if (sTestTracker != null) return sTestTracker; + if (sTrackerForTesting != null) return sTrackerForTesting; if (profile == null) { throw new IllegalArgumentException("Profile is required for retrieving tracker."); } @@ -47,7 +48,7 @@ } /** - * Set a {@Tracker} to use for testing. All calls to {@link #getTrackerForProfile(Profile)} + * Set a {@Tracker} to use for testing. All calls to {@link #getTrackerForProfile( Profile )} * will return the test tracker rather than the real tracker. * * @param testTracker The {@Tracker} to use for testing, or null if the real tracker should be @@ -55,7 +56,8 @@ */ @VisibleForTesting public static void setTrackerForTests(@Nullable Tracker testTracker) { - sTestTracker = testTracker; + sTrackerForTesting = testTracker; + ResettersForTesting.register(() -> sTrackerForTesting = null); } @NativeMethods
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 03b003b8..86ffe303 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -4124,6 +4124,11 @@ "expiry_milestone": 120 }, { + "name": "fedcm-without-well-known-enforcement", + "owners": ["yigu", "web-identity-eng@google.com"], + "expiry_milestone": 124 + }, + { "name": "feed-ablation", "owners": [ "//chrome/android/feed/OWNERS", "dewittj@chromium.org" ], "expiry_milestone": 105 @@ -6195,7 +6200,7 @@ { "name": "page-info-about-this-site-keep-side-panel-open-on-same-tab-navs", "owners": [ "dullweber", "fsenra@google.com" ], - "expiry_milestone": 116 + "expiry_milestone": 118 }, { "name": "page-info-about-this-site-new-icon",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 326f340..c7344f74 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1631,6 +1631,11 @@ const char kFedCmWithoutThirdPartyCookiesDescription[] = "Allows the FedCM API to be enabled when third party cookies are disabled."; +const char kFedCmWithoutWellKnownEnforcementName[] = + "FedCmWithoutWellKnownEnforcement"; +const char kFedCmWithoutWellKnownEnforcementDescription[] = + "Allows multiple provider urls in IdP's .well-known file."; + const char kFedCmIdpSigninStatusName[] = "FedCmIdpSigninStatus"; const char kFedCmIdpSigninStatusDescription[] = "Enables the FedCM IDP sign-in status API that allows IDPs to notify the " @@ -2988,11 +2993,6 @@ "Splits pinned and unpinned tabs into separate TabStrips under the hood. " "Pure refactoring, no user-visible behavioral changes are included."; -const char kScrollUnificationName[] = "Scroll Unification"; -const char kScrollUnificationDescription[] = - "Refactoring project that eliminates scroll handling code from Blink. " - "Does not affect behavior or performance."; - const char kSearchResultInlineIconName[] = "Search Result Inline Icons"; const char kSearchResultInlineIconDescription[] = "Show iconified text and vector icons "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index f571867..c29debfc 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -918,6 +918,9 @@ extern const char kFedCmWithoutThirdPartyCookiesName[]; extern const char kFedCmWithoutThirdPartyCookiesDescription[]; +extern const char kFedCmWithoutWellKnownEnforcementName[]; +extern const char kFedCmWithoutWellKnownEnforcementDescription[]; + extern const char kWebIdentityMDocsName[]; extern const char kWebIdentityMDocsDescription[]; @@ -1691,9 +1694,6 @@ extern const char kSplitTabStripName[]; extern const char kSplitTabStripDescription[]; -extern const char kScrollUnificationName[]; -extern const char kScrollUnificationDescription[]; - extern const char kSearchResultInlineIconName[]; extern const char kSearchResultInlineIconDescription[];
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoCctProfileManager.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoCctProfileManager.java index 535fa3c..c29e870 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoCctProfileManager.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoCctProfileManager.java
@@ -7,8 +7,8 @@ import android.annotation.SuppressLint; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; +import org.chromium.base.ResettersForTesting; import org.chromium.base.UnownedUserData; import org.chromium.base.UnownedUserDataKey; import org.chromium.build.annotations.CheckDiscard; @@ -77,10 +77,10 @@ } @CheckDiscard("Test-only setter.") - @VisibleForTesting public static void setIncognitoCctProfileManagerForTesting( IncognitoCctProfileManager incognitoCctProfileManager) { sIncognitoCctProfileManagerForTesting = incognitoCctProfileManager; + ResettersForTesting.register(() -> sIncognitoCctProfileManagerForTesting = null); } public Profile getProfile() { @@ -98,4 +98,4 @@ } detach(this); } -} \ No newline at end of file +}
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java index 56d91126..0e4bb559 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java
@@ -7,9 +7,9 @@ import android.os.Build; import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; +import org.chromium.base.ResettersForTesting; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.device_reauth.DeviceAuthRequester; import org.chromium.chrome.browser.device_reauth.ReauthenticatorBridge; @@ -104,9 +104,9 @@ && isIncognitoReauthSettingEnabled(profile); } - @VisibleForTesting public static void setIsIncognitoReauthFeatureAvailableForTesting(Boolean isAvailable) { sIsIncognitoReauthFeatureAvailableForTesting = isAvailable; + ResettersForTesting.register(() -> sIsIncognitoReauthFeatureAvailableForTesting = null); } private static boolean isIncognitoReauthSettingEnabled(Profile profile) {
diff --git a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h index 1d12eee..cf1640e 100644 --- a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h +++ b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h
@@ -141,18 +141,18 @@ // Receives web app control commands from ash. std::unique_ptr<crosapi::WebAppProviderBridgeLacros> web_app_provider_bridge_; - // Receives Chrome app (AKA extension app) events from ash. - std::unique_ptr<LacrosExtensionAppsController> chrome_apps_controller_; - // Sends Chrome app (AKA extension app) events to ash. std::unique_ptr<LacrosExtensionAppsPublisher> chrome_apps_publisher_; - // Receives extension events from ash. - std::unique_ptr<LacrosExtensionAppsController> extensions_controller_; + // Receives Chrome app (AKA extension app) events from ash. + std::unique_ptr<LacrosExtensionAppsController> chrome_apps_controller_; // Sends extension events to ash. std::unique_ptr<LacrosExtensionAppsPublisher> extensions_publisher_; + // Receives extension events from ash. + std::unique_ptr<LacrosExtensionAppsController> extensions_controller_; + // A test controller that is registered with the ash-chrome's test controller // service over crosapi to let tests running in ash-chrome control this Lacros // instance. It is only instantiated in Linux builds AND only when Ash's test
diff --git a/chrome/browser/lacros/lacros_extension_apps_controller.h b/chrome/browser/lacros/lacros_extension_apps_controller.h index cdf8331..7372816 100644 --- a/chrome/browser/lacros/lacros_extension_apps_controller.h +++ b/chrome/browser/lacros/lacros_extension_apps_controller.h
@@ -120,8 +120,7 @@ // The key is the raw pointer to the ExtensionAppsEnableFlow. std::map<void*, std::unique_ptr<apps::ExtensionAppsEnableFlow>> enable_flows_; - raw_ptr<LacrosExtensionAppsPublisher, DanglingUntriaged> publisher_ = - nullptr; // Not owned. + raw_ptr<LacrosExtensionAppsPublisher> publisher_ = nullptr; // Not owned. // Mojo endpoint that's responsible for receiving messages from Ash. mojo::Receiver<crosapi::mojom::AppController> controller_;
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java index d30898b..deaef7ca0 100644 --- a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java +++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java
@@ -171,7 +171,7 @@ when(mUserPrefsJniMock.get(mProfile)).thenReturn(mPrefService); when(mPrefService.getBoolean(Pref.UNENROLLED_FROM_GOOGLE_MOBILE_SERVICES_DUE_TO_ERRORS)) .thenReturn(false); - SyncServiceFactory.overrideForTests(mSyncServiceMock); + SyncServiceFactory.setInstanceForTesting(mSyncServiceMock); when(mSyncServiceMock.isEngineInitialized()).thenReturn(true); when(mSyncServiceMock.getAuthError()).thenReturn(GoogleServiceAuthError.State.NONE); when(mLoadingModalDialogCoordinator.getState()) @@ -269,7 +269,6 @@ @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanUseUpmCheckup() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.getSelectedTypes()) .thenReturn(CollectionUtil.newHashSet(UserSelectableType.PASSWORDS)); when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); @@ -277,59 +276,49 @@ when(mSyncServiceMock.hasSyncConsent()).thenReturn(true); assertTrue(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanNotUseUpmCheckupWithoutPasswordType() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); when(mSyncServiceMock.isEngineInitialized()).thenReturn(true); when(mSyncServiceMock.hasSyncConsent()).thenReturn(true); assertFalse(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanNotUseUpmCheckupWithoutSyncService() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.isEngineInitialized()).thenReturn(false); when(mSyncServiceMock.hasSyncConsent()).thenReturn(true); assertFalse(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanNotUseUpmCheckupWithoutSyncConsent() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.isEngineInitialized()).thenReturn(true); when(mSyncServiceMock.hasSyncConsent()).thenReturn(false); assertFalse(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanNotUseUpmCheckupWithAuthError() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.isEngineInitialized()).thenReturn(true); when(mSyncServiceMock.hasSyncConsent()).thenReturn(true); when(mSyncServiceMock.getAuthError()).thenReturn(State.INVALID_GAIA_CREDENTIALS); assertFalse(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanNotUseUpmCheckupWithNoBackend() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.getSelectedTypes()) .thenReturn(CollectionUtil.newHashSet(UserSelectableType.PASSWORDS)); when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); @@ -339,13 +328,11 @@ when(mBackendSupportHelperMock.isBackendPresent()).thenReturn(false); assertFalse(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testCanUseUpmCheckupWhenBackendUpdateNeeded() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.getSelectedTypes()) .thenReturn(CollectionUtil.newHashSet(UserSelectableType.PASSWORDS)); when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); @@ -357,7 +344,6 @@ when(mBackendSupportHelperMock.isUpdateNeeded()).thenReturn(true); assertTrue(PasswordManagerHelper.canUseUpm()); - SyncServiceFactory.resetForTests(); } @Test @@ -378,8 +364,6 @@ mModalDialogManagerSupplier, /*managePasskeys=*/false); assertNotNull(mModalDialogManager.getCurrentDialogForTest()); - - SyncServiceFactory.resetForTests(); } @Test @@ -399,8 +383,6 @@ PasswordCheckReferrer.SAFETY_CHECK, mSyncServiceMock, mModalDialogManagerSupplier); assertNotNull(mModalDialogManager.getCurrentDialogForTest()); - - SyncServiceFactory.resetForTests(); } @Test @@ -416,8 +398,6 @@ mModalDialogManagerSupplier, /*managePasskeys=*/false); assertNull(mModalDialogManager.getCurrentDialogForTest()); - - SyncServiceFactory.resetForTests(); } @Test @@ -432,8 +412,6 @@ PasswordCheckReferrer.SAFETY_CHECK, mSyncServiceMock, mModalDialogManagerSupplier); assertNull(mModalDialogManager.getCurrentDialogForTest()); - - SyncServiceFactory.resetForTests(); } @Test @@ -462,7 +440,6 @@ @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testResetsUnenrollment() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.getSelectedTypes()) .thenReturn(CollectionUtil.newHashSet(UserSelectableType.PASSWORDS)); when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); @@ -476,14 +453,11 @@ verify(mPrefService) .setBoolean( eq(Pref.UNENROLLED_FROM_GOOGLE_MOBILE_SERVICES_DUE_TO_ERRORS), eq(false)); - - SyncServiceFactory.resetForTests(); } @Test @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testDoesntResetUnenrollmentIfUnnecessary() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.getSelectedTypes()) .thenReturn(CollectionUtil.newHashSet(UserSelectableType.PASSWORDS)); when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); @@ -498,8 +472,6 @@ verify(mPrefService, never()) .setBoolean(eq(Pref.UNENROLLED_FROM_GOOGLE_MOBILE_SERVICES_DUE_TO_ERRORS), anyBoolean()); - - SyncServiceFactory.resetForTests(); } @Test @@ -1376,11 +1348,9 @@ ChromeFeatureList.PASSKEY_MANAGEMENT_USING_ACCOUNT_SETTINGS_ANDROID}) public void testUseAccountSettings() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.isEngineInitialized()).thenReturn(false); assertTrue(PasswordManagerHelper.canUseAccountSettings()); - SyncServiceFactory.resetForTests(); } @Test @@ -1388,13 +1358,11 @@ ChromeFeatureList.PASSKEY_MANAGEMENT_USING_ACCOUNT_SETTINGS_ANDROID}) public void testCannotUseAccountSettingsWithNoBackend() { - SyncServiceFactory.overrideForTests(mSyncServiceMock); when(mSyncServiceMock.isEngineInitialized()).thenReturn(false); when(mBackendSupportHelperMock.isBackendPresent()).thenReturn(false); assertFalse(PasswordManagerHelper.canUseAccountSettings()); - SyncServiceFactory.resetForTests(); } private void chooseToSyncPasswordsWithoutCustomPassphrase() {
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java index b1c4b0f..7a159dd 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java
@@ -118,7 +118,7 @@ mMediator.initializeModel(mModel); IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); } @Test
diff --git a/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc b/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc index 9b2776c..5f33032 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc +++ b/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc
@@ -12,7 +12,6 @@ #include "base/files/scoped_temp_dir.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" -#include "base/memory/singleton.h" #include "base/strings/string_number_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" @@ -31,19 +30,18 @@ #include "components/reporting/encryption/encryption_module_interface.h" #include "components/reporting/encryption/primitives.h" #include "components/reporting/encryption/testing_primitives.h" -#include "components/reporting/encryption/verification.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/storage_selector/storage_selector.h" #include "components/reporting/util/status.h" -#include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" #include "components/reporting/util/test_support_callbacks.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" #include "content/public/test/browser_task_environment.h" -#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" +#endif + using ::testing::_; using ::testing::Eq; using ::testing::Invoke; @@ -291,6 +289,14 @@ const Destination destination_ = Destination::UPLOAD_EVENTS; ReportQueueConfiguration::PolicyCheckCallback policy_checker_callback_ = base::BindRepeating([]() { return Status::StatusOK(); }); + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Required when production code checks device management status. + std::unique_ptr<ash::ScopedStubInstallAttributes> install_attributes_ = + std::make_unique<ash::ScopedStubInstallAttributes>( + ash::StubInstallAttributes::CreateCloudManaged("fake-domain-name", + "fake-device-id")); +#endif }; // Tests that a ReportQueue can be created using the ReportingClient with a DM
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc index 0516154b..20298a6a 100644 --- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc +++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
@@ -4,16 +4,14 @@ #include "chrome/browser/policy/messaging_layer/upload/record_handler_impl.h" +#include <cstddef> #include <memory> #include <utility> #include <vector> #include "base/base64.h" -#include "base/containers/queue.h" #include "base/functional/bind.h" #include "base/functional/callback.h" -#include "base/json/json_reader.h" -#include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/metrics/histogram_functions.h" #include "base/sequence_checker.h" @@ -21,26 +19,21 @@ #include "base/strings/string_number_conversions.h" #include "base/task/bind_post_task.h" #include "base/task/sequenced_task_runner.h" -#include "base/task/task_runner.h" -#include "base/task/thread_pool.h" #include "base/thread_annotations.h" #include "base/token.h" #include "base/values.h" +#include "chrome/browser/policy/management_utils.h" #include "chrome/browser/policy/messaging_layer/proto/synced/log_upload_event.pb.h" -#include "chrome/browser/policy/messaging_layer/public/report_client.h" #include "chrome/browser/policy/messaging_layer/upload/dm_server_uploader.h" #include "chrome/browser/policy/messaging_layer/upload/event_upload_size_controller.h" #include "chrome/browser/policy/messaging_layer/upload/file_upload_job.h" #include "chrome/browser/policy/messaging_layer/upload/record_upload_request_builder.h" #include "chrome/browser/policy/messaging_layer/util/reporting_server_connector.h" -#include "components/reporting/client/report_queue_provider.h" #include "components/reporting/proto/synced/record.pb.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/proto/synced/upload_tracker.pb.h" #include "components/reporting/resources/resource_manager.h" -#include "components/reporting/storage/storage_module_interface.h" #include "components/reporting/util/status.h" -#include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" #include "components/reporting/util/task_runner_context.h" #include "content/public/browser/browser_task_traits.h" @@ -160,6 +153,7 @@ void OnCompletion(const CompletionResponse& result) override; void StartUpload(); + void LogNumRecordsInUpload(size_t num_records); void ResumeUpload(size_t next_record); void FinalizeUpload(); void OnUploadComplete(StatusOr<base::Value::Dict> response); @@ -249,14 +243,31 @@ void RecordHandlerImpl::ReportUploader::StartUpload() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(!records_.empty() || need_encryption_key_); - base::UmaHistogramCounts1000("Browser.ERP.RecordsPerUpload", records_.size()); + // Log size of non-empty uploads. Key-request uploads have no records. + if (!records_.empty()) { + Schedule(&RecordHandlerImpl::ReportUploader::LogNumRecordsInUpload, + base::Unretained(this), records_.size()); + } request_builder_ = std::make_unique<UploadEncryptedReportingRequestBuilder>( need_encryption_key_); ResumeUpload(/*next_record=*/0); } +void RecordHandlerImpl::ReportUploader::LogNumRecordsInUpload( + size_t num_records) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (policy::IsDeviceEnterpriseManaged()) { + base::UmaHistogramCounts1000( + "Browser.ERP.RecordsPerUploadFromManagedDevice", num_records); + } else { // Device is unmanaged. + base::UmaHistogramCounts1000( + "Browser.ERP.RecordsPerUploadFromUnmanagedDevice", num_records); + } +} + void RecordHandlerImpl::ReportUploader::ResumeUpload(size_t next_record) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); while (next_record < records_.size()) { @@ -441,13 +452,13 @@ last_response.FindDictByDottedPath( "firstFailedUploadedRecord.failedUploadedRecord"); if (!force_confirm_ && failed_uploaded_record != nullptr) { - // The record we uploaded previously was unprocessable by the server, if the - // record was after the current |highest_sequence_information_| we should - // return a gap record. A gap record consists of an EncryptedRecord with - // just SequenceInformation. The server will report success for the gap - // record and |highest_sequence_information_| will be updated in the next - // response. In the future there may be recoverable |failureStatus|, but - // for now all the device can do is delete the record. + // The record we uploaded previously was unprocessable by the server, if + // the record was after the current |highest_sequence_information_| we + // should return a gap record. A gap record consists of an EncryptedRecord + // with just SequenceInformation. The server will report success for the + // gap record and |highest_sequence_information_| will be updated in the + // next response. In the future there may be recoverable |failureStatus|, + // but for now all the device can do is delete the record. auto gap_record_result = HandleFailedUploadedSequenceInformation(*failed_uploaded_record); if (gap_record_result.has_value()) { @@ -525,7 +536,8 @@ const auto priority_result = GetPriorityProtoFromSequenceInformationValue(value); - // If any of the previous values don't exist, or are malformed, return error. + // If any of the previous values don't exist, or are malformed, return + // error. int64_t seq_id; int64_t gen_id; if (!sequencing_id || !generation_id || generation_id->empty() ||
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc index 4c1f5be..d55ace7 100644 --- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc +++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
@@ -4,11 +4,10 @@ #include "chrome/browser/policy/messaging_layer/upload/record_handler_impl.h" +#include <memory> #include <utility> -#include "base/base64.h" #include "base/functional/callback_helpers.h" -#include "base/json/json_writer.h" #include "base/memory/scoped_refptr.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" @@ -21,26 +20,26 @@ #include "chrome/browser/policy/messaging_layer/public/report_client_test_util.h" #include "chrome/browser/policy/messaging_layer/upload/dm_server_uploader.h" #include "chrome/browser/policy/messaging_layer/upload/file_upload_job.h" -#include "chrome/browser/policy/messaging_layer/upload/record_upload_request_builder.h" +#include "chrome/browser/policy/messaging_layer/upload/file_upload_job_test_util.h" #include "chrome/browser/policy/messaging_layer/util/reporting_server_connector.h" #include "chrome/browser/policy/messaging_layer/util/reporting_server_connector_test_util.h" #include "chrome/browser/policy/messaging_layer/util/test_request_payload.h" #include "chrome/browser/policy/messaging_layer/util/test_response_payload.h" -#include "components/policy/core/common/cloud/dm_token.h" -#include "components/policy/core/common/cloud/mock_cloud_policy_client.h" #include "components/reporting/proto/synced/record.pb.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/resources/resource_manager.h" #include "components/reporting/storage/test_storage_module.h" #include "components/reporting/util/status.h" -#include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" -#include "components/reporting/util/task_runner_context.h" #include "components/reporting/util/test_support_callbacks.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" +#endif + using ::testing::_; using ::testing::AllOf; using ::testing::Eq; @@ -115,7 +114,8 @@ protected: void SetUp() override { handler_ = std::make_unique<RecordHandlerImpl>( - sequenced_task_runner_, std::make_unique<MockFileUploadDelegate>()); + base::SequencedTaskRunner::GetCurrentDefault(), + std::make_unique<MockFileUploadDelegate>()); test_storage_ = base::MakeRefCounted<test::TestStorageModule>(); test_reporting_ = ReportingClient::TestEnvironment::CreateWithStorageModule( test_storage_); @@ -136,9 +136,8 @@ bool force_confirm() const { return std::get<1>(GetParam()); } content::BrowserTaskEnvironment task_environment_; - const scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_ = - base::ThreadPool::CreateSequencedTaskRunner({}); + FileUploadJob::TestEnvironment manager_test_env_; ReportingServerConnector::TestEnvironment test_env_; scoped_refptr<test::TestStorageModule> test_storage_; @@ -147,6 +146,14 @@ std::unique_ptr<RecordHandlerImpl> handler_; scoped_refptr<ResourceManager> memory_resource_; + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Control device management status for Ash. + std::unique_ptr<ash::ScopedStubInstallAttributes> install_attributes_ = + std::make_unique<ash::ScopedStubInstallAttributes>( + ash::StubInstallAttributes::CreateCloudManaged("fake-domain-name", + "fake-device-id")); +#endif }; std::pair<ScopedReservation, std::vector<EncryptedRecord>>
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc index 8c8a323..1dcccd53 100644 --- a/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc +++ b/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
@@ -4,21 +4,9 @@ #include "chrome/browser/policy/messaging_layer/upload/record_handler_impl.h" -#include "base/base64.h" -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/json/json_writer.h" -#include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "base/strings/strcat.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" #include "base/task/sequenced_task_runner.h" -#include "base/task/task_runner.h" -#include "base/task/thread_pool.h" #include "base/test/task_environment.h" -#include "base/values.h" #include "chrome/browser/policy/messaging_layer/proto/synced/log_upload_event.pb.h" #include "chrome/browser/policy/messaging_layer/public/report_client_test_util.h" #include "chrome/browser/policy/messaging_layer/upload/dm_server_uploader.h" @@ -29,8 +17,6 @@ #include "chrome/browser/policy/messaging_layer/util/reporting_server_connector_test_util.h" #include "chrome/browser/policy/messaging_layer/util/test_request_payload.h" #include "chrome/browser/policy/messaging_layer/util/test_response_payload.h" -#include "components/policy/core/common/cloud/dm_token.h" -#include "components/policy/core/common/cloud/mock_cloud_policy_client.h" #include "components/reporting/proto/synced/record.pb.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/proto/synced/status.pb.h" @@ -38,15 +24,17 @@ #include "components/reporting/resources/resource_manager.h" #include "components/reporting/storage/test_storage_module.h" #include "components/reporting/util/status.h" -#include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" -#include "components/reporting/util/task_runner_context.h" #include "components/reporting/util/test_support_callbacks.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" +#endif + using ::testing::_; using ::testing::AllOf; using ::testing::Between; @@ -154,8 +142,8 @@ test_storage_); auto delegate = std::make_unique<MockFileUploadDelegate>(); delegate_ = delegate.get(); - handler_ = std::make_unique<RecordHandlerImpl>(sequenced_task_runner_, - std::move(delegate)); + handler_ = std::make_unique<RecordHandlerImpl>( + base::SequencedTaskRunner::GetCurrentDefault(), std::move(delegate)); memory_resource_ = base::MakeRefCounted<ResourceManager>(4u * 1024LLu * 1024LLu); // 4 MiB @@ -194,8 +182,6 @@ content::BrowserTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - const scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_ = - base::ThreadPool::CreateSequencedTaskRunner({}); FileUploadJob::TestEnvironment manager_test_env_; ReportingServerConnector::TestEnvironment test_env_; @@ -208,6 +194,14 @@ std::unique_ptr<RecordHandlerImpl> handler_; scoped_refptr<ResourceManager> memory_resource_; + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Control device management status for Ash. + std::unique_ptr<ash::ScopedStubInstallAttributes> install_attributes_ = + std::make_unique<ash::ScopedStubInstallAttributes>( + ash::StubInstallAttributes::CreateCloudManaged("fake-domain-name", + "fake-device-id")); +#endif }; EncryptedRecord ComposeEncryptedRecord(
diff --git a/chrome/browser/preloading/prerender/prerender_manager.cc b/chrome/browser/preloading/prerender/prerender_manager.cc index 50090f1..221e250 100644 --- a/chrome/browser/preloading/prerender/prerender_manager.cc +++ b/chrome/browser/preloading/prerender/prerender_manager.cc
@@ -90,7 +90,7 @@ return url.ReplaceComponents(replacements); } -void CheckAndSetPrerenderHoldbackStatus( +void MarkPreloadingAttemptAsDuplicate( content::PreloadingAttempt* preloading_attempt) { // In addition to the globally-controlled preloading config, check for the // feature-specific holdback. We disable the feature if the user is in either @@ -99,7 +99,10 @@ preloading_attempt->SetHoldbackStatus( content::PreloadingHoldbackStatus::kHoldback); } - preloading_attempt->ShouldHoldback(); + if (!preloading_attempt->ShouldHoldback()) { + preloading_attempt->SetTriggeringOutcome( + PreloadingTriggeringOutcome::kDuplicate); + } } content::PreloadingFailureReason ToPreloadingFailureReason( @@ -356,9 +359,7 @@ preloading_attempt->SetEligibility( content::PreloadingEligibility::kEligible); - CheckAndSetPrerenderHoldbackStatus(preloading_attempt); - preloading_attempt->SetTriggeringOutcome( - PreloadingTriggeringOutcome::kDuplicate); + MarkPreloadingAttemptAsDuplicate(preloading_attempt); return bookmark_prerender_handle_->GetWeakPtr(); } bookmark_prerender_handle_.reset(); @@ -396,11 +397,7 @@ preloading_attempt.SetEligibility( content::PreloadingEligibility::kEligible); - // Check and set the PreloadingHoldbackStatus before setting the - // TriggeringOutcome. - CheckAndSetPrerenderHoldbackStatus(&preloading_attempt); - preloading_attempt.SetTriggeringOutcome( - PreloadingTriggeringOutcome::kDuplicate); + MarkPreloadingAttemptAsDuplicate(&preloading_attempt); return direct_url_input_prerender_handle_->GetWeakPtr(); } @@ -614,11 +611,7 @@ preloading_attempt->SetEligibility( content::PreloadingEligibility::kEligible); - // Check and set the PreloadingHoldbackStatus before setting the - // TriggeringOutcome. - CheckAndSetPrerenderHoldbackStatus(preloading_attempt.get()); - preloading_attempt->SetTriggeringOutcome( - PreloadingTriggeringOutcome::kDuplicate); + MarkPreloadingAttemptAsDuplicate(preloading_attempt.get()); } return false; }
diff --git a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java index 7f9daf8..9d33151 100644 --- a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java +++ b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java
@@ -61,12 +61,11 @@ @Before public void setUp() { - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); } @After public void tearDown() { - SyncServiceFactory.resetForTests(); if (mScenario != null) { mScenario.close(); }
diff --git a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java index fe502bf9..dc32924e 100644 --- a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java +++ b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java
@@ -76,7 +76,7 @@ public void setUp() { Profile.setLastUsedProfileForTesting(mProfile); mocker.mock(UnifiedConsentServiceBridgeJni.TEST_HOOKS, mNativeMock); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); when(mSyncService.getSelectedTypes()).thenReturn(mSyncTypes); mocker.mock(SafeBrowsingBridgeJni.TEST_HOOKS, mSafeBrowsingNativeMock); mocker.mock(UserPrefsJni.TEST_HOOKS, mUserPrefsNativesMock);
diff --git a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImplTest.java b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImplTest.java index b55a5e34c..21a72e8 100644 --- a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImplTest.java +++ b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImplTest.java
@@ -8,7 +8,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -68,16 +67,11 @@ mMocker.mock(WebsitePreferenceBridgeJni.TEST_HOOKS, mWebsitePreferenceNativesMock); - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); mMocker.mock(SafeBrowsingBridgeJni.TEST_HOOKS, mSBNativesMock); mStepDisplayHandler = new StepDisplayHandlerImpl(); } - @After - public void tearDown() { - SyncServiceFactory.resetForTests(); - } - private void setSBState(@SafeBrowsingState int sbState) { when(mSBNativesMock.getSafeBrowsingState()).thenReturn(sbState); }
diff --git a/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java b/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java index 7968cbe..1f3a889 100644 --- a/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java +++ b/chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java
@@ -7,10 +7,10 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.chromium.base.ResettersForTesting; import org.chromium.base.ThreadUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; -import org.chromium.build.annotations.CheckDiscard; import org.chromium.chrome.browser.cookies.CookiesFetcher; import org.chromium.components.profile_metrics.BrowserProfileType; import org.chromium.content_public.browser.BrowserContextHandle; @@ -227,10 +227,9 @@ /** * Sets for testing the profile to be returned by {@link #getLastUsedRegularProfile()}. */ - @CheckDiscard("Test-only setter.") - @VisibleForTesting public static void setLastUsedProfileForTesting(Profile profile) { sLastUsedProfileForTesting = profile; + ResettersForTesting.register(() -> sLastUsedProfileForTesting = null); } @NativeMethods
diff --git a/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java b/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java index 0a03629..d71e47c 100644 --- a/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java +++ b/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteController.java
@@ -62,11 +62,17 @@ mLayoutManager = layoutManager; mDeleteTabsFilter = new QuickDeleteTabsFilter(tabModelSelector.getModel(/*incognito=*/false)); - mDialogDelegate = new QuickDeleteDialogDelegate(context, modalDialogManager, - this::onDialogDismissed, tabModelSelector, mDeleteTabsFilter); + mDialogDelegate = new QuickDeleteDialogDelegate( + context, modalDialogManager, this::onDialogDismissed, tabModelSelector); mAnimationView = animationView; mAnimationView.setBackgroundResource(R.drawable.quick_delete_animation); + + // TODO(crbug.com/1412087): Fetch the domain related data. + QuickDeleteDialogDelegate.QuickDeleteDialogData data = + new QuickDeleteDialogDelegate.QuickDeleteDialogData( + mDeleteTabsFilter.getListOfTabsToBeClosed().size()); + mDialogDelegate.showDialog(data); } /** @@ -77,13 +83,6 @@ } /** - * A method responsible for triggering the quick delete flow. - */ - public void triggerQuickDeleteFlow() { - mDialogDelegate.showDialog(); - } - - /** * A method called when the user confirms or cancels the dialog. */ private void onDialogDismissed(@DialogDismissalCause int dismissalCause) {
diff --git a/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegate.java b/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegate.java index 2d505ece..b450586 100644 --- a/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegate.java +++ b/chrome/browser/quick_delete/android/java/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegate.java
@@ -13,6 +13,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import org.chromium.base.Callback; import org.chromium.chrome.browser.profiles.Profile; @@ -40,7 +41,6 @@ private final @NonNull Context mContext; private final @NonNull Callback<Integer> mOnDismissCallback; private final @NonNull TabModelSelector mTabModelSelector; - private final @NonNull QuickDeleteTabsFilter mQuickDeleteTabsFilter; /**The {@link PropertyModel} of the underlying dialog where the quick dialog view would be * shown.*/ private PropertyModel mModalDialogPropertyModel; @@ -68,6 +68,28 @@ }; /** + * Stores the data needed for the dialog. + * + * TODO(crbug.com/1412087): Update the class to include domain related data. + */ + static class QuickDeleteDialogData { + private final int mTabsToCloseCount; + + /** + * @param tabsToCloseCount the count of tabs that the user visited within range and will + * be closed with the deletion. + */ + QuickDeleteDialogData(int tabsToCloseCount) { + mTabsToCloseCount = tabsToCloseCount; + } + + @VisibleForTesting + QuickDeleteDialogData() { + mTabsToCloseCount = 0; + } + } + + /** * @param context The associated {@link Context}. * @param modalDialogManager A {@link ModalDialogManager} responsible for showing the quick * delete modal dialog. @@ -76,28 +98,23 @@ * cancels the deletion; * @param tabModelSelector {@link TabModelSelector} to use for opening the links in search * history disambiguation notice. - * @param quickDeleteTabsFilter {@link QuickDeleteTabsFilter} which is used to get the list of - * tabs which would be closed. */ QuickDeleteDialogDelegate(@NonNull Context context, @NonNull ModalDialogManager modalDialogManager, @NonNull Callback<Integer> onDismissCallback, - @NonNull TabModelSelector tabModelSelector, - @NonNull QuickDeleteTabsFilter quickDeleteTabsFilter) { + @NonNull TabModelSelector tabModelSelector) { mContext = context; mModalDialogManager = modalDialogManager; mOnDismissCallback = onDismissCallback; mTabModelSelector = tabModelSelector; - mQuickDeleteTabsFilter = quickDeleteTabsFilter; } /** * A method to create the dialog attributes for the quick delete dialog. - * - * TODO(crbug.com/1412087): Update the browsing history text as per the mocks and update the - * screenshot for Quick Delete strings in android_chrome_strings.grd + * @param quickDeleteDialogData The dialog related data. */ - private PropertyModel createQuickDeleteDialogProperty() { + private PropertyModel createQuickDeleteDialogProperty( + @NonNull QuickDeleteDialogData quickDeleteDialogData) { View quickDeleteDialogView = LayoutInflater.from(mContext).inflate(R.layout.quick_delete_dialog, /*root=*/null); @@ -109,7 +126,7 @@ // Add the tabs close row. TextViewWithCompoundDrawables quickDeleteTabsCloseRow = quickDeleteDialogView.findViewById(R.id.quick_delete_tabs_close_row); - addTabsCloseRowIfAvailable(quickDeleteTabsCloseRow); + addTabsCloseRowIfAvailable(quickDeleteTabsCloseRow, quickDeleteDialogData); // Add search history disambiguation notice. TextViewWithClickableSpans searchHistoryDisambiguation = @@ -161,14 +178,14 @@ /** * Checks whether the user has any tabs in range to close and updates the views accordingly. * @param row The tabs close row view. + * @param data The dialog related data. */ - private void addTabsCloseRowIfAvailable(@NonNull TextViewWithCompoundDrawables row) { - final int countOfTabsToBeClosed = mQuickDeleteTabsFilter.getListOfTabsToBeClosed().size(); - - if (countOfTabsToBeClosed > 0) { + private void addTabsCloseRowIfAvailable( + @NonNull TextViewWithCompoundDrawables row, @NonNull QuickDeleteDialogData data) { + if (data.mTabsToCloseCount > 0) { String tabDescription = mContext.getResources().getQuantityString( - R.plurals.quick_delete_dialog_tabs_closed_text, countOfTabsToBeClosed, - countOfTabsToBeClosed); + R.plurals.quick_delete_dialog_tabs_closed_text, data.mTabsToCloseCount, + data.mTabsToCloseCount); row.setText(tabDescription); } else { row.setVisibility(View.GONE); @@ -226,9 +243,10 @@ /** * Shows the Quick delete dialog. + * @param quickDeleteDialogData The dialog related data. */ - void showDialog() { - mModalDialogPropertyModel = createQuickDeleteDialogProperty(); + void showDialog(@NonNull QuickDeleteDialogData quickDeleteDialogData) { + mModalDialogPropertyModel = createQuickDeleteDialogProperty(quickDeleteDialogData); mModalDialogManager.showDialog( mModalDialogPropertyModel, ModalDialogManager.ModalDialogType.APP); }
diff --git a/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegateUnitTest.java b/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegateUnitTest.java index e8f9b15..9b0b16bc 100644 --- a/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegateUnitTest.java +++ b/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteDialogDelegateUnitTest.java
@@ -47,8 +47,6 @@ import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager; import org.chromium.ui.widget.TextViewWithClickableSpans; -import java.util.List; - /** * Unit tests for Quick Delete dialog. */ @@ -69,10 +67,6 @@ private TabModel mTabModelMock; @Mock private IdentityManager mIdentityManagerMock; - @Mock - private QuickDeleteTabsFilter mQuickDeleteTabsFilterMock; - @Mock - private List<Tab> mClosedTabListMock; private FakeModalDialogManager mModalDialogManager; @@ -107,9 +101,9 @@ @SmallTest public void testCancelQuickDelete() { setSignedInStatus(false); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData()); mModalDialogManager.clickNegativeButton(); verify(mOnDismissCallbackMock, times(1)) @@ -120,9 +114,9 @@ @SmallTest public void testConfirmQuickDelete() { setSignedInStatus(false); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData()); mModalDialogManager.clickPositiveButton(); verify(mOnDismissCallbackMock, times(1)) @@ -133,9 +127,9 @@ @SmallTest public void testSearchHistoryDisambiguationNotShown_WhenUserIsSignedOut() { setSignedInStatus(false); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData()); View dialogView = mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW); @@ -150,9 +144,9 @@ @SmallTest public void testSearchHistoryDisambiguation_SearchHistoryLink() { setSignedInStatus(true); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData()); View dialogView = mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW); @@ -176,9 +170,9 @@ @SmallTest public void testSearchHistoryDisambiguation_OtherActivityLink() { setSignedInStatus(true); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData()); View dialogView = mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW); @@ -201,12 +195,9 @@ @Test @SmallTest public void testTabsToBeClosed_ZeroTabs_RemovesTheTabsClosedText() { - when(mClosedTabListMock.size()).thenReturn(0); - when(mQuickDeleteTabsFilterMock.getListOfTabsToBeClosed()).thenReturn(mClosedTabListMock); - - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData()); View dialogView = mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW); @@ -219,12 +210,10 @@ @SmallTest public void testTabsToBeClosed_OneTab_UpdatesTabsClosedText_Singular() { final int tabsToBeClosed = 1; - when(mClosedTabListMock.size()).thenReturn(tabsToBeClosed); - when(mQuickDeleteTabsFilterMock.getListOfTabsToBeClosed()).thenReturn(mClosedTabListMock); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData(tabsToBeClosed)); View dialogView = mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW); @@ -241,12 +230,10 @@ @SmallTest public void testTabsToBeClosed_MultipleTab_UpdatesTabsClosedText_Plural() { final int tabsToBeClosed = 2; - when(mClosedTabListMock.size()).thenReturn(tabsToBeClosed); - when(mQuickDeleteTabsFilterMock.getListOfTabsToBeClosed()).thenReturn(mClosedTabListMock); - new QuickDeleteDialogDelegate(mActivity, mModalDialogManager, mOnDismissCallbackMock, - mTabModelSelectorMock, mQuickDeleteTabsFilterMock) - .showDialog(); + new QuickDeleteDialogDelegate( + mActivity, mModalDialogManager, mOnDismissCallbackMock, mTabModelSelectorMock) + .showDialog(new QuickDeleteDialogDelegate.QuickDeleteDialogData(tabsToBeClosed)); View dialogView = mModalDialogManager.getShownDialogModel().get(ModalDialogProperties.CUSTOM_VIEW);
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 473eb719..b20438d9 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -269,6 +269,7 @@ "components/security_token_pin.js", "components/throbber_notice.js", "screens/common/adb_sideloading.js", + "screens/common/add_child.js", "screens/common/app_downloading.js", "screens/common/app_launch_splash.js", "screens/common/assistant_optin.js",
diff --git a/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.css b/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.css index 3c9ab7b2..b625016 100644 --- a/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.css +++ b/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.css
@@ -62,6 +62,11 @@ --iron-icon-width: 48px; } +:host-context(.jelly-enabled) .card-icon { + --iron-icon-height: 40px; + --iron-icon-width: 40px; +} + .card-content { padding-inline-end: 24px; padding-inline-start: 24px; @@ -75,7 +80,41 @@ line-height: var(--oobe-radio-card-label-line-height); } +:host-context(.jelly-enabled) .card-label { + color: var(--cros-sys-on_surface); + font-family: var(--cros-button-1-font-family); + font-size: var(--cros-button-1-font-size); + font-weight: var(--cros-button-1-font-weight); + line-height: var(--cros-button-1-line-height); +} + +:host-context(.jelly-enabled) cr-card-radio-button[checked] .card-label { + color: var(--cros-sys-on_primary_container); +} + .card-text { color: var(--oobe-text-color); line-height: 20px; } + +:host-context(.jelly-enabled) .card-text { + color: var(--cros-sys-on_surface_variant); + font-family: var(--cros-body-2-font-family); + font-size: var(--cros-body-2-font-size); + font-weight: var(--cros-body-2-font-weight); + line-height: var(--cros-body-2-line-height); +} + +:host-context(.jelly-enabled) cr-card-radio-button[checked] .card-text { + color: var(--cros-sys-on_primary_container); +} + +:host-context(.jelly-enabled) cr-card-radio-button[checked] { + background-color: var(--cros-sys-primary_container); + --cr-checked-color: var(--cros-sys-on_primary_container); + --iron-icon-height: 20px; + --iron-icon-width: 20px; +} + +/* TODO(b/289211091); Implement logic to change icon fill color depending on +the selection state. */
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.html b/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.html index 85610baf..ab8097f3 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.html
@@ -4,7 +4,7 @@ found in the LICENSE file. --> -<style include="oobe-common-styles"> +<style include="oobe-common-styles cros-color-overrides"> :host { display: flex; min-height: 0;
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js b/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js index b5778a8..915b5db0 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js +++ b/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; import '//resources/cr_elements/cr_toggle/cr_toggle.js'; import '//resources/cr_elements/cr_shared_vars.css.js'; import './common_styles/oobe_common_styles.css.js'; @@ -52,4 +53,4 @@ } } -customElements.define(OobeA11yOption.is, OobeA11yOption); \ No newline at end of file +customElements.define(OobeA11yOption.is, OobeA11yOption);
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.html b/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.html index f17670b..ed49be9 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.html
@@ -4,7 +4,7 @@ found in the LICENSE file. --> -<style include="md-select"> +<style include="md-select cros-color-overrides"> :host { font-size: var(--oobe-select-font-size); line-height: var(--oobe-select-line-height);
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.js b/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.js index 3a8059af..4f01867 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.js +++ b/chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; import '//resources/cr_elements/md_select.css.js'; import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_vars/oobe_custom_vars.css b/chrome/browser/resources/chromeos/login/components/oobe_vars/oobe_custom_vars.css index 47ddfd6..23d3815 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_vars/oobe_custom_vars.css +++ b/chrome/browser/resources/chromeos/login/components/oobe_vars/oobe_custom_vars.css
@@ -226,10 +226,9 @@ --oobe-optin-title-font-family: var(--cros-button-2-font-family); --oobe-optin-title-font-weight: var(--cros-button-2-font-weight); - /* TODO(b/287611153): Replace this with display0 token when ready. */ - --oobe-welcome-header-font-size: 52px; - --oobe-welcome-header-line-height: 60px; + --oobe-welcome-header-font-size: var(--cros-display-0-font-size); --oobe-welcome-header-font-weight: 400; /* regular */ + --oobe-welcome-header-line-height: var(--cros-display-0-line-height); --oobe-welcome-subheader-font-size: var(--cros-display-6_regular-font-size); @@ -238,8 +237,7 @@ } html.simon-enabled { - /* TODO(b/287611153): Replace this with display0 token when ready. */ - --oobe-welcome-header-font-size: 52px; - --oobe-welcome-header-line-height: 60px; + --oobe-welcome-header-font-size: var(--cros-display-0-font-size); --oobe-welcome-header-font-weight: 400; /* regular */ + --oobe-welcome-header-line-height: var(--cros-display-0-line-height); }
diff --git a/chrome/browser/resources/chromeos/login/screens.js b/chrome/browser/resources/chromeos/login/screens.js index a588850..6d3030f4 100644 --- a/chrome/browser/resources/chromeos/login/screens.js +++ b/chrome/browser/resources/chromeos/login/screens.js
@@ -7,6 +7,7 @@ // COMMON SCREENS import './screens/common/adb_sideloading.js'; +import './screens/common/add_child.js'; import './screens/common/app_downloading.js'; import './screens/common/app_launch_splash.js'; import './screens/common/assistant_optin.js'; @@ -73,6 +74,7 @@ */ export const commonScreensList = [ {tag: 'adb-sideloading-element', id: 'adb-sideloading'}, + {tag: 'add-child-element', id: 'add-child'}, {tag: 'app-downloading-element', id: 'app-downloading'}, {tag: 'app-launch-splash-element', id: 'app-launch-splash'}, {tag: 'assistant-optin-element', id: 'assistant-optin-flow'},
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index a214d6f..7fa5520 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -27,6 +27,7 @@ ] deps = [ ":adb_sideloading", + ":add_child", ":app_downloading", ":app_launch_splash", @@ -93,6 +94,18 @@ extra_deps = [ ":web_components" ] } +js_library("add_child") { + sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/add_child.js" ] + deps = [ + "../../components/behaviors:login_screen_behavior", + "../../components/behaviors:multi_step_behavior", + "../../components/behaviors:oobe_i18n_behavior", + "../../components/buttons:oobe_text_button", + "../../components/dialogs:oobe_adaptive_dialog", + ] + extra_deps = [ ":web_components" ] +} + js_library("app_downloading") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js" ] deps = [ @@ -721,6 +734,7 @@ html_to_js("web_components") { js_files = [ "adb_sideloading.js", + "add_child.js", "cryptohome_recovery_setup.js", "app_downloading.js", "app_launch_splash.js",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/add_child.html b/chrome/browser/resources/chromeos/login/screens/common/add_child.html new file mode 100644 index 0000000..c48e33e --- /dev/null +++ b/chrome/browser/resources/chromeos/login/screens/common/add_child.html
@@ -0,0 +1,77 @@ +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> +<style include="oobe-dialog-host-styles cr-card-radio-group-styles"> +@media screen and (max-width: 920px) { + :host { + --radio-button-height: 155px; + } + } + + .help-text { + color: var(--oobe-subheader-text-color); + margin-top: 16px; + } +</style> +<oobe-adaptive-dialog id="childSignInDialog" role="dialog" + for-step="overview" + aria-label$="[[i18nDynamic(locale, 'childSignInTitle')]]"> + <iron-icon slot="icon" icon="oobe-32:family"></iron-icon> + <h1 slot="title"> + [[i18nDynamic(locale, 'childSignInTitle')]] + </h1> + <div slot="subtitle"> + [[i18nDynamic(locale, 'childSignInSubtitle')]] + <a id="learnMoreLink" class="oobe-local-link" + on-click="onLearnMoreClicked_" is="action-link"> + [[i18nDynamic(locale, 'childSignInLearnMore')]] + </a> + </div> + <div slot="content" class="layout vertical landscape-vertical-centered"> + <cr-radio-group id="childSignInMethod" + selected="{{selectedSignInMethod}}"> + <cr-card-radio-button id="childCreateButton" name="create" + class="flex focus-on-show"> + <div class="card-container"> + <hd-iron-icon class="card-icon" icon1x="oobe-48:person-add" + icon2x="oobe-96:person-add"> + </hd-iron-icon> + <div class="card-content card-label"> + [[i18nDynamic(locale, 'createAccountForChildLabel')]] + </div> + </div> + </cr-card-radio-button> + <cr-card-radio-button id="childSignInButton" name="signin" + class="flex"> + <div class="card-container"> + <hd-iron-icon class="card-icon" icon1x="oobe-48:supervised-user" + icon2x="oobe-96:supervised-user"> + </hd-iron-icon> + <div class="card-content card-label"> + [[i18nDynamic(locale, 'signInForChildLabel')]] + </div> + </div> + </cr-card-radio-button> + </cr-radio-group> + <div class="help-text"> + [[i18nDynamic(locale, 'childSignInParentNotificationText')]] + </div> + </div> + <div slot="back-navigation"> + <oobe-back-button id="childBackButton" on-click="onBackClicked_"> + </oobe-back-button> + </div> + <div slot="bottom-buttons"> + <oobe-next-button id="childNextButton" on-click="onNextClicked_" + disabled="[[!selectedSignInMethod]]"> + </oobe-next-button> + </div> +</oobe-adaptive-dialog> +<oobe-modal-dialog id="learnMoreDialog" on-close="focusLearnMoreLink_" + title-key="childSignInLearnMoreDialogTitle"> + <div slot="content" class="card-text"> + [[i18nDynamic(locale, 'childSignInLearnMoreDialogText')]] + </div> +</oobe-modal-dialog> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/screens/common/add_child.js b/chrome/browser/resources/chromeos/login/screens/common/add_child.js new file mode 100644 index 0000000..10a07e7 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/screens/common/add_child.js
@@ -0,0 +1,156 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +/** + * @fileoverview Polymer element for add child screen. + */ + + +import '//resources/cr_elements/cr_radio_button/cr_card_radio_button.js'; +import '//resources/cr_elements/cr_radio_group/cr_radio_group.js'; +import '//resources/js/action_link.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import '../../components/hd_iron_icon.js'; +import '../../components/oobe_icons.html.js'; +import '../../components/common_styles/oobe_common_styles.css.js'; +import '../../components/common_styles/cr_card_radio_group_styles.css.js'; +import '../../components/common_styles/oobe_dialog_host_styles.css.js'; +import '../../components/dialogs/oobe_adaptive_dialog.js'; + +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; +import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; +import {OobeI18nBehavior} from '../../components/behaviors/oobe_i18n_behavior.js'; +import {OobeModalDialog} from '../../components/dialogs/oobe_modal_dialog.js'; +import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; +import {Oobe} from '../../cr_ui.js'; + + +/** + * @constructor + * @extends {PolymerElement} + * @implements {LoginScreenBehaviorInterface} + * @implements {MultiStepBehaviorInterface} + */ +const AddChildScreenElementBase = mixinBehaviors( + [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], PolymerElement); + +/** + * Sign in method for setting up the device for child. + * @enum {string} + */ +const AddChildSignInMethod = { + CREATE: 'create', + SIGNIN: 'signin', + +}; + +/** + * Available user actions. + * @enum {string} + */ +const UserAction = { + CREATE: 'child-account-create', + SIGNIN: 'child-signin', + BACK: 'child-back', +}; + +/** + * UI mode for the dialog. + * @enum {string} + */ +const AddChildUIStep = { + OVERVIEW: 'overview', +}; + +/** + * @typedef {{ + * learnMoreDialog: OobeModalDialog, + * learnMoreLink: HTMLAnchorElement, + * }} + */ +AddChildScreenElementBase.$; + + +/** + * @polymer + */ +class AddChildScreen extends AddChildScreenElementBase { + static get is() { + return 'add-child-element'; + } + + static get template() { + return html`{__html_template__}`; + } + + static get properties() { + return { + /** + * The currently selected sign in method. + */ + selectedSignInMethod: { + type: String, + }, + }; + } + + constructor() { + super(); + this.selectedSignInMethod = ''; + } + + + get EXTERNAL_API() { + return []; + } + + onBeforeShow() { + this.selectedSignInMethod = ''; + } + + /** @override */ + ready() { + super.ready(); + this.initializeLoginScreen('AddChildScreen'); + } + + get UI_STEPS() { + return AddChildUIStep; + } + + defaultUIStep() { + return AddChildUIStep.OVERVIEW; + } + + getOobeUIInitialState() { + return OOBE_UI_STATE.GAIA_SIGNIN; + } + + cancel() { + this.onBackClicked_(); + } + + onBackClicked_() { + this.userActed(UserAction.BACK); + } + + onNextClicked_() { + if (this.selectedSignInMethod === AddChildSignInMethod.CREATE) { + this.userActed(UserAction.CREATE); + } else if (this.selectedSignInMethod === AddChildSignInMethod.SIGNIN) { + this.userActed(UserAction.SIGNIN); + } + } + + onLearnMoreClicked_() { + this.$.learnMoreDialog.showDialog(); + } + + focusLearnMoreLink_() { + this.$.learnMoreLink.focus(); + } +} + +customElements.define(AddChildScreen.is, AddChildScreen);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_trial.html b/chrome/browser/resources/chromeos/login/screens/common/os_trial.html index d31762b..25cb5d1a 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/os_trial.html +++ b/chrome/browser/resources/chromeos/login/screens/common/os_trial.html
@@ -1,4 +1,5 @@ -<style include="oobe-dialog-host-styles cr-card-radio-group-styles"> +<style include="oobe-dialog-host-styles cr-card-radio-group-styles + cros-color-overrides"> @media screen and (max-width: 920px) { :host { --radio-button-height: 155px;
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_trial.js b/chrome/browser/resources/chromeos/login/screens/common/os_trial.js index 7b5a5780..f58133b 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/os_trial.js +++ b/chrome/browser/resources/chromeos/login/screens/common/os_trial.js
@@ -6,6 +6,7 @@ * @fileoverview Polymer element for OS trial screen. */ +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; import '//resources/cr_elements/cr_radio_button/cr_radio_button.js'; import '//resources/cr_elements/cr_radio_group/cr_radio_group.js'; import '//resources/cr_elements/cr_shared_vars.css.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html index 815535c..f007102 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html +++ b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html
@@ -3,7 +3,8 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<style include="oobe-dialog-host-styles cr-card-radio-group-styles"> +<style include="oobe-dialog-host-styles cr-card-radio-group-styles + cros-color-overrides"> * { transition: color 250ms linear, background-color 250ms linear; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js index ac0d65a..825769c 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js +++ b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js
@@ -4,6 +4,7 @@ /** * @fileoverview Polymer element for theme selection screen. */ +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; import '//resources/cr_elements/cr_radio_button/cr_radio_button.js'; import '//resources/cr_elements/cr_radio_group/cr_radio_group.js'; import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/user_creation.html b/chrome/browser/resources/chromeos/login/screens/common/user_creation.html index c2b386db..aab57b0b 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/user_creation.html +++ b/chrome/browser/resources/chromeos/login/screens/common/user_creation.html
@@ -4,16 +4,13 @@ found in the LICENSE file. --> -<style include="oobe-dialog-host-styles cr-card-radio-group-styles"> +<style include="oobe-dialog-host-styles cr-card-radio-group-styles + cros-color-overrides"> @media screen and (max-width: 920px) { :host { --radio-button-height: 155px; } } - .help-text { - color: var(--oobe-subheader-text-color); - margin-top: 16px; - } </style> <oobe-adaptive-dialog id="userCreationDialog" for-step="create" role="presentation" aria-live="polite"> @@ -70,62 +67,4 @@ </oobe-next-button> </div> </oobe-adaptive-dialog> -<oobe-adaptive-dialog id="childSignInDialog" role="dialog" for-step="child" - aria-label$="[[i18nDynamic(locale, 'childSignInTitle')]]"> - <iron-icon slot="icon" icon="oobe-32:family"></iron-icon> - <h1 slot="title"> - [[i18nDynamic(locale, 'childSignInTitle')]] - </h1> - <div slot="subtitle"> - [[i18nDynamic(locale, 'childSignInSubtitle')]] - <a id="learnMoreLink" class="oobe-local-link" - on-click="onLearnMoreClicked_" is="action-link"> - [[i18nDynamic(locale, 'childSignInLearnMore')]] - </a> - </div> - <div slot="content" class="layout vertical landscape-vertical-centered"> - <cr-radio-group id="childSignInMethod" - selected="{{selectedSignInMethod}}"> - <cr-card-radio-button id="childCreateButton" name="create" - class="flex focus-on-show"> - <div class="card-container"> - <hd-iron-icon class="card-icon" icon1x="oobe-48:person-add" - icon2x="oobe-96:person-add"> - </hd-iron-icon> - <div class="card-content card-label"> - [[i18nDynamic(locale, 'createAccountForChildLabel')]] - </div> - </div> - </cr-card-radio-button> - <cr-card-radio-button id="childSignInButton" name="signin" - class="flex"> - <div class="card-container"> - <hd-iron-icon class="card-icon" icon1x="oobe-48:supervised-user" - icon2x="oobe-96:supervised-user"> - </hd-iron-icon> - <div class="card-content card-label"> - [[i18nDynamic(locale, 'signInForChildLabel')]] - </div> - </div> - </cr-card-radio-button> - </cr-radio-group> - <div class="help-text"> - [[i18nDynamic(locale, 'childSignInParentNotificationText')]] - </div> - </div> - <div slot="back-navigation"> - <oobe-back-button id="childBackButton" on-click="onBackClicked_"> - </oobe-back-button> - </div> - <div slot="bottom-buttons"> - <oobe-next-button id="childNextButton" on-click="onNextClicked_" - disabled="[[!selectedSignInMethod]]"> - </oobe-next-button> - </div> -</oobe-adaptive-dialog> -<oobe-modal-dialog id="learnMoreDialog" on-close="focusLearnMoreLink_" - title-key="childSignInLearnMoreDialogTitle"> - <div slot="content" class="card-text"> - [[i18nDynamic(locale, 'childSignInLearnMoreDialogText')]] - </div> -</oobe-modal-dialog> +
diff --git a/chrome/browser/resources/chromeos/login/screens/common/user_creation.js b/chrome/browser/resources/chromeos/login/screens/common/user_creation.js index 1426dd7..93d26aa 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/user_creation.js +++ b/chrome/browser/resources/chromeos/login/screens/common/user_creation.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; import '//resources/cr_elements/cr_radio_button/cr_card_radio_button.js'; import '//resources/cr_elements/cr_radio_group/cr_radio_group.js'; import '//resources/js/action_link.js'; @@ -39,7 +39,6 @@ */ const UserCreationUIState = { CREATE: 'create', - CHILD: 'child', }; /** @@ -51,22 +50,6 @@ CHILD: 'child', }; -/** - * Sign in method for setting up the device for child. - * @enum {string} - */ -const UserCreationSignInMethod = { - CREATE: 'create', - SIGNIN: 'signin', -}; - -/** - * @typedef {{ - * learnMoreDialog: OobeModalDialog, - * learnMoreLink: HTMLAnchorElement, - * }} - */ -UserCreationScreenElementBase.$; class UserCreation extends UserCreationScreenElementBase { static get is() { @@ -87,13 +70,6 @@ }, /** - * The currently selected sign in method. - */ - selectedSignInMethod: { - type: String, - }, - - /** * Is the back button visible on the first step of the screen. Back button * is visible iff we are in the add person flow. * @private @@ -139,15 +115,11 @@ onBeforeShow() { this.selectedUserType = UserCreationUserType.SELF; - this.selectedSignInMethod = ''; this.titleKey_ = this.isBackButtonVisible_ ? 'userCreationAddPersonTitle' : 'userCreationTitle'; this.subtitleKey_ = this.isBackButtonVisible_ ? 'userCreationAddPersonSubtitle' : 'userCreationSubtitle'; - if (this.uiStep === UserCreationUIState.CHILD) { - Oobe.getInstance().setOobeUIState(OOBE_UI_STATE.GAIA_SIGNIN); - } } /** @override */ @@ -171,12 +143,7 @@ } onBackClicked_() { - if (this.uiStep === UserCreationUIState.CHILD) { - Oobe.getInstance().setOobeUIState(OOBE_UI_STATE.USER_CREATION); - this.setUIStep(UserCreationUIState.CREATE); - } else { - this.userActed('cancel'); - } + this.userActed('cancel'); } onNextClicked_() { @@ -184,25 +151,9 @@ if (this.selectedUserType === UserCreationUserType.SELF) { this.userActed('signin'); } else if (this.selectedUserType === UserCreationUserType.CHILD) { - Oobe.getInstance().setOobeUIState(OOBE_UI_STATE.GAIA_SIGNIN); - this.setUIStep(UserCreationUIState.CHILD); - } - } else if (this.uiStep === UserCreationUIState.CHILD) { - if (this.selectedSignInMethod === UserCreationSignInMethod.CREATE) { - this.userActed('child-account-create'); - } else if ( - this.selectedSignInMethod === UserCreationSignInMethod.SIGNIN) { - this.userActed('child-signin'); + this.userActed('add-child'); } } } - - onLearnMoreClicked_() { - this.$.learnMoreDialog.showDialog(); - } - - focusLearnMoreLink_() { - this.$.learnMoreLink.focus(); - } } customElements.define(UserCreation.is, UserCreation);
diff --git a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java index cc4ff985..5fc1e40 100644 --- a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java +++ b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java
@@ -257,7 +257,7 @@ private void configureMockSyncService() { // SyncService is injected in the mediator, but dependencies still access the factory. - SyncServiceFactory.overrideForTests(mSyncService); + SyncServiceFactory.setInstanceForTesting(mSyncService); when(mSyncService.isSyncFeatureEnabled()).thenReturn(true); when(mSyncService.isEngineInitialized()).thenReturn(true); when(mSyncService.hasSyncConsent()).thenReturn(true);
diff --git a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java index 495269a..6e705dd 100644 --- a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java +++ b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java
@@ -169,7 +169,7 @@ IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); doReturn(mSignInManager).when(mIdentityServicesProvider).getSigninManager(any()); - SyncServiceFactory.overrideForTests(mSyncServiceMock); + SyncServiceFactory.setInstanceForTesting(mSyncServiceMock); mActionTester = new UserActionTester(); }
diff --git a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleUtilsUnitTest.java b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleUtilsUnitTest.java index 3975263c..1b36fce3 100644 --- a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleUtilsUnitTest.java +++ b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleUtilsUnitTest.java
@@ -131,7 +131,7 @@ TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); doReturn(mIdentityManager).when(mIdentityServicesProvider).getIdentityManager(any()); - SyncServiceFactory.overrideForTests(mSyncServiceMock); + SyncServiceFactory.setInstanceForTesting(mSyncServiceMock); ShadowChromeFeatureList.sEnableScrollableMVT = true; ShadowChromeFeatureList.sEnableSearchResumptionModule = true;
diff --git a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.cc b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.cc index 69cf53d..6e6f838 100644 --- a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.cc +++ b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.cc
@@ -68,6 +68,7 @@ ResumeBlockedRequests(); } delegate_->OnCookieExpirationDateChanged(); + MaybeScheduleCookieRotation(); } std::unique_ptr<BoundSessionRefreshCookieFetcher> @@ -83,6 +84,7 @@ } void BoundSessionCookieControllerImpl::MaybeRefreshCookie() { + cookie_refresh_timer_.Stop(); if (refresh_cookie_fetcher_) { return; } @@ -112,6 +114,24 @@ } } +void BoundSessionCookieControllerImpl::MaybeScheduleCookieRotation() { + const base::TimeDelta kCookieRefreshInterval = base::Minutes(2); + base::TimeDelta refresh_in = + cookie_expiration_time_ - base::Time::Now() - kCookieRefreshInterval; + if (!refresh_in.is_positive()) { + MaybeRefreshCookie(); + return; + } + + // If a refresh task is already scheduled, this will reschedule it. + // `base::Unretained(this)` is safe because `this` owns + // `cookie_rotation_timer_`. + cookie_refresh_timer_.Start( + FROM_HERE, refresh_in, + base::BindRepeating(&BoundSessionCookieControllerImpl::MaybeRefreshCookie, + base::Unretained(this))); +} + void BoundSessionCookieControllerImpl::ResumeBlockedRequests() { std::vector<base::OnceClosure> callbacks; std::swap(callbacks, resume_blocked_requests_);
diff --git a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.h b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.h index 9efa8c10..3f56ff42 100644 --- a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.h +++ b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl.h
@@ -11,6 +11,7 @@ #include "base/functional/bind.h" #include "base/functional/callback_forward.h" #include "base/time/time.h" +#include "base/timer/timer.h" #include "chrome/browser/signin/bound_session_credentials/bound_session_cookie_observer.h" #include "chrome/browser/signin/bound_session_credentials/bound_session_refresh_cookie_fetcher.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -58,6 +59,7 @@ void MaybeRefreshCookie(); void SetCookieExpirationTimeAndNotify(base::Time expiration_time); void OnCookieRefreshFetched(BoundSessionRefreshCookieFetcher::Result result); + void MaybeScheduleCookieRotation(); void ResumeBlockedRequests(); void set_refresh_cookie_fetcher_factory_for_testing( @@ -71,6 +73,8 @@ std::unique_ptr<BoundSessionCookieObserver> cookie_observer_; std::unique_ptr<BoundSessionRefreshCookieFetcher> refresh_cookie_fetcher_; std::vector<base::OnceClosure> resume_blocked_requests_; + // Used to schedule preemptive cookie refresh. + base::OneShotTimer cookie_refresh_timer_; RefreshCookieFetcherFactoryForTesting refresh_cookie_fetcher_factory_for_testing_;
diff --git a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl_unittest.cc b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl_unittest.cc index 38ee847..98b3b5e1 100644 --- a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl_unittest.cc +++ b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_controller_impl_unittest.cc
@@ -27,6 +27,7 @@ constexpr char kSIDTSCookieName[] = "__Secure-1PSIDTS"; const base::TimeDelta kCookieExpirationThreshold = base::Seconds(15); +const base::TimeDelta kCookieRefreshInterval = base::Minutes(2); base::Time GetTimeInTenMinutes() { return base::Time::Now() + base::Minutes(10); @@ -125,6 +126,10 @@ return bound_session_cookie_controller()->cookie_observer_.get(); } + base::OneShotTimer* cookie_refresh_timer() { + return &bound_session_cookie_controller()->cookie_refresh_timer_; + } + size_t on_cookie_expiration_date_changed_call_count() { return on_cookie_expiration_date_changed_call_count_; } @@ -248,6 +253,10 @@ // Cookie stale. EXPECT_LT(controller->cookie_expiration_time(), base::Time::Now() - kCookieExpirationThreshold); + // Preemptive cookie rotation also fails with persistent error + SimulateCompleteRefreshRequest( + BoundSessionRefreshCookieFetcher::Result::kConnectionError, + absl::nullopt); EXPECT_FALSE(cookie_fetcher()); // Request blocked on the cookie @@ -276,6 +285,10 @@ // Cookie stale. EXPECT_LT(cookie_expiration, base::Time::Now()); + // Preemptive cookie rotation also fails with persistent error + SimulateCompleteRefreshRequest( + BoundSessionRefreshCookieFetcher::Result::kConnectionError, + absl::nullopt); EXPECT_FALSE(cookie_fetcher()); base::test::TestFuture<void> future; @@ -405,3 +418,38 @@ EXPECT_EQ(bound_session_cookie_controller()->cookie_expiration_time(), base::Time()); } + +TEST_F(BoundSessionCookieControllerImplTest, + ScheduleCookieRotationOnSetCookieExpiration) { + ResetOnCookieExpirationDateChangedCallCount(); + EXPECT_TRUE(CompletePendingRefreshRequestIfAny()); + EXPECT_EQ(on_cookie_expiration_date_changed_call_count(), 1u); + EXPECT_TRUE(cookie_refresh_timer()->IsRunning()); + base::TimeDelta expected_refresh_delay = + bound_session_cookie_controller()->cookie_expiration_time() - + base::Time::Now() - kCookieRefreshInterval; + EXPECT_EQ(expected_refresh_delay, cookie_refresh_timer()->GetCurrentDelay()); + task_environment()->FastForwardBy(expected_refresh_delay); + EXPECT_TRUE(cookie_fetcher()); + CompletePendingRefreshRequestIfAny(); +} + +TEST_F(BoundSessionCookieControllerImplTest, + RefreshCookieImmediatelyOnSetCookieExpirationBelowRefreshInterval) { + EXPECT_TRUE(CompletePendingRefreshRequestIfAny()); + ResetOnCookieExpirationDateChangedCallCount(); + SetExpirationTimeAndNotify(base::Time::Now() + kCookieRefreshInterval / 2); + EXPECT_EQ(on_cookie_expiration_date_changed_call_count(), 1u); + EXPECT_FALSE(cookie_refresh_timer()->IsRunning()); + EXPECT_TRUE(cookie_fetcher()); + CompletePendingRefreshRequestIfAny(); +} + +TEST_F(BoundSessionCookieControllerImplTest, + StopCookieRotationOnCookieRefresh) { + EXPECT_TRUE(CompletePendingRefreshRequestIfAny()); + EXPECT_TRUE(cookie_refresh_timer()->IsRunning()); + MaybeRefreshCookie(); + EXPECT_FALSE(cookie_refresh_timer()->IsRunning()); + CompletePendingRefreshRequestIfAny(); +}
diff --git a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java index e7eb6e93..b3d99b7 100644 --- a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java +++ b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/SyncServiceFactory.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.sync; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import org.chromium.base.ResettersForTesting; import org.chromium.base.ThreadUtils; @@ -55,23 +54,11 @@ /** * Overrides the initialization for tests. The tests should call resetForTests() at shutdown. */ - @VisibleForTesting - public static void overrideForTests(SyncService syncService) { - ThreadUtils.assertOnUiThread(); - sSyncServiceForTest = syncService; + public static void setInstanceForTesting(SyncService syncService) { + ThreadUtils.runOnUiThreadBlocking((Runnable) () -> sSyncServiceForTest = syncService); ResettersForTesting.register(() -> sSyncServiceForTest = null); } - /** - * Resets the SyncService instance. Calling get() next time will initialize with a new - * instance. - */ - @VisibleForTesting - public static void resetForTests() { - ThreadUtils.assertOnUiThread(); - sSyncServiceForTest = null; - } - @NativeMethods interface Natives { SyncService getForProfile(Profile profile);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 61b844b..bcc1849 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2818,6 +2818,8 @@ "webui/ash/lock_screen_reauth/lock_screen_reauth_handler.h", "webui/ash/lock_screen_reauth/lock_screen_start_reauth_ui.cc", "webui/ash/lock_screen_reauth/lock_screen_start_reauth_ui.h", + "webui/ash/login/add_child_screen_handler.cc", + "webui/ash/login/add_child_screen_handler.h", "webui/ash/login/app_downloading_screen_handler.cc", "webui/ash/login/app_downloading_screen_handler.h", "webui/ash/login/app_launch_splash_screen_handler.cc",
diff --git a/chrome/browser/ui/ash/desks/desks_client_browsertest.cc b/chrome/browser/ui/ash/desks/desks_client_browsertest.cc index 9452035..b163eb7 100644 --- a/chrome/browser/ui/ash/desks/desks_client_browsertest.cc +++ b/chrome/browser/ui/ash/desks/desks_client_browsertest.cc
@@ -857,14 +857,14 @@ // Remove "Test Desk Name (1)", which means the next created desk from // template will have that name. Then it will skip (2) since it already // exists, and create the next desk with (3). - RemoveDesk(desks_controller->desks()[2].get()); + RemoveDesk(desks_controller->GetDeskAtIndex(2)); check_launch_template_desk_name(std::u16string(kDeskName).append(u" (1)")); check_launch_template_desk_name(std::u16string(kDeskName).append(u" (3)")); // Same as above, but make sure that deleting the desk with the exact template // name still functions the same by only filling in whatever name is // available. - RemoveDesk(desks_controller->desks()[1].get()); + RemoveDesk(desks_controller->GetDeskAtIndex(1)); check_launch_template_desk_name(kDeskName); check_launch_template_desk_name(std::u16string(kDeskName).append(u" (4)")); } @@ -1605,7 +1605,7 @@ // Remove a desk first, otherwise we will run into an accessibility error // with `DeskPreviewView` upon entering overview. auto* desks_controller = ash::DesksController::Get(); - RemoveDesk(desks_controller->desks()[1].get()); + RemoveDesk(desks_controller->GetDeskAtIndex(1)); // Enter overview and launch the same template. ash::ToggleOverview(); @@ -2210,8 +2210,8 @@ // Change desk name to avoid duplication on template name. Having duplicate // names invokes a workflow that involves showing and accepting the replace // dialog, which is unnecessary for this test. - desks_controller->desks()[active_desk_index]->SetName( - base::UTF8ToUTF16(base::NumberToString(i)), true); + desks_controller->GetDeskAtIndex(active_desk_index) + ->SetName(base::UTF8ToUTF16(base::NumberToString(i)), true); // Exit and renenter overview to save the next template. Once we are viewing // the grid we can't go back to regular overview unless we exit overview or @@ -2320,7 +2320,7 @@ auto* desks_controller = ash::DesksController::Get(); ASSERT_EQ(0, desks_controller->GetActiveDeskIndex()); - desks_controller->desks()[0]->SetName(kDeskName, true); + desks_controller->GetDeskAtIndex(0)->SetName(kDeskName, true); // Save a template. ash::ToggleOverview(); @@ -2348,7 +2348,7 @@ // Launching a desk from the template creates a desk with the same name as // the template. - desks_controller->desks()[0]->SetName(u"Desk", true); + desks_controller->GetDeskAtIndex(0)->SetName(u"Desk", true); check_launch_template_desk_name(kDeskName); // Launch more desks from the template and verify that the newly create desks @@ -2359,14 +2359,14 @@ // Remove "Test Desk Name (1)", which means the next created desk from // template will have that name. Then it will skip (2) since it already // exists, and create the next desk with (3). - RemoveDesk(desks_controller->desks()[2].get()); + RemoveDesk(desks_controller->GetDeskAtIndex(2)); check_launch_template_desk_name(std::u16string(kDeskName).append(u"(1)")); check_launch_template_desk_name(std::u16string(kDeskName).append(u"(3)")); // Same as above, but make sure that deleting the desk with the exact template // name still functions the same by only filling in whatever name is // available. - RemoveDesk(desks_controller->desks()[1].get()); + RemoveDesk(desks_controller->GetDeskAtIndex(1)); check_launch_template_desk_name(kDeskName); check_launch_template_desk_name(std::u16string(kDeskName).append(u"(4)")); }
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc index 11cdf4c..99502a1 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc
@@ -99,6 +99,7 @@ } bool IsSyncUser(Profile* profile) { + CHECK(profile); const syncer::SyncService* sync_service = SyncServiceFactory::GetForProfile(profile); password_manager::SyncState sync_state = @@ -234,6 +235,12 @@ DCHECK(state_ == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || state_ == password_manager::ui::PENDING_PASSWORD_STATE); + if (!delegate_) { + // A race between `PasswordBubbleControllerBase::OnBubbleClosing()` and + // `PasswordSaveUpdateView::OnContentChanged()` may result in a null + // `delegate_`. + return false; + } if (IsSyncUser(GetProfile())) return true;
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc index 175ebed..d5c45ad 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller_unittest.cc
@@ -779,3 +779,27 @@ EXPECT_FALSE( controller()->IsCurrentStateAffectingPasswordsStoredInTheGoogleAccount()); } + +TEST_F(SaveUpdateBubbleControllerTest, NullDelegate) { + PasswordsModelDelegateMock delegate; + EXPECT_CALL(delegate, GetPendingPassword()) + .WillOnce(ReturnRef(pending_password())); + password_manager::InteractionsStats stats = GetTestStats(); + EXPECT_CALL(delegate, GetCurrentInteractionStats()).WillOnce(Return(&stats)); + std::vector<std::unique_ptr<password_manager::PasswordForm>> forms = + GetCurrentForms(); + EXPECT_CALL(delegate, GetCurrentForms()).WillOnce(ReturnRef(forms)); + url::Origin origin = url::Origin::Create(GURL(kSiteOrigin)); + EXPECT_CALL(delegate, GetOrigin()).WillOnce(Return(origin)); + EXPECT_CALL(delegate, GetState()) + .WillRepeatedly(Return(password_manager::ui::PENDING_PASSWORD_STATE)); + EXPECT_CALL(delegate, GetWebContents()).WillRepeatedly(Return(nullptr)); + SaveUpdateBubbleController controller( + delegate.AsWeakPtr(), + PasswordBubbleControllerBase::DisplayReason::kAutomatic); + + controller.OnBubbleClosing(); + + EXPECT_FALSE( + controller.IsCurrentStateAffectingPasswordsStoredInTheGoogleAccount()); +}
diff --git a/chrome/browser/ui/views/desktop_capture/OWNERS b/chrome/browser/ui/views/desktop_capture/OWNERS index e3cb2b5..beb6ba6 100644 --- a/chrome/browser/ui/views/desktop_capture/OWNERS +++ b/chrome/browser/ui/views/desktop_capture/OWNERS
@@ -1,2 +1,3 @@ eladalon@chromium.org ellyjones@chromium.org +tovep@chromium.org
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc index c105c92..42b8cc3c 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc
@@ -68,6 +68,8 @@ const std::u16string& accessible_name) : item_spacing_( base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) ? 4 : 0), + horizontal_margins_( + base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) ? 16 : 0), vertical_margins_( base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) ? 16 : 0), controller_(controller), @@ -89,7 +91,8 @@ (static_cast<int>(children().size()) + active_style_->columns - 1) / active_style_->columns; return gfx::Size(active_style_->columns * active_style_->item_size.width() + - (active_style_->columns - 1) * item_spacing_, + (active_style_->columns - 1) * item_spacing_ + + 2 * horizontal_margins_, total_rows * active_style_->item_size.height() + (total_rows - 1) * item_spacing_ + 2 * vertical_margins_); @@ -108,7 +111,8 @@ ++col, x += (width + item_spacing_)) { if (i == children().end()) return; - (*i++)->SetBounds(x, y + vertical_margins_, width, height); + (*i++)->SetBounds(x + horizontal_margins_, y + vertical_margins_, width, + height); } } }
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.h b/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.h index 3686013..3464c5c3 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.h +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.h
@@ -63,6 +63,7 @@ DesktopMediaSourceView* GetSelectedView(); const int item_spacing_; + const int horizontal_margins_; const int vertical_margins_; raw_ptr<DesktopMediaListController, DanglingUntriaged> controller_;
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_pane_view.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_pane_view.cc index b5b7a18acb6..0ac13ed7 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_pane_view.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_pane_view.cc
@@ -4,25 +4,34 @@ #include "chrome/browser/ui/views/desktop_capture/desktop_media_pane_view.h" +#include "ui/base/ui_base_features.h" #include "ui/views/background.h" +#include "ui/views/controls/scroll_view.h" #include "ui/views/controls/separator.h" #include "ui/views/layout/box_layout.h" DesktopMediaPaneView::DesktopMediaPaneView( std::unique_ptr<views::View> content_view, std::unique_ptr<ShareAudioView> share_audio_view) { - SetBackground( - views::CreateThemedSolidBackground(ui::kColorSubtleEmphasisBackground)); + SetBackground(views::CreateThemedRoundedRectBackground( + features::IsChromeRefresh2023() ? ui::kColorSysSurface4 + : ui::kColorSubtleEmphasisBackground, + /*top_radius=*/0, + /*bottom_radius=*/features::IsChromeRefresh2023() ? 8 : 4, + /*for_border_thickness=*/0)); views::BoxLayout* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, gfx::Insets::VH(0, 16))); + views::BoxLayout::Orientation::kVertical, gfx::Insets(0))); layout->SetFlexForView(AddChildView(std::move(content_view)), 1); if (!share_audio_view) { return; } - AddChildView(std::make_unique<views::Separator>()); + View* separator_container = AddChildView(std::make_unique<views::View>()); + separator_container->SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical, gfx::Insets::VH(0, 16))); + separator_container->AddChildView(std::make_unique<views::Separator>()); share_audio_view_ = AddChildView(std::move(share_audio_view)); }
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 6ec6f20f..37d4b8c 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
@@ -288,10 +288,17 @@ NOTREACHED_NORETURN(); } -std::unique_ptr<views::ScrollView> CreateScrollView() { +std::unique_ptr<views::ScrollView> CreateScrollView(bool audio_requested) { if (base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign)) { auto scroll_view = std::make_unique<views::ScrollView>(); - scroll_view->SetBackgroundThemeColorId(ui::kColorSubtleEmphasisBackground); + scroll_view->SetBackgroundThemeColorId( + features::IsChromeRefresh2023() ? ui::kColorSysSurface4 + : ui::kColorSubtleEmphasisBackground); + if (audio_requested) { + // When audio is requested, a separator is added just below the scroll + // view, and the overflow indicator becomes redundant, + scroll_view->SetDrawOverflowIndicator(false); + } return scroll_view; } else { return views::ScrollView::CreateScrollViewWithBorder(); @@ -450,7 +457,7 @@ /*focus_rectangle_inset=*/5); std::unique_ptr<views::ScrollView> screen_scroll_view = - CreateScrollView(); + CreateScrollView(audio_requested_); std::u16string screen_title_text = l10n_util::GetStringUTF16( IDS_DESKTOP_MEDIA_PICKER_SOURCE_TYPE_SCREEN); auto list_controller = std::make_unique<DesktopMediaListController>( @@ -499,7 +506,7 @@ /*focus_rectangle_inset=*/5); std::unique_ptr<views::ScrollView> window_scroll_view = - CreateScrollView(); + CreateScrollView(audio_requested_); std::u16string window_title_text = l10n_util::GetStringUTF16( IDS_DESKTOP_MEDIA_PICKER_SOURCE_TYPE_WINDOW); auto list_controller = std::make_unique<DesktopMediaListController>( @@ -555,7 +562,7 @@ /*image_rect=*/gfx::Rect(20, 20, 320, 240), /*focus_rectangle_inset=*/5); std::unique_ptr<views::ScrollView> window_scroll_view = - CreateScrollView(); + CreateScrollView(audio_requested_); const std::u16string title = l10n_util::GetStringUTF16( IDS_DESKTOP_MEDIA_PICKER_SOURCE_TYPE_THIS_TAB); auto list_controller = std::make_unique<DesktopMediaListController>(
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc index 223decf..8a2db5e8 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc
@@ -12,6 +12,7 @@ #include "ui/accessibility/ax_node_data.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/base/ui_base_features.h" #include "ui/color/color_id.h" #include "ui/color/color_provider.h" #include "ui/gfx/canvas.h" @@ -91,13 +92,24 @@ } } - image_view_->SetBackground(views::CreateSolidBackground( - GetColorProvider()->GetColor(ui::kColorMenuItemBackgroundSelected))); + if (base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) && + features::IsChromeRefresh2023()) { + SetBackground(views::CreateRoundedRectBackground( + GetColorProvider()->GetColor(ui::kColorSysTonalContainer), 8)); + } else { + image_view_->SetBackground(views::CreateSolidBackground( + GetColorProvider()->GetColor(ui::kColorMenuItemBackgroundSelected))); + } label_->SetFontList(label_->font_list().Derive(0, gfx::Font::NORMAL, gfx::Font::Weight::BOLD)); parent_->OnSelectionChanged(); } else { - image_view_->SetBackground(nullptr); + if (base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) && + features::IsChromeRefresh2023()) { + SetBackground(nullptr); + } else { + image_view_->SetBackground(nullptr); + } label_->SetFontList(label_->font_list().Derive(0, gfx::Font::NORMAL, gfx::Font::Weight::NORMAL)); }
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.cc index b4c77b6..93fb1ba2 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.cc
@@ -18,8 +18,10 @@ #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/base/ui_base_features.h" #include "ui/color/color_provider.h" #include "ui/gfx/favicon_size.h" +#include "ui/gfx/geometry/rounded_corners_f.h" #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/background.h" #include "ui/views/border.h" @@ -28,6 +30,7 @@ #include "ui/views/controls/table/table_view_observer.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/layout_provider.h" #include "ui/views/view.h" using content::BrowserThread; @@ -184,6 +187,21 @@ controller_->AcceptSource(); } +std::unique_ptr<views::ScrollView> CreateScrollViewWithTable( + std::unique_ptr<views::TableView> table) { + if (base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) && + features::IsChromeRefresh2023()) { + auto scroll_view = std::make_unique<views::ScrollView>( + views::ScrollView::ScrollWithLayers::kEnabled); + scroll_view->SetViewportRoundedCornerRadius(gfx::RoundedCornersF(8)); + scroll_view->SetContents(std::move(table)); + scroll_view->SetBorder(nullptr); + return scroll_view; + } else { + return views::TableView::CreateScrollViewWithTable(std::move(table)); + } +} + } // namespace DesktopMediaTabList::DesktopMediaTabList(DesktopMediaListController* controller, @@ -258,14 +276,14 @@ std::unique_ptr<views::View> full_panel = std::make_unique<views::View>(); - View* scroll_view = full_panel->AddChildView( - views::TableView::CreateScrollViewWithTable(std::move(list))); - scroll_view->SetPreferredSize(gfx::Size(kListWidth, 0)); + scroll_view_ = + full_panel->AddChildView(CreateScrollViewWithTable(std::move(list))); + scroll_view_->SetPreferredSize(gfx::Size(kListWidth, 0)); full_panel->AddChildView(std::move(preview_sidebar)); const gfx::Insets kFullPannelInset = base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) - ? gfx::Insets::VH(16, 0) + ? gfx::Insets(16) : gfx::Insets::TLBR(15, 0, 0, 0); const int kChildSpacing = base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) ? 16 : 12; @@ -273,7 +291,7 @@ full_panel->SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal, kFullPannelInset, kChildSpacing, true)); - layout->SetFlexForView(scroll_view, 1); + layout->SetFlexForView(scroll_view_, 1); auto container = std::make_unique<View>(); container->SetUseDefaultFillLayout(true); @@ -306,16 +324,34 @@ DesktopMediaListController::ListView::OnThemeChanged(); const ui::ColorProvider* const color_provider = GetColorProvider(); - list_->SetBorder(views::CreateSolidBorder( - /*thickness=*/1, - color_provider->GetColor(kColorDesktopMediaTabListBorder))); - const SkColor background_color = - color_provider->GetColor(kColorDesktopMediaTabListPreviewBackground); - preview_wrapper_->SetBackground( - views::CreateSolidBackground(background_color)); - empty_preview_label_->SetBackground( - views::CreateSolidBackground(background_color)); - empty_preview_label_->SetBackgroundColor(background_color); + if (features::IsChromeRefresh2023()) { + list_->SetBorder(nullptr); + } else { + list_->SetBorder(views::CreateSolidBorder( + /*thickness=*/1, + color_provider->GetColor(kColorDesktopMediaTabListBorder))); + } + + if (base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign) && + features::IsChromeRefresh2023()) { + scroll_view_->SetBackground(views::CreateRoundedRectBackground( + GetColorProvider()->GetColor(ui::kColorSysSurface4), 8)); + const SkColor background_color = + color_provider->GetColor(ui::kColorSysTonalContainer); + preview_wrapper_->SetBackground( + views::CreateRoundedRectBackground(background_color, 8)); + empty_preview_label_->SetBackground( + views::CreateRoundedRectBackground(background_color, 8)); + empty_preview_label_->SetBackgroundColor(background_color); + } else { + const SkColor background_color = + color_provider->GetColor(kColorDesktopMediaTabListPreviewBackground); + preview_wrapper_->SetBackground( + views::CreateSolidBackground(background_color)); + empty_preview_label_->SetBackground( + views::CreateSolidBackground(background_color)); + empty_preview_label_->SetBackgroundColor(background_color); + } } absl::optional<content::DesktopMediaID> DesktopMediaTabList::GetSelection() {
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.h b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.h index 7ed97231..84a5421 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.h +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list.h
@@ -74,6 +74,7 @@ raw_ptr<views::ImageView> preview_; raw_ptr<views::Label> empty_preview_label_; raw_ptr<views::Label> preview_label_; + raw_ptr<views::ScrollView> scroll_view_; // Counts the number of times preview_ has been set to an image. size_t preview_set_count_ = 0;
diff --git a/chrome/browser/ui/views/desktop_capture/share_audio_view.cc b/chrome/browser/ui/views/desktop_capture/share_audio_view.cc index a4e5f107..a21741c7 100644 --- a/chrome/browser/ui/views/desktop_capture/share_audio_view.cc +++ b/chrome/browser/ui/views/desktop_capture/share_audio_view.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/desktop_capture/share_audio_view.h" #include "chrome/browser/ui/layout_constants.h" +#include "chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h" #include "components/vector_icons/vector_icons.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" @@ -13,7 +14,8 @@ ShareAudioView::ShareAudioView(const std::u16string& label_text, bool audio_offered) { - SetProperty(views::kMarginsKey, gfx::Insets::TLBR(8, 0, 16, 0)); + CHECK(base::FeatureList::IsEnabled(kDisplayMediaPickerRedesign)); + SetProperty(views::kMarginsKey, gfx::Insets::TLBR(8, 16, 16, 16)); views::ImageView* audio_icon_view = AddChildView(std::make_unique<views::ImageView>());
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc index 4b5f3bc..9c47961 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -492,6 +492,13 @@ const ui::Event& event) { popup_view_->model()->OpenSelection( OmniboxPopupSelection(model_index_, state), event.time_stamp()); + if (state == OmniboxPopupSelection::FOCUSED_BUTTON_REMOVE_SUGGESTION) { + // The button could be pressed and the deletion successful, but the match + // may continue to appear with the X button remaining so it looked like it + // didn't delete. There may be a deeper async matches issue involved, but + // this seems to help in at least some cases (pedals + entities, e.g. dino). + UpdateRemoveSuggestionVisibility(); + } } ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h index f29907b..c4956654 100644 --- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h +++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h
@@ -23,7 +23,7 @@ class Browser; -constexpr int DISTANCE_BUTTON_VERTICAL = 12; +constexpr int DISTANCE_BUTTON_VERTICAL = 8; // Base bubble view that prompts the user to grant or deny a permission request // from a website. Should not be used directly, instead create one of the more
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_one_origin_view.cc b/chrome/browser/ui/views/permissions/permission_prompt_bubble_one_origin_view.cc index c63d2da4..7f796fb 100644 --- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_one_origin_view.cc +++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_one_origin_view.cc
@@ -174,12 +174,12 @@ DISTANCE_SUBSECTION_HORIZONTAL_INDENT)), provider->GetDistanceMetric(views::DISTANCE_RELATED_LABEL_HORIZONTAL))); - constexpr int kPermissionIconSize = 18; + const int kPermissionIconSize = features::IsChromeRefresh2023() ? 20 : 18; auto* icon = line_container->AddChildView( std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon( permissions::GetIconId(request->request_type()), ui::kColorIcon, kPermissionIconSize))); - icon->SetVerticalAlignment(views::ImageView::Alignment::kLeading); + icon->SetVerticalAlignment(views::ImageView::Alignment::kCenter); auto* label = line_container->AddChildView( std::make_unique<views::Label>(request->GetMessageTextFragment())); @@ -189,5 +189,9 @@ if (features::IsChromeRefresh2023()) { label->SetTextStyle(views::style::STYLE_BODY_3); label->SetEnabledColorId(kColorPermissionPromptRequestText); + + constexpr int kPermissionBodyTopMargin = 10; + line_container->SetProperty( + views::kMarginsKey, gfx::Insets().set_top(kPermissionBodyTopMargin)); } }
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc index 5681faeb..df064af 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -16,6 +16,12 @@ // Manual tests: +IN_PROC_BROWSER_TEST_F(WebAppIntegration, EnterAndExitFullScreenApp) { + helper_.CreateShortcut(Site::kStandalone, WindowOptions::kWindowed); + helper_.EnterFullScreenApp(); + helper_.ExitFullScreenApp(); +} + IN_PROC_BROWSER_TEST_F(WebAppIntegration, UninstallFromList) { helper_.CreateShortcut(Site::kStandalone, WindowOptions::kWindowed); helper_.UninstallFromList(Site::kStandalone);
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index c82f7e8..9d36dc3 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -46,6 +46,8 @@ #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_test.h" #include "chrome/browser/ui/intent_picker_tab_helper.h" #include "chrome/browser/ui/startup/startup_browser_creator.h" #include "chrome/browser/ui/startup/web_app_startup_utils.h" @@ -127,6 +129,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/mojom/frame/fullscreen.mojom.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h" #include "third_party/re2/src/re2/re2.h" #include "ui/accessibility/ax_action_data.h" @@ -1105,6 +1108,34 @@ AfterStateChangeAction(); } +void WebAppIntegrationTestDriver::EnterFullScreenApp() { + if (!BeforeStateChangeAction(__FUNCTION__)) { + return; + } + FullscreenNotificationObserver fullscreen_observer(app_browser()); + FullscreenController* fullscreen_controller = + app_browser()->exclusive_access_manager()->fullscreen_controller(); + ASSERT_FALSE(fullscreen_controller->IsFullscreenForBrowser()); + fullscreen_controller->ToggleBrowserFullscreenMode(); + fullscreen_observer.Wait(); + ASSERT_TRUE(fullscreen_controller->IsFullscreenForBrowser()); + AfterStateChangeAction(); +} + +void WebAppIntegrationTestDriver::ExitFullScreenApp() { + if (!BeforeStateChangeAction(__FUNCTION__)) { + return; + } + FullscreenNotificationObserver fullscreen_observer(app_browser()); + FullscreenController* fullscreen_controller = + app_browser()->exclusive_access_manager()->fullscreen_controller(); + ASSERT_TRUE(fullscreen_controller->IsFullscreenForBrowser()); + fullscreen_controller->ToggleBrowserFullscreenMode(); + fullscreen_observer.Wait(); + ASSERT_FALSE(fullscreen_controller->IsFullscreenForBrowser()); + AfterStateChangeAction(); +} + void WebAppIntegrationTestDriver::DisableFileHandling(Site site) { if (!BeforeStateChangeAction(__FUNCTION__)) { return; @@ -2650,6 +2681,26 @@ AfterStateCheckAction(); } +void WebAppIntegrationTestDriver::CheckAppToolbarVisible() { + if (!BeforeStateCheckAction(__FUNCTION__)) { + return; + } + ASSERT_TRUE(app_browser()); + BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); + ASSERT_TRUE(app_view->web_app_frame_toolbar_for_testing()->GetVisible()); + AfterStateCheckAction(); +} + +void WebAppIntegrationTestDriver::CheckAppToolbarNotVisible() { + if (!BeforeStateCheckAction(__FUNCTION__)) { + return; + } + ASSERT_TRUE(app_browser()); + BrowserView* app_view = BrowserView::GetBrowserViewForBrowser(app_browser()); + ASSERT_FALSE(app_view->web_app_frame_toolbar_for_testing()->GetVisible()); + AfterStateCheckAction(); +} + void WebAppIntegrationTestDriver::CheckBrowserNavigation(Site site) { if (!BeforeStateCheckAction(__FUNCTION__)) { return;
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h index 5079b6a4f..d6a4035 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -264,6 +264,8 @@ void DisableRunOnOsLoginFromAppHome(Site site); void EnableRunOnOsLoginFromAppSettings(Site site); void EnableRunOnOsLoginFromAppHome(Site site); + void EnterFullScreenApp(); + void ExitFullScreenApp(); void DisableFileHandling(Site site); void EnableFileHandling(Site site); void DisableWindowControlsOverlay(Site site); @@ -340,6 +342,8 @@ void CheckAppInListTabbed(Site site); void CheckAppNavigation(Site site); void CheckAppNavigationIsStartUrl(); + void CheckAppToolbarVisible(); + void CheckAppToolbarNotVisible(); void CheckBrowserNavigation(Site site); void CheckBrowserNavigationIsAppSettings(Site site); void CheckBrowserNotAtAppHome();
diff --git a/chrome/browser/ui/webui/app_home/app_home_page_handler_browsertest.cc b/chrome/browser/ui/webui/app_home/app_home_page_handler_browsertest.cc index 214a51e..31b1aec 100644 --- a/chrome/browser/ui/webui/app_home/app_home_page_handler_browsertest.cc +++ b/chrome/browser/ui/webui/app_home/app_home_page_handler_browsertest.cc
@@ -11,9 +11,11 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/test_extension_system.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" #include "chrome/browser/ui/webui/app_home/app_home.mojom.h" #include "chrome/browser/ui/webui/app_home/mock_app_home_page.h" #include "chrome/browser/web_applications/os_integration/web_app_shortcut.h" +#include "chrome/browser/web_applications/test/os_integration_test_override_impl.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_provider.h" @@ -164,10 +166,18 @@ ~AppHomePageHandlerTest() override = default; void SetUpOnMainThread() override { + base::ScopedAllowBlockingForTesting allow_blocking; + override_registration_ = + web_app::OsIntegrationTestOverrideImpl::OverrideForTesting(); web_app::test::WaitUntilWebAppProviderAndSubsystemsReady( web_app::WebAppProvider::GetForTest(profile())); } + void TearDownOnMainThread() override { + base::ScopedAllowBlockingForTesting allow_blocking; + override_registration_.reset(); + } + protected: std::unique_ptr<TestAppHomePageHandler> GetAppHomePageHandler() { content::WebContents* contents = @@ -252,15 +262,9 @@ content::TestWebUI test_web_ui_; testing::StrictMock<MockAppHomePage> page_; -#if BUILDFLAG(IS_WIN) - // This prevents SetRunOnOsLoginMode from leaving shortcuts in the Windows - // startup directory that cause Chrome to get launched when Windows starts on - // a bot. It needs to be in the class so that the override lasts until the - // test object is destroyed, because tasks can keep running after the test - // method finishes. - // See https://crbug.com/1239809 - base::ScopedPathOverride override_user_startup_{base::DIR_USER_STARTUP}; -#endif // BUILDFLAG(IS_WIN) + + std::unique_ptr<web_app::OsIntegrationTestOverrideImpl::BlockingRegistration> + override_registration_; }; MATCHER_P(MatchAppName, expected_app_name, "") { @@ -434,6 +438,22 @@ views::Widget* widget = waiter.WaitIfNeededAndGet(); ASSERT_TRUE(widget != nullptr); views::test::AcceptDialog(widget); + FlushShortcutTasks(); +#endif + EXPECT_CALL(page_, RemoveApp(MatchAppId(installed_app_id))) + .Times(testing::AtLeast(1)); + UninstallTestWebApp(installed_app_id); +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + // If SubManagersExecuteEnabled is false, the shortcuts should have been + // cleaned up when the web app is uninstalled by + // OsIntegrationManager::UninstallOsHooks. + // TODO(http://b/289136332) Remove this when the dialog correctly integrates + // with the WebAppProvider's sub-manager system. + if (web_app::AreSubManagersExecuteEnabled()) { + base::ScopedAllowBlockingForTesting allow_blocking; + override_registration_->test_override->SimulateDeleteShortcutsByUser( + profile(), installed_app_id, kTestAppName); + } #endif } @@ -460,6 +480,12 @@ ASSERT_TRUE(widget != nullptr); views::test::AcceptDialog(widget); #endif + EXPECT_CALL(page_, RemoveApp(MatchAppId(extension->id()))) + .Times(testing::AtLeast(1)); + UninstallTestExtensionApp(extension.get()); +#if !BUILDFLAG(IS_MAC) + FlushShortcutTasks(); +#endif } IN_PROC_BROWSER_TEST_F(AppHomePageHandlerTest, SetRunOnOsLoginMode) {
diff --git a/chrome/browser/ui/webui/ash/login/add_child_screen_handler.cc b/chrome/browser/ui/webui/ash/login/add_child_screen_handler.cc new file mode 100644 index 0000000..334326e --- /dev/null +++ b/chrome/browser/ui/webui/ash/login/add_child_screen_handler.cc
@@ -0,0 +1,45 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/ash/login/add_child_screen_handler.h" +#include "base/logging.h" +#include "chrome/browser/ash/login/oobe_screen.h" +#include "chrome/browser/ash/login/wizard_controller.h" +#include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" +#include "chrome/grit/generated_resources.h" +#include "components/login/localized_values_builder.h" +#include "ui/chromeos/devicetype_utils.h" + +namespace ash { + +AddChildScreenHandler::AddChildScreenHandler() : BaseScreenHandler(kScreenId) {} + +AddChildScreenHandler::~AddChildScreenHandler() = default; + +void AddChildScreenHandler::DeclareLocalizedValues( + ::login::LocalizedValuesBuilder* builder) { + builder->AddF("childSignInTitle", IDS_OOBE_USER_CREATION_CHILD_SIGNIN_TITLE, + ui::GetChromeOSDeviceName()); + builder->Add("childSignInSubtitle", + IDS_OOBE_USER_CREATION_CHILD_SIGNIN_SUBTITLE); + builder->Add("createAccountForChildLabel", + IDS_OOBE_USER_CREATION_CHILD_ACCOUNT_CREATION_BUTTON_LABEL); + builder->Add("signInForChildLabel", + IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_BUTTON_LABEL); + builder->AddF("childSignInParentNotificationText", + IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_PARENT_NOTIFICATION_TEXT, + ui::GetChromeOSDeviceName()); + builder->Add("childSignInLearnMore", + IDS_OOBE_USER_CREATION_CHILD_SIGNIN_LEARN_MORE); + builder->Add("childSignInLearnMoreDialogTitle", + IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_LEARN_MORE_DIALOG_TITLE); + builder->Add("childSignInLearnMoreDialogText", + IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_LEARN_MORE_DIALOG_TEXT); +} + +void AddChildScreenHandler::Show() { + ShowInWebUI(); +} + +} // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/add_child_screen_handler.h b/chrome/browser/ui/webui/ash/login/add_child_screen_handler.h new file mode 100644 index 0000000..2c65d5348 --- /dev/null +++ b/chrome/browser/ui/webui/ash/login/add_child_screen_handler.h
@@ -0,0 +1,49 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_ADD_CHILD_SCREEN_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_ADD_CHILD_SCREEN_HANDLER_H_ + +#include "base/memory/weak_ptr.h" +#include "base/values.h" +#include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" + +namespace ash { + +// Interface for dependency injection between AddChildScreen and its +// WebUI representation. +class AddChildScreenView : public base::SupportsWeakPtr<AddChildScreenView> { + public: + inline constexpr static StaticOobeScreenId kScreenId{"add-child", + "AddChildScreen"}; + + virtual ~AddChildScreenView() = default; + + // Shows the contents of the screen. + virtual void Show() = 0; +}; + +class AddChildScreenHandler : public BaseScreenHandler, + public AddChildScreenView { + public: + using TView = AddChildScreenView; + + AddChildScreenHandler(); + + AddChildScreenHandler(const AddChildScreenHandler&) = delete; + AddChildScreenHandler& operator=(const AddChildScreenHandler&) = delete; + + ~AddChildScreenHandler() override; + + // BaseScreenHandler: + void DeclareLocalizedValues( + ::login::LocalizedValuesBuilder* builder) override; + + // AddChildScreenView: + void Show() override; +}; + +} // namespace ash + +#endif // CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_ADD_CHILD_SCREEN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc index cce92e4..6bcc5d52 100644 --- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -42,6 +42,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/webui/about_ui.h" +#include "chrome/browser/ui/webui/ash/login/add_child_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_downloading_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_launch_splash_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/arc_vm_data_migration_screen_handler.h" @@ -518,6 +519,8 @@ AddScreenHandler(std::make_unique<DisplaySizeScreenHandler>()); } + AddScreenHandler(std::make_unique<AddChildScreenHandler>()); + if (features::IsOobeDrivePinningEnabled()) { AddScreenHandler(std::make_unique<DrivePinningScreenHandler>()); }
diff --git a/chrome/browser/ui/webui/ash/login/user_creation_screen_handler.cc b/chrome/browser/ui/webui/ash/login/user_creation_screen_handler.cc index 10fffd0c..2a69ac5 100644 --- a/chrome/browser/ui/webui/ash/login/user_creation_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/user_creation_screen_handler.cc
@@ -36,23 +36,6 @@ IDS_OOBE_USER_CREATION_CHILD_BUTTON_LABEL); builder->Add("createForChildDescription", IDS_OOBE_USER_CREATION_CHILD_BUTTON_DESCRIPTION); - builder->AddF("childSignInTitle", IDS_OOBE_USER_CREATION_CHILD_SIGNIN_TITLE, - ui::GetChromeOSDeviceName()); - builder->Add("childSignInSubtitle", - IDS_OOBE_USER_CREATION_CHILD_SIGNIN_SUBTITLE); - builder->Add("createAccountForChildLabel", - IDS_OOBE_USER_CREATION_CHILD_ACCOUNT_CREATION_BUTTON_LABEL); - builder->Add("signInForChildLabel", - IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_BUTTON_LABEL); - builder->AddF("childSignInParentNotificationText", - IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_PARENT_NOTIFICATION_TEXT, - ui::GetChromeOSDeviceName()); - builder->Add("childSignInLearnMore", - IDS_OOBE_USER_CREATION_CHILD_SIGNIN_LEARN_MORE); - builder->Add("childSignInLearnMoreDialogTitle", - IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_LEARN_MORE_DIALOG_TITLE); - builder->Add("childSignInLearnMoreDialogText", - IDS_OOBE_USER_CREATION_CHILD_SIGN_IN_LEARN_MORE_DIALOG_TEXT); } void UserCreationScreenHandler::Show() {
diff --git a/chrome/browser/ui/webui/policy/policy_ui.cc b/chrome/browser/ui/webui/policy/policy_ui.cc index 96fe0f7..5547f40 100644 --- a/chrome/browser/ui/webui/policy/policy_ui.cc +++ b/chrome/browser/ui/webui/policy/policy_ui.cc
@@ -8,6 +8,7 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/policy/value_provider/chrome_policies_value_provider.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/policy/policy_ui_handler.h" #include "chrome/browser/ui/webui/webui_util.h" @@ -169,10 +170,62 @@ // Localized strings for chrome://policy/test. static constexpr webui::LocalizedString kPolicyTestStrings[] = { {"testTitle", IDS_POLICY_TEST_TITLE}, + {"testRestart", IDS_POLICY_REBOOT_BUTTON}, + {"testApply", IDS_POLICY_TEST_APPLY}, + {"testImport", IDS_POLICY_TEST_IMPORT}, + {"testDesc", IDS_POLICY_TEST_DESC}, + {"testTableName", IDS_POLICY_HEADER_NAME}, + {"testTableSource", IDS_POLICY_HEADER_SOURCE}, + {"testTableTarget", IDS_POLICY_TEST_TABLE_TARGET}, + {"testTableLevel", IDS_POLICY_HEADER_LEVEL}, + {"testTableValue", IDS_POLICY_LABEL_VALUE}, + {"testTableRemove", IDS_REMOVE}, + {"testAdd", IDS_POLICY_TEST_ADD}, + {"testNameSelect", IDS_POLICY_SELECT_NAME}, + {"testSourceSelect", IDS_POLICY_SELECT_SOURCE}, + {"testTargetSelect", IDS_POLICY_SELECT_TARGET}, + {"testLevelSelect", IDS_POLICY_SELECT_LEVEL}, }; + source->AddLocalizedStrings(kPolicyTestStrings); source->AddResourcePath("test/", IDR_POLICY_TEST_POLICY_TEST_HTML); source->AddResourcePath("test", IDR_POLICY_TEST_POLICY_TEST_HTML); + + // Create a string policy_name_str of comma-separated policy names + ChromePoliciesValueProvider value_provider(profile); + base::Value::List policy_names = + (*value_provider.GetNames().FindDict("chrome")) + .FindList("policyNames") + ->Clone(); + std::string policy_name_str = ""; + for (auto& policy_name : policy_names) { + policy_name_str += policy_name.GetString() + ","; + } + policy_name_str.pop_back(); // remove last divider + source->AddString("policyNames", policy_name_str); + + // Strings for policy levels, scopes and sources + static constexpr webui::LocalizedString kPolicyTestTypes[] = { + {"scopeUser", IDS_POLICY_SCOPE_USER}, + {"scopeAllUsers", IDS_POLICY_SCOPE_ALL_USERS}, + {"scopeDevice", IDS_POLICY_SCOPE_DEVICE}, + {"levelRecommended", IDS_POLICY_LEVEL_RECOMMENDED}, + {"levelMandatory", IDS_POLICY_LEVEL_MANDATORY}, + {"sourceEnterpriseDefault", IDS_POLICY_SOURCE_ENTERPRISE_DEFAULT}, + {"sourceDefault", IDS_POLICY_SOURCE_DEFAULT}, + {"sourceCommandLine", IDS_POLICY_SOURCE_COMMAND_LINE}, + {"sourceCloud", IDS_POLICY_SOURCE_CLOUD}, + {"sourceMerged", IDS_POLICY_SOURCE_MERGED}, + {"sourceCloudFromAsh", IDS_POLICY_SOURCE_CLOUD_FROM_ASH}, + {"sourceRestrictedManagedGuestSessionOverride", + IDS_POLICY_SOURCE_RESTRICTED_MANAGED_GUEST_SESSION_OVERRIDE}, + {"sourceActiveDirectory", IDS_POLICY_SOURCE_ACTIVE_DIRECTORY}, + {"sourcePlatform", IDS_POLICY_SOURCE_PLATFORM}, + {"sourceDeviceLocalAccountOverride", + IDS_POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE}, + }; + + source->AddLocalizedStrings(kPolicyTestTypes); } webui::SetupWebUIDataSource(
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 1753e96..df359b9 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -41,6 +41,8 @@ "commands/os_integration_synchronize_command.h", "commands/run_on_os_login_command.cc", "commands/run_on_os_login_command.h", + "commands/uninstall_all_user_installed_web_apps_command.cc", + "commands/uninstall_all_user_installed_web_apps_command.h", "commands/update_file_handler_command.cc", "commands/update_file_handler_command.h", "commands/update_protocol_handler_approval_command.cc", @@ -624,6 +626,7 @@ "commands/manifest_update_finalize_command_unittest.cc", "commands/os_integration_synchronize_command_unittest.cc", "commands/run_on_os_login_command_unittest.cc", + "commands/uninstall_all_user_installed_web_apps_command_unittest.cc", "commands/update_file_handler_command_unittest.cc", "commands/web_app_uninstall_command_unittest.cc", "daily_metrics_helper_unittest.cc",
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc index f8ca701..b9d36af 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -304,6 +304,7 @@ case webapps::WebappUninstallSource::kSystemPreinstalled: case webapps::WebappUninstallSource::kExternalLockScreen: case webapps::WebappUninstallSource::kInstallUrlDeduping: + case webapps::WebappUninstallSource::kHealthcareUserInstallCleanup: return apps::Readiness::kUninstalledByNonUser; } }
diff --git a/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.cc b/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.cc new file mode 100644 index 0000000..48e044ac --- /dev/null +++ b/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.cc
@@ -0,0 +1,122 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.h" + +#include "base/check.h" +#include "base/functional/bind.h" +#include "chrome/browser/web_applications/locks/all_apps_lock.h" +#include "chrome/browser/web_applications/web_app_constants.h" +#include "chrome/browser/web_applications/web_app_registrar.h" +#include "components/webapps/browser/uninstall_result_code.h" + +namespace web_app { + +UninstallAllUserInstalledWebAppsCommand:: + UninstallAllUserInstalledWebAppsCommand( + webapps::WebappUninstallSource uninstall_source, + Profile& profile, + Callback callback) + : WebAppCommandTemplate<AllAppsLock>( + "UninstallAllUserInstalledWebAppsCommand"), + lock_description_(std::make_unique<AllAppsLockDescription>()), + uninstall_source_(uninstall_source), + profile_(profile), + callback_(std::move(callback)) {} + +UninstallAllUserInstalledWebAppsCommand:: + ~UninstallAllUserInstalledWebAppsCommand() = default; + +void UninstallAllUserInstalledWebAppsCommand::StartWithLock( + std::unique_ptr<AllAppsLock> lock) { + lock_ = std::move(lock); + auto& registrar = lock_->registrar(); + for (const web_app::WebApp& app : registrar.GetApps()) { + if (app.WasInstalledByUser()) { + ids_to_uninstall_.push_back(app.app_id()); + } + } + ProcessNextUninstallOrComplete(); +} + +void UninstallAllUserInstalledWebAppsCommand::ProcessNextUninstallOrComplete() { + // Start next pending job. + if (!pending_jobs_.empty()) { + std::swap(active_job_, pending_jobs_.back().first); + auto install_source = pending_jobs_.back().second; + pending_jobs_.pop_back(); + + active_job_->Start( + *lock_, + base::BindOnce(&UninstallAllUserInstalledWebAppsCommand::JobComplete, + weak_factory_.GetWeakPtr(), install_source)); + return; + } + + // All pending jobs and app IDs are finished. + if (ids_to_uninstall_.empty()) { + CompleteAndSelfDestruct(errors_.empty() ? CommandResult::kSuccess + : CommandResult::kFailure); + return; + } + + // Prepare pending jobs for next app ID. + AppId app_id = ids_to_uninstall_.back(); + ids_to_uninstall_.pop_back(); + + for (auto install_source : kUserDrivenInstallSources) { + pending_jobs_.emplace_back( + std::make_unique<RemoveInstallSourceJob>(uninstall_source_, *profile_, + app_id, install_source), + install_source); + } + + ProcessNextUninstallOrComplete(); +} + +void UninstallAllUserInstalledWebAppsCommand::JobComplete( + WebAppManagement::Type install_source, + webapps::UninstallResultCode code) { + CHECK(active_job_); + + debug_info_.EnsureDict(active_job_->app_id()) + ->Set(base::ToString(install_source), + ConvertUninstallResultCodeToString(code)); + + if (code != webapps::UninstallResultCode::kSuccess && + code != webapps::UninstallResultCode::kNoAppToUninstall) { + errors_.push_back(std::format("{}[{}]: {}", active_job_->app_id(), + base::ToString(install_source), + ConvertUninstallResultCodeToString(code))); + } + + active_job_.reset(); + ProcessNextUninstallOrComplete(); +} + +void UninstallAllUserInstalledWebAppsCommand::OnShutdown() { + CompleteAndSelfDestruct(CommandResult::kShutdown); +} + +const LockDescription& +UninstallAllUserInstalledWebAppsCommand::lock_description() const { + return *lock_description_; +} + +base::Value UninstallAllUserInstalledWebAppsCommand::ToDebugValue() const { + return base::Value(debug_info_.Clone()); +} + +void UninstallAllUserInstalledWebAppsCommand::CompleteAndSelfDestruct( + CommandResult result) { + CHECK(callback_); + absl::optional<std::string> error_message = absl::nullopt; + if (!errors_.empty()) { + error_message = base::JoinString(errors_, "\n"); + } + SignalCompletionAndSelfDestruct( + result, base::BindOnce(std::move(callback_), error_message)); +} + +} // namespace web_app
diff --git a/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.h b/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.h new file mode 100644 index 0000000..05af2ff --- /dev/null +++ b/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.h
@@ -0,0 +1,72 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_UNINSTALL_ALL_USER_INSTALLED_WEB_APPS_COMMAND_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_UNINSTALL_ALL_USER_INSTALLED_WEB_APPS_COMMAND_H_ + +#include "base/memory/weak_ptr.h" +#include "base/values.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/web_applications/commands/web_app_command.h" +#include "chrome/browser/web_applications/uninstall/remove_install_source_job.h" + +namespace webapps { +enum class UninstallResultCode; +} // namespace webapps + +namespace web_app { + +class AllAppsLock; +class AllAppsLockDescription; +class LockDescription; + +// This command acquires the AllAppsLock and uninstalls all user-installed web +// apps. +class UninstallAllUserInstalledWebAppsCommand + : public WebAppCommandTemplate<AllAppsLock> { + public: + using Callback = base::OnceCallback<void( + const absl::optional<std::string>& error_message)>; + + UninstallAllUserInstalledWebAppsCommand( + webapps::WebappUninstallSource uninstall_source, + Profile& profile, + Callback callback); + ~UninstallAllUserInstalledWebAppsCommand() override; + + // WebAppCommandTemplate<AllAppsLock>: + void StartWithLock(std::unique_ptr<AllAppsLock> lock) override; + void OnShutdown() override; + const LockDescription& lock_description() const override; + base::Value ToDebugValue() const override; + + private: + void ProcessNextUninstallOrComplete(); + void JobComplete(WebAppManagement::Type install_source, + webapps::UninstallResultCode code); + void CompleteAndSelfDestruct(CommandResult result); + + std::unique_ptr<AllAppsLockDescription> lock_description_; + std::unique_ptr<AllAppsLock> lock_; + + webapps::WebappUninstallSource uninstall_source_; + const raw_ref<Profile> profile_; + Callback callback_; + + std::vector<AppId> ids_to_uninstall_; + std::vector<std::pair<std::unique_ptr<RemoveInstallSourceJob>, + WebAppManagement::Type>> + pending_jobs_; + std::unique_ptr<RemoveInstallSourceJob> active_job_; + + std::vector<std::string> errors_; + base::Value::Dict debug_info_; + + base::WeakPtrFactory<UninstallAllUserInstalledWebAppsCommand> weak_factory_{ + this}; +}; + +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_UNINSTALL_ALL_USER_INSTALLED_WEB_APPS_COMMAND_H_
diff --git a/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command_unittest.cc b/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command_unittest.cc new file mode 100644 index 0000000..5a3a96a --- /dev/null +++ b/chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command_unittest.cc
@@ -0,0 +1,171 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.h" + +#include "base/memory/scoped_refptr.h" +#include "base/test/task_environment.h" +#include "base/test/test_future.h" +#include "chrome/browser/web_applications/policy/web_app_policy_constants.h" +#include "chrome/browser/web_applications/test/fake_web_app_provider.h" +#include "chrome/browser/web_applications/test/mock_file_utils_wrapper.h" +#include "chrome/browser/web_applications/test/test_file_utils.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test.h" +#include "chrome/browser/web_applications/test/web_app_test_observers.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_command_manager.h" +#include "chrome/browser/web_applications/web_app_icon_manager.h" +#include "chrome/browser/web_applications/web_app_registry_update.h" +#include "chrome/browser/web_applications/web_app_utils.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/scoped_user_pref_update.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace web_app { + +class UninstallAllUserInstalledWebAppsCommandTest : public WebAppTest { + public: + UninstallAllUserInstalledWebAppsCommandTest() = default; + + void SetUp() override { + WebAppTest::SetUp(); + + test::AwaitStartWebAppProviderAndSubsystems(profile()); + } + + void TearDown() override { + provider()->Shutdown(); + WebAppTest::TearDown(); + } + + WebAppProvider* provider() { return WebAppProvider::GetForTest(profile()); } + + WebAppRegistrar& registrar_unsafe() { return provider()->registrar_unsafe(); } +}; + +TEST_F(UninstallAllUserInstalledWebAppsCommandTest, NoUserInstalledWebApps) { + WebAppTestInstallWithOsHooksObserver observer(profile()); + observer.BeginListening(); + { + base::Value::Dict app_policy; + app_policy.Set(web_app::kUrlKey, "https://example.com/install"); + ScopedListPrefUpdate update(profile()->GetPrefs(), + prefs::kWebAppInstallForceList); + update->Append(std::move(app_policy)); + } + AppId app_id = observer.Wait(); + + base::test::TestFuture<const absl::optional<std::string>&> future; + provider()->command_manager().ScheduleCommand( + std::make_unique<UninstallAllUserInstalledWebAppsCommand>( + webapps::WebappUninstallSource::kHealthcareUserInstallCleanup, + *profile(), future.GetCallback())); + EXPECT_EQ(future.Get(), absl::nullopt); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id)); +} + +TEST_F(UninstallAllUserInstalledWebAppsCommandTest, RemovesUserInstallSources) { + WebAppTestInstallWithOsHooksObserver observer(profile()); + observer.BeginListening(); + { + base::Value::Dict app_policy; + app_policy.Set(web_app::kUrlKey, "https://example.com/install"); + ScopedListPrefUpdate update(profile()->GetPrefs(), + prefs::kWebAppInstallForceList); + update->Append(std::move(app_policy)); + } + AppId app_id = observer.Wait(); + + AppId sync_app_id = test::InstallDummyWebApp( + profile(), "app from sync", GURL("https://example.com/install"), + webapps::WebappInstallSource::SYNC); + EXPECT_EQ(app_id, sync_app_id); + + const WebApp* web_app = registrar_unsafe().GetAppById(app_id); + EXPECT_TRUE(web_app->GetSources().test(WebAppManagement::kPolicy)); + EXPECT_TRUE(web_app->GetSources().test(WebAppManagement::kSync)); + + base::test::TestFuture<const absl::optional<std::string>&> future; + provider()->command_manager().ScheduleCommand( + std::make_unique<UninstallAllUserInstalledWebAppsCommand>( + webapps::WebappUninstallSource::kHealthcareUserInstallCleanup, + *profile(), future.GetCallback())); + EXPECT_EQ(future.Get(), absl::nullopt); + + EXPECT_TRUE(registrar_unsafe().IsInstalled(app_id)); + EXPECT_TRUE(web_app->GetSources().test(WebAppManagement::kPolicy)); + EXPECT_FALSE(web_app->GetSources().test(WebAppManagement::kSync)); +} + +TEST_F(UninstallAllUserInstalledWebAppsCommandTest, + UninstallsUserInstalledWebApps) { + AppId app_id1 = test::InstallDummyWebApp( + profile(), "app from browser", GURL("https://example1.com"), + webapps::WebappInstallSource::AUTOMATIC_PROMPT_BROWSER_TAB); + + AppId app_id2 = test::InstallDummyWebApp(profile(), "app from sync", + GURL("https://example2.com"), + webapps::WebappInstallSource::SYNC); + + base::test::TestFuture<const absl::optional<std::string>&> future; + provider()->command_manager().ScheduleCommand( + std::make_unique<UninstallAllUserInstalledWebAppsCommand>( + webapps::WebappUninstallSource::kHealthcareUserInstallCleanup, + *profile(), future.GetCallback())); + EXPECT_EQ(future.Get(), absl::nullopt); + + EXPECT_FALSE(registrar_unsafe().IsInstalled(app_id1)); + EXPECT_FALSE(registrar_unsafe().IsInstalled(app_id2)); +} + +class UninstallAllUserInstalledWebAppsCommandWithIconManagerTest + : public UninstallAllUserInstalledWebAppsCommandTest { + public: + void SetUp() override { + WebAppTest::SetUp(); + + FakeWebAppProvider* provider = FakeWebAppProvider::Get(profile()); + file_utils_wrapper_ = + base::MakeRefCounted<testing::NiceMock<MockFileUtilsWrapper>>(); + provider->SetIconManager( + std::make_unique<WebAppIconManager>(profile(), file_utils_wrapper_)); + + test::AwaitStartWebAppProviderAndSubsystems(profile()); + } + + void TearDown() override { + file_utils_wrapper_ = nullptr; + UninstallAllUserInstalledWebAppsCommandTest::TearDown(); + } + + scoped_refptr<testing::NiceMock<MockFileUtilsWrapper>> file_utils_wrapper_; +}; + +TEST_F(UninstallAllUserInstalledWebAppsCommandWithIconManagerTest, + ReturnUninstallErrors) { + EXPECT_CALL(*file_utils_wrapper_, WriteFile) + .WillRepeatedly(testing::ReturnArg<2>()); + + AppId app_id = test::InstallDummyWebApp(profile(), "app from sync", + GURL("https://example.com"), + webapps::WebappInstallSource::SYNC); + + EXPECT_CALL(*file_utils_wrapper_, DeleteFileRecursively) + .WillOnce(testing::Return(false)); + + base::test::TestFuture<const absl::optional<std::string>&> future; + provider()->command_manager().ScheduleCommand( + std::make_unique<UninstallAllUserInstalledWebAppsCommand>( + webapps::WebappUninstallSource::kHealthcareUserInstallCleanup, + *profile(), future.GetCallback())); + EXPECT_EQ(future.Get(), app_id + "[Sync]: Error"); + + EXPECT_FALSE(registrar_unsafe().IsInstalled(app_id)); +} + +} // namespace web_app
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsertest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsertest.cc index 7649031..88d37f0d 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsertest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsertest.cc
@@ -659,4 +659,78 @@ EXPECT_TRUE(AppBrowserController::IsWebApp(new_app_window)); } +IN_PROC_BROWSER_TEST_F(IsolatedWebAppBrowserTest, SharedWorker) { + std::string register_worker_js = R"( + const policy = trustedTypes.createPolicy('default', { + createScriptURL: (url) => url, + }); + const worker = new SharedWorker( + policy.createScriptURL('/shared_worker.js')); + + let listener = null; + worker.port.addEventListener('message', (e) => { + listener(e.data); + listener = null; + }); + worker.port.start(); + + function sendMessage(body) { + if (listener !== null) { + return Promise.reject('Already have pending request'); + } + return new Promise((resolve) => { + listener = resolve; + worker.port.postMessage(body); + }); + } + )"; + + web_app::IsolatedWebAppUrlInfo url_info = InstallDevModeProxyIsolatedWebApp( + isolated_web_app_dev_server().GetOrigin()); + content::RenderFrameHost* app_frame1 = OpenApp(url_info.app_id()); + ASSERT_TRUE(ExecJs(app_frame1, register_worker_js)); + + EXPECT_EQ("none", EvalJs(app_frame1, "sendMessage('hello')")); + EXPECT_EQ("hello", EvalJs(app_frame1, "sendMessage('world')")); + + // Open a second window and make sure it uses the same worker instance. + content::RenderFrameHost* app_frame2 = OpenApp(url_info.app_id()); + ASSERT_TRUE(ExecJs(app_frame2, register_worker_js)); + + EXPECT_EQ("world", EvalJs(app_frame2, "sendMessage('frame2!')")); +} + +IN_PROC_BROWSER_TEST_F(IsolatedWebAppBrowserTest, DedicatedWorker) { + std::string register_worker_js = R"( + const policy = trustedTypes.createPolicy('default', { + createScriptURL: (url) => url, + }); + const worker = new Worker(policy.createScriptURL('/dedicated_worker.js')); + + let listener = null; + worker.addEventListener('message', (e) => { + listener(e.data); + listener = null; + }); + + function sendMessage(body) { + if (listener !== null) { + return Promise.reject('Already have pending request'); + } + return new Promise((resolve) => { + listener = resolve; + worker.postMessage(body); + }); + } + )"; + + web_app::IsolatedWebAppUrlInfo url_info = InstallDevModeProxyIsolatedWebApp( + isolated_web_app_dev_server().GetOrigin()); + content::RenderFrameHost* app_frame = OpenApp(url_info.app_id()); + ASSERT_TRUE(ExecJs(app_frame, register_worker_js)); + + EXPECT_EQ("none", EvalJs(app_frame, "sendMessage('hello')")); + EXPECT_EQ("hello", EvalJs(app_frame, "sendMessage('world')")); +} + } // namespace web_app
diff --git a/chrome/browser/web_applications/uninstall/remove_web_app_job.cc b/chrome/browser/web_applications/uninstall/remove_web_app_job.cc index 9cb2c24f..16fac34 100644 --- a/chrome/browser/web_applications/uninstall/remove_web_app_job.cc +++ b/chrome/browser/web_applications/uninstall/remove_web_app_job.cc
@@ -53,7 +53,9 @@ uninstall_source == webapps::WebappUninstallSource::kShelf || uninstall_source == webapps::WebappUninstallSource::kSync || uninstall_source == webapps::WebappUninstallSource::kStartupCleanup || - uninstall_source == webapps::WebappUninstallSource::kTestCleanup; + uninstall_source == webapps::WebappUninstallSource::kTestCleanup || + uninstall_source == + webapps::WebappUninstallSource::kHealthcareUserInstallCleanup; } } // namespace
diff --git a/chrome/browser/web_applications/web_app_command_scheduler.cc b/chrome/browser/web_applications/web_app_command_scheduler.cc index 6cf9a6a..470c3aab 100644 --- a/chrome/browser/web_applications/web_app_command_scheduler.cc +++ b/chrome/browser/web_applications/web_app_command_scheduler.cc
@@ -506,6 +506,24 @@ location); } +void WebAppCommandScheduler::UninstallAllUserInstalledWebApps( + webapps::WebappUninstallSource uninstall_source, + UninstallAllUserInstalledWebAppsCommand::Callback callback, + const base::Location& location) { + if (IsShuttingDown()) { + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), + ConvertUninstallResultCodeToString( + webapps::UninstallResultCode::kCancelled))); + return; + } + provider_->command_manager().ScheduleCommand( + std::make_unique<UninstallAllUserInstalledWebAppsCommand>( + uninstall_source, *profile_, std::move(callback)), + location); +} + void WebAppCommandScheduler::SetRunOnOsLoginMode( const AppId& app_id, RunOnOsLoginMode login_mode,
diff --git a/chrome/browser/web_applications/web_app_command_scheduler.h b/chrome/browser/web_applications/web_app_command_scheduler.h index b07f103..d073e38 100644 --- a/chrome/browser/web_applications/web_app_command_scheduler.h +++ b/chrome/browser/web_applications/web_app_command_scheduler.h
@@ -19,6 +19,7 @@ #include "chrome/browser/web_applications/commands/manifest_update_check_command.h" #include "chrome/browser/web_applications/commands/manifest_update_finalize_command.h" #include "chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.h" +#include "chrome/browser/web_applications/commands/uninstall_all_user_installed_web_apps_command.h" #include "chrome/browser/web_applications/external_install_options.h" #include "chrome/browser/web_applications/isolated_web_apps/install_isolated_web_app_command.h" #include "chrome/browser/web_applications/uninstall/uninstall_job.h" @@ -247,6 +248,12 @@ UninstallJob::Callback callback, const base::Location& location = FROM_HERE); + // Schedules a command that uninstalls all user-installed web apps. + void UninstallAllUserInstalledWebApps( + webapps::WebappUninstallSource uninstall_source, + UninstallAllUserInstalledWebAppsCommand::Callback callback, + const base::Location& location = FROM_HERE); + // Schedules a command that updates run on os login to provided `login_mode` // for a web app. void SetRunOnOsLoginMode(const AppId& app_id,
diff --git a/chrome/browser/web_applications/web_app_constants.cc b/chrome/browser/web_applications/web_app_constants.cc index d3ca8678..00c78db9 100644 --- a/chrome/browser/web_applications/web_app_constants.cc +++ b/chrome/browser/web_applications/web_app_constants.cc
@@ -102,6 +102,8 @@ return "Test cleanup"; case webapps::WebappUninstallSource::kInstallUrlDeduping: return "Install URL deduping"; + case webapps::WebappUninstallSource::kHealthcareUserInstallCleanup: + return "Healthcare User Install Cleanup"; } }
diff --git a/chrome/browser/web_applications/web_app_constants.h b/chrome/browser/web_applications/web_app_constants.h index 613c438..adcdd408 100644 --- a/chrome/browser/web_applications/web_app_constants.h +++ b/chrome/browser/web_applications/web_app_constants.h
@@ -295,6 +295,24 @@ std::string ConvertUninstallSourceToStringType( const webapps::WebappUninstallSource& uninstall_source); +// Install sources that can be uninstalled by the user. +const WebAppManagement::Type kUserUninstallableSources[] = { + WebAppManagement::kDefault, + WebAppManagement::kSync, + WebAppManagement::kWebAppStore, + WebAppManagement::kSubApp, + WebAppManagement::kOem, + WebAppManagement::kCommandLine, + WebAppManagement::kOneDriveIntegration, +}; + +// Install sources that resulted from a user web app install. +const WebAppManagement::Type kUserDrivenInstallSources[] = { + WebAppManagement::kSync, + WebAppManagement::kWebAppStore, + WebAppManagement::kOneDriveIntegration, +}; + } // namespace web_app #endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_CONSTANTS_H_
diff --git a/chrome/browser/web_applications/web_app_utils.cc b/chrome/browser/web_applications/web_app_utils.cc index 9ad6e5a..b9747db 100644 --- a/chrome/browser/web_applications/web_app_utils.cc +++ b/chrome/browser/web_applications/web_app_utils.cc
@@ -576,15 +576,7 @@ bool CanUserUninstallWebApp(WebAppSources sources) { WebAppSources specified_sources; - for (WebAppManagement::Type type : { - WebAppManagement::kDefault, - WebAppManagement::kSync, - WebAppManagement::kWebAppStore, - WebAppManagement::kSubApp, - WebAppManagement::kOem, - WebAppManagement::kCommandLine, - WebAppManagement::kOneDriveIntegration, - }) { + for (WebAppManagement::Type type : kUserUninstallableSources) { specified_sources.set(type); }
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt index 1d7b5a1..14bb257 100644 --- a/chrome/build/lacros64.pgo.txt +++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@ -chrome-chromeos-amd64-generic-main-1687910433-0e82dd540b6239eca41c0532c2097b11774caf8e.profdata +chrome-chromeos-amd64-generic-main-1687953515-1d9b1fba30d407599c722142b25514fb0a7a2c2a.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 5d3a2e33..4546525e 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1687946070-6743fefe9c997bac5a0a2766a1667fe6885b2849.profdata +chrome-mac-arm-main-1687967584-959d12959475e6ada4d6db4678edffefe83a6c1f.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 2fc3a4d..22883e9 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1687931674-0231b311c720aabcb60a82426ee382ba2ed76bfc.profdata +chrome-mac-main-1687953515-1c632dcdf40125994114f815624549b4f3eb7f82.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 178f5a8..01fbb848 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1687931674-f7e335ffabb10143815909557f45296d28547df7.profdata +chrome-win32-main-1687964388-37dc025c61d6964e7ecf2ee0fa3bdd9600842c08.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index a75eff7..4b3c8fbc 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1687942448-f6e990ebe1a19fb4104e0357e3a23906cf836d67.profdata +chrome-win64-main-1687953515-5e86fb6b063616749b8f2f99ec6c9c5ffb7e286e.profdata
diff --git a/chrome/services/cups_proxy/ipp_validator.h b/chrome/services/cups_proxy/ipp_validator.h index fdaf4f9..e6dc435e 100644 --- a/chrome/services/cups_proxy/ipp_validator.h +++ b/chrome/services/cups_proxy/ipp_validator.h
@@ -49,7 +49,7 @@ bool ValidateIppData(const std::vector<uint8_t>& ipp_data); // Unowned delegate providing necessary Profile dependencies. - CupsProxyServiceDelegate* const delegate_; + const raw_ptr<CupsProxyServiceDelegate, ExperimentalAsh> delegate_; SEQUENCE_CHECKER(sequence_checker_); };
diff --git a/chrome/services/cups_proxy/printer_installer.h b/chrome/services/cups_proxy/printer_installer.h index 6783c47..016faf7 100644 --- a/chrome/services/cups_proxy/printer_installer.h +++ b/chrome/services/cups_proxy/printer_installer.h
@@ -11,6 +11,7 @@ #include <string> #include "base/functional/callback_forward.h" +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/services/cups_proxy/cups_proxy_service_delegate.h" @@ -45,7 +46,7 @@ void Finish(InstallPrinterCallback cb, InstallPrinterResult res); // Unowned delegate granting access to printing stack dependencies. - CupsProxyServiceDelegate* const delegate_; + const raw_ptr<CupsProxyServiceDelegate, ExperimentalAsh> delegate_; SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<PrinterInstaller> weak_factory_{this};
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc index 38fdbdc..6f246bd 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc
@@ -466,7 +466,16 @@ return absl::nullopt; } - return base::Base64Decode(*fido_message); + std::string base64_decoded_fido_message; + + if (!base::Base64Decode(*fido_message, &base64_decoded_fido_message, + base::Base64DecodePolicy::kForgiving)) { + LOG(ERROR) << "Failed to decode fidoMessage as a Base64 String"; + return absl::nullopt; + } + + return std::vector<uint8_t>(base64_decoded_fido_message.begin(), + base64_decoded_fido_message.end()); } void QuickStartDecoder::DecodeNotifySourceOfUpdateResponse(
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index f17eb6c..09a881e 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3442,6 +3442,7 @@ if (is_chromeos) { sources += [ + "../browser/chromeos/extensions/login_screen/login/cleanup/web_app_cleanup_handler_browsertest.cc", "../browser/chromeos/extensions/login_screen/login_state/login_state_apitest.cc", "../browser/extensions/api/certificate_provider/certificate_provider_apitest.cc", "../browser/extensions/api/document_scan/document_scan_apitest.cc", @@ -3884,8 +3885,6 @@ "../browser/ash/accessibility/live_caption/system_live_caption_service_browsertest.cc", "../browser/ash/accessibility/magnification_controller_browsertest.cc", "../browser/ash/accessibility/magnification_manager_browsertest.cc", - "../browser/ash/accessibility/magnifier_animation_waiter.cc", - "../browser/ash/accessibility/magnifier_animation_waiter.h", "../browser/ash/accessibility/select_to_speak_browsertest.cc", "../browser/ash/accessibility/service/accessibility_service_client_browsertest.cc", "../browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc", @@ -4060,6 +4059,7 @@ "../browser/ash/login/saml/security_token_saml_test.h", "../browser/ash/login/saml/test_client_cert_saml_idp_mixin.cc", "../browser/ash/login/saml/test_client_cert_saml_idp_mixin.h", + "../browser/ash/login/screens/add_child_screen_browsertest.cc", "../browser/ash/login/screens/app_downloading_screen_browsertest.cc", "../browser/ash/login/screens/assistant_optin_flow_screen_browsertest.cc", "../browser/ash/login/screens/choobe_screen_browsertest.cc", @@ -9569,6 +9569,8 @@ "../browser/ui/autofill/payments/card_unmask_prompt_view_tester.h", "../browser/ui/autofill/payments/test_card_unmask_prompt_waiter.cc", "../browser/ui/autofill/payments/test_card_unmask_prompt_waiter.h", + "../browser/ui/exclusive_access/exclusive_access_test.cc", + "../browser/ui/exclusive_access/exclusive_access_test.h", "../browser/ui/search/ntp_test_utils.cc", "../browser/ui/search/ntp_test_utils.h", "../browser/ui/views/autofill/payments/card_unmask_prompt_view_tester_views.cc",
diff --git a/chrome/test/data/web_apps/simple_isolated_app/dedicated_worker.js b/chrome/test/data/web_apps/simple_isolated_app/dedicated_worker.js new file mode 100644 index 0000000..a06d93b7 --- /dev/null +++ b/chrome/test/data/web_apps/simple_isolated_app/dedicated_worker.js
@@ -0,0 +1,11 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Responds to post messages with the value of the *previous* message that was +// received. +let lastMessage = 'none'; +self.addEventListener('message', (e) => { + postMessage(lastMessage); + lastMessage = e.data; +});
diff --git a/chrome/test/data/web_apps/simple_isolated_app/dedicated_worker.js.mock-http-headers b/chrome/test/data/web_apps/simple_isolated_app/dedicated_worker.js.mock-http-headers new file mode 100644 index 0000000..afdd546 --- /dev/null +++ b/chrome/test/data/web_apps/simple_isolated_app/dedicated_worker.js.mock-http-headers
@@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: text/javascript +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +Cross-Origin-Resource-Policy: same-origin
diff --git a/chrome/test/data/web_apps/simple_isolated_app/shared_worker.js b/chrome/test/data/web_apps/simple_isolated_app/shared_worker.js new file mode 100644 index 0000000..f0059cf --- /dev/null +++ b/chrome/test/data/web_apps/simple_isolated_app/shared_worker.js
@@ -0,0 +1,17 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Responds to post messages with the value of the *previous* message that was +// received. +let lastMessage = 'none'; +self.addEventListener('connect', (e) => { + const port = e.ports[0]; + + port.addEventListener('message', (e) => { + port.postMessage(lastMessage); + lastMessage = e.data; + }); + + port.start(); +});
diff --git a/chrome/test/webapps/data/actions.md b/chrome/test/webapps/data/actions.md index 7642008..647a84f9 100644 --- a/chrome/test/webapps/data/actions.md +++ b/chrome/test/webapps/data/actions.md
@@ -20,7 +20,7 @@ TODO(dmurph): Possibly this table up into markdown-header section. -| # Action base name | Argument Types | Output Actions | Unique Identifier (next: 168) | Status (WIP, Implemented, Not Implemented, Parameterized) | Description | Metadata, implementation bug, etc | +| # Action base name | Argument Types | Output Actions | Unique Identifier (next: 172) | Status (WIP, Implemented, Not Implemented, Parameterized) | Description | Metadata, implementation bug, etc | | --- | --- | --- | --- | --- | --- | --- | | # Badging | | check_app_badge_empty | Site | | 2 | Not Implemented | Check that the 'badge' on the app icon is empty | | @@ -126,6 +126,10 @@ | check_window_icon_correct | Site | | 78 | Not Implemented | | P3 | | delete_platform_shortcut | Site | | 74 | Implemented | Delete the shortcut that lives on the operating system. Win/Mac/Linux only. | P2 | | delete_profile | | | 83 | Not Implemented | Delete the user profile. | P4 | +| enter_full_screen_app | | | 168 | Implemented | Enter full screen mode for the app window. | P1 | +| exit_full_screen_app | | | 169 | Implemented | Exit full screen mode for the app window. | P1 | +| check_app_toolbar_visible | | | 170 | Implemented | Check the toolbar is visible on the app window . | P1 | +| check_app_toolbar_not_visible | | | 171 | Implemented | Check the toolbar is not visible on the app window. | P1 | | # Launching | | launch_from_launch_icon | Site | | 35 | Implemented | Launch the web app by navigating the browser to the web app, and selecting the launch icon in the omnibox (intent picker), | | | launch_from_menu_option | Site | | 69 | Implemented | Launch the web app by navigating the browser to the web app, and selecting the "Launch _" menu option in the 3-dot menu. | cliffordcheng@, P1 |
diff --git a/chrome/test/webapps/data/framework_supported_actions.csv b/chrome/test/webapps/data/framework_supported_actions.csv index 3b009466..ef2f675 100644 --- a/chrome/test/webapps/data/framework_supported_actions.csv +++ b/chrome/test/webapps/data/framework_supported_actions.csv
@@ -6,6 +6,8 @@ check_app_in_list_windowed, 🌕, 🌕, 🌕, 🌓, check_app_list_empty, 🌕, 🌕, 🌕, 🌓, check_app_not_in_list, 🌕, 🌕, 🌕, 🌓, +check_app_toolbar_visible, 🌕, 🌕, 🌕, 🌕, +check_app_toolbar_not_visible, 🌕, 🌕, 🌕, 🌕, check_browser_not_at_app_home, 🌕, 🌕, 🌕, 🌕, check_custom_toolbar, 🌕, 🌕, 🌕, 🌕, check_files_loaded_in_site, 🌕, 🌕, 🌕, 🌕, @@ -40,6 +42,8 @@ delete_platform_shortcut, 🌕, 🌕, 🌕, 🌑, disable_window_controls_overlay, 🌕, 🌕, 🌕, 🌕, enable_window_controls_overlay, 🌕, 🌕, 🌕, 🌕, +enter_full_screen_app, 🌕, 🌕, 🌕, 🌕, +exit_full_screen_app, 🌕, 🌕, 🌕, 🌕, create_shortcut, 🌕, 🌕, 🌕, 🌕, install_locally, 🌓, 🌓, 🌓, 🌓, install_menu_option, 🌕, 🌕, 🌕, 🌕,
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index 1dde9af..59643632 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -31,10 +31,6 @@ if (is_chromeos_ash) { configs += [ ":chromeos_implementation" ] - if (is_chromeos_device) { - configs += [ "//build/config/compiler:use_orderfile_for_hugepage" ] - } - if (current_cpu == "arm" || current_cpu == "x86") { defines = [ "BINDER_IPC_32BIT" ] }
diff --git a/chromeos/ash/components/report/BUILD.gn b/chromeos/ash/components/report/BUILD.gn new file mode 100644 index 0000000..69b2236 --- /dev/null +++ b/chromeos/ash/components/report/BUILD.gn
@@ -0,0 +1,36 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") +import("//third_party/protobuf/proto_library.gni") + +assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //ash") + +source_set("fresnel_prefs") { + public_deps = [ "//components/prefs:prefs" ] + + deps = [ "//base" ] + + sources = [ + "//chromeos/ash/components/report/prefs/fresnel_pref_names.cc", + "//chromeos/ash/components/report/prefs/fresnel_pref_names.h", + ] +} + +proto_library("fresnel_service_proto") { + sources = [ "//chromeos/ash/components/report/proto/fresnel_service.proto" ] + + extra_configs = + [ "//third_party/private_membership:private_membership_config" ] + + import_dirs = [ + "//third_party/private_membership/src", + "//third_party/shell-encryption/src", + ".", + ] + + proto_in_dir = "//" + + link_deps = [ "//third_party/private_membership:private_membership_proto" ] +}
diff --git a/chromeos/ash/services/secure_channel/ble_constants.h b/chromeos/ash/services/secure_channel/ble_constants.h index 7ee14775..b6c1a74 100644 --- a/chromeos/ash/services/secure_channel/ble_constants.h +++ b/chromeos/ash/services/secure_channel/ble_constants.h
@@ -19,6 +19,7 @@ // The service UUID used for BLE advertisements. constexpr const char kAdvertisingServiceUuid[] = "0000fe50-0000-1000-8000-00805f9b34fb"; +const std::vector<uint8_t> kAdvertisingServiceUuidAsBytes = {0x50, 0xfe}; // The GATT server UUID used for uWeave. constexpr const char kGattServerUuid[] = "b3b7e28e-a000-3e17-bd86-6e97b9e28c11";
diff --git a/chromeos/ash/services/secure_channel/ble_scanner_impl.cc b/chromeos/ash/services/secure_channel/ble_scanner_impl.cc index 250ba059..2f1859f 100644 --- a/chromeos/ash/services/secure_channel/ble_scanner_impl.cc +++ b/chromeos/ash/services/secure_channel/ble_scanner_impl.cc
@@ -30,6 +30,10 @@ // TODO(hansberry): Share this constant with BluetoothHelper. const size_t kMinNumBytesInServiceData = 2; +constexpr base::TimeDelta kScanningDeviceFoundTimeout = base::Seconds(1); +constexpr base::TimeDelta kScanningDeviceLostTimeout = base::Seconds(7); +constexpr base::TimeDelta kScanningRssiSamplingPeriod = base::Seconds(1); + } // namespace // static @@ -163,11 +167,23 @@ is_initializing_discovery_session_ = true; if (floss::features::IsFlossEnabled()) { - // TODO(b/217274013): Filters are currently being ignored in Floss. When - // filters are implemented, a filter can be added for - // kAdvertisingServiceUuid. + device::BluetoothLowEnergyScanFilter::Pattern pattern( + /*start_position=*/0, + device::BluetoothLowEnergyScanFilter::AdvertisementDataType:: + kServiceData, + kAdvertisingServiceUuidAsBytes); + auto filter = device::BluetoothLowEnergyScanFilter::Create( + device::BluetoothLowEnergyScanFilter::Range::kNear, + kScanningDeviceFoundTimeout, kScanningDeviceLostTimeout, {pattern}, + kScanningRssiSamplingPeriod); + if (!filter) { + PA_LOG(ERROR) + << "Failed to start LE scanning due to failure to create filter."; + return; + } + le_scan_session_ = adapter_->StartLowEnergyScanSession( - /*filter=*/nullptr, weak_ptr_factory_.GetWeakPtr()); + std::move(filter), weak_ptr_factory_.GetWeakPtr()); return; }
diff --git a/chromeos/ash/services/secure_channel/ble_scanner_impl_unittest.cc b/chromeos/ash/services/secure_channel/ble_scanner_impl_unittest.cc index 50a3a1e..3944328 100644 --- a/chromeos/ash/services/secure_channel/ble_scanner_impl_unittest.cc +++ b/chromeos/ash/services/secure_channel/ble_scanner_impl_unittest.cc
@@ -244,6 +244,7 @@ std::unique_ptr<device::BluetoothLowEnergyScanFilter> filter, base::WeakPtr<device::BluetoothLowEnergyScanSession::Delegate> delegate) { EXPECT_FALSE(scan_session_ptr_); + EXPECT_TRUE(filter); auto scan_session = std::make_unique<device::MockBluetoothLowEnergyScanSession>( base::BindOnce(
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index f7128b4..227fbfc 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -285,8 +285,9 @@ <message name="IDS_QUICK_ANSWERS_VIEW_A11Y_INFO_DESC_TEMPLATE_V2" desc="A11y description template for the Quick Answers view (V2 version)."> <ph name="QUERY_TEXT">$1<ex>interested</ex></ph>; <ph name="RESULT_TEXT">$2<ex>showing curiosity or concern about something or someone; having a feeling of interest.</ex></ph>; Press Search plus Space to see result in Google Search. </message> + <!-- TODO(b/259440976): Remove navigation directions once the QA Rich Card feature launches. --> <message name="IDS_QUICK_ANSWERS_VIEW_A11Y_NAME_TEXT" desc="A11y name text for the Quick Answers view."> - Info related to your selection + Info related to your selection. Use Left or Right arrow keys to access controls. </message> <message name="IDS_QUICK_ANSWERS_VIEW_A11Y_RETRY_LABEL_DESC" desc="A11y retry label description for the Quick Answers view."> Cannot connect to the internet. Click to try again.
diff --git a/chromeos/chromeos_strings_grd/IDS_QUICK_ANSWERS_VIEW_A11Y_NAME_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_QUICK_ANSWERS_VIEW_A11Y_NAME_TEXT.png.sha1 index 2bbe767..7d53359 100644 --- a/chromeos/chromeos_strings_grd/IDS_QUICK_ANSWERS_VIEW_A11Y_NAME_TEXT.png.sha1 +++ b/chromeos/chromeos_strings_grd/IDS_QUICK_ANSWERS_VIEW_A11Y_NAME_TEXT.png.sha1
@@ -1 +1 @@ -a54a9781638401dc399f5aa506d1db54944abda7 \ No newline at end of file +64594e70bd3bc84a3a8e856a3241c11d0471f133 \ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 4ee8089..1d6f14c 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -394,4 +394,8 @@ # https://crbug.com/1446233 "tast.arc.IntentForward.lacros_vm", + + # https://crbug.com/1458897 + "cryptohome.UssMigrationPasswordPin", + "cryptohome.USSMigrationPinAfterPasswordMigration", ]
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button.cc b/chromeos/ui/frame/caption_buttons/frame_size_button.cc index deb288e..1e70cb7 100644 --- a/chromeos/ui/frame/caption_buttons/frame_size_button.cc +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.cc
@@ -16,6 +16,7 @@ #include "chromeos/ui/frame/multitask_menu/multitask_menu.h" #include "chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.h" #include "chromeos/ui/wm/features.h" +#include "ui/aura/client/cursor_client.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" #include "ui/base/hit_test.h" @@ -387,7 +388,10 @@ } // Pie animation will start on both active/inactive window. - if (GetState() == views::Button::STATE_HOVERED) { + if (aura::client::CursorClient* cursor_client = aura::client::GetCursorClient( + GetWidget()->GetNativeWindow()->GetRootWindow()); + cursor_client && cursor_client->IsCursorVisible() && + GetState() == views::Button::STATE_HOVERED) { // On animation end we should show the multitask menu. // Note that if the window is not active, after the pie animation this will // activate the window.
diff --git a/components/BUILD.gn b/components/BUILD.gn index d3326e59..1d5b5bf2 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -525,6 +525,7 @@ "//components/embedder_support/android:native_java_unittests_java", "//components/embedder_support/android/metrics:test_support_java", "//components/embedder_support/android/metrics:unit_tests", + "//components/environment_integrity/android:unit_tests", "//components/gcm_driver/instance_id:test_support", "//components/gcm_driver/instance_id/android:instance_id_driver_java", "//components/gcm_driver/instance_id/android:instance_id_driver_test_support_java",
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc index ec54788..6ac26d9 100644 --- a/components/autofill/core/browser/field_types.cc +++ b/components/autofill/core/browser/field_types.cc
@@ -297,4 +297,166 @@ return o; } +base::StringPiece FieldTypeToDeveloperRepresentationString( + ServerFieldType type) { + switch (type) { + case NO_SERVER_DATA: + case UNKNOWN_TYPE: + case FIELD_WITH_DEFAULT_VALUE: + case EMPTY_TYPE: + case NOT_ACCOUNT_CREATION_PASSWORD: + case NOT_NEW_PASSWORD: + case NOT_PASSWORD: + case NOT_USERNAME: + case AMBIGUOUS_TYPE: + case NAME_SUFFIX: + case ADDRESS_HOME_ADDRESS: + case ADDRESS_HOME_ADDRESS_WITH_NAME: + return ""; + case NUMERIC_QUANTITY: + return "Numeric quantity"; + case MERCHANT_EMAIL_SIGNUP: + return "Merchant email signup"; + case MERCHANT_PROMO_CODE: + return "Merchant promo code"; + case PASSWORD: + return "Password"; + case ACCOUNT_CREATION_PASSWORD: + return "Account creation password"; + case USERNAME: + case SINGLE_USERNAME: + return "Username"; + case USERNAME_AND_EMAIL_ADDRESS: + return "Username and email"; + case PROBABLY_NEW_PASSWORD: + case NEW_PASSWORD: + return "New password"; + case CONFIRMATION_PASSWORD: + return "Confirmation password"; + case SEARCH_TERM: + return "Search term"; + case PRICE: + return "Price"; + case NAME_HONORIFIC_PREFIX: + return "Honorific prefix"; + case NAME_FULL_WITH_HONORIFIC_PREFIX: + return "Full name with honorific prefix"; + case NAME_FIRST: + return "First name"; + case NAME_MIDDLE: + return "Middle name"; + case NAME_LAST: + return "Last name"; + case NAME_LAST_FIRST: + return "First last name"; + case NAME_LAST_CONJUNCTION: + return "Last name conjunction"; + case NAME_LAST_SECOND: + return "Second last name"; + case NAME_MIDDLE_INITIAL: + return "Middle name initial"; + case NAME_FULL: + return "Full name"; + case EMAIL_ADDRESS: + return "Email address"; + case PHONE_HOME_NUMBER: + case PHONE_HOME_WHOLE_NUMBER: + case PHONE_HOME_CITY_AND_NUMBER: + case PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX: + return "Phone number"; + case PHONE_HOME_NUMBER_PREFIX: + return "Phone number prefix"; + case PHONE_HOME_NUMBER_SUFFIX: + return "Phone number suffix"; + case PHONE_HOME_CITY_CODE: + case PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX: + return "Phone number city code"; + case PHONE_HOME_COUNTRY_CODE: + return "Phone number country code"; + case PHONE_HOME_EXTENSION: + return "Phone number extension"; + case ADDRESS_HOME_FLOOR: + return "Floor"; + case ADDRESS_HOME_LANDMARK: + return "Landmark"; + case ADDRESS_HOME_STREET_NAME: + return "Street name"; + case ADDRESS_HOME_DEPENDENT_STREET_NAME: + return "Dependent home street name"; + case ADDRESS_HOME_HOUSE_NUMBER: + return "House number"; + case ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME: + return "Street and dependent street name"; + case ADDRESS_HOME_BETWEEN_STREETS: + return "Address between streets"; + case ADDRESS_HOME_LINE1: + return "Address line 1"; + case ADDRESS_HOME_LINE2: + return "Address line 2"; + case ADDRESS_HOME_LINE3: + return "Address line 3"; + case ADDRESS_HOME_PREMISE_NAME: + return "Address premise"; + case ADDRESS_HOME_SUBPREMISE: + return "Address subpremise"; + case ADDRESS_HOME_OTHER_SUBUNIT: + return "Address subunit"; + case ADDRESS_HOME_ADMIN_LEVEL2: + return "Administrative area level 2"; + case ADDRESS_HOME_STREET_ADDRESS: + return "Street address"; + case ADDRESS_HOME_SORTING_CODE: + return "Sorting code"; + case ADDRESS_HOME_DEPENDENT_LOCALITY: + return "Dependent locality"; + case ADDRESS_HOME_APT_NUM: + return "Apt num"; + case ADDRESS_HOME_CITY: + return "City"; + case ADDRESS_HOME_STATE: + return "State"; + case ADDRESS_HOME_ZIP: + return "Zip code"; + case ADDRESS_HOME_COUNTRY: + return "Country"; + case BIRTHDATE_DAY: + return "Birthdate day"; + case BIRTHDATE_MONTH: + return "Birthdate month"; + case BIRTHDATE_4_DIGIT_YEAR: + return "Birthdate year"; + case CREDIT_CARD_NAME_FULL: + return "Credit card full name"; + case CREDIT_CARD_NAME_FIRST: + return "Credit card first name"; + case CREDIT_CARD_NAME_LAST: + return "Credit card last name"; + case CREDIT_CARD_NUMBER: + return "Credit card number"; + case CREDIT_CARD_EXP_MONTH: + return "Credit card exp month"; + case CREDIT_CARD_EXP_2_DIGIT_YEAR: + case CREDIT_CARD_EXP_4_DIGIT_YEAR: + case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR: + case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: + return "Credit card exp year"; + case CREDIT_CARD_TYPE: + return "Credit card type"; + case CREDIT_CARD_VERIFICATION_CODE: + return "Credit card verification code"; + case COMPANY_NAME: + return "Company name"; + case UPI_VPA: + return "UPI VPA"; + case IBAN_VALUE: + return "IBAN"; + case CREDIT_CARD_STANDALONE_VERIFICATION_CODE: + case ONE_TIME_CODE: + return "One time code"; + case MAX_VALID_FIELD_TYPE: + return ""; + } + NOTREACHED_NORETURN(); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index dfc62d5..f472499 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -430,6 +430,14 @@ // static string, you don't need to worry about memory deallocation. base::StringPiece FieldTypeToStringPiece(ServerFieldType type); +// Returns a StringPiece describing `type`. The devtools UI uses this string to +// give developers feedback about autofill's filling decision. Note that +// different field types can map to the same string representation for +// simplicity of the feedback. Returns an empty string if the type is not +// supported. +base::StringPiece FieldTypeToDeveloperRepresentationString( + ServerFieldType type); + // Inverse map of FieldTypeToStringPiece. Checks that only valid ServerFieldType // string representations are being passed. ServerFieldType TypeNameToFieldType(base::StringPiece type_name);
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 86f555e..30cb2a33 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "22.25", - "log_list_timestamp": "2023-06-27T12:55:33Z", + "version": "22.26", + "log_list_timestamp": "2023-06-28T12:54:54Z", "operators": [ { "name": "Google",
diff --git a/components/content_settings/android/BUILD.gn b/components/content_settings/android/BUILD.gn index 20cf274..1b5122cb 100644 --- a/components/content_settings/android/BUILD.gn +++ b/components/content_settings/android/BUILD.gn
@@ -56,6 +56,7 @@ "../core/browser/cookie_settings.h", "../core/common/content_settings.h", "../core/common/content_settings_types.h", + "../core/common/cookie_controls_breakage_confidence_level.h", "../core/common/cookie_controls_enforcement.h", "../core/common/cookie_controls_status.h", ]
diff --git a/components/content_settings/android/cookie_controls_bridge.cc b/components/content_settings/android/cookie_controls_bridge.cc index faecd53..4d0f2c3 100644 --- a/components/content_settings/android/cookie_controls_bridge.cc +++ b/components/content_settings/android/cookie_controls_bridge.cc
@@ -33,6 +33,7 @@ permissions_client->GetCookieSettings(web_contents->GetBrowserContext()), original_context ? permissions_client->GetCookieSettings(original_context) : nullptr); + old_observation_.Observe(controller_.get()); observation_.Observe(controller_.get()); controller_->Update(web_contents); } @@ -74,6 +75,50 @@ // This is a no-op for Android. void CookieControlsBridge::OnStatefulBounceCountChanged(int bounce_count) {} +void CookieControlsBridge::OnStatusChanged( + CookieControlsStatus status, + CookieControlsEnforcement enforcement, + base::Time expiration) { + // Only invoke the callback when there is a change. + if (status_ == status && enforcement_ == enforcement && + expiration_ == expiration) { + return; + } + status_ = status; + enforcement_ = enforcement; + expiration_ = expiration; + JNIEnv* env = base::android::AttachCurrentThread(); + Java_CookieControlsBridge_onStatusChanged( + env, jobject_, static_cast<int>(status_), static_cast<int>(enforcement_), + expiration.ToJavaTime()); +} + +void CookieControlsBridge::OnSitesCountChanged(int allowed_sites, + int blocked_sites) { + // The site counts change quite frequently, so avoid unnecessary + // UI updates if possible. + if (allowed_sites_ == allowed_sites && blocked_sites_ == blocked_sites) { + return; + } + allowed_sites_ = allowed_sites; + blocked_sites_ = blocked_sites; + JNIEnv* env = base::android::AttachCurrentThread(); + Java_CookieControlsBridge_onSitesCountChanged(env, jobject_, allowed_sites, + blocked_sites); +} + +void CookieControlsBridge::OnBreakageConfidenceLevelChanged( + CookieControlsBreakageConfidenceLevel level) { + if (level_ == level) { + return; + } + + level_ = level; + JNIEnv* env = base::android::AttachCurrentThread(); + Java_CookieControlsBridge_onBreakageConfidenceLevelChanged( + env, jobject_, static_cast<int>(level)); +} + void CookieControlsBridge::SetThirdPartyCookieBlockingEnabledForSite( JNIEnv* env, bool block_cookies) {
diff --git a/components/content_settings/android/cookie_controls_bridge.h b/components/content_settings/android/cookie_controls_bridge.h index fa17bad2..bae716c 100644 --- a/components/content_settings/android/cookie_controls_bridge.h +++ b/components/content_settings/android/cookie_controls_bridge.h
@@ -16,7 +16,8 @@ // Communicates between CookieControlsController (C++ backend) and PageInfoView // (Java UI). -class CookieControlsBridge : public OldCookieControlsObserver { +class CookieControlsBridge : public OldCookieControlsObserver, + public CookieControlsObserver { public: // Creates a CookeControlsBridge for interaction with a // CookieControlsController. @@ -48,15 +49,30 @@ void OnCookiesCountChanged(int allowed_cookies, int blocked_cookies) override; void OnStatefulBounceCountChanged(int bounce_count) override; + // CookieControlsObserver: + void OnStatusChanged(CookieControlsStatus status, + CookieControlsEnforcement enforcement, + base::Time expiration) override; + void OnSitesCountChanged(int allowed_sites, int blocked_sites) override; + void OnBreakageConfidenceLevelChanged( + CookieControlsBreakageConfidenceLevel level) override; + private: base::android::ScopedJavaGlobalRef<jobject> jobject_; CookieControlsStatus status_ = CookieControlsStatus::kUninitialized; CookieControlsEnforcement enforcement_ = CookieControlsEnforcement::kNoEnforcement; + CookieControlsBreakageConfidenceLevel level_ = + CookieControlsBreakageConfidenceLevel::kUninitialized; + absl::optional<base::Time> expiration_; absl::optional<int> blocked_cookies_; absl::optional<int> allowed_cookies_; + absl::optional<int> blocked_sites_; + absl::optional<int> allowed_sites_; std::unique_ptr<CookieControlsController> controller_; base::ScopedObservation<CookieControlsController, OldCookieControlsObserver> + old_observation_{this}; + base::ScopedObservation<CookieControlsController, CookieControlsObserver> observation_{this}; };
diff --git a/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java b/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java index f3c13f1f..d3c2403 100644 --- a/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java +++ b/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java
@@ -73,6 +73,23 @@ mObserver.onCookiesCountChanged(allowedCookies, blockedCookies); } + @CalledByNative + private void onStatusChanged(@CookieControlsStatus int status, + @CookieControlsEnforcement int enforcement, long expiration) { + mObserver.onStatusChanged(status, enforcement, expiration); + } + + @CalledByNative + private void onSitesCountChanged(int allowedSites, int blockedSites) { + mObserver.onSitesCountChanged(allowedSites, blockedSites); + } + + @CalledByNative + private void onBreakageConfidenceLevelChanged( + @CookieControlsBreakageConfidenceLevel int level) { + mObserver.onBreakageConfidenceLevelChanged(level); + } + @NativeMethods interface Natives { long init(CookieControlsBridge caller, WebContents webContents,
diff --git a/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsObserver.java b/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsObserver.java index 685bf34..c946c1d 100644 --- a/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsObserver.java +++ b/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsObserver.java
@@ -8,6 +8,8 @@ * Interface for a class that wants to receive cookie updates from CookieControlsBridge. */ public interface CookieControlsObserver { + /* The following two methods are used when the UserBypassUI flag is disabled. */ + /** * Called when the cookie blocking status for the current page changes. * @param status An enum indicating the cookie blocking status. @@ -21,4 +23,28 @@ * @param blockedCookies An integer indicating the number of cookies being blocked. */ public void onCookiesCountChanged(int allowedCookies, int blockedCookies); + + /* The following three methods are used when the UserBypassUI flag is enabled. */ + + /** + * Called when the cookie blocking status for the current site changes. + * @param status An enum indicating the cookie blocking status. + * @param enforcement An enum indicating enforcement of cookie policies. + * @param expiration Expiration of the cookie blocking exception. + */ + public void onStatusChanged(@CookieControlsStatus int status, + @CookieControlsEnforcement int enforcement, long expiration); + + /** + * Called when there is an update in the number of sites where cookies are used/blocked. + * @param allowedSites An integer indicating the number of sites with cookies being used. + * @param blockedSites An integer indicating the number of sites with cookies being blocked. + */ + public void onSitesCountChanged(int allowedSites, int blockedSites); + + /** + * Called when the breakage confidence level for the current site changes. + * @param level An enum indicating the confidence level. + */ + public void onBreakageConfidenceLevelChanged(@CookieControlsBreakageConfidenceLevel int level); }
diff --git a/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h b/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h index 61de61a..189c753 100644 --- a/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h +++ b/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h
@@ -9,6 +9,7 @@ // controls. It takes into account blocked third-party cookie access, exceptions // lifecycle, site engagement index and recent user activity (like frequent page // reloads). +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.content_settings enum class CookieControlsBreakageConfidenceLevel { kUninitialized, kLow,
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetStressTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetStressTest.java index 96e29ba8..ab2c37e 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetStressTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetStressTest.java
@@ -15,6 +15,7 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.test.util.Batch; import org.chromium.net.CronetTestRule.OnlyRunNativeCronet; import java.util.ArrayList; @@ -27,6 +28,7 @@ * Tests that making a large number of requests do not lead to crashes. */ @RunWith(AndroidJUnit4.class) +@Batch(Batch.UNIT_TESTS) public class CronetStressTest { @Rule public final CronetTestRule mTestRule = CronetTestRule.withAutomaticEngineStartup();
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRuleTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRuleTest.java index 73a8835a..00cc1ab 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRuleTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRuleTest.java
@@ -18,6 +18,7 @@ import org.junit.rules.TestName; import org.junit.runner.RunWith; +import org.chromium.base.test.util.Batch; import org.chromium.net.CronetTestRule.OnlyRunJavaCronet; import org.chromium.net.CronetTestRule.OnlyRunNativeCronet; import org.chromium.net.CronetTestRule.RequiresMinApi; @@ -28,6 +29,7 @@ * Tests features of CronetTestRule. */ @RunWith(AndroidJUnit4.class) +@Batch(Batch.UNIT_TESTS) public class CronetTestRuleTest { @Rule public final CronetTestRule mTestRule = CronetTestRule.withAutomaticEngineStartup();
diff --git a/components/environment_integrity/DIR_METADATA b/components/environment_integrity/DIR_METADATA new file mode 100644 index 0000000..44453f6 --- /dev/null +++ b/components/environment_integrity/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "Blink>Identity" +}
diff --git a/components/environment_integrity/OWNERS b/components/environment_integrity/OWNERS new file mode 100644 index 0000000..0d781e8 --- /dev/null +++ b/components/environment_integrity/OWNERS
@@ -0,0 +1,2 @@ +rayankans@chromium.org +pbirk@chromium.org \ No newline at end of file
diff --git a/components/environment_integrity/README.md b/components/environment_integrity/README.md new file mode 100644 index 0000000..04a20b51 --- /dev/null +++ b/components/environment_integrity/README.md
@@ -0,0 +1,13 @@ +# Web Environment Integrity (WEI) +https://github.com/RupertBenWiser/Web-Environment-Integrity/blob/main/explainer.md + +Implementations for Web Environment Integrity can vary from platform to platform. +For example, on Android we must store key-pair identifiers called "handles" and +make calls to the Play Integrity attester. On other platforms, the flow may be +much different. + +When adding WEI support for a platform, code that is specific to that platform +should be placed in the appropriate platform-specific directory (e.g. /android). +Code that can be used across platforms can be placed in a /common directory. + +Currently Android is the only supported platform for WEI.
diff --git a/components/environment_integrity/android/BUILD.gn b/components/environment_integrity/android/BUILD.gn new file mode 100644 index 0000000..162b40ec --- /dev/null +++ b/components/environment_integrity/android/BUILD.gn
@@ -0,0 +1,48 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") + +static_library("android") { + sources = [ + "android_environment_integrity_data_manager.cc", + "android_environment_integrity_data_manager.h", + "android_environment_integrity_data_storage.cc", + "android_environment_integrity_data_storage.h", + "android_environment_integrity_service.cc", + "android_environment_integrity_service.h", + ] + + deps = [ + "//base", + "//content/public/browser", + "//mojo/public/cpp/bindings", + "//sql", + "//third_party/blink/public/common:headers", + "//third_party/blink/public/mojom:mojom_core", + "//third_party/sqlite", + "//url", + ] +} + +source_set("unit_tests") { + testonly = true + + sources = [ + "android_environment_integrity_data_manager_unittest.cc", + "android_environment_integrity_data_storage_unittest.cc", + ] + + deps = [ + ":android", + "//base/test:test_support", + "//content/test:test_support", + "//sql", + "//sql:test_support", + "//testing/gmock", + "//testing/gtest", + "//third_party/blink/public/common:headers", + "//url", + ] +}
diff --git a/components/environment_integrity/android/DEPS b/components/environment_integrity/android/DEPS new file mode 100644 index 0000000..11858bc --- /dev/null +++ b/components/environment_integrity/android/DEPS
@@ -0,0 +1,15 @@ +include_rules = [ + "+content/public/browser", + "+mojo/public", + "+sql", + "+third_party/blink/public/common", + "+third_party/blink/public/mojom/environment_integrity/environment_integrity_service.mojom.h", + "+third_party/sqlite/sqlite3.h", + "+url", +] + +specific_include_rules = { + '(.*_[a-z]*test\.cc|test_.*\.h)': [ + "+content/public/test", + ], +}
diff --git a/components/environment_integrity/android/android_environment_integrity_data_manager.cc b/components/environment_integrity/android/android_environment_integrity_data_manager.cc new file mode 100644 index 0000000..a7c8e7e --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_data_manager.cc
@@ -0,0 +1,59 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/environment_integrity/android/android_environment_integrity_data_manager.h" + +#include "base/functional/bind.h" +#include "base/task/thread_pool.h" +#include "content/public/browser/storage_partition_config.h" + +namespace { + +const base::FilePath::CharType kDatabasePath[] = + FILE_PATH_LITERAL("EnvironmentIntegrity"); + +base::FilePath GetDBPath(content::StoragePartition* storage_partition) { + if (storage_partition->GetConfig().in_memory()) { + // AndroidEnvironmentIntegrityDataStorage expects an empty file path in + // order to open the DB in memory. + return base::FilePath(); + } + + return storage_partition->GetPath().Append(kDatabasePath); +} + +} // namespace + +namespace environment_integrity { + +STORAGE_PARTITION_USER_DATA_KEY_IMPL(AndroidEnvironmentIntegrityDataManager); + +AndroidEnvironmentIntegrityDataManager::AndroidEnvironmentIntegrityDataManager( + content::StoragePartition* storage_partition) + : content::StoragePartitionUserData<AndroidEnvironmentIntegrityDataManager>( + storage_partition), + storage_(base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::USER_VISIBLE, + base::TaskShutdownBehavior::BLOCK_SHUTDOWN}), + GetDBPath(storage_partition)) {} + +AndroidEnvironmentIntegrityDataManager:: + ~AndroidEnvironmentIntegrityDataManager() = default; + +void AndroidEnvironmentIntegrityDataManager::GetHandle( + const url::Origin& origin, + GetHandleCallback callback) { + storage_.AsyncCall(&AndroidEnvironmentIntegrityDataStorage::GetHandle) + .WithArgs(origin) + .Then(std::move(callback)); +} + +void AndroidEnvironmentIntegrityDataManager::SetHandle( + const url::Origin& origin, + int64_t handle) { + storage_.AsyncCall(&AndroidEnvironmentIntegrityDataStorage::SetHandle) + .WithArgs(origin, handle); +} + +} // namespace environment_integrity
diff --git a/components/environment_integrity/android/android_environment_integrity_data_manager.h b/components/environment_integrity/android/android_environment_integrity_data_manager.h new file mode 100644 index 0000000..f3483b6 --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_data_manager.h
@@ -0,0 +1,48 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_DATA_MANAGER_H_ +#define COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_DATA_MANAGER_H_ + +#include "base/files/file_path.h" +#include "base/threading/sequence_bound.h" +#include "components/environment_integrity/android/android_environment_integrity_data_storage.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/storage_partition_user_data.h" +#include "url/origin.h" + +namespace environment_integrity { + +// Class for storing and accessing Environment Integrity data. +class AndroidEnvironmentIntegrityDataManager + : public content::StoragePartitionUserData< + AndroidEnvironmentIntegrityDataManager> { + public: + using GetHandleCallback = base::OnceCallback<void(absl::optional<int64_t>)>; + + ~AndroidEnvironmentIntegrityDataManager() override; + AndroidEnvironmentIntegrityDataManager( + const AndroidEnvironmentIntegrityDataManager& other) = delete; + AndroidEnvironmentIntegrityDataManager& operator=( + const AndroidEnvironmentIntegrityDataManager& other) = delete; + + void GetHandle(const url::Origin& origin, GetHandleCallback callback); + + void SetHandle(const url::Origin& origin, int64_t handle); + + private: + explicit AndroidEnvironmentIntegrityDataManager( + content::StoragePartition* storage_partition); + + base::SequenceBound<AndroidEnvironmentIntegrityDataStorage> storage_; + + friend class content::StoragePartitionUserData< + AndroidEnvironmentIntegrityDataManager>; + + STORAGE_PARTITION_USER_DATA_KEY_DECL(); +}; + +} // namespace environment_integrity + +#endif // COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_DATA_MANAGER_H_
diff --git a/components/environment_integrity/android/android_environment_integrity_data_manager_unittest.cc b/components/environment_integrity/android/android_environment_integrity_data_manager_unittest.cc new file mode 100644 index 0000000..2fda72ee --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_data_manager_unittest.cc
@@ -0,0 +1,69 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/environment_integrity/android/android_environment_integrity_data_manager.h" + +#include "base/files/scoped_temp_dir.h" +#include "base/functional/bind.h" +#include "base/run_loop.h" +#include "base/test/bind.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "content/public/test/test_renderer_host.h" +#include "content/public/test/web_contents_tester.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/storage_key/storage_key.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace environment_integrity { + +class AndroidEnvironmentIntegrityDataManagerTest + : public content::RenderViewHostTestHarness { + public: + AndroidEnvironmentIntegrityDataManagerTest() = default; +}; + +TEST_F(AndroidEnvironmentIntegrityDataManagerTest, GetAndSetHandle) { + GURL url = GURL("https://foo.com"); + content::WebContentsTester::For(web_contents())->NavigateAndCommit(url); + + content::StoragePartition* storage_partition = + main_rfh()->GetStoragePartition(); + environment_integrity::AndroidEnvironmentIntegrityDataManager:: + CreateForStoragePartition(storage_partition); + AndroidEnvironmentIntegrityDataManager* manager = + environment_integrity::AndroidEnvironmentIntegrityDataManager:: + GetForStoragePartition(storage_partition); + + url::Origin origin = url::Origin::Create(url); + manager->GetHandle(origin, base::BindLambdaForTesting( + [](absl::optional<int64_t> maybe_handle) { + // No result before the handle has been set + // for the origin. + EXPECT_FALSE(maybe_handle); + })); + + int64_t handle = 123; + manager->SetHandle(origin, handle); + manager->GetHandle(origin, + base::BindLambdaForTesting( + [handle](absl::optional<int64_t> maybe_handle) { + // Result should match the set handle. + ASSERT_TRUE(maybe_handle.has_value()); + EXPECT_EQ(*maybe_handle, handle); + })); + + int64_t new_handle = 234; + manager->SetHandle(origin, new_handle); + manager->GetHandle(origin, + base::BindLambdaForTesting( + [new_handle](absl::optional<int64_t> maybe_handle) { + // Result should match the updated handle. + ASSERT_TRUE(maybe_handle.has_value()); + EXPECT_EQ(*maybe_handle, new_handle); + })); +} + +} // namespace environment_integrity
diff --git a/components/environment_integrity/android/android_environment_integrity_data_storage.cc b/components/environment_integrity/android/android_environment_integrity_data_storage.cc new file mode 100644 index 0000000..76a8539b --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_data_storage.cc
@@ -0,0 +1,210 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/environment_integrity/android/android_environment_integrity_data_storage.h" + +#include "base/files/file_util.h" +#include "base/metrics/histogram_functions.h" +#include "sql/database.h" +#include "sql/error_delegate_util.h" +#include "sql/meta_table.h" +#include "sql/recovery.h" +#include "sql/statement.h" +#include "sql/transaction.h" +#include "third_party/blink/public/common/storage_key/storage_key.h" +#include "third_party/sqlite/sqlite3.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace { + +// Version number of the database. +const int kCurrentVersionNumber = 1; + +} // namespace + +namespace environment_integrity { + +AndroidEnvironmentIntegrityDataStorage::AndroidEnvironmentIntegrityDataStorage( + const base::FilePath& path_to_database) + : path_to_database_(path_to_database), db_(sql::DatabaseOptions{}) { + DETACH_FROM_SEQUENCE(sequence_checker_); +} + +AndroidEnvironmentIntegrityDataStorage:: + ~AndroidEnvironmentIntegrityDataStorage() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +} + +bool AndroidEnvironmentIntegrityDataStorage::EnsureDBInitialized() { + if (db_.is_open()) { + return true; + } + return InitializeDB(); +} + +bool AndroidEnvironmentIntegrityDataStorage::InitializeDB() { + db_.set_error_callback(base::BindRepeating( + &AndroidEnvironmentIntegrityDataStorage::DatabaseErrorCallback, + base::Unretained(this))); + db_.set_histogram_tag("EnvironmentIntegrity"); + + if (path_to_database_.empty()) { + if (!db_.OpenInMemory()) { + DLOG(ERROR) + << "Failed to create in-memory environment integrity database: " + << db_.GetErrorMessage(); + return false; + } + } else { + const base::FilePath dir = path_to_database_.DirName(); + + if (!base::CreateDirectory(dir)) { + DLOG(ERROR) + << "Failed to create directory for environment integrity database"; + return false; + } + if (!db_.Open(path_to_database_)) { + DLOG(ERROR) << "Failed to open environment integrity database: " + << db_.GetErrorMessage(); + return false; + } + } + + if (!InitializeSchema()) { + db_.Close(); + return false; + } + + DCHECK(sql::MetaTable::DoesTableExist(&db_)); + DCHECK(db_.DoesTableExist("environment_integrity_handles")); + return true; +} + +bool AndroidEnvironmentIntegrityDataStorage::InitializeSchema() { + if (!db_.is_open()) { + return false; + } + + sql::MetaTable meta_table; + if (!meta_table.Init(&db_, kCurrentVersionNumber, kCurrentVersionNumber)) { + return false; + } + + if (!CreateSchema()) { + return false; + } + + // This is the first code version. No database version is expected to be + // smaller. Fail when this happens. + if (meta_table.GetVersionNumber() < kCurrentVersionNumber) { + return false; + } + + // This is possible with code reverts. The DB will never work until Chrome + // is re-upgraded. Assume the user will continue using this Chrome version + // and raze the DB to get the feature working. + if (meta_table.GetVersionNumber() > kCurrentVersionNumber) { + db_.Raze(); + meta_table.Reset(); + return InitializeSchema(); + } + + return true; +} + +bool AndroidEnvironmentIntegrityDataStorage::CreateSchema() { + static constexpr char kDEnvironmentIntegrityHandlesTableSql[] = + // clang-format off + "CREATE TABLE IF NOT EXISTS environment_integrity_handles(" + "origin TEXT PRIMARY KEY NOT NULL," + "handle INTEGER NOT NULL)"; + // clang-format on + return db_.Execute(kDEnvironmentIntegrityHandlesTableSql); +} + +void AndroidEnvironmentIntegrityDataStorage::DatabaseErrorCallback( + int extended_error, + sql::Statement* stmt) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + sql::UmaHistogramSqliteResult("Storage.EnvironmentIntegrity.DBErrors", + extended_error); + + if (sql::IsErrorCatastrophic(extended_error)) { + // Normally this will poison the database, causing any subsequent operations + // to silently fail without any side effects. However, if RazeAndPoison() is + // called from the error callback in response to an error raised from within + // sql::Database::Open, opening the now-razed database will be retried. + db_.RazeAndPoison(); + return; + } + + // The default handling is to assert on debug and to ignore on release. + if (!sql::Database::IsExpectedSqliteError(extended_error)) { + DLOG(FATAL) << db_.GetErrorMessage(); + } +} + +absl::optional<int64_t> AndroidEnvironmentIntegrityDataStorage::GetHandle( + const url::Origin& origin) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!EnsureDBInitialized()) { + return absl::nullopt; + } + + static constexpr char kGetHandleSql[] = + // clang-format off + "SELECT handle " + "FROM environment_integrity_handles " + "WHERE origin=?"; + // clang-format on + + sql::Statement statement( + db_.GetCachedStatement(SQL_FROM_HERE, kGetHandleSql)); + + if (!statement.is_valid()) { + DLOG(ERROR) << "GetHandle SQL statement did not compile."; + return absl::nullopt; + } + + statement.BindString(0, origin.Serialize()); + + if (!statement.Step() || !statement.Succeeded()) { + return absl::nullopt; + } + + return statement.ColumnInt64(0); +} + +void AndroidEnvironmentIntegrityDataStorage::SetHandle( + const url::Origin& origin, + int64_t handle) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!EnsureDBInitialized()) { + return; + } + + static constexpr char kSetHandleSql[] = + // clang-format off + "INSERT OR REPLACE INTO environment_integrity_handles(origin,handle) " + "VALUES(?,?)"; + // clang-format on + + sql::Statement statement( + db_.GetCachedStatement(SQL_FROM_HERE, kSetHandleSql)); + + if (!statement.is_valid()) { + DLOG(ERROR) << "SetHandle SQL statement did not compile."; + return; + } + statement.BindString(0, origin.Serialize()); + statement.BindInt64(1, handle); + + if (!statement.Run()) { + DLOG(ERROR) << "Could not set environment integrity handle: " + << db_.GetErrorMessage(); + } +} + +} // namespace environment_integrity
diff --git a/components/environment_integrity/android/android_environment_integrity_data_storage.h b/components/environment_integrity/android/android_environment_integrity_data_storage.h new file mode 100644 index 0000000..649c92e --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_data_storage.h
@@ -0,0 +1,54 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_DATA_STORAGE_H_ +#define COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_DATA_STORAGE_H_ + +#include "base/files/file_path.h" +#include "base/memory/weak_ptr.h" +#include "base/sequence_checker.h" +#include "base/thread_annotations.h" +#include "sql/database.h" +#include "sql/meta_table.h" +#include "url/origin.h" + +namespace environment_integrity { + +class AndroidEnvironmentIntegrityDataStorage { + public: + explicit AndroidEnvironmentIntegrityDataStorage( + const base::FilePath& path_to_database); + + AndroidEnvironmentIntegrityDataStorage( + const AndroidEnvironmentIntegrityDataStorage&) = delete; + AndroidEnvironmentIntegrityDataStorage& operator=( + const AndroidEnvironmentIntegrityDataStorage&) = delete; + AndroidEnvironmentIntegrityDataStorage( + AndroidEnvironmentIntegrityDataStorage&&) = delete; + AndroidEnvironmentIntegrityDataStorage& operator=( + AndroidEnvironmentIntegrityDataStorage&&) = delete; + + ~AndroidEnvironmentIntegrityDataStorage(); + + absl::optional<int64_t> GetHandle(const url::Origin& origin); + + void SetHandle(const url::Origin& origin, int64_t handle); + + private: + bool EnsureDBInitialized() VALID_CONTEXT_REQUIRED(sequence_checker_); + bool InitializeDB() VALID_CONTEXT_REQUIRED(sequence_checker_); + bool InitializeSchema() VALID_CONTEXT_REQUIRED(sequence_checker_); + bool CreateSchema() VALID_CONTEXT_REQUIRED(sequence_checker_); + void DatabaseErrorCallback(int extended_error, sql::Statement* stmt); + + const base::FilePath path_to_database_; + + sql::Database db_ GUARDED_BY_CONTEXT(sequence_checker_); + + SEQUENCE_CHECKER(sequence_checker_); +}; + +} // namespace environment_integrity + +#endif // COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_DATA_STORAGE_H_
diff --git a/components/environment_integrity/android/android_environment_integrity_data_storage_unittest.cc b/components/environment_integrity/android/android_environment_integrity_data_storage_unittest.cc new file mode 100644 index 0000000..41d4b52 --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_data_storage_unittest.cc
@@ -0,0 +1,213 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/environment_integrity/android/android_environment_integrity_data_storage.h" + +#include <functional> +#include <memory> + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/functional/bind.h" +#include "base/memory/raw_ptr.h" +#include "base/path_service.h" +#include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "sql/database.h" +#include "sql/statement.h" +#include "sql/test/scoped_error_expecter.h" +#include "sql/test/test_helpers.h" +#include "sql/transaction.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/storage_key/storage_key.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace environment_integrity { + +namespace { + +int VersionFromMetaTable(sql::Database& db) { + // Get version. + sql::Statement s( + db.GetUniqueStatement("SELECT value FROM meta WHERE key='version'")); + if (!s.Step()) { + return 0; + } + return s.ColumnInt(0); +} + +} // namespace + +class AndroidEnvironmentIntegrityDataStorageTest : public testing::Test { + public: + AndroidEnvironmentIntegrityDataStorageTest() + : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} + + void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } + + void TearDown() override { EXPECT_TRUE(temp_dir_.Delete()); } + + base::FilePath DbPath() const { + return temp_dir_.GetPath().Append( + FILE_PATH_LITERAL("EnvironmentIntegrity")); + } + + base::FilePath GetSqlFilePath(base::StringPiece sql_filename) { + base::FilePath file_path; + base::PathService::Get(base::DIR_SOURCE_ROOT, &file_path); + file_path = + file_path.AppendASCII("components/test/data/environment_integrity/"); + file_path = file_path.AppendASCII(sql_filename); + EXPECT_TRUE(base::PathExists(file_path)); + return file_path; + } + + size_t CountHandleEntries(sql::Database& db) { + static const char kCountSQL[] = + "SELECT COUNT(*) FROM environment_integrity_handles"; + sql::Statement s(db.GetUniqueStatement(kCountSQL)); + EXPECT_TRUE(s.Step()); + return s.ColumnInt(0); + } + + void OpenDatabase() { + storage_.reset(); + storage_ = + std::make_unique<AndroidEnvironmentIntegrityDataStorage>(DbPath()); + } + + void CloseDatabase() { storage_.reset(); } + + AndroidEnvironmentIntegrityDataStorage* storage() { return storage_.get(); } + + protected: + base::ScopedTempDir temp_dir_; + std::unique_ptr<AndroidEnvironmentIntegrityDataStorage> storage_; + base::test::SingleThreadTaskEnvironment task_environment_; +}; + +TEST_F(AndroidEnvironmentIntegrityDataStorageTest, + DatabaseInitialized_TablesAndIndexesLazilyInitialized) { + OpenDatabase(); + CloseDatabase(); + + // An unused AndroidEnvironmentIntegrityDataStorage instance should not create + // the database. + EXPECT_FALSE(base::PathExists(DbPath())); + + OpenDatabase(); + // Trigger the lazy-initialization. + url::Origin origin = url::Origin::Create(GURL("https://foo.com")); + storage()->GetHandle(origin); + CloseDatabase(); + + EXPECT_TRUE(base::PathExists(DbPath())); + + sql::Database db; + EXPECT_TRUE(db.Open(DbPath())); + + // [environment_integrity_handles], [meta]. + EXPECT_EQ(2u, sql::test::CountSQLTables(&db)); + + EXPECT_EQ(1, VersionFromMetaTable(db)); + + // [sqlite_autoindex_environment_integrity_handles_1] and + // [sqlite_autoindex_meta_1]. + EXPECT_EQ(2u, sql::test::CountSQLIndices(&db)); + + // `origin` and `handle`. + EXPECT_EQ(2u, + sql::test::CountTableColumns(&db, "environment_integrity_handles")); + + EXPECT_EQ(0u, CountHandleEntries(db)); +} + +TEST_F(AndroidEnvironmentIntegrityDataStorageTest, + LoadFromFile_CurrentVersion_Success) { + ASSERT_TRUE( + sql::test::CreateDatabaseFromSQL(DbPath(), GetSqlFilePath("v1.sql"))); + + OpenDatabase(); + url::Origin origin = url::Origin::Create(GURL("https://foo.com")); + // Trigger the lazy-initialization. + absl::optional<int64_t> maybe_handle = storage()->GetHandle(origin); + ASSERT_TRUE(maybe_handle.has_value()); + EXPECT_EQ(*maybe_handle, 123); + CloseDatabase(); + + sql::Database db; + EXPECT_TRUE(db.Open(DbPath())); + EXPECT_EQ(2u, sql::test::CountSQLTables(&db)); + EXPECT_EQ(1, VersionFromMetaTable(db)); + EXPECT_EQ(1u, CountHandleEntries(db)); +} + +TEST_F(AndroidEnvironmentIntegrityDataStorageTest, + LoadFromFile_VersionTooOld_Failure) { + ASSERT_TRUE(sql::test::CreateDatabaseFromSQL( + DbPath(), GetSqlFilePath("v0.init_too_old.sql"))); + + OpenDatabase(); + url::Origin origin = url::Origin::Create(GURL("https://foo.com")); + // Trigger the lazy-initialization. + absl::optional<int64_t> maybe_handle = storage()->GetHandle(origin); + EXPECT_FALSE(maybe_handle); + CloseDatabase(); + + // Expect that the initialization was unsuccessful. The original database was + // unaffected. + sql::Database db; + EXPECT_TRUE(db.Open(DbPath())); + EXPECT_EQ(2u, sql::test::CountSQLTables(&db)); + EXPECT_EQ(0, VersionFromMetaTable(db)); + EXPECT_EQ(1u, CountHandleEntries(db)); +} + +TEST_F(AndroidEnvironmentIntegrityDataStorageTest, + LoadFromFile_VersionTooNew_Failure) { + ASSERT_TRUE(sql::test::CreateDatabaseFromSQL( + DbPath(), GetSqlFilePath("v2.init_too_new.sql"))); + + OpenDatabase(); + url::Origin origin = url::Origin::Create(GURL("https://foo.com")); + // Trigger the lazy-initialization. + absl::optional<int64_t> maybe_handle = storage()->GetHandle(origin); + EXPECT_FALSE(maybe_handle); + CloseDatabase(); + + // Expect that the initialization was successful. The original database was + // razed and re-initialized. + sql::Database db; + EXPECT_TRUE(db.Open(DbPath())); + EXPECT_EQ(2u, sql::test::CountSQLTables(&db)); + EXPECT_EQ(1, VersionFromMetaTable(db)); + EXPECT_EQ(0u, CountHandleEntries(db)); +} + +TEST_F(AndroidEnvironmentIntegrityDataStorageTest, GetAndSetHandle) { + OpenDatabase(); + url::Origin origin = url::Origin::Create(GURL("https://foo.com")); + absl::optional<int64_t> maybe_handle = storage()->GetHandle(origin); + EXPECT_FALSE(maybe_handle); + + int64_t handle = 123; + storage()->SetHandle(origin, handle); + maybe_handle = storage()->GetHandle(origin); + ASSERT_TRUE(maybe_handle.has_value()); + EXPECT_EQ(*maybe_handle, handle); + + int64_t new_handle = 234; + storage()->SetHandle(origin, new_handle); + maybe_handle = storage()->GetHandle(origin); + ASSERT_TRUE(maybe_handle.has_value()); + EXPECT_EQ(*maybe_handle, new_handle); + CloseDatabase(); +} + +} // namespace environment_integrity
diff --git a/components/environment_integrity/android/android_environment_integrity_service.cc b/components/environment_integrity/android/android_environment_integrity_service.cc new file mode 100644 index 0000000..2e00f48 --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_service.cc
@@ -0,0 +1,85 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/environment_integrity/android/android_environment_integrity_service.h" + +#include "components/environment_integrity/android/android_environment_integrity_data_manager.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/document_service.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/storage_partition.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "url/origin.h" + +namespace environment_integrity { + +AndroidEnvironmentIntegrityService::AndroidEnvironmentIntegrityService( + content::RenderFrameHost& render_frame_host, + mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> receiver) + : DocumentService(render_frame_host, std::move(receiver)) {} + +AndroidEnvironmentIntegrityService::~AndroidEnvironmentIntegrityService() = + default; + +// static +void AndroidEnvironmentIntegrityService::Create( + content::RenderFrameHost* render_frame_host, + mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> receiver) { + CHECK(render_frame_host); + + // The object is bound to the lifetime of `render_frame_host` and the mojo + // connection. See DocumentService for details. + new AndroidEnvironmentIntegrityService(*render_frame_host, + std::move(receiver)); +} + +void AndroidEnvironmentIntegrityService::GetEnvironmentIntegrity( + GetEnvironmentIntegrityCallback callback) { + url::Origin origin = + render_frame_host().GetOutermostMainFrame()->GetLastCommittedOrigin(); + content::StoragePartition* storage_partition = + render_frame_host().GetOutermostMainFrame()->GetStoragePartition(); + AndroidEnvironmentIntegrityDataManager* data_manager = + AndroidEnvironmentIntegrityDataManager::GetOrCreateForStoragePartition( + storage_partition); + + data_manager->GetHandle( + origin, base::BindOnce(&AndroidEnvironmentIntegrityService::OnGetHandle, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +void AndroidEnvironmentIntegrityService::OnGetHandle( + GetEnvironmentIntegrityCallback callback, + absl::optional<int64_t> maybe_handle) { + // If no handle is stored, create a new handle and store it. + int64_t handle; + + if (maybe_handle.has_value()) { + handle = maybe_handle.value(); + } else { + // TODO(crbug.com/1439945) Get handle from PIA Crystal API. + handle = 0; + + url::Origin origin = + render_frame_host().GetOutermostMainFrame()->GetLastCommittedOrigin(); + content::StoragePartition* storage_partition = + render_frame_host().GetOutermostMainFrame()->GetStoragePartition(); + AndroidEnvironmentIntegrityDataManager* data_manager = + AndroidEnvironmentIntegrityDataManager::GetOrCreateForStoragePartition( + storage_partition); + + data_manager->SetHandle(origin, handle); + } + + GetIntegrityTokenForHandle(handle, std::move(callback)); +} + +void AndroidEnvironmentIntegrityService::GetIntegrityTokenForHandle( + int64_t handle, + GetEnvironmentIntegrityCallback callback) { + // TODO(crbug.com/1439945) Get integrity token from PIA Crystal API. + std::move(callback).Run(); +} + +} // namespace environment_integrity
diff --git a/components/environment_integrity/android/android_environment_integrity_service.h b/components/environment_integrity/android/android_environment_integrity_service.h new file mode 100644 index 0000000..165754c --- /dev/null +++ b/components/environment_integrity/android/android_environment_integrity_service.h
@@ -0,0 +1,55 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_SERVICE_H_ +#define COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_SERVICE_H_ + +#include "content/public/browser/document_service.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "third_party/blink/public/mojom/environment_integrity/environment_integrity_service.mojom.h" + +namespace content { +class RenderFrameHost; +} // namespace content + +namespace environment_integrity { + +class AndroidEnvironmentIntegrityService final + : public content::DocumentService< + blink::mojom::EnvironmentIntegrityService> { + public: + AndroidEnvironmentIntegrityService( + const AndroidEnvironmentIntegrityService&) = delete; + AndroidEnvironmentIntegrityService& operator=( + const AndroidEnvironmentIntegrityService&) = delete; + ~AndroidEnvironmentIntegrityService() override; + + // Factory method for creating an instance of this interface. + static void Create( + content::RenderFrameHost* render_frame_host, + mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> + receiver); + + // blink::mojom::EnvironmentIntegrityService: + void GetEnvironmentIntegrity( + GetEnvironmentIntegrityCallback callback) override; + + private: + AndroidEnvironmentIntegrityService( + content::RenderFrameHost& render_frame_host, + mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> + receiver); + + void OnGetHandle(GetEnvironmentIntegrityCallback callback, + absl::optional<int64_t> maybe_handle); + + void GetIntegrityTokenForHandle(int64_t handle, + GetEnvironmentIntegrityCallback callback); + + base::WeakPtrFactory<AndroidEnvironmentIntegrityService> weak_factory_{this}; +}; + +} // namespace environment_integrity + +#endif // COMPONENTS_ENVIRONMENT_INTEGRITY_ANDROID_ANDROID_ENVIRONMENT_INTEGRITY_SERVICE_H_
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc index 4be2055..322b33c58 100644 --- a/components/omnibox/browser/omnibox_edit_model.cc +++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -1865,7 +1865,10 @@ bool force_update_ui) { DCHECK(popup_view_); - if (controller_->result().empty()) { + // `force_update_ui` is precautionary to be sure the UI updates but + // omitting it doesn't necessarily mean a bug will appear. We have + // seen bugs in the past, though, and it seems to help. + if (controller_->result().empty() && !force_update_ui) { return; }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java index a404735..1afb04c 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java
@@ -181,6 +181,16 @@ } } + // TODO(crbug.com/1446230): Implement the following three UserBypassUI methods. + @Override + public void onStatusChanged(int status, int enforcement, long expiration) {} + + @Override + public void onSitesCountChanged(int allowedSites, int blockedSites) {} + + @Override + public void onBreakageConfidenceLevelChanged(int level) {} + private boolean isDeletionDisabled() { return WebsitePreferenceBridge.isCookieDeletionDisabled(mMainController.getBrowserContext(), mFullUrl); }
diff --git a/components/page_info/page_info.cc b/components/page_info/page_info.cc index f71d5a1..12a30e1e 100644 --- a/components/page_info/page_info.cc +++ b/components/page_info/page_info.cc
@@ -839,8 +839,6 @@ } void PageInfo::ComputeUIInputs(const GURL& url) { - // TODO(https://crbug.com/1404024): Check |isolated-app| scheme once we have a - // definition available for components if (IsIsolatedWebApp()) { site_identity_status_ = SITE_IDENTITY_STATUS_ISOLATED_WEB_APP; site_connection_status_ = SITE_CONNECTION_STATUS_ISOLATED_WEB_APP;
diff --git a/components/policy/core/common/BUILD.gn b/components/policy/core/common/BUILD.gn index b3cf7d1..0676556 100644 --- a/components/policy/core/common/BUILD.gn +++ b/components/policy/core/common/BUILD.gn
@@ -541,6 +541,7 @@ "management/management_service_unittest.cc", "policy_bundle_unittest.cc", "policy_loader_command_line_unittest.cc", + "policy_loader_local_test_unittest.cc", "policy_logger_unittest.cc", "policy_map_unittest.cc", "policy_proto_decoders_unittest.cc",
diff --git a/components/policy/core/common/policy_loader_local_test.cc b/components/policy/core/common/policy_loader_local_test.cc index b17795e..afc23b6 100644 --- a/components/policy/core/common/policy_loader_local_test.cc +++ b/components/policy/core/common/policy_loader_local_test.cc
@@ -4,7 +4,10 @@ #include "components/policy/core/common/policy_loader_local_test.h" +#include <string> + #include "base/json/json_reader.h" +#include "base/logging.h" #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_namespace.h" @@ -18,11 +21,60 @@ PolicyLoaderLocalTest::~PolicyLoaderLocalTest() = default; PolicyBundle PolicyLoaderLocalTest::Load() { + return bundle_.Clone(); +} + +void PolicyLoaderLocalTest::SetPolicyListJson( + const std::string& policy_list_json) { PolicyBundle bundle; - // TODO (b:286422730): Load policies from json file. + auto policies = base::JSONReader::ReadAndReturnValueWithError( + policy_list_json, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); - return bundle; + CHECK(policies.has_value() && policies->is_list()) + << "List of policies expected"; + + PolicyMap& policy_map = + bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); + + for (auto& policy : policies->GetList()) { + CHECK(policy.is_dict()) + << "A dictionary is expected for each policy definition"; + base::Value::Dict* policy_dict = &policy.GetDict(); + + VerifyJsonContents(policy_dict); + + PolicyLevel level = + static_cast<PolicyLevel>(*policy_dict->FindInt("level")); + PolicyScope scope = + static_cast<PolicyScope>(*policy_dict->FindInt("scope")); + PolicySource source = + static_cast<PolicySource>(*policy_dict->FindInt("source")); + std::string name = *policy_dict->FindString("name"); + base::Value value = policy_dict->Find("value")->Clone(); + + PolicyMap::Entry entry(level, scope, source, std::move(value), nullptr); + policy_map.Set(name, std::move(entry)); + } + + bundle_ = std::move(bundle); +} + +void PolicyLoaderLocalTest::VerifyJsonContents(base::Value::Dict* policy_dict) { + auto level_int = policy_dict->FindInt("level"); + CHECK(level_int.has_value() && + *level_int <= static_cast<int>(PolicyLevel::POLICY_LEVEL_MAX)) + << "Invalid level found"; + auto scope_int = policy_dict->FindInt("scope"); + CHECK(scope_int.has_value() && + *scope_int <= static_cast<int>(PolicyScope::POLICY_SCOPE_MAX)) + << "Invalid scope found"; + auto source_int = policy_dict->FindInt("source"); + CHECK(source_int.has_value() && + *source_int < static_cast<int>(PolicySource::POLICY_SOURCE_COUNT)) + << "Invalid source found"; + CHECK(policy_dict->FindString("name")) << "Invalid name found"; + CHECK(policy_dict->contains("value")) << "Invalid value found"; } } // namespace policy
diff --git a/components/policy/core/common/policy_loader_local_test.h b/components/policy/core/common/policy_loader_local_test.h index 6409ebf..786c8418 100644 --- a/components/policy/core/common/policy_loader_local_test.h +++ b/components/policy/core/common/policy_loader_local_test.h
@@ -5,6 +5,9 @@ #ifndef COMPONENTS_POLICY_CORE_COMMON_POLICY_LOADER_LOCAL_TEST_H_ #define COMPONENTS_POLICY_CORE_COMMON_POLICY_LOADER_LOCAL_TEST_H_ +#include <string> + +#include "components/policy/core/common/policy_bundle.h" #include "components/policy/policy_export.h" namespace policy { @@ -19,6 +22,18 @@ ~PolicyLoaderLocalTest(); PolicyBundle Load(); + + // Sets policies from |policy_list_json| to |bundle_|, + // |policy_list_json| should be a json string containing a list of + // dictionaries. Each dictionary represents a policy and should + // contain a key-value pair for the level(int), scope(int), source(int), + // name and value of the policy. + void SetPolicyListJson(const std::string& policy_list_json); + + void VerifyJsonContents(base::Value::Dict* policy_dict); + + private: + PolicyBundle bundle_; }; } // namespace policy
diff --git a/components/policy/core/common/policy_loader_local_test_unittest.cc b/components/policy/core/common/policy_loader_local_test_unittest.cc new file mode 100644 index 0000000..009cb43 --- /dev/null +++ b/components/policy/core/common/policy_loader_local_test_unittest.cc
@@ -0,0 +1,221 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/policy/core/common/policy_loader_local_test.h" + +#include <string> + +#include "base/values.h" +#include "components/policy/core/common/policy_bundle.h" +#include "components/policy/core/common/policy_types.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace policy { + +class PolicyLoaderLocalTestTest : public ::testing::Test { + public: + void LoadAndVerifyPolicies(PolicyLoaderLocalTest* loader, + const base::Value::List& expected_policies) { + std::unique_ptr<PolicyBundle> bundle = + std::make_unique<PolicyBundle>(loader->Load()); + PolicyMap& map = + bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); + EXPECT_EQ(map.size(), expected_policies.size()); + for (auto& expected_policy : expected_policies) { + const base::Value::Dict* policy_dict = &expected_policy.GetDict(); + const PolicyMap::Entry* actual_policy = + map.Get(*policy_dict->FindString("name")); + ASSERT_TRUE(actual_policy); + + EXPECT_EQ(static_cast<PolicyLevel>(*policy_dict->FindInt("level")), + actual_policy->level); + EXPECT_EQ(static_cast<PolicyScope>(*policy_dict->FindInt("scope")), + actual_policy->scope); + EXPECT_EQ(static_cast<PolicySource>(*policy_dict->FindInt("source")), + actual_policy->source); + + ASSERT_TRUE(actual_policy->value_unsafe()); + EXPECT_EQ(*policy_dict->Find("value"), *actual_policy->value_unsafe()); + } + } + + base::Value::Dict PolicyAsDict(PolicyLevel level, + PolicyScope scope, + PolicySource source, + const std::string& name, + base::Value value) { + base::Value::Dict policy; + policy.Set("level", level); + policy.Set("scope", scope); + policy.Set("source", source); + policy.Set("name", name); + policy.Set("value", std::move(value)); + + return policy; + } +}; + +TEST_F(PolicyLoaderLocalTestTest, LoadFromJson) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + policy_loader->SetPolicyListJson(R"( + [ + { + "level": 0, + "scope": 0, + "source": 0, + "name": "a", + "value": 3 + }, + { + "level": 1, + "scope": 1, + "source": 2, + "name": "b", + "value": "test" + } + ])"); + base::Value::List expected_policies; + expected_policies.Append(PolicyAsDict( + POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, /*name=*/"a", base::Value(3))); + expected_policies.Append( + PolicyAsDict(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, + POLICY_SOURCE_CLOUD, /*name=*/"b", base::Value("test"))); + + LoadAndVerifyPolicies(policy_loader.get(), expected_policies); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_MissingScope) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + + EXPECT_DEATH_IF_SUPPORTED( + { + policy_loader->SetPolicyListJson(R"( + [ + { + "level": 0, + "source": 0, + "name": "a", + "value": 3 + }, + { + "level": 1, + "scope": 1, + "source": 2, + "name": "b", + "value": "test" + } + ])"); + }, + ""); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_MissingName) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + + EXPECT_DEATH_IF_SUPPORTED( + { + policy_loader->SetPolicyListJson(R"( + [ + { + "level": 0, + "scope": 0, + "source": 0, + "name": "a", + "value": 3 + }, + { + "level": 1, + "scope": 1, + "source": 2, + "value": "test" + } + ])"); + }, + ""); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_NotList) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + // Not a list + EXPECT_DEATH_IF_SUPPORTED({ policy_loader->SetPolicyListJson(R"({})"); }, ""); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_PolicyNotDict) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + + // Entry not a dictionary + EXPECT_DEATH_IF_SUPPORTED({ policy_loader->SetPolicyListJson(R"([[]])"); }, + ""); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_PolicyLevel) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + + // Invalid policy level + EXPECT_DEATH_IF_SUPPORTED( + { + policy_loader->SetPolicyListJson(R"( + [ + { + "level": 4, + "scope": 0, + "source": 0, + "name": "a", + "value": 3 + } + ])"); + }, + ""); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_PolicyScope) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + + // Invalid policy scope + EXPECT_DEATH_IF_SUPPORTED( + { + policy_loader->SetPolicyListJson(R"( + [ + { + "level": 0, + "scope": 5, + "source": 0, + "name": "a", + "value": 3 + } + ])"); + }, + ""); +} + +TEST_F(PolicyLoaderLocalTestTest, InvalidInput_PolicySource) { + std::unique_ptr<PolicyLoaderLocalTest> policy_loader = + std::make_unique<PolicyLoaderLocalTest>(); + + // Invalid policy source + EXPECT_DEATH_IF_SUPPORTED( + { + policy_loader->SetPolicyListJson(R"( + [ + { + "level": 0, + "scope": 0, + "source": 11, + "name": "a", + "value": 3 + } + ])"); + }, + ""); +} + +} // namespace policy
diff --git a/components/policy/core/common/policy_types.h b/components/policy/core/common/policy_types.h index cd834d8..18b10de 100644 --- a/components/policy/core/common/policy_types.h +++ b/components/policy/core/common/policy_types.h
@@ -17,6 +17,9 @@ // MACHINE policies apply to any users of the current machine. POLICY_SCOPE_MACHINE, + + // Number of scope types. Has to be last element. + POLICY_SCOPE_MAX = POLICY_SCOPE_MACHINE }; // The level of a policy determines its enforceability and whether users can @@ -28,6 +31,9 @@ // MANDATORY policies must be enforced and users can't circumvent them. POLICY_LEVEL_MANDATORY, + + // Number of level types. Has to be equal to last element. + POLICY_LEVEL_MAX = POLICY_LEVEL_MANDATORY }; // The source of a policy indicates where its value is originating from. The
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/BeforeunloadEventCancelByPreventDefaultEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/BeforeunloadEventCancelByPreventDefaultEnabled.yaml index 780a712..bfd08c01 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/BeforeunloadEventCancelByPreventDefaultEnabled.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/BeforeunloadEventCancelByPreventDefaultEnabled.yaml
@@ -1,6 +1,6 @@ caption: Control the new behavior for beforeunload event showing cancel confirmation dialog when preventDefault gets called default: null -desc: |2- +desc: |- This policy allows to control whether confirmation dialog is shown when a page calls preventDefault for beforeunload event. Historically, <ph name="PRODUCT_NAME">Google Chrome</ph> didn't show these dialogs, but the default behavior is being changed. This policy is a temporary escape hatch, meant for the enterprises whose websites got broken because of the new behavior and that need some time before they get fixed. If this policy is enabled, then the cancel confirmation dialog is shown when a page calls preventDefault for beforeunload event. @@ -32,4 +32,4 @@ - android:115-125 - webview_android:115-125 tags: [] -type: main \ No newline at end of file +type: main
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/SafeSitesFilterBehavior.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/SafeSitesFilterBehavior.yaml index 8135e7c0..771268f0 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/SafeSitesFilterBehavior.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/SafeSitesFilterBehavior.yaml
@@ -29,7 +29,7 @@ - 1 type: integer supported_on: -- android:115- +- android:116- - chrome.*:69- - chrome_os:69- tags:
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/ShowFullUrlsInAddressBar.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/ShowFullUrlsInAddressBar.yaml index 5bd14ee..8242e27c 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/ShowFullUrlsInAddressBar.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/ShowFullUrlsInAddressBar.yaml
@@ -22,8 +22,10 @@ - caption: Display the default URL, allow users to switch to the full URL value: null owners: -- livvielin@chromium.org -- enamelites@google.com +- jdeblasio@google.com +- meacer@google.com +- cthomp@google.com +- carlosil@google.com schema: type: boolean supported_on:
diff --git a/components/policy/resources/templates/policy_definitions/Startup/HomepageIsNewTabPage.yaml b/components/policy/resources/templates/policy_definitions/Startup/HomepageIsNewTabPage.yaml index 5303342a..648ba2f 100644 --- a/components/policy/resources/templates/policy_definitions/Startup/HomepageIsNewTabPage.yaml +++ b/components/policy/resources/templates/policy_definitions/Startup/HomepageIsNewTabPage.yaml
@@ -23,8 +23,7 @@ - caption: Allow users to choose value: null owners: -- file://components/policy/OWNERS -- rsorokin@chromium.org +- chrome-desktop-ntp@google.com schema: type: boolean supported_on:
diff --git a/components/policy/resources/templates/policy_definitions/Startup/HomepageLocation.yaml b/components/policy/resources/templates/policy_definitions/Startup/HomepageLocation.yaml index 2ae4e38..6c2508b 100644 --- a/components/policy/resources/templates/policy_definitions/Startup/HomepageLocation.yaml +++ b/components/policy/resources/templates/policy_definitions/Startup/HomepageLocation.yaml
@@ -20,8 +20,7 @@ - fuchsia label: Home page URL owners: -- file://components/policy/OWNERS -- rsorokin@chromium.org +- chrome-desktop-ntp@google.com schema: type: string supported_on:
diff --git a/components/policy/resources/templates/policy_definitions/Startup/NewTabPageLocation.yaml b/components/policy/resources/templates/policy_definitions/Startup/NewTabPageLocation.yaml index fabd6f07..54ed8241 100644 --- a/components/policy/resources/templates/policy_definitions/Startup/NewTabPageLocation.yaml +++ b/components/policy/resources/templates/policy_definitions/Startup/NewTabPageLocation.yaml
@@ -21,8 +21,7 @@ - fuchsia label: New Tab page URL owners: -- file://components/policy/OWNERS -- okalitova@chromium.org +- chrome-desktop-ntp@google.com schema: type: string supported_on:
diff --git a/components/policy/resources/webui/BUILD.gn b/components/policy/resources/webui/BUILD.gn index e6bc9d6..ca70b37 100644 --- a/components/policy/resources/webui/BUILD.gn +++ b/components/policy/resources/webui/BUILD.gn
@@ -23,6 +23,8 @@ "policy_row.ts", "policy_precedence_row.ts", "policy_table.ts", + "test/policy_test_row.ts", + "test/policy_test_table.ts", "status_box.ts", ]
diff --git a/components/policy/resources/webui/test/policy_test.html b/components/policy/resources/webui/test/policy_test.html index 4d9dc88..0aa44011 100644 --- a/components/policy/resources/webui/test/policy_test.html +++ b/components/policy/resources/webui/test/policy_test.html
@@ -1,7 +1,6 @@ <!doctype html> <html dir="$i18n{textdirection}" lang="$i18n{language}"> <head> - <meta charset="utf-8"> <title>$i18n{testTitle}</title> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> </head> @@ -9,5 +8,14 @@ <header> <h1>$i18n{testTitle}</h1> </header> + <div id="top-buttons"> + <button id="restart-browser">$i18n{testRestart}</button> + <button id="apply-policies">$i18n{testApply}</button> + <button id="import-policies-json">$i18n{testImport}</button> + <button id="export-policies-json">$i18n{exportPoliciesJSON}</button> + </div> + <p>$i18n{testDesc}</p> + <policy-test-table></policy-test-table> </body> -</html> \ No newline at end of file +<script type="module" src="/test/policy_test_table.js"></script> +</html>
diff --git a/components/policy/resources/webui/test/policy_test_row.html b/components/policy/resources/webui/test/policy_test_row.html new file mode 100644 index 0000000..ca8d8b20 --- /dev/null +++ b/components/policy/resources/webui/test/policy_test_row.html
@@ -0,0 +1,86 @@ +<style> + :host { + display: table-row; + } + + div { + display: table-cell; + border: 1px solid black; + padding: 1px; + } + + [role="cell"] > * { + width: 100%; + box-sizing: border-box; + } +</style> +<div role="cell"> + <select class="name-select"> + <option selected disabled hidden>$i18n{testNameSelect}</option> + </select> +</div> +<div role="cell"> + <select class="source-select"> + <option selected disabled hidden>$i18n{testSourceSelect}</option> + <option title="POLICY_SOURCE_ENTERPRISE_DEFAULT" value="0"> + $i18n{sourceEnterpriseDefault} + </option> + <option title="POLICY_SOURCE_DEFAULT" value="1"> + $i18n{sourceDefault} + </option> + <option title="POLICY_SOURCE_COMMAND_LINE" value="2"> + $i18n{sourceCommandLine} + </option> + <option title="POLICY_SOURCE_CLOUD" value="3"> + $i18n{sourceCloud} + </option> + <option title="POLICY_SOURCE_MERGED" value="4"> + $i18n{sourceMerged} + </option> + <option title="POLICY_SOURCE_CLOUD_FROM_ASH" value="5"> + $i18n{sourceCloudFromAsh} + </option> + <option + title="POLICY_SOURCE_RESTRICTED_MANAGED_GUEST_SESSION_OVERRIDE" + value="6"> + $i18n{sourceRestrictedManagedGuestSessionOverride} + </option> + <option title="POLICY_SOURCE_ACTIVE_DIRECTORY" value="7"> + $i18n{sourceActiveDirectory} + </option> + <option title="POLICY_SOURCE_PLATFORM" value="8"> + $i18n{sourcePlatform} + </option> + <option title="POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE" + value="9"> + $i18n{sourceDeviceLocalAccountOverride} + </option> + </select> +</div> +<div role="cell"> + <select class="target-select"> + <option selected disabled hidden>$i18n{testTargetSelect}</option> + <option title="POLICY_SCOPE_USER" value="0">$i18n{scopeUser}</option> + <option title="POLICY_SCOPE_ALL_USERS" value="1"> + $i18n{scopeAllUsers} + </option> + <option title="POLICY_SCOPE_DEVICE" value="2">$i18n{scopeDevice}</option> + </select> +</div> +<div role="cell"> + <select class="level-select"> + <option selected disabled hidden>$i18n{testLevelSelect}</option> + <option title="POLICY_LEVEL_RECOMMENDED" value="0"> + $i18n{levelRecommended} + </option> + <option title="POLICY_LEVEL_MANDATORY" value="1"> + $i18n{levelMandatory} + </option> + </select> +</div> +<div role="cell"> + <input type="text" class="value-input"> +</div> +<div role="cell"> + <button class="remove-btn">$i18n{testTableRemove}</button> +</div> \ No newline at end of file
diff --git a/components/policy/resources/webui/test/policy_test_row.ts b/components/policy/resources/webui/test/policy_test_row.ts new file mode 100644 index 0000000..4ec1f22 --- /dev/null +++ b/components/policy/resources/webui/test/policy_test_row.ts
@@ -0,0 +1,47 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import '../strings.m.js'; + +import {CustomElement} from 'chrome://resources/js/custom_element.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; + +import {getTemplate} from './policy_test_row.html.js'; + +export class PolicyTestRowElement extends CustomElement { + static override get template() { + return getTemplate(); + } + + constructor() { + super(); + this.initialize(); + } + + // Function that initializes the policy selection dropdowns and delete + // button for the current row. + private initialize() { + const policyNameDropdown = this.getRequiredElement('.name-select'); + + // Populate the policy name dropdown with all policy names. + loadTimeData.getString('policyNames') + .split(',') + .forEach(function(policyName) { + const currOpt = document.createElement('option'); + currOpt.textContent = policyName; + policyNameDropdown.appendChild(currOpt); + }); + + // Add an event listener for this row's delete button. + this.getRequiredElement('.remove-btn') + .addEventListener('click', this.remove.bind(this)); + } +} + +// Declare the custom element. +declare global { + interface HTMLElementTagNameMap { + 'policy-test-row': PolicyTestRowElement; + } +} +customElements.define('policy-test-row', PolicyTestRowElement);
diff --git a/components/policy/resources/webui/test/policy_test_table.html b/components/policy/resources/webui/test/policy_test_table.html new file mode 100644 index 0000000..1a61ea6 --- /dev/null +++ b/components/policy/resources/webui/test/policy_test_table.html
@@ -0,0 +1,29 @@ +<style> + .table { + display: table; + width: 100%; + } + + header { + display: table-row; + text-align: center; + } + + .cell { + display: table-cell; + border: 1px solid black; + padding: 1px; + } +</style> +<div class="table" role="table"> + <header role="row"> + <div class="cell">$i18n{testTableName}</div> + <div class="cell">$i18n{testTableSource}</div> + <div class="cell">$i18n{testTableTarget}</div> + <div class="cell">$i18n{testTableLevel}</div> + <div class="cell">$i18n{testTableValue}</div> + <div class="cell">$i18n{testTableRemove}</div> + </header> + <policy-test-row></policy-test-row> +</div> +<button id="add-policy-btn">$i18n{testAdd}</button>
diff --git a/components/policy/resources/webui/test/policy_test_table.ts b/components/policy/resources/webui/test/policy_test_table.ts new file mode 100644 index 0000000..082cbfd --- /dev/null +++ b/components/policy/resources/webui/test/policy_test_table.ts
@@ -0,0 +1,35 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import './policy_test_row.js'; + +import {CustomElement} from 'chrome://resources/js/custom_element.js'; + +import {getTemplate} from './policy_test_table.html.js'; + +export class PolicyTestTableElement extends CustomElement { + static override get template() { + return getTemplate(); + } + + constructor() { + super(); + this.getRequiredElement('#add-policy-btn') + .addEventListener('click', this.addRow.bind(this)); + } + + // Event listener function that adds a new PolicyTestRowElement to the table + // when the Add Policy button is clicked + private addRow() { + this.getRequiredElement<HTMLElement>('.table').appendChild( + document.createElement('policy-test-row')); + } +} + +// Declare the custom element +declare global { + interface HTMLElementTagNameMap { + 'policy-test-table': PolicyTestTableElement; + } +} +customElements.define('policy-test-table', PolicyTestTableElement);
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp index 2959b40..6d7fbbf 100644 --- a/components/policy_strings.grdp +++ b/components/policy_strings.grdp
@@ -740,10 +740,37 @@ Refresh Logs </message> - <!-- Strings for chrome://policy/test --> +<!-- Strings for chrome://policy/test --> <message name="IDS_POLICY_TEST_TITLE" desc="Title for the page."> Policy Tests </message> + <message name="IDS_POLICY_TEST_APPLY" desc="Label for the apply-policies button."> + Apply policies + </message> + <message name="IDS_POLICY_TEST_IMPORT" desc="Label for the import-policies-json button."> + Import from JSON + </message> + <message name="IDS_POLICY_TEST_DESC" desc="Text for the page description."> + You must run chrome as an admin to apply policies from this page. You cannot use this page from a managed acount on this unmanaged device. All managed accounts will be locked if you use this page, except accounts managed by the same entity as this device (affiliaited accounts). + </message> + <message name="IDS_POLICY_TEST_TABLE_TARGET" desc="Text for the column of the policy table for the policy target."> + Target + </message> + <message name="IDS_POLICY_TEST_ADD" desc="Label for the add-policy-btn button."> + Add policy + </message> + <message name="IDS_POLICY_SELECT_NAME" desc="Text for the default option in the policy name dropdown menu."> + Select policy name + </message> + <message name="IDS_POLICY_SELECT_SOURCE" desc="Text for the default option in the policy source dropdown menu."> + Select policy source + </message> + <message name="IDS_POLICY_SELECT_TARGET" desc="Text for the default option in the policy target dropdown menu."> + Select policy target + </message> + <message name="IDS_POLICY_SELECT_LEVEL" desc="Text for the default option in the policy level dropdown menu."> + Select policy level + </message> <!-- Strings for Disabled chrome://.* screen --> <message name="IDS_CHROME_URLS_DISABLED_PAGE_HEADER" desc="A heading for the user when the application is blocked.">
diff --git a/components/policy_strings_grdp/IDS_POLICY_SELECT_LEVEL.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_SELECT_LEVEL.png.sha1 new file mode 100644 index 0000000..28abe08 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_SELECT_LEVEL.png.sha1
@@ -0,0 +1 @@ +3bf329c023fee785c9990cf003ffdc2727143abd \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_SELECT_NAME.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_SELECT_NAME.png.sha1 new file mode 100644 index 0000000..28abe08 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_SELECT_NAME.png.sha1
@@ -0,0 +1 @@ +3bf329c023fee785c9990cf003ffdc2727143abd \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_SELECT_SOURCE.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_SELECT_SOURCE.png.sha1 new file mode 100644 index 0000000..28abe08 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_SELECT_SOURCE.png.sha1
@@ -0,0 +1 @@ +3bf329c023fee785c9990cf003ffdc2727143abd \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_SELECT_TARGET.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_SELECT_TARGET.png.sha1 new file mode 100644 index 0000000..28abe08 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_SELECT_TARGET.png.sha1
@@ -0,0 +1 @@ +3bf329c023fee785c9990cf003ffdc2727143abd \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_ADD.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_ADD.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_ADD.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_APPLY.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_APPLY.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_APPLY.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_DESC.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_DESC.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_DESC.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_EXPORT.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_EXPORT.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_EXPORT.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_IMPORT.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_IMPORT.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_IMPORT.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_TABLE_TARGET.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_TABLE_TARGET.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_TABLE_TARGET.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_TEST_TABLE_VALUE.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_TEST_TABLE_VALUE.png.sha1 new file mode 100644 index 0000000..259c5ca7 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_TEST_TABLE_VALUE.png.sha1
@@ -0,0 +1 @@ +51d7ff34f276acc64d14a8704861826493538874 \ No newline at end of file
diff --git a/components/segmentation_platform/internal/database/config_holder.cc b/components/segmentation_platform/internal/database/config_holder.cc index f230235..e8c1c60 100644 --- a/components/segmentation_platform/internal/database/config_holder.cc +++ b/components/segmentation_platform/internal/database/config_holder.cc
@@ -67,4 +67,14 @@ return legacy_output_segmentation_keys_.contains(segmentation_key); } +Config* ConfigHolder::GetConfigForSegmentationKey( + const std::string& segmentation_key) const { + for (const auto& config : configs_) { + if (config->segmentation_key == segmentation_key) { + return config.get(); + } + } + return nullptr; +} + } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/config_holder.h b/components/segmentation_platform/internal/database/config_holder.h index 678ea02c..98dc7f1 100644 --- a/components/segmentation_platform/internal/database/config_holder.h +++ b/components/segmentation_platform/internal/database/config_holder.h
@@ -46,6 +46,10 @@ // uses discrete mapping. bool IsLegacySegmentationKey(const std::string& segmentation_key) const; + // Returns the config for provided segmentation key, null if not found. + Config* GetConfigForSegmentationKey( + const std::string& segmentation_key) const; + private: // All the active Config(s) in the service. const std::vector<std::unique_ptr<Config>> configs_;
diff --git a/components/segmentation_platform/internal/migration/migration_test_utils.cc b/components/segmentation_platform/internal/migration/migration_test_utils.cc index af41e109..c24b49b 100644 --- a/components/segmentation_platform/internal/migration/migration_test_utils.cc +++ b/components/segmentation_platform/internal/migration/migration_test_utils.cc
@@ -17,10 +17,11 @@ std::unique_ptr<Config> GetTestConfigForBinaryClassifier( const std::string& segmentation_key, + const std::string& segmentation_uma_name, proto::SegmentId segment_id) { auto config = std::make_unique<Config>(); config->segmentation_key = segmentation_key; - config->segmentation_uma_name = SegmentationKeyToUmaName(segmentation_key); + config->segmentation_uma_name = segmentation_uma_name; config->AddSegmentId(segment_id); config->segment_selection_ttl = base::Days(7); config->unknown_selection_ttl = base::Days(7);
diff --git a/components/segmentation_platform/internal/migration/migration_test_utils.h b/components/segmentation_platform/internal/migration/migration_test_utils.h index 38186a7..d405d01f 100644 --- a/components/segmentation_platform/internal/migration/migration_test_utils.h +++ b/components/segmentation_platform/internal/migration/migration_test_utils.h
@@ -13,10 +13,14 @@ std::unique_ptr<Config> GetTestConfigForBinaryClassifier( const std::string& segmentation_key, + const std::string& segmentation_uma_name, proto::SegmentId segment_id); + std::unique_ptr<Config> GetTestConfigForAdaptiveToolbar(); + proto::OutputConfig GetTestOutputConfigForBinaryClassifier( proto::SegmentId segment_id); + proto::OutputConfig GetTestOutputConfigForAdaptiveToolbar(); } // namespace segmentation_platform::migration_test_utils
diff --git a/components/segmentation_platform/internal/migration/prefs_migrator_unittest.cc b/components/segmentation_platform/internal/migration/prefs_migrator_unittest.cc index 2f61009..411633d 100644 --- a/components/segmentation_platform/internal/migration/prefs_migrator_unittest.cc +++ b/components/segmentation_platform/internal/migration/prefs_migrator_unittest.cc
@@ -13,6 +13,7 @@ #include "components/segmentation_platform/internal/migration/migration_test_utils.h" #include "components/segmentation_platform/internal/selection/segmentation_result_prefs.h" #include "components/segmentation_platform/public/config.h" +#include "components/segmentation_platform/public/constants.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,7 +37,7 @@ std::string()); pref_service_.registry()->RegisterDictionaryPref(kSegmentationResultPref); configs_.push_back(migration_test_utils::GetTestConfigForBinaryClassifier( - kShoppingUserSegmentationKey, + kShoppingUserSegmentationKey, kShoppingUserUmaName, proto::SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER)); configs_.push_back(migration_test_utils::GetTestConfigForAdaptiveToolbar()); }
diff --git a/components/segmentation_platform/internal/migration/result_migration_utils_unittest.cc b/components/segmentation_platform/internal/migration/result_migration_utils_unittest.cc index c0bd5c06..096a741 100644 --- a/components/segmentation_platform/internal/migration/result_migration_utils_unittest.cc +++ b/components/segmentation_platform/internal/migration/result_migration_utils_unittest.cc
@@ -6,6 +6,7 @@ #include "components/segmentation_platform/internal/metadata/metadata_utils.h" #include "components/segmentation_platform/internal/migration/migration_test_utils.h" +#include "components/segmentation_platform/public/constants.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -38,7 +39,7 @@ TEST_F(ResultMigrationUtilsTest, CreateClientResultForBinaryClassifier) { std::unique_ptr<Config> config = migration_test_utils::GetTestConfigForBinaryClassifier( - kShoppingUserSegmentationKey, + kShoppingUserSegmentationKey, kShoppingUserUmaName, SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER); SelectedSegment result( SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER, 1);
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc index 4c6e0bf1..24d2e2d 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
@@ -18,7 +18,6 @@ #include "components/prefs/pref_registry_simple.h" #include "components/segmentation_platform/internal/config_parser.h" #include "components/segmentation_platform/internal/constants.h" -#include "components/segmentation_platform/internal/database/client_result_prefs.h" #include "components/segmentation_platform/internal/database/storage_service.h" #include "components/segmentation_platform/internal/execution/processing/sync_device_info_observer.h" #include "components/segmentation_platform/internal/platform_options.h" @@ -33,7 +32,6 @@ #include "components/segmentation_platform/public/field_trial_register.h" #include "components/segmentation_platform/public/input_context.h" #include "components/segmentation_platform/public/input_delegate.h" -#include "components/segmentation_platform/public/model_provider.h" namespace segmentation_platform { @@ -200,19 +198,7 @@ CHECK(segment_selectors_.find(segmentation_key) != segment_selectors_.end()); auto& selector = segment_selectors_.at(segmentation_key); - - // Wrap callback to record metrics. - auto wrapped_callback = base::BindOnce( - [](const std::string& segmentation_key, base::Time start_time, - SegmentSelectionCallback callback, - const SegmentSelectionResult& result) -> void { - stats::RecordOnDemandSegmentSelectionDuration( - segmentation_key, result, base::Time::Now() - start_time); - std::move(callback).Run(result); - }, - segmentation_key, base::Time::Now(), std::move(callback)); - selector->GetSelectedSegmentOnDemand(input_context, - std::move(wrapped_callback)); + selector->GetSelectedSegmentOnDemand(input_context, std::move(callback)); } void SegmentationPlatformServiceImpl::CollectTrainingData(
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher.cc b/components/segmentation_platform/internal/selection/request_dispatcher.cc index 68f1a469..355aa8f 100644 --- a/components/segmentation_platform/internal/selection/request_dispatcher.cc +++ b/components/segmentation_platform/internal/selection/request_dispatcher.cc
@@ -14,14 +14,12 @@ #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" #include "components/segmentation_platform/internal/database/config_holder.h" -#include "components/segmentation_platform/internal/metadata/metadata_utils.h" #include "components/segmentation_platform/internal/post_processor/post_processor.h" #include "components/segmentation_platform/internal/selection/request_handler.h" #include "components/segmentation_platform/internal/selection/segment_result_provider.h" #include "components/segmentation_platform/internal/stats.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/prediction_options.h" -#include "components/segmentation_platform/public/proto/prediction_result.pb.h" #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" #include "components/segmentation_platform/public/result.h" @@ -45,26 +43,6 @@ result = raw_result; } -// Wrap callback to record metrics. -template <typename ResultType> -base::OnceCallback<void(const RawResult&)> GetWrappedCallback( - const std::string& segmentation_key, - base::OnceCallback<void(const ResultType&)> callback) { - auto wrapped_callback = base::BindOnce( - [](const std::string& segmentation_key, base::Time start_time, - base::OnceCallback<void(const ResultType&)> callback, - const RawResult& raw_result) -> void { - stats::RecordClassificationRequestTotalDuration( - segmentation_key, base::Time::Now() - start_time); - ResultType result(PredictionStatus::kFailed); - PostProcess(std::move(raw_result), result); - std::move(callback).Run(result); - }, - segmentation_key, base::Time::Now(), std::move(callback)); - - return wrapped_callback; -} - } // namespace RequestDispatcher::RequestDispatcher( @@ -149,6 +127,22 @@ ExecuteAllPendingActions(); } +template <typename ResultType> +void RequestDispatcher::CallbackWrapper( + const std::string& segmentation_key, + base::Time start_time, + base::OnceCallback<void(const ResultType&)> callback, + const RawResult& raw_result) { + Config* config = + config_holder_->GetConfigForSegmentationKey(segmentation_key); + CHECK(config); + stats::RecordClassificationRequestTotalDuration( + *config, base::Time::Now() - start_time); + ResultType result(PredictionStatus::kFailed); + PostProcess(std::move(raw_result), result); + std::move(callback).Run(result); +} + void RequestDispatcher::GetModelResult( const std::string& segmentation_key, const PredictionOptions& options, @@ -157,6 +151,9 @@ if (config_holder_->IsLegacySegmentationKey(segmentation_key)) { return; } + Config* config = + config_holder_->GetConfigForSegmentationKey(segmentation_key); + CHECK(config); if (!options.on_demand_execution) { // Returns result directly from prefs for non-ondemand models. @@ -167,12 +164,12 @@ raw_result = PostProcessor().GetRawResult(*pred_result, PredictionStatus::kSucceeded); stats::RecordSegmentSelectionFailure( - segmentation_key, stats::SegmentationSelectionFailureReason:: - kClassificationResultFromPrefs); + *config, stats::SegmentationSelectionFailureReason:: + kClassificationResultFromPrefs); } else { stats::RecordSegmentSelectionFailure( - segmentation_key, stats::SegmentationSelectionFailureReason:: - kClassificationResultNotAvailableInPrefs); + *config, stats::SegmentationSelectionFailureReason:: + kClassificationResultNotAvailableInPrefs); } base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( @@ -201,8 +198,7 @@ // results. if (!storage_init_status_.value()) { stats::RecordSegmentSelectionFailure( - segmentation_key, - stats::SegmentationSelectionFailureReason::kDBInitFailure); + *config, stats::SegmentationSelectionFailureReason::kDBInitFailure); base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), RawResult(PredictionStatus::kFailed))); @@ -211,10 +207,8 @@ auto iter = request_handlers_.find(segmentation_key); CHECK(iter != request_handlers_.end()); - auto wrapped_callback = - GetWrappedCallback(segmentation_key, std::move(callback)); iter->second->GetPredictionResult(options, input_context, - std::move(wrapped_callback)); + std::move(callback)); } void RequestDispatcher::GetClassificationResult( @@ -223,7 +217,9 @@ scoped_refptr<InputContext> input_context, ClassificationResultCallback callback) { auto wrapped_callback = - GetWrappedCallback(segmentation_key, std::move(callback)); + base::BindOnce(&RequestDispatcher::CallbackWrapper<ClassificationResult>, + weak_ptr_factory_.GetWeakPtr(), segmentation_key, + base::Time::Now(), std::move(callback)); GetModelResult(segmentation_key, options, input_context, std::move(wrapped_callback)); } @@ -233,8 +229,10 @@ const PredictionOptions& options, scoped_refptr<InputContext> input_context, AnnotatedNumericResultCallback callback) { - auto wrapped_callback = - GetWrappedCallback(segmentation_key, std::move(callback)); + auto wrapped_callback = base::BindOnce( + &RequestDispatcher::CallbackWrapper<AnnotatedNumericResult>, + weak_ptr_factory_.GetWeakPtr(), segmentation_key, base::Time::Now(), + std::move(callback)); GetModelResult(segmentation_key, options, input_context, std::move(wrapped_callback)); }
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher.h b/components/segmentation_platform/internal/selection/request_dispatcher.h index 9e7ea94..79ad026 100644 --- a/components/segmentation_platform/internal/selection/request_dispatcher.h +++ b/components/segmentation_platform/internal/selection/request_dispatcher.h
@@ -80,6 +80,14 @@ scoped_refptr<InputContext> input_context, AnnotatedNumericResultCallback callback); + // Wrap the result callback for recording metrics and converting raw result to + // necessary result type. + template <typename ResultType> + void CallbackWrapper(const std::string& segmentation_key, + base::Time start_time, + base::OnceCallback<void(const ResultType&)> callback, + const RawResult& raw_result); + // Configs for all registered clients. const raw_ptr<const ConfigHolder> config_holder_;
diff --git a/components/segmentation_platform/internal/selection/segment_selector_impl.cc b/components/segmentation_platform/internal/selection/segment_selector_impl.cc index f84517bb..89cb98f 100644 --- a/components/segmentation_platform/internal/selection/segment_selector_impl.cc +++ b/components/segmentation_platform/internal/selection/segment_selector_impl.cc
@@ -173,8 +173,13 @@ scoped_refptr<InputContext> input_context, SegmentSelectionCallback callback) { DCHECK(config_->on_demand_execution); + + // Wrap callback to record metrics. + auto wrapped_callback = base::BindOnce( + &SegmentSelectorImpl::CallbackWrapper, weak_ptr_factory_.GetWeakPtr(), + base::Time::Now(), std::move(callback)); GetRankForNextSegment(std::make_unique<SegmentRanks>(), input_context, - std::move(callback)); + std::move(wrapped_callback)); } void SegmentSelectorImpl::OnModelExecutionCompleted(SegmentId segment_id) { @@ -382,4 +387,13 @@ field_trial_register_->RegisterFieldTrial(trial_name, group_name); } +void SegmentSelectorImpl::CallbackWrapper( + base::Time start_time, + SegmentSelectionCallback callback, + const SegmentSelectionResult& result) { + stats::RecordOnDemandSegmentSelectionDuration(*config_, result, + base::Time::Now() - start_time); + std::move(callback).Run(result); +} + } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/selection/segment_selector_impl.h b/components/segmentation_platform/internal/selection/segment_selector_impl.h index 6cb8ab0f..c73c0f0 100644 --- a/components/segmentation_platform/internal/selection/segment_selector_impl.h +++ b/components/segmentation_platform/internal/selection/segment_selector_impl.h
@@ -115,6 +115,11 @@ std::pair<SegmentId, float> FindBestSegment( const SegmentRanks& segment_scores); + // Wrapped result callback for recording metrics. + void CallbackWrapper(base::Time start_time, + SegmentSelectionCallback callback, + const SegmentSelectionResult& result); + std::unique_ptr<SegmentResultProvider> segment_result_provider_; // Helper class to read/write results to the prefs.
diff --git a/components/segmentation_platform/internal/stats.cc b/components/segmentation_platform/internal/stats.cc index 296c8eee..45e4b82 100644 --- a/components/segmentation_platform/internal/stats.cc +++ b/components/segmentation_platform/internal/stats.cc
@@ -4,7 +4,6 @@ #include "components/segmentation_platform/internal/stats.h" -#include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" @@ -402,22 +401,21 @@ duration); } -void RecordClassificationRequestTotalDuration( - const std::string& segmentation_key, - base::TimeDelta duration) { +void RecordClassificationRequestTotalDuration(const Config& config, + base::TimeDelta duration) { std::string histogram_name = base::StrCat({"SegmentationPlatform.ClassificationRequest.TotalDuration.", - SegmentationKeyToUmaName(segmentation_key)}); + config.segmentation_uma_name}); base::UmaHistogramTimes(histogram_name, duration); } void RecordOnDemandSegmentSelectionDuration( - const std::string& segmentation_key, + const Config& config, const SegmentSelectionResult& result, base::TimeDelta duration) { std::string histogram_prefix = base::StrCat({"SegmentationPlatform.SegmentSelectionOnDemand.Duration.", - SegmentationKeyToUmaName(segmentation_key), "."}); + config.segmentation_uma_name}); base::UmaHistogramTimes(base::StrCat({histogram_prefix, "Any"}), duration); std::string histogram_name = @@ -569,14 +567,6 @@ reason); } -void RecordSegmentSelectionFailure(const std::string& segmentation_key, - SegmentationSelectionFailureReason reason) { - base::UmaHistogramEnumeration( - base::StrCat({"SegmentationPlatform.SelectionFailedReason.", - SegmentationKeyToUmaName(segmentation_key)}), - reason); -} - std::string FeatureProcessingErrorToString(FeatureProcessingError error) { switch (error) { case FeatureProcessingError::kUkmEngineDisabled:
diff --git a/components/segmentation_platform/internal/stats.h b/components/segmentation_platform/internal/stats.h index ac2be148..50adae8 100644 --- a/components/segmentation_platform/internal/stats.h +++ b/components/segmentation_platform/internal/stats.h
@@ -12,7 +12,6 @@ #include "components/segmentation_platform/public/model_provider.h" #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" #include "components/segmentation_platform/public/proto/types.pb.h" -#include "components/segmentation_platform/public/result.h" #include "components/segmentation_platform/public/segment_selection_result.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -132,14 +131,13 @@ // Records the total duration for GetClassificationResult API starting from the // time request arrives in segmentation service until the result has been // returned. It includes feature processing and model execution as well. -void RecordClassificationRequestTotalDuration( - const std::string& segmentation_key, - base::TimeDelta duration); +void RecordClassificationRequestTotalDuration(const Config& config, + base::TimeDelta duration); // Records the total duration of on-demand segment selection which includes // running all the models associated with the client and computing result. void RecordOnDemandSegmentSelectionDuration( - const std::string& segmentation_key, + const Config& config, const SegmentSelectionResult& result, base::TimeDelta duration); // Records the result value after successfully executing an ML model. @@ -225,10 +223,6 @@ void RecordSegmentSelectionFailure(const Config& config, SegmentationSelectionFailureReason reason); -// Records the reason for failure or success to compute a segment selection. -void RecordSegmentSelectionFailure(const std::string& segmentation_key, - SegmentationSelectionFailureReason reason); - // Keep in sync with SegmentationPlatformFeatureProcessingError in // //tools/metrics/histograms/enums.xml. enum class FeatureProcessingError {
diff --git a/components/segmentation_platform/internal/stats_unittest.cc b/components/segmentation_platform/internal/stats_unittest.cc index 0eb24ef..d4e1cc0 100644 --- a/components/segmentation_platform/internal/stats_unittest.cc +++ b/components/segmentation_platform/internal/stats_unittest.cc
@@ -11,7 +11,6 @@ #include "components/segmentation_platform/public/constants.h" #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" #include "components/segmentation_platform/public/proto/types.pb.h" -#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace segmentation_platform { @@ -72,8 +71,7 @@ base::HistogramTester tester; Config config; config.segmentation_key = kAdaptiveToolbarSegmentationKey; - config.segmentation_uma_name = - SegmentationKeyToUmaName(config.segmentation_key); + config.segmentation_uma_name = kAdaptiveToolbarUmaName; // Share -> New tab. RecordSegmentSelectionComputed( @@ -109,8 +107,7 @@ base::HistogramTester tester; Config config; config.segmentation_key = kPowerUserKey; - config.segmentation_uma_name = - SegmentationKeyToUmaName(config.segmentation_key); + config.segmentation_uma_name = kPowerUserUmaName; auto result_low = metadata_utils::CreatePredictionResult( /*model_scores=*/{0.2}, @@ -172,8 +169,7 @@ base::HistogramTester tester; Config config; config.segmentation_key = kPowerUserKey; - config.segmentation_uma_name = - SegmentationKeyToUmaName(config.segmentation_key); + config.segmentation_uma_name = kPowerUserUmaName; auto result_low = metadata_utils::CreatePredictionResult( /*model_scores=*/{0.2}, @@ -211,8 +207,7 @@ base::HistogramTester tester; Config config; config.segmentation_key = kChromeStartAndroidSegmentationKey; - config.segmentation_uma_name = - SegmentationKeyToUmaName(config.segmentation_key); + config.segmentation_uma_name = kChromeStartAndroidUmaName; config.is_boolean_segment = true; // Start to none.
diff --git a/components/segmentation_platform/public/constants.cc b/components/segmentation_platform/public/constants.cc index af5baf36..40ffa48 100644 --- a/components/segmentation_platform/public/constants.cc +++ b/components/segmentation_platform/public/constants.cc
@@ -4,64 +4,10 @@ #include "components/segmentation_platform/public/constants.h" -#include "base/notreached.h" -#include "base/strings/string_util.h" #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" namespace segmentation_platform { -const char* SegmentationKeyToUmaName(const std::string& segmentation_key) { - // Please keep in sync with SegmentationKey variant in - // //tools/metrics/histograms/metadata/segmentation_platform/histograms.xml. - // Should also update the field trials allowlist in - // go/segmentation-field-trials-map. - if (segmentation_key == kAdaptiveToolbarSegmentationKey) { - return kAdaptiveToolbarUmaName; - } else if (segmentation_key == kChromeStartAndroidSegmentationKey) { - return kChromeStartAndroidUmaName; - } else if (segmentation_key == kChromeStartAndroidV2SegmentationKey) { - return kChromeStartAndroidV2UmaName; - } else if (segmentation_key == kQueryTilesSegmentationKey) { - return kQueryTilesUmaName; - } else if (segmentation_key == kChromeLowUserEngagementSegmentationKey) { - return kChromeLowUserEngagementUmaName; - } else if (segmentation_key == kFeedUserSegmentationKey) { - return kFeedUserSegmentUmaName; - } else if (segmentation_key == kShoppingUserSegmentationKey) { - return kShoppingUserUmaName; - } else if (segmentation_key == kContextualPageActionsKey) { - return kContextualPageActionsUmaName; - } else if (segmentation_key == kSearchUserKey) { - return kSearchUserUmaName; - } else if (segmentation_key == kPowerUserKey) { - return kPowerUserUmaName; - } else if (segmentation_key == kCrossDeviceUserKey) { - return kCrossDeviceUserUmaName; - } else if (segmentation_key == kFrequentFeatureUserKey) { - return kFrequentFeatureUserUmaName; - } else if (segmentation_key == kIntentionalUserKey) { - return kIntentionalUserUmaName; - } else if (segmentation_key == kResumeHeavyUserKey) { - return kResumeHeavyUserUmaName; - } else if (segmentation_key == kDeviceSwitcherKey) { - return kDeviceSwitcherUmaName; - } else if (segmentation_key == kTabletProductivityUserKey) { - return kTabletProductivityUserUmaName; - } else if (segmentation_key == kWebAppInstallationPromoKey) { - return kWebAppInstallationPromoUmaName; - } else if (segmentation_key == kDeviceTierKey) { - return kDeviceTierUmaName; - } else if (segmentation_key == kTabResumptionClassifierKey) { - return kTabResumptionClassifierUmaName; - } else if (segmentation_key == kPasswordManagerUserKey) { - return kPasswordManagerUserUmaName; - } else if (base::StartsWith(segmentation_key, "test_key")) { - return "TestKey"; - } - NOTREACHED(); - return "Unknown"; -} - // Please keep in sync with SegmentationModel variant in // //tools/metrics/histograms/metadata/segmentation_platform/histograms.xml. // Should also update the field trials allowlist in
diff --git a/components/segmentation_platform/public/constants.h b/components/segmentation_platform/public/constants.h index 53b5abf..a19ffff7 100644 --- a/components/segmentation_platform/public/constants.h +++ b/components/segmentation_platform/public/constants.h
@@ -12,6 +12,8 @@ namespace segmentation_platform { +// SEGMENTATION_CLIENT_KEYS_BEGIN + // The key to be used for adaptive toolbar feature. const char kAdaptiveToolbarSegmentationKey[] = "adaptive_toolbar"; const char kAdaptiveToolbarUmaName[] = "AdaptiveToolbar"; @@ -98,6 +100,13 @@ const char kTabResumptionClassifierKey[] = "tab_resupmtion_classifier"; const char kTabResumptionClassifierUmaName[] = "TabResumptionClassifier"; +// SEGMENTATION_CLIENT_KEYS_END + +// Please keep the UMA names for keys in sync with SegmentationKey variant in +// //tools/metrics/histograms/metadata/segmentation_platform/histograms.xml. +// Should also update the field trials allowlist in +// go/segmentation-field-trials-map. + // Config parameter name specified in experiment configs. Any experiment config // or feature can include this param and segmentation will enable the config for // storing cached results. @@ -115,9 +124,6 @@ const char kSubsegmentDiscreteMappingSuffix[] = "_subsegment"; -// Returns an UMA display string for the given `segmentation_key`. -const char* SegmentationKeyToUmaName(const std::string& segmentation_key); - // Returns an UMA histogram variant for the given segment_id. std::string SegmentIdToHistogramVariant(proto::SegmentId segment_id);
diff --git a/components/sync/service/BUILD.gn b/components/sync/service/BUILD.gn index 0fbf33d..4202386 100644 --- a/components/sync/service/BUILD.gn +++ b/components/sync/service/BUILD.gn
@@ -27,6 +27,8 @@ "glue/sync_engine_impl.h", "glue/sync_transport_data_prefs.cc", "glue/sync_transport_data_prefs.h", + "history_sync_session_durations_metrics_recorder.cc", + "history_sync_session_durations_metrics_recorder.h", "model_load_manager.cc", "model_load_manager.h", "model_type_controller.cc",
diff --git a/components/sync/service/history_sync_session_durations_metrics_recorder.cc b/components/sync/service/history_sync_session_durations_metrics_recorder.cc new file mode 100644 index 0000000..a2b25f9 --- /dev/null +++ b/components/sync/service/history_sync_session_durations_metrics_recorder.cc
@@ -0,0 +1,137 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync/service/history_sync_session_durations_metrics_recorder.h" + +#include <string> +#include <string_view> + +#include "base/feature_list.h" +#include "base/metrics/histogram_functions.h" +#include "base/strings/strcat.h" +#include "base/time/time.h" +#include "components/sync/base/features.h" +#include "components/sync/service/sync_user_settings.h" + +namespace syncer { + +namespace { + +base::TimeDelta SubtractInactiveTime(base::TimeDelta total_length, + base::TimeDelta inactive_time) { + // Subtract any time the user was inactive from our session length. If this + // ends up giving the session negative length, which can happen if the feature + // state changed after the user became inactive, log the length as 0. + base::TimeDelta session_length = total_length - inactive_time; + if (session_length.is_negative()) { + session_length = base::TimeDelta(); + } + return session_length; +} + +void LogDuration(std::string_view histogram_suffix, + base::TimeDelta session_length) { + base::UmaHistogramCustomTimes( + base::StrCat({"Session.TotalDurationMax1Day.", histogram_suffix}), + session_length, base::Milliseconds(1), base::Hours(24), 50); +} + +} // namespace + +HistorySyncSessionDurationsMetricsRecorder:: + HistorySyncSessionDurationsMetricsRecorder(SyncService* sync_service) + : sync_service_(sync_service) { + // |sync_service| can be null if sync is disabled by a command line flag. + if (sync_service_) { + sync_observation_.Observe(sync_service_.get()); + } + + // Get the initial state. + history_sync_enabled_ = IsHistorySyncEnabled(); +} + +HistorySyncSessionDurationsMetricsRecorder:: + ~HistorySyncSessionDurationsMetricsRecorder() { + DCHECK(!total_session_timer_) << "Missing a call to OnSessionEnded()."; + sync_observation_.Reset(); +} + +bool HistorySyncSessionDurationsMetricsRecorder::IsHistorySyncEnabled() const { + if (!sync_service_) { + return false; + } + if (!sync_service_->GetUserSettings()->GetSelectedTypes().Has( + UserSelectableType::kHistory)) { + return false; + } + // For signed-in non-syncing users, history sync can only be enabled if the + // kReplaceSyncPromosWithSignInPromos feature is on. + // TODO(crbug.com/1455963,crbug.com/1134090): Update GetSelectedTypes() so + // that this extra check here isn't needed. + if (!sync_service_->IsSyncFeatureEnabled() && + !base::FeatureList::IsEnabled(kReplaceSyncPromosWithSignInPromos)) { + return false; + } + return true; +} + +void HistorySyncSessionDurationsMetricsRecorder::OnSessionStarted( + base::TimeTicks session_start) { + total_session_timer_ = std::make_unique<base::ElapsedTimer>(); + history_sync_state_timer_ = std::make_unique<base::ElapsedTimer>(); +} + +void HistorySyncSessionDurationsMetricsRecorder::OnSessionEnded( + base::TimeDelta session_length) { + if (!total_session_timer_) { + // If there was no active session, just ignore this call. + return; + } + CHECK(history_sync_state_timer_); + + if (session_length.is_zero()) { + // During Profile teardown, this method is called with a |session_length| + // of zero. + session_length = total_session_timer_->Elapsed(); + } + + base::TimeDelta total_session_time = total_session_timer_->Elapsed(); + base::TimeDelta history_sync_state_session_time = + history_sync_state_timer_->Elapsed(); + total_session_timer_.reset(); + history_sync_state_timer_.reset(); + + base::TimeDelta total_inactivity_time = total_session_time - session_length; + + LogHistorySyncDuration(history_sync_enabled_, + SubtractInactiveTime(history_sync_state_session_time, + total_inactivity_time)); +} + +void HistorySyncSessionDurationsMetricsRecorder::OnStateChanged( + SyncService* sync) { + bool new_history_sync_state = IsHistorySyncEnabled(); + if (history_sync_enabled_ == new_history_sync_state) { + return; + } + + // If there's an ongoing session, record it and start a new one. + if (history_sync_state_timer_) { + LogHistorySyncDuration(history_sync_enabled_, + history_sync_state_timer_->Elapsed()); + history_sync_state_timer_ = std::make_unique<base::ElapsedTimer>(); + } + + history_sync_enabled_ = new_history_sync_state; +} + +// static +void HistorySyncSessionDurationsMetricsRecorder::LogHistorySyncDuration( + bool history_sync_enabled, + base::TimeDelta session_length) { + LogDuration(history_sync_enabled ? "WithHistorySync" : "WithoutHistorySync", + session_length); +} + +} // namespace syncer
diff --git a/components/sync/service/history_sync_session_durations_metrics_recorder.h b/components/sync/service/history_sync_session_durations_metrics_recorder.h new file mode 100644 index 0000000..5cb9c40 --- /dev/null +++ b/components/sync/service/history_sync_session_durations_metrics_recorder.h
@@ -0,0 +1,65 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_SERVICE_HISTORY_SYNC_SESSION_DURATIONS_METRICS_RECORDER_H_ +#define COMPONENTS_SYNC_SERVICE_HISTORY_SYNC_SESSION_DURATIONS_METRICS_RECORDER_H_ + +#include <memory> + +#include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" +#include "base/time/time.h" +#include "base/timer/elapsed_timer.h" +#include "components/sync/service/sync_service.h" +#include "components/sync/service/sync_service_observer.h" + +namespace syncer { + +// Tracks the active browsing time that the user spends with history sync +// enabled as fraction of their total browsing time. +class HistorySyncSessionDurationsMetricsRecorder + : public syncer::SyncServiceObserver { + public: + // Callers must ensure that the parameters outlive this object. + explicit HistorySyncSessionDurationsMetricsRecorder( + SyncService* sync_service); + + HistorySyncSessionDurationsMetricsRecorder( + const HistorySyncSessionDurationsMetricsRecorder&) = delete; + HistorySyncSessionDurationsMetricsRecorder& operator=( + const HistorySyncSessionDurationsMetricsRecorder&) = delete; + + ~HistorySyncSessionDurationsMetricsRecorder() override; + + bool IsHistorySyncEnabled() const; + + // Informs this service that a session started at |session_start| time. + void OnSessionStarted(base::TimeTicks session_start); + void OnSessionEnded(base::TimeDelta session_length); + + // syncer::SyncServiceObserver: + void OnStateChanged(SyncService* sync) override; + + private: + static void LogHistorySyncDuration(bool history_sync_enabled, + base::TimeDelta session_length); + + const raw_ptr<SyncService> sync_service_; + + base::ScopedObservation<syncer::SyncService, syncer::SyncServiceObserver> + sync_observation_{this}; + + bool history_sync_enabled_ = false; + + // Tracks the elapsed active session time while the browser is open. The timer + // is absent if there's no active session. + std::unique_ptr<base::ElapsedTimer> total_session_timer_; + // Tracks the elapsed active session time in the current history-sync-enabled + // state. Absent if there's no active session. + std::unique_ptr<base::ElapsedTimer> history_sync_state_timer_; +}; + +} // namespace syncer + +#endif // COMPONENTS_SYNC_SERVICE_HISTORY_SYNC_SESSION_DURATIONS_METRICS_RECORDER_H_
diff --git a/components/sync/service/sync_session_durations_metrics_recorder.cc b/components/sync/service/sync_session_durations_metrics_recorder.cc index 248ac08..521d64f3 100644 --- a/components/sync/service/sync_session_durations_metrics_recorder.cc +++ b/components/sync/service/sync_session_durations_metrics_recorder.cc
@@ -9,7 +9,6 @@ #include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h" -#include "components/sync/engine/cycle/sync_cycle_snapshot.h" namespace syncer { @@ -17,7 +16,7 @@ base::TimeDelta SubtractInactiveTime(base::TimeDelta total_length, base::TimeDelta inactive_time) { - // Substract any time the user was inactive from our session length. If this + // Subtract any time the user was inactive from our session length. If this // ends up giving the session negative length, which can happen if the feature // state changed after the user became inactive, log the length as 0. base::TimeDelta session_length = total_length - inactive_time; @@ -48,7 +47,9 @@ SyncSessionDurationsMetricsRecorder::SyncSessionDurationsMetricsRecorder( SyncService* sync_service, signin::IdentityManager* identity_manager) - : sync_service_(sync_service), identity_manager_(identity_manager) { + : sync_service_(sync_service), + identity_manager_(identity_manager), + history_sync_recorder_(sync_service) { // |sync_service| can be null if sync is disabled by a command line flag. if (sync_service_) { sync_observation_.Observe(sync_service_.get()); @@ -95,12 +96,16 @@ total_session_timer_ = std::make_unique<base::ElapsedTimer>(); signin_session_timer_ = std::make_unique<base::ElapsedTimer>(); sync_account_session_timer_ = std::make_unique<base::ElapsedTimer>(); + + history_sync_recorder_.OnSessionStarted(session_start); } void SyncSessionDurationsMetricsRecorder::OnSessionEnded( base::TimeDelta session_length) { DVLOG(1) << "Session end"; + history_sync_recorder_.OnSessionEnded(session_length); + if (!total_session_timer_) { // If there was no active session, just ignore this call. return;
diff --git a/components/sync/service/sync_session_durations_metrics_recorder.h b/components/sync/service/sync_session_durations_metrics_recorder.h index dacc009e..a102d561 100644 --- a/components/sync/service/sync_session_durations_metrics_recorder.h +++ b/components/sync/service/sync_session_durations_metrics_recorder.h
@@ -10,8 +10,8 @@ #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "base/timer/elapsed_timer.h" -#include "components/keyed_service/core/keyed_service.h" #include "components/signin/public/identity_manager/identity_manager.h" +#include "components/sync/service/history_sync_session_durations_metrics_recorder.h" #include "components/sync/service/sync_service.h" #include "components/sync/service/sync_service_observer.h" @@ -37,7 +37,7 @@ // Returns whether the user is signed in. // Note: this is not the same thing as |account_status_|. - // |account_status_| says OFF (kind of like sayng "no, not signed-in") if the + // |account_status_| says OFF (kind of like saying "no, not signed-in") if the // account is in an error state. IsSignedIn() does not; it will return // true for accounts that are signed-in in yet an error state. // The most common reason this happens is if a syncing user signs out @@ -104,6 +104,8 @@ const raw_ptr<SyncService> sync_service_; const raw_ptr<signin::IdentityManager> identity_manager_; + HistorySyncSessionDurationsMetricsRecorder history_sync_recorder_; + base::ScopedObservation<syncer::SyncService, syncer::SyncServiceObserver> sync_observation_{this}; base::ScopedObservation<signin::IdentityManager,
diff --git a/components/test/data/environment_integrity/v0.init_too_old.sql b/components/test/data/environment_integrity/v0.init_too_old.sql new file mode 100644 index 0000000..77f896f --- /dev/null +++ b/components/test/data/environment_integrity/v0.init_too_old.sql
@@ -0,0 +1,17 @@ +PRAGMA foreign_keys=OFF; + +BEGIN TRANSACTION; + +CREATE TABLE environment_integrity_handles ( +origin TEXT NOT NULL, +handle INTEGER NOT NULL, +PRIMARY KEY (origin)); + +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); + +INSERT INTO meta VALUES('version','0'); +INSERT INTO meta VALUES('last_compatible_version','1'); + +INSERT INTO environment_integrity_handles VALUES ('https://foo.com', 123); + +COMMIT;
diff --git a/components/test/data/environment_integrity/v1.sql b/components/test/data/environment_integrity/v1.sql new file mode 100644 index 0000000..58d1f48 --- /dev/null +++ b/components/test/data/environment_integrity/v1.sql
@@ -0,0 +1,17 @@ +PRAGMA foreign_keys=OFF; + +BEGIN TRANSACTION; + +CREATE TABLE environment_integrity_handles ( +origin TEXT NOT NULL, +handle INTEGER NOT NULL, +PRIMARY KEY (origin)); + +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); + +INSERT INTO meta VALUES('version','1'); +INSERT INTO meta VALUES('last_compatible_version','1'); + +INSERT INTO environment_integrity_handles VALUES ('https://foo.com', 123); + +COMMIT;
diff --git a/components/test/data/environment_integrity/v2.init_too_new.sql b/components/test/data/environment_integrity/v2.init_too_new.sql new file mode 100644 index 0000000..1540a0c1 --- /dev/null +++ b/components/test/data/environment_integrity/v2.init_too_new.sql
@@ -0,0 +1,17 @@ +PRAGMA foreign_keys=OFF; + +BEGIN TRANSACTION; + +CREATE TABLE environment_integrity_handles ( +origin TEXT NOT NULL, +handle INTEGER NOT NULL, +PRIMARY KEY (origin)); + +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); + +INSERT INTO meta VALUES('version','2'); +INSERT INTO meta VALUES('last_compatible_version','1'); + +INSERT INTO environment_integrity_handles VALUES ('https://foo.com', 123); + +COMMIT;
diff --git a/components/user_manager/fake_user_manager.cc b/components/user_manager/fake_user_manager.cc index c87c605d..515917c 100644 --- a/components/user_manager/fake_user_manager.cc +++ b/components/user_manager/fake_user_manager.cc
@@ -368,20 +368,6 @@ const User* primary_user, bool is_current_user_owner) const {} -bool FakeUserManager::GetPlatformKnownUserId(const std::string& user_email, - AccountId* out_account_id) const { - if (user_email == kStubUserEmail) { - *out_account_id = StubAccountId(); - return true; - } - - if (user_email == kGuestUserName) { - *out_account_id = GuestAccountId(); - return true; - } - return false; -} - const AccountId& FakeUserManager::GetGuestAccountId() const { return GuestAccountId(); }
diff --git a/components/user_manager/fake_user_manager.h b/components/user_manager/fake_user_manager.h index b6085d6..b7650fc 100644 --- a/components/user_manager/fake_user_manager.h +++ b/components/user_manager/fake_user_manager.h
@@ -128,8 +128,6 @@ void UpdateLoginState(const User* active_user, const User* primary_user, bool is_current_user_owner) const override; - bool GetPlatformKnownUserId(const std::string& user_email, - AccountId* out_account_id) const override; void AsyncRemoveCryptohome(const AccountId& account_id) const override; bool IsDeprecatedSupervisedAccountId( const AccountId& account_id) const override;
diff --git a/components/user_manager/known_user.cc b/components/user_manager/known_user.cc index 0903679..8384096 100644 --- a/components/user_manager/known_user.cc +++ b/components/user_manager/known_user.cc
@@ -21,6 +21,7 @@ #include "components/prefs/scoped_user_pref_update.h" #include "components/user_manager/common_types.h" #include "components/user_manager/user_manager.h" +#include "components/user_manager/user_names.h" #include "google_apis/gaia/gaia_auth_util.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -206,6 +207,22 @@ AccountId::AccountTypeToString(account_id.GetAccountType())); } +// Checks for platform-specific known users matching given |user_email|. If +// data matches a known account, returns it. +absl::optional<AccountId> GetPlatformKnownUserId( + const base::StringPiece user_email) { + if (user_email == kStubUserEmail) { + return StubAccountId(); + } + if (user_email == kStubAdUserEmail) { + return StubAdAccountId(); + } + if (user_email == kGuestUserName) { + return GuestAccountId(); + } + return absl::nullopt; +} + } // namespace KnownUser::KnownUser(PrefService* local_state) : local_state_(local_state) { @@ -386,11 +403,12 @@ return EmptyAccountId(); } - AccountId result(EmptyAccountId()); // UserManager is usually NULL in unit tests. - if (account_type == AccountType::UNKNOWN && UserManager::IsInitialized() && - UserManager::Get()->GetPlatformKnownUserId(user_email, &result)) { - return result; + if (account_type == AccountType::UNKNOWN) { + if (absl::optional<AccountId> result = GetPlatformKnownUserId(user_email); + result.has_value()) { + return result.value(); + } } const std::string sanitized_email = @@ -460,13 +478,10 @@ } } - // GetPlatformKnownAccountId - AccountId result(EmptyAccountId()); - // UserManager is usually NULL in unit tests. - if (UserManager::IsInitialized() && - UserManager::Get()->GetPlatformKnownUserId(cryptohome_id.value(), - &result)) { - return result; + if (absl::optional<AccountId> result = + GetPlatformKnownUserId(cryptohome_id.value()); + result.has_value()) { + return result.value(); } return AccountId::FromNonCanonicalEmail(cryptohome_id.value(), std::string(), AccountType::UNKNOWN);
diff --git a/components/user_manager/user_manager.h b/components/user_manager/user_manager.h index 09af42e..9bb5d339 100644 --- a/components/user_manager/user_manager.h +++ b/components/user_manager/user_manager.h
@@ -435,12 +435,6 @@ // Returns "Local State" PrefService instance. virtual PrefService* GetLocalState() const = 0; - // Checks for platform-specific known users matching given |user_email|. If - // data matches a known account, fills |out_account_id| with account id and - // returns true. - virtual bool GetPlatformKnownUserId(const std::string& user_email, - AccountId* out_account_id) const = 0; - // Returns account id of the Guest user. virtual const AccountId& GetGuestAccountId() const = 0;
diff --git a/components/viz/common/resources/shared_image_format_utils.cc b/components/viz/common/resources/shared_image_format_utils.cc index c769218..8a99e4e 100644 --- a/components/viz/common/resources/shared_image_format_utils.cc +++ b/components/viz/common/resources/shared_image_format_utils.cc
@@ -285,51 +285,45 @@ gfx::BufferFormat SinglePlaneSharedImageFormatToBufferFormat( SharedImageFormat format) { CHECK(format.is_single_plane()); - switch (format.resource_format()) { - case BGRA_8888: - return gfx::BufferFormat::BGRA_8888; - case RED_8: - return gfx::BufferFormat::R_8; - case R16_EXT: - return gfx::BufferFormat::R_16; - case RG16_EXT: - return gfx::BufferFormat::RG_1616; - case RGBA_4444: - return gfx::BufferFormat::RGBA_4444; - case RGBA_8888: - return gfx::BufferFormat::RGBA_8888; - case RGBA_F16: - return gfx::BufferFormat::RGBA_F16; - case BGR_565: - return gfx::BufferFormat::BGR_565; - case RG_88: - return gfx::BufferFormat::RG_88; - case RGBX_8888: - return gfx::BufferFormat::RGBX_8888; - case BGRX_8888: - return gfx::BufferFormat::BGRX_8888; - case RGBA_1010102: - return gfx::BufferFormat::RGBA_1010102; - case BGRA_1010102: - return gfx::BufferFormat::BGRA_1010102; - case YVU_420: - return gfx::BufferFormat::YVU_420; - case YUV_420_BIPLANAR: - return gfx::BufferFormat::YUV_420_BIPLANAR; - case YUVA_420_TRIPLANAR: - return gfx::BufferFormat::YUVA_420_TRIPLANAR; - case P010: - return gfx::BufferFormat::P010; - case ETC1: - case ALPHA_8: - case LUMINANCE_8: - case RGB_565: - case LUMINANCE_F16: - // CanCreateGpuMemoryBufferForSinglePlaneSharedImageFormat() returns - // false for these types, so give a default value that will not be used. - break; + if (format == SinglePlaneFormat::kBGRA_8888) { + return gfx::BufferFormat::BGRA_8888; + } else if (format == SinglePlaneFormat::kR_8) { + return gfx::BufferFormat::R_8; + } else if (format == SinglePlaneFormat::kR_16) { + return gfx::BufferFormat::R_16; + } else if (format == SinglePlaneFormat::kRG_1616) { + return gfx::BufferFormat::RG_1616; + } else if (format == SinglePlaneFormat::kRGBA_4444) { + return gfx::BufferFormat::RGBA_4444; + } else if (format == SinglePlaneFormat::kRGBA_8888) { + return gfx::BufferFormat::RGBA_8888; + } else if (format == SinglePlaneFormat::kRGBA_F16) { + return gfx::BufferFormat::RGBA_F16; + } else if (format == SinglePlaneFormat::kBGR_565) { + return gfx::BufferFormat::BGR_565; + } else if (format == SinglePlaneFormat::kRG_88) { + return gfx::BufferFormat::RG_88; + } else if (format == SinglePlaneFormat::kRGBX_8888) { + return gfx::BufferFormat::RGBX_8888; + } else if (format == SinglePlaneFormat::kBGRX_8888) { + return gfx::BufferFormat::BGRX_8888; + } else if (format == SinglePlaneFormat::kRGBA_1010102) { + return gfx::BufferFormat::RGBA_1010102; + } else if (format == SinglePlaneFormat::kBGRA_1010102) { + return gfx::BufferFormat::BGRA_1010102; + } else if (format == LegacyMultiPlaneFormat::kYV12) { + return gfx::BufferFormat::YVU_420; + } else if (format == LegacyMultiPlaneFormat::kNV12) { + return gfx::BufferFormat::YUV_420_BIPLANAR; + } else if (format == LegacyMultiPlaneFormat::kNV12A) { + return gfx::BufferFormat::YUVA_420_TRIPLANAR; + } else if (format == LegacyMultiPlaneFormat::kP010) { + return gfx::BufferFormat::P010; + } else { + // CanCreateGpuMemoryBufferForSinglePlaneSharedImageFormat() returns + // false for all other types, so give a default value that will not be used. + return gfx::BufferFormat::RGBA_8888; } - return gfx::BufferFormat::RGBA_8888; } SharedImageFormat GetSharedImageFormat(gfx::BufferFormat format) {
diff --git a/components/webapps/browser/installable/installable_metrics.h b/components/webapps/browser/installable/installable_metrics.h index 5a15cbf..4981514 100644 --- a/components/webapps/browser/installable/installable_metrics.h +++ b/components/webapps/browser/installable/installable_metrics.h
@@ -204,8 +204,12 @@ // The DedupeInstallUrlsCommand. kInstallUrlDeduping = 20, + // Healthcare app cleaning up all user installed apps in between shared + // sessions. + kHealthcareUserInstallCleanup = 21, + // Add any new values above this one. - kMaxValue = kInstallUrlDeduping, + kMaxValue = kHealthcareUserInstallCleanup, }; // This is the result of the promotability check that is recorded in the
diff --git a/components/webxr/android/openxr_platform_helper_android.cc b/components/webxr/android/openxr_platform_helper_android.cc index 563d35a..01e3f34 100644 --- a/components/webxr/android/openxr_platform_helper_android.cc +++ b/components/webxr/android/openxr_platform_helper_android.cc
@@ -78,7 +78,11 @@ device::mojom::XRDeviceData OpenXrPlatformHelperAndroid::GetXRDeviceData() { device::mojom::XRDeviceData device_data; - device_data.is_ar_blend_mode_supported = false; + // TODO(https://crbug.com/1458584): Query if AR blending is supported from an + // XrInstance using IsArBlendModeSupported(). Statically returning `true` + // because AR support is currently gated by the "OpenXrExtendedFeatureSupport" + // flag in XRRuntimeManagerImpl::GetImmersiveArRuntime(). + device_data.is_ar_blend_mode_supported = true; return device_data; }
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index cc8d559..9dce64a4 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -908,8 +908,6 @@ "download/save_package_serialization_handler.h", "download/save_types.cc", "download/save_types.h", - "environment_integrity/environment_integrity_service_impl.cc", - "environment_integrity/environment_integrity_service_impl.h", "eye_dropper_chooser_impl.cc", "eye_dropper_chooser_impl.h", "feature_observer.cc",
diff --git a/content/browser/android/content_feature_map.cc b/content/browser/android/content_feature_map.cc index 2935337..228c323 100644 --- a/content/browser/android/content_feature_map.cc +++ b/content/browser/android/content_feature_map.cc
@@ -28,6 +28,7 @@ &features::kFedCm, &features::kOnDemandAccessibilityEvents, &kOptimizeImmHideCalls, + &kMouseAndTrackpadDropdownMenu, &features::kProcessSharingWithStrictSiteInstances, &features::kReduceGpuPriorityOnBackground, &features::kRequestDesktopSiteAdditions,
diff --git a/content/browser/android/selection/selection_popup_controller.cc b/content/browser/android/selection/selection_popup_controller.cc index 1dd0bc6e..eff9434 100644 --- a/content/browser/android/selection/selection_popup_controller.cc +++ b/content/browser/android/selection/selection_popup_controller.cc
@@ -97,6 +97,15 @@ return Java_SelectionPopupControllerImpl_getContext(env, obj); } +void SelectionPopupController::SetTextHandlesHiddenForDropdownMenu( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + jboolean hidden) { + if (rwhva_) { + rwhva_->SetTextHandlesHiddenForDropdownMenu(hidden); + } +} + void SelectionPopupController::SetTextHandlesTemporarilyHidden( JNIEnv* env, const JavaParamRef<jobject>& obj, @@ -209,8 +218,9 @@ return false; // Don't show paste pop-up for non-editable textarea. - if (!params.is_editable && params.selection_text.empty()) + if (!params.is_editable && params.selection_text.empty()) { return false; + } const bool can_select_all = !!(params.edit_flags & blink::ContextMenuDataEditFlags::kCanSelectAll); @@ -225,11 +235,11 @@ params.source_type == ui::MENU_SOURCE_LONG_PRESS; Java_SelectionPopupControllerImpl_showSelectionMenu( - env, obj, params.selection_rect.x(), params.selection_rect.y(), - params.selection_rect.right(), params.selection_rect.bottom(), - handle_height, params.is_editable, is_password_type, jselected_text, - params.selection_start_offset, can_select_all, can_edit_richly, - should_suggest, params.source_type, + env, obj, params.x, params.y, params.selection_rect.x(), + params.selection_rect.y(), params.selection_rect.right(), + params.selection_rect.bottom(), handle_height, params.is_editable, + is_password_type, jselected_text, params.selection_start_offset, + can_select_all, can_edit_richly, should_suggest, params.source_type, render_frame_host->GetJavaRenderFrameHost()); return true; }
diff --git a/content/browser/android/selection/selection_popup_controller.h b/content/browser/android/selection/selection_popup_controller.h index 4ae23bc..f92ba7f7 100644 --- a/content/browser/android/selection/selection_popup_controller.h +++ b/content/browser/android/selection/selection_popup_controller.h
@@ -29,6 +29,11 @@ const base::android::JavaParamRef<jobject>& obj, WebContents* web_contents); + void SetTextHandlesHiddenForDropdownMenu( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jboolean hidden); + void SetTextHandlesTemporarilyHidden( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj,
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index 4b70f2e..1c5d46ba 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -1316,7 +1316,7 @@ AggregatableResult::kInternalError); } - // Early exit if done modifying the storage. Dropped reports still need to + // Early exit if done modifying the storage. Noised reports still need to // clean sources. if (!IsSuccessResult(store_event_level_status) && !IsSuccessResult(store_aggregatable_status) &&
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 87e490d..d4a1fad 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -181,7 +181,6 @@ #if BUILDFLAG(IS_ANDROID) #include "content/browser/android/date_time_chooser_android.h" #include "content/browser/android/text_suggestion_host_android.h" -#include "content/browser/environment_integrity/environment_integrity_service_impl.h" #include "content/browser/renderer_host/render_widget_host_view_android.h" #include "services/device/public/mojom/nfc.mojom.h" #include "third_party/blink/public/mojom/hid/hid.mojom.h" @@ -1135,6 +1134,10 @@ map->Add<blink::mojom::BrowsingTopicsDocumentService>( base::BindRepeating(&BrowsingTopicsDocumentHost::CreateMojoService)); } + if (base::FeatureList::IsEnabled(features::kWebEnvironmentIntegrity)) { + map->Add<blink::mojom::EnvironmentIntegrityService>(base::BindRepeating( + &EmptyBinderForFrame<blink::mojom::EnvironmentIntegrityService>)); + } #if !BUILDFLAG(IS_ANDROID) map->Add<blink::mojom::DirectSocketsService>( base::BindRepeating(&DirectSocketsServiceImpl::CreateForFrame)); @@ -1199,17 +1202,9 @@ base::BindRepeating(&BindDateTimeChooserForFrame)); map->Add<blink::mojom::TextSuggestionHost>( base::BindRepeating(&BindTextSuggestionHostForFrame)); - if (base::FeatureList::IsEnabled(features::kWebEnvironmentIntegrity)) { - map->Add<blink::mojom::EnvironmentIntegrityService>( - base::BindRepeating(&EnvironmentIntegrityServiceImpl::Create)); - } #else map->Add<blink::mojom::TextSuggestionHost>(base::BindRepeating( &EmptyBinderForFrame<blink::mojom::TextSuggestionHost>)); - if (base::FeatureList::IsEnabled(features::kWebEnvironmentIntegrity)) { - map->Add<blink::mojom::EnvironmentIntegrityService>(base::BindRepeating( - &EmptyBinderForFrame<blink::mojom::EnvironmentIntegrityService>)); - } #endif // BUILDFLAG(IS_ANDROID) map->Add<blink::mojom::ClipboardHost>(
diff --git a/content/browser/environment_integrity/environment_integrity_service_impl.cc b/content/browser/environment_integrity/environment_integrity_service_impl.cc deleted file mode 100644 index 187b24c..0000000 --- a/content/browser/environment_integrity/environment_integrity_service_impl.cc +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/environment_integrity/environment_integrity_service_impl.h" - -#include "content/public/browser/document_service.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" - -namespace content { - -EnvironmentIntegrityServiceImpl::EnvironmentIntegrityServiceImpl( - content::RenderFrameHost& render_frame_host, - mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> receiver) - : DocumentService(render_frame_host, std::move(receiver)) {} - -EnvironmentIntegrityServiceImpl::~EnvironmentIntegrityServiceImpl() = default; - -// static -void EnvironmentIntegrityServiceImpl::Create( - content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> receiver) { - CHECK(render_frame_host); - - // The object is bound to the lifetime of `render_frame_host` and the mojo - // connection. See DocumentService for details. - new EnvironmentIntegrityServiceImpl(*render_frame_host, std::move(receiver)); -} - -void EnvironmentIntegrityServiceImpl::GetEnvironmentIntegrity( - GetEnvironmentIntegrityCallback callback) { - // TODO(crbug.com/1439945) Get integrity token from PIA Crystal API. - std::move(callback).Run(); -} - -} // namespace content
diff --git a/content/browser/environment_integrity/environment_integrity_service_impl.h b/content/browser/environment_integrity/environment_integrity_service_impl.h deleted file mode 100644 index ca7c827..0000000 --- a/content/browser/environment_integrity/environment_integrity_service_impl.h +++ /dev/null
@@ -1,44 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_ENVIRONMENT_INTEGRITY_ENVIRONMENT_INTEGRITY_SERVICE_IMPL_H_ -#define CONTENT_BROWSER_ENVIRONMENT_INTEGRITY_ENVIRONMENT_INTEGRITY_SERVICE_IMPL_H_ - -#include "content/public/browser/document_service.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "third_party/blink/public/mojom/environment_integrity/environment_integrity_service.mojom.h" - -namespace content { - -class EnvironmentIntegrityServiceImpl final - : public content::DocumentService< - blink::mojom::EnvironmentIntegrityService> { - public: - EnvironmentIntegrityServiceImpl( - content::RenderFrameHost& render_frame_host, - mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> - receiver); - - EnvironmentIntegrityServiceImpl(const EnvironmentIntegrityServiceImpl&) = - delete; - EnvironmentIntegrityServiceImpl& operator=( - const EnvironmentIntegrityServiceImpl&) = delete; - ~EnvironmentIntegrityServiceImpl() override; - - // Factory method for creating an instance of this interface. - static void Create( - content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver<blink::mojom::EnvironmentIntegrityService> - receiver); - - // blink::mojom::EnvironmentIntegrityService: - void GetEnvironmentIntegrity( - GetEnvironmentIntegrityCallback callback) override; - - base::WeakPtrFactory<EnvironmentIntegrityServiceImpl> weak_factory_{this}; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_ENVIRONMENT_INTEGRITY_ENVIRONMENT_INTEGRITY_SERVICE_IMPL_H_
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc index db6bfb5..d7f7814 100644 --- a/content/browser/loader/navigation_url_loader_impl_unittest.cc +++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -77,10 +77,10 @@ url_request_context_ = url_request_context_builder.Build(); url_loader_context_.set_url_request_context(url_request_context_.get()); - constexpr network::ResourceScheduler::ClientId kClientId(3); resource_scheduler_client_ = base::MakeRefCounted<network::ResourceSchedulerClient>( - kClientId, network::IsBrowserInitiated(false), &resource_scheduler_, + network::ResourceScheduler::ClientId::Create(), + network::IsBrowserInitiated(false), &resource_scheduler_, url_request_context_->network_quality_estimator()); url_loader_context_.set_resource_scheduler_client( resource_scheduler_client_);
diff --git a/content/browser/renderer_host/input/scroll_behavior_browsertest.cc b/content/browser/renderer_host/input/scroll_behavior_browsertest.cc index c40ffb90b..213cd53bb 100644 --- a/content/browser/renderer_host/input/scroll_behavior_browsertest.cc +++ b/content/browser/renderer_host/input/scroll_behavior_browsertest.cc
@@ -389,8 +389,15 @@ AssertScrollEndedAtPosition("element.scrollTop", 95, 1); } +#if BUILDFLAG(IS_MAC) +#define MAYBE_SmoothWheelScrollCompletesWithScriptedMirror \ + DISABLED_SmoothWheelScrollCompletesWithScriptedMirror +#else +#define MAYBE_SmoothWheelScrollCompletesWithScriptedMirror \ + SmoothWheelScrollCompletesWithScriptedMirror +#endif IN_PROC_BROWSER_TEST_P(ScrollBehaviorBrowserTestWithPercentBasedScrolling, - SmoothWheelScrollCompletesWithScriptedMirror) { + MAYBE_SmoothWheelScrollCompletesWithScriptedMirror) { RunTestSmoothWheelScrollCompletesWithScriptedMirror(); }
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index d0b7165..70b7df53 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -2711,6 +2711,16 @@ ShowInternal(); } +void RenderWidgetHostViewAndroid::SetTextHandlesHiddenForDropdownMenu( + bool hide_handles) { + if (!touch_selection_controller_ || + handles_hidden_by_dropdown_menu_ == hide_handles) { + return; + } + handles_hidden_by_dropdown_menu_ = hide_handles; + SetTextHandlesHiddenInternal(); +} + void RenderWidgetHostViewAndroid::SetTextHandlesHiddenForStylus( bool hide_handles) { if (!touch_selection_controller_ || handles_hidden_by_stylus_ == hide_handles) @@ -2723,7 +2733,8 @@ if (!touch_selection_controller_) return; touch_selection_controller_->SetTemporarilyHidden( - handles_hidden_by_stylus_ || handles_hidden_by_selection_ui_); + handles_hidden_by_dropdown_menu_ || handles_hidden_by_stylus_ || + handles_hidden_by_selection_ui_); } void RenderWidgetHostViewAndroid::OnStylusSelectBegin(float x0,
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index e97c812..a058399b 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -313,6 +313,7 @@ void MoveCaret(const gfx::Point& point); void DismissTextHandles(); + void SetTextHandlesHiddenForDropdownMenu(bool hide_handles); void SetTextHandlesTemporarilyHidden(bool hide_handles); void SelectAroundCaretAck(blink::mojom::SelectAroundCaretResultPtr result); @@ -568,6 +569,10 @@ PageVisibilityState page_visibility_ = PageVisibilityState::kHidden; + // Specifies whether touch selection handles are hidden due to the dropdown + // menu. + bool handles_hidden_by_dropdown_menu_ = false; + // Specifies whether touch selection handles are hidden due to stylus. bool handles_hidden_by_stylus_ = false;
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index a1b52a2..deb3d1c 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -2034,6 +2034,9 @@ } bool FederatedAuthRequestImpl::NotifyResolve(const std::string& token) { + // Close the pop-up window post user permission. + NotifyClose(); + // TODO(crbug.com/1429083): handle the multi-idp case when there are // more than one config_urls hanging. CompleteRequest(FederatedAuthRequestResult::kSuccess, TokenStatus::kSuccess,
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index f41b0cd..213fda4 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -1267,6 +1267,37 @@ EXPECT_FALSE(DidFetch(FetchedEndpoint::ACCOUNTS)); } +// Test that the well-known file has too many provider urls. +TEST_F(FederatedAuthRequestImplTest, WellKnownHasTooManyProviderUrls) { + RequestExpectations expectation = { + RequestTokenStatus::kError, + FederatedAuthRequestResult::kErrorWellKnownTooBig, + /*standalone_console_message=*/absl::nullopt, + /*selected_idp_config_url=*/absl::nullopt}; + + MockConfiguration config = kConfigurationValid; + config.idp_info[kProviderUrlFull].well_known = { + {kProviderUrlFull, kProviderTwoUrlFull}, + {ParseStatus::kSuccess, net::HTTP_OK}}; + RunAuthTest(kDefaultRequestParameters, expectation, config); + EXPECT_TRUE(DidFetchWellKnownAndConfig()); + EXPECT_FALSE(DidFetch(FetchedEndpoint::ACCOUNTS)); +} + +// Test that the well-known enforcement is bypassed. +TEST_F(FederatedAuthRequestImplTest, WellKnownEnforcementBypassed) { + base::test::ScopedFeatureList list; + list.InitAndEnableFeature(features::kFedCmWithoutWellKnownEnforcement); + + MockConfiguration config = kConfigurationValid; + config.idp_info[kProviderUrlFull].well_known = { + {kProviderUrlFull, kProviderTwoUrlFull}, + {ParseStatus::kSuccess, net::HTTP_OK}}; + RunAuthTest(kDefaultRequestParameters, kExpectationSuccess, config); + EXPECT_TRUE(DidFetchWellKnownAndConfig()); + EXPECT_TRUE(DidFetch(FetchedEndpoint::ACCOUNTS)); +} + // Test that not having the filename in the well-known fails. TEST_F(FederatedAuthRequestImplTest, WellKnownHasNoFilename) { MockConfiguration config{kConfigurationValid};
diff --git a/content/browser/webid/federated_provider_fetcher.cc b/content/browser/webid/federated_provider_fetcher.cc index afce99e..5c29b1d9 100644 --- a/content/browser/webid/federated_provider_fetcher.cc +++ b/content/browser/webid/federated_provider_fetcher.cc
@@ -4,6 +4,7 @@ #include "content/browser/webid/federated_provider_fetcher.h" +#include "content/browser/webid/flags.h" #include "content/browser/webid/webid_utils.h" namespace content { @@ -132,7 +133,8 @@ } } - if (urls.size() > kMaxProvidersInWellKnownFile) { + if (urls.size() > kMaxProvidersInWellKnownFile && + !IsFedCmWithoutWellKnownEnforcementEnabled()) { OnError(fetch_result, FederatedAuthRequestResult::kErrorWellKnownTooBig, TokenStatus::kWellKnownTooBig, /*additional_console_error_message=*/absl::nullopt);
diff --git a/content/browser/webid/flags.cc b/content/browser/webid/flags.cc index d547ddd..293f906 100644 --- a/content/browser/webid/flags.cc +++ b/content/browser/webid/flags.cc
@@ -47,6 +47,11 @@ return base::FeatureList::IsEnabled(features::kFedCmIdPRegistration); } +bool IsFedCmWithoutWellKnownEnforcementEnabled() { + return base::FeatureList::IsEnabled( + features::kFedCmWithoutWellKnownEnforcement); +} + bool IsWebIdentityMDocsEnabled() { return base::FeatureList::IsEnabled(features::kWebIdentityMDocs); }
diff --git a/content/browser/webid/flags.h b/content/browser/webid/flags.h index 4fe6ce5..2a08aacd 100644 --- a/content/browser/webid/flags.h +++ b/content/browser/webid/flags.h
@@ -35,6 +35,9 @@ // Whether the IdP Registration API is enabled. bool IsFedCmIdPRegistrationEnabled(); +// Whether the well-known enforcement is bypassed. +bool IsFedCmWithoutWellKnownEnforcementEnabled(); + // Whether the Web Identity MDocs API is enabled. bool IsWebIdentityMDocsEnabled();
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/content/browser/xr/service/xr_runtime_manager_impl.cc index 001b2ad..3235be5 100644 --- a/content/browser/xr/service/xr_runtime_manager_impl.cc +++ b/content/browser/xr/service/xr_runtime_manager_impl.cc
@@ -253,14 +253,9 @@ } BrowserXRRuntimeImpl* XRRuntimeManagerImpl::GetImmersiveArRuntime() { -#if BUILDFLAG(ENABLE_ARCORE) - auto* arcore_runtime = - GetRuntime(device::mojom::XRDeviceId::ARCORE_DEVICE_ID); - if (arcore_runtime && arcore_runtime->SupportsArBlendMode()) - return arcore_runtime; -#endif - #if BUILDFLAG(ENABLE_OPENXR) + // If OpenXR is available and the runtime supports an AR blend mode, prefer + // it over ARCore to unify VR/AR rendering paths. if (base::FeatureList::IsEnabled( device::features::kOpenXrExtendedFeatureSupport)) { auto* openxr = GetRuntime(device::mojom::XRDeviceId::OPENXR_DEVICE_ID); @@ -269,6 +264,14 @@ } #endif +#if BUILDFLAG(ENABLE_ARCORE) + auto* arcore_runtime = + GetRuntime(device::mojom::XRDeviceId::ARCORE_DEVICE_ID); + if (arcore_runtime && arcore_runtime->SupportsArBlendMode()) { + return arcore_runtime; + } +#endif + return nullptr; }
diff --git a/content/common/features.cc b/content/common/features.cc index 82263249..e1a74f2a 100644 --- a/content/common/features.cc +++ b/content/common/features.cc
@@ -25,6 +25,12 @@ base::FEATURE_ENABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_ANDROID) +BASE_FEATURE(kMouseAndTrackpadDropdownMenu, + "MouseAndTrackpadDropdownMenu", + base::FEATURE_DISABLED_BY_DEFAULT); +#endif // BUILDFLAG(IS_ANDROID) + BASE_FEATURE(kConsolidatedIPCForProxyCreation, "ConsolidatedIPCForProxyCreation", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/content/common/features.h b/content/common/features.h index 91d44b5..fbd097c8 100644 --- a/content/common/features.h +++ b/content/common/features.h
@@ -28,6 +28,12 @@ BASE_DECLARE_FEATURE(kOptimizeImmHideCalls); #endif // BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_ANDROID) +// When enabled, shows a dropdown menu for mouse and trackpad secondary +// clicks (i.e. right click). +BASE_DECLARE_FEATURE(kMouseAndTrackpadDropdownMenu); +#endif // BUILDFLAG(IS_ANDROID) + // When enabled, when creating new proxies for all nodes in a `FrameTree`, one // IPC is sent to create all child frame proxies instead of sending one IPC per // proxy.
diff --git a/content/public/android/java/res/values/ids.xml b/content/public/android/java/res/values/ids.xml index e60f009..fae2ec7 100644 --- a/content/public/android/java/res/values/ids.xml +++ b/content/public/android/java/res/values/ids.xml
@@ -1,4 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + <resources> <!-- Selection Menu Group IDs --> <item type="id" name="select_action_menu_assist_items" />
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/FloatingPastePopupMenu.java b/content/public/android/java/src/org/chromium/content/browser/selection/FloatingPastePopupMenu.java index d7c7e8ce..79355ee0 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/FloatingPastePopupMenu.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/FloatingPastePopupMenu.java
@@ -119,7 +119,7 @@ return mDelegate.canPasteAsPlainText(); } }; - SelectionPopupControllerImpl.initializeNonSelectionMenu( + SelectionPopupControllerImpl.initializeNonSelectionActionMenu( actionMenuDelegate, mContext, mAdditionalItemProvider, mode, menu); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java index fa4465a3..ef0e8f0 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectActionMenuHelper.java
@@ -341,6 +341,7 @@ .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) + .setIsIconTintable(true) .build(); } @@ -353,6 +354,7 @@ .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) + .setIsIconTintable(true) .build(); } @@ -365,6 +367,7 @@ .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) + .setIsIconTintable(true) .build(); } @@ -376,6 +379,7 @@ .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) + .setIsIconTintable(true) .build(); } @@ -388,6 +392,7 @@ .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) + .setIsIconTintable(true) .build(); } @@ -410,6 +415,7 @@ .setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT) .setIsEnabled(isEnabled) + .setIsIconTintable(true) .build(); } }
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java index 0b96c34..19901e1b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -26,8 +26,10 @@ import android.view.textclassifier.TextClassifier; import androidx.annotation.IdRes; +import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.Px; import androidx.annotation.VisibleForTesting; import org.chromium.base.Log; @@ -49,10 +51,13 @@ import org.chromium.content.browser.WindowEventObserverManager; import org.chromium.content.browser.input.ImeAdapterImpl; import org.chromium.content.browser.selection.SelectActionMenuHelper.SelectActionMenuDelegate; +import org.chromium.content.browser.selection.SelectActionMenuHelper.TextProcessingIntentHandler; import org.chromium.content.browser.webcontents.WebContentsImpl; import org.chromium.content.browser.webcontents.WebContentsImpl.UserDataFactory; import org.chromium.content_public.browser.ActionModeCallbackHelper; import org.chromium.content_public.browser.AdditionalSelectionMenuItemProvider; +import org.chromium.content_public.browser.ContentFeatureList; +import org.chromium.content_public.browser.ContentFeatureMap; import org.chromium.content_public.browser.ImeEventObserver; import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.SelectAroundCaretResult; @@ -68,9 +73,12 @@ import org.chromium.ui.base.ViewAndroidDelegate; import org.chromium.ui.base.ViewAndroidDelegate.ContainerViewObserver; import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.modelutil.MVCListAdapter; import org.chromium.ui.touch_selection.SelectionEventType; import org.chromium.ui.touch_selection.TouchSelectionDraggableType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.PriorityQueue; /** @@ -120,11 +128,22 @@ // Used in tests to disable magnifier. private static boolean sDisableMagnifier; + // Used in tests to enable tablet UI mode. + private static boolean sEnableTabletUiModeForTesting; + private static final class UserDataFactoryLazyHolder { private static final UserDataFactory<SelectionPopupControllerImpl> INSTANCE = SelectionPopupControllerImpl::new; } + @IntDef({SelectionMenuType.ACTION_MODE, SelectionMenuType.PASTE, SelectionMenuType.DROPDOWN}) + @Retention(RetentionPolicy.SOURCE) + public @interface SelectionMenuType { + int ACTION_MODE = 0; + int PASTE = 1; + int DROPDOWN = 2; + } + private final Handler mHandler; private Context mContext; private WindowAndroid mWindowAndroid; @@ -136,7 +155,7 @@ private SelectionClient.ResultCallback mResultCallback; // Used to customize PastePopupMenu - private AdditionalSelectionMenuItemProvider mNonSelectionAdditionalItemProvider; + private @Nullable AdditionalSelectionMenuItemProvider mNonSelectionAdditionalItemProvider; // Selection rectangle in DIP. private final Rect mSelectionRect = new Rect(); @@ -165,6 +184,13 @@ private boolean mCanSelectAll; private boolean mCanEditRichly; + @MenuSourceType + private int mMenuSourceType; + + // Click or touch down coordinates + private int mXDip; + private int mYDip; + private boolean mUnselectAllOnDismiss; private String mLastSelectedText; private int mLastSelectionOffset; @@ -281,6 +307,11 @@ sDisableMagnifier = disable; } + @VisibleForTesting + public static void setEnableTabletUiModeForTesting(boolean disable) { + sEnableTabletUiModeForTesting = disable; + } + /** * Create {@link SelectionPopupControllerImpl} instance. * @param webContents WebContents instance. @@ -358,14 +389,14 @@ // ViewAndroidDelegate.ContainerViewObserver @Override - public void onUpdateContainerView(ViewGroup view) { + public void onUpdateContainerView(ViewGroup containerView) { // Cleans up action mode before switching to a new container view. if (isActionModeValid()) finishActionMode(); mUnselectAllOnDismiss = true; destroyPastePopup(); - if (view != null) view.setClickable(true); - mView = view; + if (containerView != null) containerView.setClickable(true); + mView = containerView; mMagnifierAnimator = null; } @@ -388,7 +419,7 @@ @Override public void setNonSelectionAdditionalMenuItemProvider( - AdditionalSelectionMenuItemProvider provider) { + @Nullable AdditionalSelectionMenuItemProvider provider) { mNonSelectionAdditionalItemProvider = provider; } @@ -440,10 +471,44 @@ return 0; } + /** + * Returns true if the window is on tablet. Can be disabled for testing. + */ + private boolean isWindowOnTablet() { + if (sEnableTabletUiModeForTesting) { + return true; + } + return DeviceFormFactor.isWindowOnTablet(mWindowAndroid); + } + + /** + * Returns true if a dropdown menu should be used based on the current state + * (i.e. mouse was used to invoke text selection menu). + */ + private boolean shouldUseDropdownMenu() { + if (!ContentFeatureMap.isEnabled(ContentFeatureList.MOUSE_AND_TRACKPAD_DROPDOWN_MENU)) { + return false; + } + return mView != null && mDropdownMenuDelegate != null + && mMenuSourceType == MenuSourceType.MENU_SOURCE_MOUSE && isWindowOnTablet(); + } + + /** + * Returns the type of menu to show based on the current state (i.e. has selection). + */ + @VisibleForTesting + @SelectionMenuType + protected int getMenuType() { + if (shouldUseDropdownMenu()) { + return SelectionMenuType.DROPDOWN; + } + return hasSelection() ? SelectionMenuType.ACTION_MODE : SelectionMenuType.PASTE; + } + @VisibleForTesting @CalledByNative - public void showSelectionMenu(int left, int top, int right, int bottom, int handleHeight, - boolean isEditable, boolean isPasswordType, String selectionText, + public void showSelectionMenu(int xDip, int yDip, int left, int top, int right, int bottom, + int handleHeight, boolean isEditable, boolean isPasswordType, String selectionText, int selectionStartOffset, boolean canSelectAll, boolean canRichlyEdit, boolean shouldSuggest, @MenuSourceType int sourceType, RenderFrameHost renderFrameHost) { @@ -452,14 +517,17 @@ int offsetBottom = bottom; offsetBottom += handleHeight; + mXDip = xDip; + mYDip = yDip; mSelectionRect.set(left, top, right, offsetBottom); mEditable = isEditable; mLastSelectedText = selectionText; mLastSelectionOffset = selectionStartOffset; + mCanSelectAll = canSelectAll; mHasSelection = selectionText.length() != 0; mIsPasswordType = isPasswordType; - mCanSelectAll = canSelectAll; mCanEditRichly = canRichlyEdit; + mMenuSourceType = sourceType; mUnselectAllOnDismiss = true; if (hasSelection()) { @@ -487,17 +555,36 @@ // From selection adjustment, show menu directly. // Note that this won't happen if it is incognito mode or device is not provisioned. if (sourceType == MenuSourceType.MENU_SOURCE_ADJUST_SELECTION) { - showActionModeOrClearOnFailure(); + showSelectionMenuInternal(); return; } // Show menu there is no updates from SelectionClient. if (mSelectionClient == null || !mSelectionClient.requestSelectionPopupUpdates(shouldSuggest)) { - showActionModeOrClearOnFailure(); + showSelectionMenuInternal(); } } else { - createAndShowPastePopup(); + showSelectionMenuInternal(); + } + } + + /** + * Shows the correct menu based on the current state (i.e. has selection). + */ + private void showSelectionMenuInternal() { + @SelectionMenuType + final int menuType = getMenuType(); + switch (menuType) { + case SelectionMenuType.ACTION_MODE: + showActionModeOrClearOnFailure(); + break; + case SelectionMenuType.PASTE: + createAndShowPastePopup(); + break; + case SelectionMenuType.DROPDOWN: + createAndShowDropdownMenu(); + break; } } @@ -509,7 +596,10 @@ * <p> If the action mode cannot be created the selection is cleared. */ public void showActionModeOrClearOnFailure() { - if (!isActionModeSupported() || !hasSelection() || mView == null) return; + if (!isActionModeSupported() || !hasSelection() || mView == null + || getMenuType() != SelectionMenuType.ACTION_MODE) { + return; + } // Just refresh non-floating action mode if it already exists to avoid blinking. if (isActionModeValid() && !isFloatingActionMode()) { @@ -523,6 +613,10 @@ return; } + // Dismiss the dropdown menu if showing. + destroyDropdownMenu(); + setTextHandlesHiddenForDropdownMenu(false); + // Reset overflow menu (see crbug.com/700929). destroyActionModeAndKeepSelection(); @@ -550,11 +644,17 @@ } } - private void createAndShowPastePopup() { - if (mView == null || mView.getParent() == null || mView.getVisibility() != View.VISIBLE) { + @VisibleForTesting + protected void createAndShowPastePopup() { + if (mView == null || mView.getParent() == null || mView.getVisibility() != View.VISIBLE + || getMenuType() != SelectionMenuType.PASTE) { return; } + // Dismiss the dropdown menu if showing. + destroyDropdownMenu(); + setTextHandlesHiddenForDropdownMenu(false); + destroyPastePopup(); PastePopupMenu.PastePopupMenuDelegate delegate = new PastePopupMenu.PastePopupMenuDelegate() { @@ -604,6 +704,108 @@ } } + private SelectionDropdownMenuDelegate.ItemClickListener getDropdownItemClickListener( + SelectionDropdownMenuDelegate delegate) { + return item -> { + final int id = delegate.getItemId(item); + logSelectionAction(delegate.getGroupId(item), id); + + // Use the click listener for the item if it has one. + @Nullable + View.OnClickListener clickListener = delegate.getClickListener(item); + if (clickListener != null) { + clickListener.onClick(null); + destroyDropdownMenu(); + } else { + handleMenuItemClick(id, this::destroyDropdownMenu); + } + }; + } + + private MVCListAdapter.ModelList getDropdownItems() { + MVCListAdapter.ModelList items = new MVCListAdapter.ModelList(); + if (mDropdownMenuDelegate != null) { + PriorityQueue<SelectionMenuGroup> allItemGroups; + if (hasSelection()) { + allItemGroups = getSelectionMenuItems(); + } else { + allItemGroups = getNonSelectionMenuItems(this, mNonSelectionAdditionalItemProvider); + } + + SelectionMenuGroup group = allItemGroups.poll(); + int i = 0; + while (group != null) { + if (i > 0) { + // Add a divider above the new group. + items.add(mDropdownMenuDelegate.getDivider()); + } + + // First determine if any item in the group contains an icon. Given + // there will always be a small amount of items in the menu it is + // okay to run this loop twice. This property will be used later on when + // rendering the items to determine title spacing. + boolean groupContainsIcon = false; + for (SelectionMenuItem item : group.items) { + groupContainsIcon = item.getIcon(mContext) != null; + + // Exit early if there is an icon found. + if (groupContainsIcon) { + break; + } + } + + // Populate the items from the group. + for (SelectionMenuItem item : group.items) { + CharSequence title = item.getTitle(mContext); + CharSequence contentDescription = item.contentDescription; + items.add(mDropdownMenuDelegate.getMenuItem( + title != null ? title.toString() : null, + contentDescription != null ? contentDescription.toString() : null, + group.id, item.id, item.getIcon(mContext), item.isIconTintable, + groupContainsIcon, item.isEnabled, item.clickListener)); + } + group = allItemGroups.poll(); + i++; + } + } + return items; + } + + @VisibleForTesting + protected void createAndShowDropdownMenu() { + assert mView != null; + assert mDropdownMenuDelegate != null; + + if (getMenuType() != SelectionMenuType.DROPDOWN) { + return; + } + + // Dismiss any action menu if showing. + destroyActionModeAndKeepSelection(); + destroyPastePopup(); + + // Dismiss any previous menu if showing. + destroyDropdownMenu(); + setTextHandlesHiddenForDropdownMenu(true); + + // Convert coordinates to pixels and show the dropdown. + final float deviceScaleFactor = getDeviceScaleFactor(); + @Px + final int x = (int) (mXDip * deviceScaleFactor); + + // The click down coordinates are relative to the content viewport, but we need + // coordinates relative to the containing View, therefore we need to add the content offset + // to the y value. + @Px + final int y = ((int) ((mYDip * deviceScaleFactor) + + mWebContents.getRenderCoordinates().getContentOffsetYPix())); + + MVCListAdapter.ModelList items = getDropdownItems(); + SelectionDropdownMenuDelegate.ItemClickListener itemClickListener = + getDropdownItemClickListener(mDropdownMenuDelegate); + mDropdownMenuDelegate.show(mContext, mView, items, itemClickListener, x, y); + } + // HideablePopup implementation @Override public void hide() { @@ -617,6 +819,12 @@ } } + private void destroyDropdownMenu() { + if (mDropdownMenuDelegate != null) { + mDropdownMenuDelegate.dismiss(); + } + } + @VisibleForTesting public boolean isPastePopupShowing() { return mPastePopupMenu != null; @@ -767,46 +975,37 @@ @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { SelectActionMenuHelper.removeAllAddedGroupsFromMenu(menu); - createSelectionActionMenu(mode, menu); + initializeActionMenu(mContext, getSelectionMenuItems(), mode, menu, item -> { + logSelectionAction(item.getGroupId(), item.getItemId()); + return false; + }); return true; } - public static void initializeNonSelectionMenu(SelectActionMenuDelegate delegate, + private PriorityQueue<SelectionMenuGroup> getSelectionMenuItems() { + TextProcessingIntentHandler textProcessingIntentHandler = + isSelectActionModeAllowed(MENU_ITEM_PROCESS_TEXT) ? this::processText : null; + return SelectActionMenuHelper.getSelectionMenuItems(this, mContext, mClassificationResult, + isSelectionPassword(), !isFocusedNodeEditable(), textProcessingIntentHandler); + } + + private static PriorityQueue<SelectionMenuGroup> getNonSelectionMenuItems( + SelectActionMenuDelegate delegate, + @Nullable AdditionalSelectionMenuItemProvider nonSelectionAdditionalItemProvider) { + return SelectActionMenuHelper.getNonSelectionMenuItems( + delegate, nonSelectionAdditionalItemProvider); + } + + public static void initializeNonSelectionActionMenu(SelectActionMenuDelegate delegate, Context context, @Nullable AdditionalSelectionMenuItemProvider nonSelectionAdditionalItemProvider, ActionMode mode, Menu menu) { PriorityQueue<SelectionMenuGroup> nonSelectionMenuItems = - SelectActionMenuHelper.getNonSelectionMenuItems( - delegate, nonSelectionAdditionalItemProvider); + getNonSelectionMenuItems(delegate, nonSelectionAdditionalItemProvider); initializeActionMenu(context, nonSelectionMenuItems, mode, menu, null); } - /** - * Initializes the selection menu. - * @param additionalMenuItemClickListener additional actions that need to be executed after a - * menu item is clicked. - */ - private static void initializeSelectionMenu(SelectActionMenuDelegate delegate, Context context, - @Nullable SelectionClient.Result classificationResult, boolean isSelectionPassword, - boolean isSelectionReadOnly, - @Nullable SelectActionMenuHelper - .TextProcessingIntentHandler textProcessingIntentHandler, - ActionMode mode, Menu menu, - @Nullable MenuItem.OnMenuItemClickListener additionalMenuItemClickListener) { - PriorityQueue<SelectionMenuGroup> selectionMenuItems = - SelectActionMenuHelper.getSelectionMenuItems(delegate, context, - classificationResult, isSelectionPassword, isSelectionReadOnly, - textProcessingIntentHandler); - initializeActionMenu( - context, selectionMenuItems, mode, menu, additionalMenuItemClickListener); - } - - /** - * Initializes a {@link Menu} with items from the {@link SelectionMenuGroup}s. - * {@link SelectionMenuItem}s where {@link SelectionMenuItem#isEnabled} returns false - * are not added. - */ - private static void initializeActionMenu(Context context, + public static void initializeActionMenu(Context context, PriorityQueue<SelectionMenuGroup> menuGroups, ActionMode mode, Menu menu, @Nullable MenuItem.OnMenuItemClickListener additionalMenuItemClickListener) { for (SelectionMenuGroup group : menuGroups) { @@ -859,18 +1058,6 @@ } } - private void createSelectionActionMenu(ActionMode mode, Menu menu) { - SelectActionMenuHelper.TextProcessingIntentHandler textProcessingIntentHandler = null; - if (isSelectActionModeAllowed(MENU_ITEM_PROCESS_TEXT)) { - textProcessingIntentHandler = this::processText; - } - initializeSelectionMenu(this, mContext, mClassificationResult, isSelectionPassword(), - !isFocusedNodeEditable(), textProcessingIntentHandler, mode, menu, item -> { - logSelectionAction(item.getGroupId(), item.getItemId()); - return false; - }); - } - /** * Checks if copy action is available. */ @@ -884,8 +1071,8 @@ */ @Override public boolean canCut() { - return hasSelection() && !isSelectionPassword() && Clipboard.getInstance().canCopy() - && isFocusedNodeEditable(); + return hasSelection() && isFocusedNodeEditable() && !isSelectionPassword() + && Clipboard.getInstance().canCopy(); } /** @@ -915,7 +1102,7 @@ } /** - * Check if need to show "paste as plain text" option. + * Check if there is a need to show "paste as plain text" option. * "paste as plain text" option needs clipboard content is rich text, and editor supports rich * text as well. */ @@ -956,33 +1143,40 @@ assert mView != null; if (!isActionModeValid()) return true; - int id = item.getItemId(); + Runnable dismissMenuRunnable; + if (item.getItemId() == R.id.select_action_menu_select_all) { + // We don't dismiss the action menu for select all. + dismissMenuRunnable = null; + } else { + dismissMenuRunnable = mode::finish; + } + return handleMenuItemClick(item.getItemId(), dismissMenuRunnable); + } + private boolean handleMenuItemClick( + @IdRes final int id, @Nullable Runnable dismissMenuRunnable) { if (id == R.id.select_action_menu_select_all) { selectAll(); } else if (id == R.id.select_action_menu_cut) { cut(); - mode.finish(); } else if (id == R.id.select_action_menu_copy) { copy(); - mode.finish(); } else if (id == R.id.select_action_menu_paste) { paste(); - mode.finish(); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && id == R.id.select_action_menu_paste_as_plain_text) { pasteAsPlainText(); - mode.finish(); } else if (id == R.id.select_action_menu_share) { share(); - mode.finish(); } else if (id == R.id.select_action_menu_web_search) { search(); - mode.finish(); } else { - return false; + assert false : "Unsupported menu item id"; } + if (dismissMenuRunnable != null) { + dismissMenuRunnable.run(); + } return true; } @@ -1037,7 +1231,7 @@ } private int getActionType(int menuItemId, int menuItemGroupId) { - if (menuItemGroupId == android.R.id.textAssist) { + if (menuItemGroupId == android.R.id.textAssist || menuItemId == android.R.id.textAssist) { return SelectionEvent.ACTION_SMART_SHARE; } if (menuItemId == R.id.select_action_menu_select_all) { @@ -1056,9 +1250,6 @@ if (menuItemId == R.id.select_action_menu_share) { return SelectionEvent.ACTION_SHARE; } - if (menuItemId == android.R.id.textAssist) { - return SelectionEvent.ACTION_SMART_SHARE; - } return SelectionEvent.ACTION_OTHER; } @@ -1271,6 +1462,12 @@ mDropdownMenuDelegate = dropdownMenuDelegate; } + private void setTextHandlesHiddenForDropdownMenu(boolean hide) { + if (mNativeSelectionPopupController == 0) return; + SelectionPopupControllerImplJni.get().setTextHandlesHiddenForDropdownMenu( + mNativeSelectionPopupController, SelectionPopupControllerImpl.this, hide); + } + private void setTextHandlesTemporarilyHidden(boolean hide) { if (mNativeSelectionPopupController == 0) return; SelectionPopupControllerImplJni.get().setTextHandlesTemporarilyHidden( @@ -1279,7 +1476,8 @@ @CalledByNative public void restoreSelectionPopupsIfNecessary() { - if (hasSelection() && !isActionModeValid()) { + if (hasSelection() && !isActionModeValid() + && getMenuType() == SelectionMenuType.ACTION_MODE) { showActionModeOrClearOnFailure(); } } @@ -1596,7 +1794,7 @@ // remove this check. if (result.startAdjust > 0 || result.endAdjust < 0) { mClassificationResult = null; - showActionModeOrClearOnFailure(); + showSelectionMenuInternal(); return; } @@ -1621,7 +1819,7 @@ } // Rely on this method to clear |mHidden| and unhide the action mode. - showActionModeOrClearOnFailure(); + showSelectionMenuInternal(); } }; @@ -1677,5 +1875,7 @@ long init(SelectionPopupControllerImpl caller, WebContents webContents); void setTextHandlesTemporarilyHidden(long nativeSelectionPopupController, SelectionPopupControllerImpl caller, boolean hidden); + void setTextHandlesHiddenForDropdownMenu(long nativeSelectionPopupController, + SelectionPopupControllerImpl caller, boolean hidden); } }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java index 39126cf..91076d3 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
@@ -24,6 +24,8 @@ public static final String BACKGROUND_MEDIA_RENDERER_HAS_MODERATE_BINDING = "BackgroundMediaRendererHasModerateBinding"; + public static final String MOUSE_AND_TRACKPAD_DROPDOWN_MENU = "MouseAndTrackpadDropdownMenu"; + public static final String ON_DEMAND_ACCESSIBILITY_EVENTS = "OnDemandAccessibilityEvents"; public static final String OPTIMIZE_IMM_HIDE_CALLS = "OptimizeImmHideCalls";
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java b/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java index 61add7d..eaac3e3 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/SelectionMenuItem.java
@@ -35,12 +35,13 @@ public final @Nullable CharSequence contentDescription; public final @Nullable View.OnClickListener clickListener; public final boolean isEnabled; + public final boolean isIconTintable; private SelectionMenuItem(@IdRes int id, @AttrRes int iconAttr, @Nullable Drawable icon, @StringRes int titleRes, @Nullable CharSequence title, @Nullable Character alphabeticShortcut, int orderInCategory, int showAsActionFlags, @Nullable CharSequence contentDescription, @Nullable View.OnClickListener clickListener, - boolean isEnabled) { + boolean isEnabled, boolean isIconTintable) { mIconAttr = iconAttr; mIcon = icon; mTitleRes = titleRes; @@ -52,6 +53,7 @@ this.contentDescription = contentDescription; this.clickListener = clickListener; this.isEnabled = isEnabled; + this.isIconTintable = isIconTintable; } /** @@ -104,6 +106,7 @@ private @Nullable CharSequence mContentDescription; private @Nullable View.OnClickListener mClickListener; private boolean mIsEnabled; + private boolean mIsIconTintable; /** * Pass in a non-null title. @@ -137,6 +140,7 @@ mContentDescription = null; mClickListener = null; mIsEnabled = true; + mIsIconTintable = false; } /** @@ -216,12 +220,20 @@ } /** + * Pass in true if the icon can be safely tinted. Defaults to false. + */ + public Builder setIsIconTintable(boolean isIconTintable) { + mIsIconTintable = isIconTintable; + return this; + } + + /** * Builds the menu item. */ public SelectionMenuItem build() { return new SelectionMenuItem(mId, mIconAttr, mIcon, mTitleRes, mTitle, mAlphabeticShortcut, mOrderInCategory, mShowAsActionFlags, mContentDescription, - mClickListener, mIsEnabled); + mClickListener, mIsEnabled, mIsIconTintable); } } }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java b/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java index 6a37677..3299134 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java
@@ -9,6 +9,7 @@ import android.view.textclassifier.TextClassifier; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.content.browser.selection.SelectionPopupControllerImpl; @@ -84,7 +85,8 @@ * Sets the {@link AdditionalSelectionMenuItemProvider} used by {@link SelectionPopupController} * when no text is selected. */ - void setNonSelectionAdditionalMenuItemProvider(AdditionalSelectionMenuItemProvider provider); + void setNonSelectionAdditionalMenuItemProvider( + @Nullable AdditionalSelectionMenuItemProvider provider); /** * @return {@link SelectionClient.ResultCallback} instance.
diff --git a/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java b/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java index aa427eb8..acab651 100644 --- a/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java +++ b/content/public/android/junit/src/org/chromium/content/browser/selection/SelectionPopupControllerTest.java
@@ -26,6 +26,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.res.TypedArray; import android.os.Build; import android.provider.Settings; import android.view.ActionMode; @@ -45,6 +46,7 @@ import org.robolectric.shadows.ShadowLog; import org.chromium.base.ContextUtils; +import org.chromium.base.FeatureList; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; import org.chromium.content.browser.GestureListenerManagerImpl; @@ -52,11 +54,14 @@ import org.chromium.content.browser.RenderCoordinatesImpl; import org.chromium.content.browser.RenderWidgetHostViewImpl; import org.chromium.content.browser.webcontents.WebContentsImpl; +import org.chromium.content_public.browser.ContentFeatureList; import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.SelectAroundCaretResult; import org.chromium.content_public.browser.SelectionClient; import org.chromium.content_public.browser.SelectionEventProcessor; import org.chromium.content_public.browser.SelectionPopupController; +import org.chromium.content_public.browser.selection.SelectionDropdownMenuDelegate; +import org.chromium.content_public.browser.test.util.TestSelectionDropdownMenuDelegate; import org.chromium.ui.base.MenuSourceType; import org.chromium.ui.base.ViewAndroidDelegate; import org.chromium.ui.base.WindowAndroid; @@ -76,6 +81,7 @@ private SelectionPopupControllerImpl mController; private Context mContext; private WeakReference<Context> mWeakContext; + private TypedArray mTypedArray; private WindowAndroid mWindowAndroid; private WebContentsImpl mWebContents; private ViewGroup mView; @@ -89,6 +95,7 @@ private PopupController mPopupController; private GestureListenerManagerImpl mGestureStateListenerManager; private RenderFrameHost mRenderFrameHost; + private FeatureList.TestValues mTestValues; private static final String MOUNTAIN_FULL = "585 Franklin Street, Mountain View, CA 94041"; private static final String MOUNTAIN = "Mountain"; @@ -150,6 +157,7 @@ mContext = Mockito.mock(Context.class); mWeakContext = new WeakReference<Context>(mContext); + mTypedArray = Mockito.mock(TypedArray.class); mWindowAndroid = Mockito.mock(WindowAndroid.class); mWebContents = Mockito.mock(WebContentsImpl.class); mView = Mockito.mock(ViewGroup.class); @@ -163,6 +171,9 @@ mPopupController = Mockito.mock(PopupController.class); mGestureStateListenerManager = Mockito.mock(GestureListenerManagerImpl.class); + mTestValues = new FeatureList.TestValues(); + setDropdownMenuFeatureEnabled(false); + SelectionPopupControllerImpl.setDisableMagnifierForTesting(true); mContentResolver = RuntimeEnvironment.application.getContentResolver(); @@ -171,6 +182,7 @@ when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getContentResolver()).thenReturn(mContentResolver); + when(mContext.obtainStyledAttributes(Mockito.any(int[].class))).thenReturn(mTypedArray); when(mWebContents.getRenderWidgetHostView()).thenReturn(mRenderWidgetHostViewImpl); when(mWebContents.getRenderCoordinates()).thenReturn(mRenderCoordinates); when(mRenderCoordinates.getDeviceScaleFactor()).thenReturn(1.f); @@ -187,6 +199,8 @@ @After public void tearDown() { SelectionPopupControllerImpl.setDisableMagnifierForTesting(false); + SelectionPopupControllerImpl.setEnableTabletUiModeForTesting(false); + setDropdownMenuFeatureEnabled(false); } @Test @@ -202,7 +216,7 @@ mController.setSelectionClient(client); // Long press triggered showSelectionMenu() call. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE, /* selectionOffset = */ 5, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -216,7 +230,7 @@ when(mView.startActionMode(any(), anyInt())).thenReturn(mActionMode); // Call showSelectionMenu again, which is adjustSelectionByCharacterOffset triggered. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -246,7 +260,7 @@ mController.setSelectionClient(client); // Long press triggered showSelectionMenu() call. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE, /* selectionOffset = */ 5, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -259,7 +273,7 @@ // Another long press triggered showSelectionMenu() call. client.setResult(newResult); - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, MOUNTAIN, /* selectionOffset = */ 21, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -271,7 +285,7 @@ when(mView.startActionMode(any(), anyInt())).thenReturn(mActionMode); // First adjustSelectionByCharacterOffset() triggered. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -283,7 +297,7 @@ assertEquals("Maps", returnResult.label); // Second adjustSelectionByCharacterOffset() triggered. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, MOUNTAIN_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -305,14 +319,14 @@ mController.setSelectionClient(client); // Long press triggered showSelectionMenu() call. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE, /* selectionOffset = */ 5, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, MenuSourceType.MENU_SOURCE_LONG_PRESS, mRenderFrameHost); // Another long press triggered showSelectionMenu() call. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, MOUNTAIN, /* selectionOffset = */ 21, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -334,7 +348,7 @@ when(mView.startActionMode(any(), anyInt())).thenReturn(mActionMode); // First adjustSelectionByCharacterOffset() triggered. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -346,7 +360,7 @@ assertEquals("Maps", returnResult.label); // Second adjustSelectionByCharacterOffset() triggered. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, MOUNTAIN_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -370,7 +384,7 @@ mController.setSelectionClient(client); // Long press triggered showSelectionMenu() call. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE, /* selectionOffset = */ 5, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -383,7 +397,7 @@ mController.getResultCallback().onClassified(result); // Call showSelectionMenu again, which is adjustSelectionByCharacterOffset triggered. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -393,7 +407,7 @@ eq(AMPHITHEATRE_FULL), eq(0), isA(SelectionClient.Result.class)); // Dragging selection handle, select "1600 Amphitheatre". - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL.substring(0, 17), /* selectionOffset = */ 0, /* canSelectAll = */ true, @@ -423,7 +437,7 @@ mController.setSelectionClient(client); // Long press triggered showSelectionMenu() call. - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE, /* selectionOffset = */ 5, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -439,7 +453,7 @@ eq(AMPHITHEATRE), eq(5), any(SelectionClient.Result.class)); // Dragging selection handle, select "1600 Amphitheatre". - mController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + mController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL.substring(0, 17), /* selectionOffset = */ 0, /* canSelectAll = */ true, @@ -577,7 +591,7 @@ when(mView.startActionMode(any(), anyInt())).thenReturn(mActionMode); // Long press triggered showSelectionMenu() call. - spyController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + spyController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -614,7 +628,7 @@ when(mView.startActionMode(any(), anyInt())).thenReturn(mActionMode); // Long press triggered showSelectionMenu() call. - spyController.showSelectionMenu(0, 0, 0, 0, 0, /* isEditable = */ true, + spyController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, /* canSelectAll = */ true, /* canRichlyEdit = */ true, /* shouldSuggest = */ true, @@ -686,6 +700,76 @@ assertEquals(0, menu3.size()); } + @Test + @Feature({"TextInput"}) + public void testShowDropdownMenuWhenMenuSourceIsMouse() { + setDropdownMenuFeatureEnabled(true); + SelectionPopupControllerImpl spyController = Mockito.spy(mController); + SelectionDropdownMenuDelegate dropdownMenuDelegate = + Mockito.spy(new TestSelectionDropdownMenuDelegate()); + spyController.setDropdownMenuDelegate(dropdownMenuDelegate); + spyController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, + /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, + /* canSelectAll = */ true, + /* canRichlyEdit = */ true, /* shouldSuggest = */ true, + MenuSourceType.MENU_SOURCE_MOUSE, mRenderFrameHost); + Mockito.verify(spyController, times(1)).createAndShowDropdownMenu(); + Mockito.verify(spyController, times(1)).destroyActionModeAndKeepSelection(); + Mockito.verify(spyController, times(1)).destroyPastePopup(); + Mockito.verify(dropdownMenuDelegate, times(1)).dismiss(); + Mockito.verify(dropdownMenuDelegate, times(1)) + .show(any(), any(), any(), any(), anyInt(), anyInt()); + Mockito.verify(spyController, never()).createAndShowPastePopup(); + Mockito.verify(spyController, never()).showActionModeOrClearOnFailure(); + } + + @Test + @Feature({"TextInput"}) + public void testShowPasteMenuWhenSourceIsLongPressWithNoSelection() { + // Needed so createAndShowPastePopup() won't return early. + when(mView.getParent()).thenReturn(Mockito.mock(ViewGroup.class)); + setDropdownMenuFeatureEnabled(true); + SelectionPopupControllerImpl spyController = Mockito.spy(mController); + SelectionDropdownMenuDelegate dropdownMenuDelegate = + Mockito.spy(new TestSelectionDropdownMenuDelegate()); + spyController.setDropdownMenuDelegate(dropdownMenuDelegate); + spyController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, + /* isPasswordType = */ false, "", /* selectionOffset = */ 0, + /* canSelectAll = */ true, + /* canRichlyEdit = */ true, /* shouldSuggest = */ true, + MenuSourceType.MENU_SOURCE_LONG_PRESS, mRenderFrameHost); + Mockito.verify(spyController, times(1)).createAndShowPastePopup(); + Mockito.verify(dropdownMenuDelegate, times(1)).dismiss(); + Mockito.verify(spyController, never()).createAndShowDropdownMenu(); + Mockito.verify(spyController, never()).showActionModeOrClearOnFailure(); + } + + @Test + @Feature({"TextInput"}) + public void testShowSelectionActionMenuWhenSourceIsLongPressWithSelection() { + setDropdownMenuFeatureEnabled(true); + SelectionPopupControllerImpl spyController = Mockito.spy(mController); + SelectionDropdownMenuDelegate dropdownMenuDelegate = + Mockito.spy(new TestSelectionDropdownMenuDelegate()); + spyController.setDropdownMenuDelegate(dropdownMenuDelegate); + spyController.showSelectionMenu(0, 0, 0, 0, 0, 0, 0, /* isEditable = */ true, + /* isPasswordType = */ false, AMPHITHEATRE_FULL, /* selectionOffset = */ 0, + /* canSelectAll = */ true, + /* canRichlyEdit = */ true, /* shouldSuggest = */ true, + MenuSourceType.MENU_SOURCE_LONG_PRESS, mRenderFrameHost); + Mockito.verify(spyController, times(1)).showActionModeOrClearOnFailure(); + Mockito.verify(dropdownMenuDelegate, times(1)).dismiss(); + Mockito.verify(spyController, never()).createAndShowPastePopup(); + Mockito.verify(spyController, never()).createAndShowDropdownMenu(); + } + + private void setDropdownMenuFeatureEnabled(boolean enabled) { + mTestValues.addFeatureFlagOverride( + ContentFeatureList.MOUSE_AND_TRACKPAD_DROPDOWN_MENU, enabled); + FeatureList.setTestValues(mTestValues); + SelectionPopupControllerImpl.setEnableTabletUiModeForTesting(enabled); + } + private ResolveInfo createResolveInfoWithActivityInfo(String activityName, boolean exported) { String packageName = "org.chromium.content.browser.selection.SelectionPopupControllerTest";
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index f33e7be8..0ce4f02a 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -405,6 +405,7 @@ "storage_partition.h", "storage_partition_config.cc", "storage_partition_config.h", + "storage_partition_user_data.h", "storage_usage_info.h", "stored_payment_app.cc", "stored_payment_app.h",
diff --git a/content/public/browser/storage_partition.h b/content/public/browser/storage_partition.h index c8bc4cb4..20edbb9 100644 --- a/content/public/browser/storage_partition.h +++ b/content/public/browser/storage_partition.h
@@ -11,6 +11,7 @@ #include "base/functional/callback_forward.h" #include "base/observer_list_types.h" +#include "base/supports_user_data.h" #include "base/time/time.h" #include "build/build_config.h" #include "components/services/storage/privileged/mojom/indexed_db_control.mojom-forward.h" @@ -91,7 +92,7 @@ // persistent state inside the BrowserContext. This is used to implement // isolated storage where a renderer with isolated storage cannot see // the cookies, localStorage, etc., that normal web renderers have access to. -class CONTENT_EXPORT StoragePartition { +class CONTENT_EXPORT StoragePartition : public base::SupportsUserData { public: // Returns the StoragePartitionConfig that represents this StoragePartition. virtual const StoragePartitionConfig& GetConfig() = 0; @@ -361,7 +362,7 @@ const storage::QuotaSettings* settings); protected: - virtual ~StoragePartition() {} + ~StoragePartition() override {} }; } // namespace content
diff --git a/content/public/browser/storage_partition_user_data.h b/content/public/browser/storage_partition_user_data.h new file mode 100644 index 0000000..6b732c3 --- /dev/null +++ b/content/public/browser/storage_partition_user_data.h
@@ -0,0 +1,115 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_BROWSER_STORAGE_PARTITION_USER_DATA_H_ +#define CONTENT_PUBLIC_BROWSER_STORAGE_PARTITION_USER_DATA_H_ + +#include "base/memory/ptr_util.h" +#include "base/memory/raw_ref.h" +#include "base/supports_user_data.h" +#include "content/public/browser/storage_partition.h" + +namespace content { + +// A base class for classes attached to, and scoped to, the lifetime of a +// content::StoragePartition. + +// StoragePartitionUserData is created when a user of an API inherits this class +// and calls CreateForStoragePartition. +// +// StoragePartitionUserData is similar to DocumentUserData, but is attached to a +// storage partition instead of any document. +// +// Example usage of StoragePartitionUserData: +// +// --- in foo_storage_partition_helper.h --- +// class FooStoragePartitionHelper : public +// content::StoragePartitionUserData<FooStoragePartitionHelper> { +// public: +// ~FooStoragePartitionHelper() override; +// +// // ... more public stuff here ... +// +// private: +// explicit FooStoragePartitionHelper(content::StoragePartition* +// storage_partition); +// +// friend StoragePartitionUserData; +// STORAGE_PARTITION_USER_DATA_KEY_DECL(); +// +// // ... more private stuff here ... +// }; +// +// --- in foo_storage_partition_helper.cc --- +// STORAGE_PARTITION_USER_DATA_KEY_IMPL(FooStoragePartitionHelper); +// +// FooStoragePartitionHelper::FooStoragePartitionHelper( +// content::StoragePartition* storage_partition) +// : StoragePartitionUserData(storage_partition) {} +// +// FooStoragePartitionHelper::~FooStoragePartitionHelper() {} +// +template <typename T> +class StoragePartitionUserData : public base::SupportsUserData::Data { + public: + template <typename... Args> + static void CreateForStoragePartition(StoragePartition* storage_partition, + Args&&... args) { + DCHECK(storage_partition); + if (!GetForStoragePartition(storage_partition)) { + T* data = new T(storage_partition, std::forward<Args>(args)...); + storage_partition->SetUserData(UserDataKey(), base::WrapUnique(data)); + } + } + + static T* GetOrCreateForStoragePartition( + StoragePartition* storage_partition) { + DCHECK(storage_partition); + if (auto* data = GetForStoragePartition(storage_partition)) { + return data; + } + + CreateForStoragePartition(storage_partition); + return GetForStoragePartition(storage_partition); + } + + static T* GetForStoragePartition(StoragePartition* storage_partition) { + DCHECK(storage_partition); + return static_cast<T*>(storage_partition->GetUserData(UserDataKey())); + } + + static void DeleteForStoragePartition(StoragePartition* storage_partition) { + DCHECK(GetForStoragePartition(storage_partition)); + storage_partition->RemoveUserData(UserDataKey()); + } + + StoragePartition& storage_partition() const { return *storage_partition_; } + + static const void* UserDataKey() { return &T::kUserDataKey; } + + protected: + explicit StoragePartitionUserData(StoragePartition* storage_partition) + : storage_partition_(storage_partition) {} + + private: + // StoragePartition associated with subclass which inherits this + // StoragePartitionUserData. + const raw_ptr<StoragePartition> storage_partition_; +}; + +// Users won't be able to instantiate the template if they miss declaring the +// user data key. +// This macro declares a static variable inside the class that inherits from +// StoragePartitionUserData. The address of this static variable is used as +// the key to store/retrieve an instance of the class. +#define STORAGE_PARTITION_USER_DATA_KEY_DECL() static const int kUserDataKey = 0 + +// This macro instantiates the static variable declared by the previous macro. +// It must live in a .cc file to ensure that there is only one instantiation +// of the static variable. +#define STORAGE_PARTITION_USER_DATA_KEY_IMPL(Type) const int Type::kUserDataKey + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_STORAGE_PARTITION_USER_DATA_H_
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 00c3d53..2a88ae6 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -428,6 +428,11 @@ "FedCmIdpSigninStatusEnabled", base::FEATURE_DISABLED_BY_DEFAULT); +// Enables bypassing the well-known file enforcement. +BASE_FEATURE(kFedCmWithoutWellKnownEnforcement, + "FedCmWithoutWellKnownEnforcement", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enables the MDocs API in the IdentityCredential. BASE_FEATURE(kWebIdentityMDocs, "WebIdentityMDocs",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 9b8ff3c..e4943e3 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -91,6 +91,7 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmSelectiveDisclosure); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdpSigninStatusMetrics); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdpSigninStatusEnabled); +CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmWithoutWellKnownEnforcement); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebIdentityMDocs); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFirstPartySets); CONTENT_EXPORT extern const base::FeatureParam<bool>
diff --git a/content/public/test/android/BUILD.gn b/content/public/test/android/BUILD.gn index 7ae596d..784e10c 100644 --- a/content/public/test/android/BUILD.gn +++ b/content/public/test/android/BUILD.gn
@@ -65,6 +65,7 @@ "javatests/src/org/chromium/content_public/browser/test/util/RenderProcessHostUtils.java", "javatests/src/org/chromium/content_public/browser/test/util/TestCallbackHelperContainer.java", "javatests/src/org/chromium/content_public/browser/test/util/TestInputMethodManagerWrapper.java", + "javatests/src/org/chromium/content_public/browser/test/util/TestSelectionDropdownMenuDelegate.java", "javatests/src/org/chromium/content_public/browser/test/util/TestSelectionPopupController.java", "javatests/src/org/chromium/content_public/browser/test/util/TestThreadUtils.java", "javatests/src/org/chromium/content_public/browser/test/util/TestTouchUtils.java",
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestSelectionDropdownMenuDelegate.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestSelectionDropdownMenuDelegate.java new file mode 100644 index 0000000..ce75c58 --- /dev/null +++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestSelectionDropdownMenuDelegate.java
@@ -0,0 +1,56 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.content_public.browser.test.util; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.View; + +import androidx.annotation.Nullable; + +import org.chromium.content_public.browser.selection.SelectionDropdownMenuDelegate; +import org.chromium.ui.modelutil.MVCListAdapter; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * A placeholder {@link SelectionDropdownMenuDelegate} to be used with tests. + */ +public class TestSelectionDropdownMenuDelegate implements SelectionDropdownMenuDelegate { + @Override + public void show(Context context, View rootView, MVCListAdapter.ModelList items, + ItemClickListener clickListener, int x, int y) {} + + @Override + public void dismiss() {} + + @Override + public int getGroupId(PropertyModel itemModel) { + return 0; + } + + @Override + public int getItemId(PropertyModel itemModel) { + return 0; + } + + @Nullable + @Override + public View.OnClickListener getClickListener(PropertyModel itemModel) { + return null; + } + + @Override + public MVCListAdapter.ListItem getDivider() { + return null; + } + + @Override + public MVCListAdapter.ListItem getMenuItem(String title, @Nullable String contentDescription, + int groupId, int id, @Nullable Drawable startIcon, boolean isIconTintable, + boolean groupContainsIcon, boolean enabled, + @Nullable View.OnClickListener clickListener) { + return null; + } +}
diff --git a/content/web_test/renderer/pixel_dump.cc b/content/web_test/renderer/pixel_dump.cc index 7f0cd96..481410e 100644 --- a/content/web_test/renderer/pixel_dump.cc +++ b/content/web_test/renderer/pixel_dump.cc
@@ -35,6 +35,7 @@ #include "third_party/blink/public/web/web_frame_widget.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_page_popup.h" +#include "third_party/blink/public/web/web_print_page_description.h" #include "third_party/blink/public/web/web_print_params.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_widget.h" @@ -49,12 +50,38 @@ auto* frame_widget = web_frame->LocalRoot()->FrameWidget(); frame_widget->UpdateAllLifecyclePhases(blink::DocumentUpdateReason::kTest); + gfx::SizeF used_page_size(page_size_in_pixels); + uint32_t page_count = web_frame->PrintBegin( - blink::WebPrintParams(gfx::SizeF(page_size_in_pixels)), blink::WebNode()); + blink::WebPrintParams(used_page_size), blink::WebNode()); + + // Check the desired size of the first page, according to Blink, and use that + // as the actual size for all pages. This is similar to what regular Chrome + // printing (PrintRenderFrameHelper & co) does, in order to honor @page CSS + // rules. This will need to change when adding support for mixed page + // sizes. See crbug.com/835358 + blink::WebPrintPageDescription description; + description.size = used_page_size; + web_frame->GetPageDescription(0, &description); + gfx::SizeF first_page_area_size( + description.size.width() - + (description.margin_left + description.margin_right), + description.size.height() - + (description.margin_top + description.margin_bottom)); + + if (used_page_size != first_page_area_size && + first_page_area_size.width() >= 1 && first_page_area_size.height() >= 1) { + // A valid and different page size has been specified in CSS. Relayout. + web_frame->PrintEnd(); + used_page_size = first_page_area_size; + page_count = web_frame->PrintBegin(blink::WebPrintParams(used_page_size), + blink::WebNode()); + } + blink::WebVector<uint32_t> pages( printing::PageNumber::GetPages(page_ranges, page_count)); - gfx::Size spool_size = - web_frame->SpoolSizeInPixelsForTesting(page_size_in_pixels, pages); + gfx::Size spool_size = web_frame->SpoolSizeInPixelsForTesting( + gfx::ToFlooredSize(used_page_size), pages); bool is_opaque = false; @@ -70,8 +97,8 @@ printing::PrintSettings::NewCookie()); cc::SkiaPaintCanvas canvas(bitmap); canvas.SetPrintingMetafile(&metafile); - web_frame->PrintPagesForTesting(&canvas, page_size_in_pixels, spool_size, - &pages); + web_frame->PrintPagesForTesting(&canvas, gfx::ToFlooredSize(used_page_size), + spool_size, &pages); web_frame->PrintEnd(); return bitmap; }
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc index 09ce27e..01e95a70 100644 --- a/content/web_test/renderer/test_runner.cc +++ b/content/web_test/renderer/test_runner.cc
@@ -95,15 +95,14 @@ namespace { -// According to http://web-platform-tests.org/writing-tests/print-reftests.html -// the default page size for print reftests is 5 by 3 inches. Margins aren't -// mentioned, but there are quite a few existing reftests that specify a page -// *box* size of 5x3 inches, along with a 0.5 inch margin on every side. For -// Chromium to pass those, operate with a page *area* size of 4 by 2 inches. -// There are 96 CSS pixels per inch, so multiply by that. -// -// TODO(crbug.com/1416181): Change this to 5 by 3 inches, once it's possible to -// specify the page size and margins with @page rules in WPT reftests. +// TODO(https://github.com/web-platform-tests/wpt/issues/40788): According to +// http://web-platform-tests.org/writing-tests/print-reftests.html the default +// page size for print reftests is 5 by 3 inches. But that doesn't match the +// expectations of existing tests. The WPT test +// infrastructure/reftest/reftest_match-print.html assumes that the page height +// is 2in, not 3in. Apparently, there's a secret margin of 0.5 inches being +// assumed, or something. So use 4 by 2 inches. There are 96 CSS pixels per +// inch, so multiply by that. const int kWPTPrintWidth = 4 * 96; const int kWPTPrintHeight = 2 * 96;
diff --git a/device/fido/features.cc b/device/fido/features.cc index 0a28e9b..93b6895 100644 --- a/device/fido/features.cc +++ b/device/fido/features.cc
@@ -123,4 +123,9 @@ "WebAuthenticationConditionalUIExperimentation", base::FEATURE_ENABLED_BY_DEFAULT); +// Enabled in M117. Remove in or after M120. +BASE_FEATURE(kWebAuthnCableViaCredMan, + "WebAuthenticationCableViaCredMan", + base::FEATURE_ENABLED_BY_DEFAULT); + } // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h index a3ba888..978f73e8 100644 --- a/device/fido/features.h +++ b/device/fido/features.h
@@ -94,6 +94,10 @@ COMPONENT_EXPORT(DEVICE_FIDO) BASE_DECLARE_FEATURE(kWebAuthConditionalUIExperimentation); +// Handle caBLE requests on Android with the CredMan-capable code path. +COMPONENT_EXPORT(DEVICE_FIDO) +BASE_DECLARE_FEATURE(kWebAuthnCableViaCredMan); + } // namespace device #endif // DEVICE_FIDO_FEATURES_H_
diff --git a/device/vr/openxr/openxr_platform_helper.cc b/device/vr/openxr/openxr_platform_helper.cc index 666d5b4..86c4929 100644 --- a/device/vr/openxr/openxr_platform_helper.cc +++ b/device/vr/openxr/openxr_platform_helper.cc
@@ -6,11 +6,13 @@ #include <memory> #include <utility> +#include "base/containers/contains.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/version.h" #include "build/build_config.h" #include "components/version_info/version_info.h" +#include "device/vr/openxr/openxr_api_wrapper.h" #include "device/vr/openxr/openxr_defs.h" #include "device/vr/openxr/openxr_extension_helper.h" #include "device/vr/openxr/openxr_graphics_binding.h" @@ -189,4 +191,20 @@ return result; } +bool OpenXrPlatformHelper::IsArBlendModeSupported(XrInstance instance) { + XrSystemId system; + + if (XR_FAILED(OpenXrApiWrapper::GetSystem(instance, &system))) { + return false; + } + + std::vector<XrEnvironmentBlendMode> environment_blend_modes = + OpenXrApiWrapper::GetSupportedBlendModes(instance, system); + + return base::Contains(environment_blend_modes, + XR_ENVIRONMENT_BLEND_MODE_ADDITIVE) || + base::Contains(environment_blend_modes, + XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND); +} + } // namespace device
diff --git a/device/vr/openxr/openxr_platform_helper.h b/device/vr/openxr/openxr_platform_helper.h index 3991424..f9f31691 100644 --- a/device/vr/openxr/openxr_platform_helper.h +++ b/device/vr/openxr/openxr_platform_helper.h
@@ -113,6 +113,8 @@ // features. virtual device::mojom::XRDeviceData GetXRDeviceData() = 0; + bool IsArBlendModeSupported(XrInstance instance); + protected: OpenXrPlatformHelper();
diff --git a/device/vr/openxr/windows/openxr_platform_helper_windows.cc b/device/vr/openxr/windows/openxr_platform_helper_windows.cc index 314f454..d61b2c3c9 100644 --- a/device/vr/openxr/windows/openxr_platform_helper_windows.cc +++ b/device/vr/openxr/windows/openxr_platform_helper_windows.cc
@@ -83,7 +83,8 @@ device::mojom::XRDeviceData OpenXrPlatformHelperWindows::GetXRDeviceData() { device::mojom::XRDeviceData device_data; - device_data.is_ar_blend_mode_supported = IsArBlendModeSupported(); + device_data.is_ar_blend_mode_supported = + IsArBlendModeSupported(GetOrCreateXrInstance()); // Only set the LUID if it exists and is nonzero. if (LUID luid; TryGetLuid(&luid)) { device_data.luid = CHROME_LUID{luid.LowPart, luid.HighPart}; @@ -92,22 +93,6 @@ return device_data; } -bool OpenXrPlatformHelperWindows::IsArBlendModeSupported() { - XrSystemId system; - if (XR_FAILED( - OpenXrApiWrapper::GetSystem(GetOrCreateXrInstance(), &system))) { - return false; - } - - std::vector<XrEnvironmentBlendMode> environment_blend_modes = - OpenXrApiWrapper::GetSupportedBlendModes(GetOrCreateXrInstance(), system); - - return base::Contains(environment_blend_modes, - XR_ENVIRONMENT_BLEND_MODE_ADDITIVE) || - base::Contains(environment_blend_modes, - XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND); -} - // Returns the LUID of the adapter the OpenXR runtime is on. Returns false and // sets luid to {0, 0} if the LUID could not be determined. Also returns false // if the value of the retrieved LUID is {0, 0}.
diff --git a/device/vr/openxr/windows/openxr_platform_helper_windows.h b/device/vr/openxr/windows/openxr_platform_helper_windows.h index 9007e3ca..a0f22bd 100644 --- a/device/vr/openxr/windows/openxr_platform_helper_windows.h +++ b/device/vr/openxr/windows/openxr_platform_helper_windows.h
@@ -48,7 +48,6 @@ private: XrInstance GetOrCreateXrInstance(); - bool IsArBlendModeSupported(); // Accessing the LUID is handled via an extension method. We cache that // method here once we've loaded it so that we don't have to look it up again,
diff --git a/docs/ios/build_instructions.md b/docs/ios/build_instructions.md index d8f6f440..a22ab66 100644 --- a/docs/ios/build_instructions.md +++ b/docs/ios/build_instructions.md
@@ -199,7 +199,7 @@ test application. Those provisioning profile will have a bundle identifier matching the following pattern `${prefix}.gtest.${test-suite-name}` where `${test-suite-name}` is the name of the test suite with underscores changed -to dashes (e.g. `base_unittests` app will use `${prefix}.gest.base-unittests` +to dashes (e.g. `base_unittests` app will use `${prefix}.gtest.base-unittests` as bundle identifier). To be able to run the EarlGrey tests on a device, you'll need two provisioning
diff --git a/gpu/command_buffer/service/dawn_context_provider.cc b/gpu/command_buffer/service/dawn_context_provider.cc index 8986183..a7d66ed 100644 --- a/gpu/command_buffer/service/dawn_context_provider.cc +++ b/gpu/command_buffer/service/dawn_context_provider.cc
@@ -140,7 +140,7 @@ #endif // TODO(crbug.com/1456492): verify the required features. - wgpu::FeatureName features[] = { + std::vector<wgpu::FeatureName> features = { wgpu::FeatureName::DawnInternalUsages, wgpu::FeatureName::DawnMultiPlanarFormats, wgpu::FeatureName::DepthClipControl, @@ -149,15 +149,20 @@ wgpu::FeatureName::SurfaceCapabilities, }; - descriptor.requiredFeatures = features; - descriptor.requiredFeaturesCount = std::size(features); - wgpu::BackendType backend_type = GetDefaultBackendType(); std::vector<dawn::native::Adapter> adapters = instance_->EnumerateAdapters(); for (dawn::native::Adapter adapter : adapters) { wgpu::AdapterProperties properties; adapter.GetProperties(&properties); if (properties.backendType == backend_type) { + if (wgpu::Adapter(adapter.Get()).HasFeature( + wgpu::FeatureName::TransientAttachments)) { + features.push_back(wgpu::FeatureName::TransientAttachments); + } + + descriptor.requiredFeatures = features.data(); + descriptor.requiredFeaturesCount = std::size(features); + wgpu::Device device(adapter.CreateDevice(&descriptor)); if (device) { device.SetUncapturedErrorCallback(&LogError, nullptr);
diff --git a/infra/config/dev/subprojects/chromium/ci.star b/infra/config/dev/subprojects/chromium/ci.star index 80d34a3..eba460d 100644 --- a/infra/config/dev/subprojects/chromium/ci.star +++ b/infra/config/dev/subprojects/chromium/ci.star
@@ -118,7 +118,6 @@ # disabled. ci_builder( name = "linux-rel-dev", - os = os.LINUX_BIONIC, description_html = "Test description. <b>Test HTML</b>.", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config(config = "chromium"), @@ -128,6 +127,7 @@ build_config = builder_config.build_config.RELEASE, ), ), + os = os.LINUX_BIONIC, ) ci_builder(
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 0cf0fdce..552d04f0 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -29471,14 +29471,11 @@ ' },' ' "$build/siso": {' ' "configs": [' - ' "remote_all",' - ' "rewrapper_to_reproxy"' + ' "remote_all"' ' ],' ' "enable_cloud_profiler": true,' ' "enable_cloud_trace": true,' - ' "experiments": [' - ' "use-reproxy"' - ' ],' + ' "experiments": [],' ' "project": "rbe-chromium-untrusted"' ' },' ' "$recipe_engine/resultdb/test_presentation": {' @@ -29601,7 +29598,8 @@ ' },' ' "$build/siso": {' ' "configs": [' - ' "remote_all"' + ' "remote_all",' + ' "rewrapper_to_reproxy"' ' ],' ' "enable_cloud_profiler": true,' ' "enable_cloud_trace": true,'
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index d426ea9..50ec11d 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -74,7 +74,7 @@ LINUX_FOCAL = os_enum(os_category.LINUX, "Ubuntu-20.04"), # A migration off of bionic is in progress, builders identified in # linux-default.json will have a different os dimension - LINUX_DEFAULT = os_enum(os_category.LINUX, "Ubuntu-18.04", json.decode(io.read_file("./linux-default.json"))), + LINUX_DEFAULT = os_enum(os_category.LINUX, "Ubuntu-22.04", json.decode(io.read_file("./linux-default.json"))), MAC_10_15 = os_enum(os_category.MAC, "Mac-10.15"), MAC_12 = os_enum(os_category.MAC, "Mac-12"), MAC_13 = os_enum(os_category.MAC, "Mac-13"),
diff --git a/infra/config/lib/linux-default.json b/infra/config/lib/linux-default.json index 606ad03..d9b2b55 100644 --- a/infra/config/lib/linux-default.json +++ b/infra/config/lib/linux-default.json
@@ -1,708 +1,15 @@ { - "ci": { - "3pp-linux-amd64-packager": "Ubuntu-22.04", - "ASAN Debug": "Ubuntu-22.04", - "ASAN Release": "Ubuntu-22.04", - "ASAN Release Media": "Ubuntu-22.04", - "ASan Debug (32-bit x86 with V8-ARM)": "Ubuntu-22.04", - "ASan Release (32-bit x86 with V8-ARM)": "Ubuntu-22.04", - "ASan Release Media (32-bit x86 with V8-ARM)": "Ubuntu-22.04", - "Afl Upload Linux ASan": "Ubuntu-22.04", - "Android ASAN (dbg)": "Ubuntu-22.04", - "Android ASAN (dbg) (reclient)": "Ubuntu-22.04", - "Android FYI Release (NVIDIA Shield TV)": "Ubuntu-22.04", - "Android FYI Release (Nexus 5X)": "Ubuntu-22.04", - "Android FYI Release (Pixel 2)": "Ubuntu-22.04", - "Android FYI Release (Pixel 4)": "Ubuntu-22.04", - "Android FYI Release (Pixel 6)": "Ubuntu-22.04", - "Android FYI Release (Samsung A13)": "Ubuntu-22.04", - "Android FYI Release (Samsung A23)": "Ubuntu-22.04", - "Android Release (Nexus 5X)": "Ubuntu-22.04", - "Android WebView N (dbg)": "Ubuntu-22.04", - "Android WebView O (dbg)": "Ubuntu-22.04", - "Android WebView P (dbg)": "Ubuntu-22.04", - "Android arm Builder (dbg)": "Ubuntu-22.04", - "Android arm64 Builder (dbg)": "Ubuntu-22.04", - "Android arm64 Builder All Targets (dbg)": "Ubuntu-22.04", - "Android x64 Builder (dbg)": "Ubuntu-22.04", - "Android x64 Builder All Targets (dbg)": "Ubuntu-22.04", - "Android x86 Builder (dbg)": "Ubuntu-22.04", - "CFI Linux CF": "Ubuntu-22.04", - "CFI Linux ToT": "Ubuntu-22.04", - "Cast Android (dbg)": "Ubuntu-22.04", - "Cast Audio Linux": "Ubuntu-22.04", - "Cast Linux": "Ubuntu-22.04", - "Cast Linux ARM64": "Ubuntu-22.04", - "Cast Linux Debug": "Ubuntu-22.04", - "Centipede Upload Linux ASan": "Ubuntu-22.04", - "ChromeOS FYI Release (amd64-generic)": "Ubuntu-22.04", - "ChromeOS FYI Release (kevin)": "Ubuntu-22.04", - "ChromeOS FYI Release Skylab (kevin)": "Ubuntu-22.04", - "ChromiumOS ASAN Release": "Ubuntu-22.04", - "Comparison Android (reclient)": "Ubuntu-22.04", - "Comparison Android (reclient) (reproxy cache)": "Ubuntu-22.04", - "Comparison Android (reclient)(CQ)": "Ubuntu-22.04", - "Comparison Linux (reclient)": "Ubuntu-22.04", - "Comparison Linux (reclient)(CQ)": "Ubuntu-22.04", - "Comparison Simple Chrome (reclient)": "Ubuntu-22.04", - "Comparison Simple Chrome (reclient)(CQ)": "Ubuntu-22.04", - "Dawn Android arm DEPS Release (Pixel 4)": "Ubuntu-22.04", - "Dawn Android arm Release (Pixel 4)": "Ubuntu-22.04", - "Dawn Android arm64 DEPS Release (Pixel 6)": "Ubuntu-22.04", - "Dawn Android arm64 Release (Pixel 6)": "Ubuntu-22.04", - "Dawn Linux TSAN Release": "Ubuntu-22.04", - "Dawn Linux x64 Builder": "Ubuntu-22.04", - "Dawn Linux x64 DEPS Builder": "Ubuntu-22.04", - "Dawn Linux x64 DEPS Release (Intel UHD 630)": "Ubuntu-22.04", - "Dawn Linux x64 DEPS Release (NVIDIA)": "Ubuntu-22.04", - "Dawn Linux x64 Release (Intel UHD 630)": "Ubuntu-22.04", - "Dawn Linux x64 Release (NVIDIA)": "Ubuntu-22.04", - "Dawn Mac x64 DEPS Release (AMD)": "Ubuntu-22.04", - "Dawn Mac x64 DEPS Release (Intel)": "Ubuntu-22.04", - "Dawn Mac x64 Experimental Release (AMD)": "Ubuntu-22.04", - "Dawn Mac x64 Experimental Release (Intel)": "Ubuntu-22.04", - "Dawn Mac x64 Release (AMD)": "Ubuntu-22.04", - "Dawn Mac x64 Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x64 DEPS Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x64 DEPS Release (NVIDIA)": "Ubuntu-22.04", - "Dawn Win10 x64 Experimental Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x64 Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x64 Release (NVIDIA)": "Ubuntu-22.04", - "Dawn Win10 x86 DEPS Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x86 DEPS Release (NVIDIA)": "Ubuntu-22.04", - "Dawn Win10 x86 Experimental Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x86 Release (Intel)": "Ubuntu-22.04", - "Dawn Win10 x86 Release (NVIDIA)": "Ubuntu-22.04", - "Deterministic Android": "Ubuntu-22.04", - "Deterministic Android (dbg)": "Ubuntu-22.04", - "Deterministic Fuchsia (dbg)": "Ubuntu-22.04", - "Deterministic Linux": "Ubuntu-22.04", - "Deterministic Linux (dbg)": "Ubuntu-22.04", - "GPU FYI Android arm Builder": "Ubuntu-22.04", - "GPU FYI Android arm64 Builder": "Ubuntu-22.04", - "GPU FYI Lacros x64 Builder": "Ubuntu-22.04", - "GPU FYI Linux Builder": "Ubuntu-22.04", - "GPU FYI Linux Builder (dbg)": "Ubuntu-22.04", - "GPU Flake Finder": "Ubuntu-22.04", - "GPU Linux Builder": "Ubuntu-22.04", - "GPU Linux Builder (dbg)": "Ubuntu-22.04", - "Lacros FYI x64 Release (AMD)": "Ubuntu-22.04", - "Lacros FYI x64 Release (Intel)": "Ubuntu-22.04", - "Leak Detection Linux": "Ubuntu-22.04", - "Libfuzzer Upload Chrome OS ASan": "Ubuntu-22.04", - "Libfuzzer Upload Linux ASan": "Ubuntu-22.04", - "Libfuzzer Upload Linux ASan Debug": "Ubuntu-22.04", - "Libfuzzer Upload Linux UBSan": "Ubuntu-22.04", - "Libfuzzer Upload Linux V8-ARM64 ASan": "Ubuntu-22.04", - "Libfuzzer Upload Linux V8-ARM64 ASan Debug": "Ubuntu-22.04", - "Libfuzzer Upload Linux32 ASan": "Ubuntu-22.04", - "Libfuzzer Upload Linux32 V8-ARM ASan": "Ubuntu-22.04", - "Libfuzzer Upload Linux32 V8-ARM ASan Debug": "Ubuntu-22.04", - "Linux ASan LSan Builder": "Ubuntu-22.04", - "Linux ASan LSan Tests (1)": "Ubuntu-22.04", - "Linux ASan Tests (sandboxed)": "Ubuntu-22.04", - "Linux Builder": "Ubuntu-22.04", - "Linux Builder (Wayland)": "Ubuntu-22.04", - "Linux Builder (dbg)": "Ubuntu-22.04", - "Linux Builder (j-500) (reclient)": "Ubuntu-22.04", - "Linux Builder (reclient compare)": "Ubuntu-22.04", - "Linux CFI": "Ubuntu-22.04", - "Linux Chromium OS ASan LSan Builder": "Ubuntu-22.04", - "Linux Chromium OS ASan LSan Tests (1)": "Ubuntu-22.04", - "Linux ChromiumOS Full": "Ubuntu-22.04", - "Linux Debug (NVIDIA)": "Ubuntu-22.04", - "Linux FYI Debug (NVIDIA)": "Ubuntu-22.04", - "Linux FYI Experimental Release (Intel UHD 630)": "Ubuntu-22.04", - "Linux FYI Experimental Release (NVIDIA)": "Ubuntu-22.04", - "Linux FYI GPU TSAN Release": "Ubuntu-22.04", - "Linux FYI Release (AMD RX 5500 XT)": "Ubuntu-22.04", - "Linux FYI Release (Intel UHD 630)": "Ubuntu-22.04", - "Linux FYI Release (NVIDIA)": "Ubuntu-22.04", - "Linux Release (NVIDIA)": "Ubuntu-22.04", - "Linux TSan Builder": "Ubuntu-22.04", - "Linux TSan Tests": "Ubuntu-22.04", - "Linux Tests": "Ubuntu-22.04", - "Linux Tests (Wayland)": "Ubuntu-22.04", - "Linux Tests (dbg)(1)": "Ubuntu-22.04", - "Linux Viz": "Ubuntu-22.04", - "Mac Debug (Intel)": "Ubuntu-22.04", - "Mac FYI ASAN (Intel)": "Ubuntu-22.04", - "Mac FYI Debug (Intel)": "Ubuntu-22.04", - "Mac FYI Experimental Release (Apple M1)": "Ubuntu-22.04", - "Mac FYI Experimental Release (Intel)": "Ubuntu-22.04", - "Mac FYI Experimental Retina Release (AMD)": "Ubuntu-22.04", - "Mac FYI Experimental Retina Release (NVIDIA)": "Ubuntu-22.04", - "Mac FYI Release (Apple M1)": "Ubuntu-22.04", - "Mac FYI Release (Intel)": "Ubuntu-22.04", - "Mac FYI Retina ASAN (AMD)": "Ubuntu-22.04", - "Mac FYI Retina Debug (AMD)": "Ubuntu-22.04", - "Mac FYI Retina Release (AMD)": "Ubuntu-22.04", - "Mac FYI Retina Release (Apple M2)": "Ubuntu-22.04", - "Mac FYI Retina Release (NVIDIA)": "Ubuntu-22.04", - "Mac Pro FYI Release (AMD)": "Ubuntu-22.04", - "Mac Release (Intel)": "Ubuntu-22.04", - "Mac Retina Debug (AMD)": "Ubuntu-22.04", - "Mac Retina Release (AMD)": "Ubuntu-22.04", - "Mac10.13 Tests": "Ubuntu-22.04", - "Mac10.14 Tests": "Ubuntu-22.04", - "Mac10.15 Tests": "Ubuntu-22.04", - "Mac11 Tests": "Ubuntu-22.04", - "Mac12 Tests": "Ubuntu-22.04", - "Mac13 Tests": "Ubuntu-22.04", - "Mac13 Tests (dbg)": "Ubuntu-22.04", - "Network Service Linux": "Ubuntu-22.04", - "Nougat Phone Tester": "Ubuntu-22.04", - "Oreo Phone Tester": "Ubuntu-22.04", - "Site Isolation Android": "Ubuntu-22.04", - "TSAN Debug": "Ubuntu-22.04", - "TSAN Release": "Ubuntu-22.04", - "ToTAndroid": "Ubuntu-22.04", - "ToTAndroid (dbg)": "Ubuntu-22.04", - "ToTAndroid x64": "Ubuntu-22.04", - "ToTAndroid x86": "Ubuntu-22.04", - "ToTAndroid64": "Ubuntu-22.04", - "ToTAndroidASan": "Ubuntu-22.04", - "ToTAndroidCoverage x86": "Ubuntu-22.04", - "ToTAndroidOfficial": "Ubuntu-22.04", - "ToTChromeOS": "Ubuntu-22.04", - "ToTChromeOS (dbg)": "Ubuntu-22.04", - "ToTFuchsia x64": "Ubuntu-22.04", - "ToTFuchsiaOfficial arm64": "Ubuntu-22.04", - "ToTLinux": "Ubuntu-22.04", - "ToTLinux (dbg)": "Ubuntu-22.04", - "ToTLinuxASan": "Ubuntu-22.04", - "ToTLinuxASanLibfuzzer": "Ubuntu-22.04", - "ToTLinuxCoverage": "Ubuntu-22.04", - "ToTLinuxPGO": "Ubuntu-22.04", - "ToTLinuxTSan": "Ubuntu-22.04", - "ToTLinuxUBSanVptr": "Ubuntu-22.04", - "UBSan Release": "Ubuntu-22.04", - "UBSan vptr Release": "Ubuntu-22.04", - "VR Linux": "Ubuntu-22.04", - "WebKit Linux ASAN": "Ubuntu-22.04", - "WebKit Linux Leak": "Ubuntu-22.04", - "Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)": "Ubuntu-22.04", - "Win10 FYI x64 DX12 Vulkan Release (NVIDIA)": "Ubuntu-22.04", - "Win10 FYI x64 Debug (NVIDIA)": "Ubuntu-22.04", - "Win10 FYI x64 Exp Release (NVIDIA)": "Ubuntu-22.04", - "Win10 FYI x64 Experimental Release (Intel)": "Ubuntu-22.04", - "Win10 FYI x64 Release (AMD RX 5500 XT)": "Ubuntu-22.04", - "Win10 FYI x64 Release (Intel)": "Ubuntu-22.04", - "Win10 FYI x64 Release (NVIDIA)": "Ubuntu-22.04", - "Win10 FYI x64 Release XR Perf (NVIDIA)": "Ubuntu-22.04", - "Win10 FYI x86 Release (NVIDIA)": "Ubuntu-22.04", - "Win10 x64 Debug (NVIDIA)": "Ubuntu-22.04", - "Win10 x64 Release (NVIDIA)": "Ubuntu-22.04", - "Win11 Tests x64": "Ubuntu-22.04", - "android-10-arm64-rel": "Ubuntu-22.04", - "android-11-x86-fyi-rel": "Ubuntu-22.04", - "android-11-x86-rel": "Ubuntu-22.04", - "android-12-x64-dbg-tests": "Ubuntu-22.04", - "android-12-x64-fyi-rel": "Ubuntu-22.04", - "android-12-x64-rel": "Ubuntu-22.04", - "android-12l-x64-dbg-tests": "Ubuntu-22.04", - "android-12l-x64-fyi-dbg": "Ubuntu-22.04", - "android-13-x64-fyi-rel": "Ubuntu-22.04", - "android-13-x64-rel": "Ubuntu-22.04", - "android-androidx-packager": "Ubuntu-22.04", - "android-angle-chromium-arm64-builder": "Ubuntu-22.04", - "android-angle-chromium-arm64-nexus5x": "Ubuntu-22.04", - "android-annotator-rel": "Ubuntu-22.04", - "android-archive-dbg": "Ubuntu-22.04", - "android-archive-rel": "Ubuntu-22.04", - "android-arm64-archive-rel": "Ubuntu-22.04", - "android-arm64-proguard-rel": "Ubuntu-22.04", - "android-asan": "Ubuntu-22.04", - "android-avd-packager": "Ubuntu-22.04", - "android-bfcache-rel": "Ubuntu-22.04", - "android-binary-size-generator": "Ubuntu-22.04", - "android-build-perf-developer": "Ubuntu-22.04", - "android-chrome-pie-x86-wpt-fyi-rel": "Ubuntu-22.04", - "android-code-coverage": "Ubuntu-22.04", - "android-code-coverage-native": "Ubuntu-22.04", - "android-cronet-arm-dbg": "Ubuntu-22.04", - "android-cronet-arm-rel": "Ubuntu-22.04", - "android-cronet-arm64-dbg": "Ubuntu-22.04", - "android-cronet-arm64-rel": "Ubuntu-22.04", - "android-cronet-asan-arm-rel": "Ubuntu-22.04", - "android-cronet-asan-x86-rel": "Ubuntu-22.04", - "android-cronet-x86-dbg": "Ubuntu-22.04", - "android-cronet-x86-dbg-10-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-11-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-lollipop-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-marshmallow-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-oreo-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-pie-tests": "Ubuntu-22.04", - "android-cronet-x86-rel": "Ubuntu-22.04", - "android-cronet-x86-rel-kitkat-tests": "Ubuntu-22.04", - "android-device-flasher": "Ubuntu-22.04", - "android-fieldtrial-rel": "Ubuntu-22.04", - "android-nougat-x86-rel": "Ubuntu-22.04", - "android-official": "Ubuntu-22.04", - "android-perfetto-rel": "Ubuntu-22.04", - "android-pie-arm64-dbg": "Ubuntu-22.04", - "android-pie-arm64-rel": "Ubuntu-22.04", - "android-pie-arm64-rel-dev": "Ubuntu-22.04", - "android-pie-x86-fyi-rel": "Ubuntu-22.04", - "android-pie-x86-rel": "Ubuntu-22.04", - "android-rust-arm32-rel": "Ubuntu-22.04", - "android-rust-arm64-dbg": "Ubuntu-22.04", - "android-rust-arm64-rel": "Ubuntu-22.04", - "android-sdk-packager": "Ubuntu-22.04", - "android-webview-10-x86-rel-tests": "Ubuntu-22.04", - "android-webview-12-x64-dbg-tests": "Ubuntu-22.04", - "android-webview-13-x64-dbg-tests": "Ubuntu-22.04", - "android-webview-pie-x86-wpt-fyi-rel": "Ubuntu-22.04", - "android-x86-code-coverage": "Ubuntu-22.04", - "android-x86-rel": "Ubuntu-22.04", - "build-perf-android": "Ubuntu-22.04", - "build-perf-android-siso": "Ubuntu-22.04", - "build-perf-linux": "Ubuntu-22.04", - "build-perf-linux-siso": "Ubuntu-22.04", - "chromeos-amd64-generic-asan-rel": "Ubuntu-22.04", - "chromeos-amd64-generic-cfi-thin-lto-rel": "Ubuntu-22.04", - "chromeos-amd64-generic-dbg": "Ubuntu-22.04", - "chromeos-amd64-generic-lacros-dbg": "Ubuntu-22.04", - "chromeos-amd64-generic-rel": "Ubuntu-22.04", - "chromeos-amd64-generic-rel (reclient compare)": "Ubuntu-22.04", - "chromeos-amd64-generic-rel (reclient)": "Ubuntu-22.04", - "chromeos-arm-generic-dbg": "Ubuntu-22.04", - "chromeos-arm-generic-rel": "Ubuntu-22.04", - "chromeos-arm64-generic-rel": "Ubuntu-22.04", - "chromeos-jacuzzi-rel": "Ubuntu-22.04", - "chromeos-js-code-coverage": "Ubuntu-22.04", - "chromeos-octopus-rel": "Ubuntu-22.04", - "fuchsia-angle-builder": "Ubuntu-22.04", - "fuchsia-arm64-cast-receiver-rel": "Ubuntu-22.04", - "fuchsia-arm64-rel": "Ubuntu-22.04", - "fuchsia-code-coverage": "Ubuntu-22.04", - "fuchsia-fyi-arm64-dbg": "Ubuntu-22.04", - "fuchsia-fyi-x64-asan": "Ubuntu-22.04", - "fuchsia-fyi-x64-dbg": "Ubuntu-22.04", - "fuchsia-fyi-x64-dbg-persistent-emulator": "Ubuntu-22.04", - "fuchsia-official": "Ubuntu-22.04", - "fuchsia-x64-accessibility-rel": "Ubuntu-22.04", - "fuchsia-x64-cast-receiver-rel": "Ubuntu-22.04", - "fuchsia-x64-dbg": "Ubuntu-22.04", - "fuchsia-x64-rel": "Ubuntu-22.04", - "ios-angle-intel": "Ubuntu-22.04", - "lacros-amd64-generic-binary-size-rel": "Ubuntu-22.04", - "lacros-amd64-generic-rel": "Ubuntu-22.04", - "lacros-amd64-generic-rel (reclient)": "Ubuntu-22.04", - "lacros-amd64-generic-rel-fyi": "Ubuntu-22.04", - "lacros-amd64-generic-rel-skylab": "Ubuntu-22.04", - "lacros-amd64-generic-rel-skylab-fyi": "Ubuntu-22.04", - "lacros-arm-archive-rel": "Ubuntu-22.04", - "lacros-arm-generic-rel": "Ubuntu-22.04", - "lacros-arm-generic-rel-skylab": "Ubuntu-22.04", - "lacros-arm-generic-rel-skylab-fyi": "Ubuntu-22.04", - "lacros-arm64-archive-rel": "Ubuntu-22.04", - "lacros-arm64-generic-rel": "Ubuntu-22.04", - "lacros-arm64-generic-rel-skylab": "Ubuntu-22.04", - "lacros-arm64-generic-rel-skylab-fyi": "Ubuntu-22.04", - "lacros64-archive-rel": "Ubuntu-22.04", - "linux-angle-chromium-builder": "Ubuntu-22.04", - "linux-angle-chromium-intel": "Ubuntu-22.04", - "linux-angle-chromium-nvidia": "Ubuntu-22.04", - "linux-annotator-rel": "Ubuntu-22.04", - "linux-archive-dbg": "Ubuntu-22.04", - "linux-archive-rel": "Ubuntu-22.04", - "linux-arm64-rel-cft": "Ubuntu-22.04", - "linux-ash-chromium-generator-rel": "Ubuntu-22.04", - "linux-bfcache-rel": "Ubuntu-22.04", - "linux-blink-animation-use-time-delta": "Ubuntu-22.04", - "linux-blink-heap-verification": "Ubuntu-22.04", - "linux-blink-web-tests-force-accessibility-rel": "Ubuntu-22.04", - "linux-blink-wpt-reset-rel": "Ubuntu-22.04", - "linux-build-perf-developer": "Ubuntu-22.04", - "linux-cfm-rel": "Ubuntu-22.04", - "linux-chromeos-annotator-rel": "Ubuntu-22.04", - "linux-chromeos-build-perf": "Ubuntu-22.04", - "linux-chromeos-build-perf-siso": "Ubuntu-22.04", - "linux-chromeos-code-coverage": "Ubuntu-22.04", - "linux-chromeos-dbg": "Ubuntu-22.04", - "linux-chromeos-rel": "Ubuntu-22.04", - "linux-code-coverage": "Ubuntu-22.04", - "linux-cr23-rel": "Ubuntu-22.04", - "linux-exp-asan-lsan-fyi-rel": "Ubuntu-22.04", - "linux-exp-tsan-fyi-rel": "Ubuntu-22.04", - "linux-extended-tracing-rel": "Ubuntu-22.04", - "linux-fieldtrial-rel": "Ubuntu-22.04", - "linux-fuzz-coverage": "Ubuntu-22.04", - "linux-headless-shell-rel": "Ubuntu-22.04", - "linux-js-code-coverage": "Ubuntu-22.04", - "linux-lacros-archive-rel": "Ubuntu-22.04", - "linux-lacros-asan-lsan-rel": "Ubuntu-22.04", - "linux-lacros-builder-fyi-rel": "Ubuntu-22.04", - "linux-lacros-builder-rel": "Ubuntu-22.04", - "linux-lacros-builder-rel (reclient)": "Ubuntu-22.04", - "linux-lacros-code-coverage": "Ubuntu-22.04", - "linux-lacros-dbg": "Ubuntu-22.04", - "linux-lacros-dbg-fyi": "Ubuntu-22.04", - "linux-lacros-dbg-tests-fyi": "Ubuntu-22.04", - "linux-lacros-tester-fyi-rel": "Ubuntu-22.04", - "linux-lacros-tester-rel": "Ubuntu-22.04", - "linux-lacros-version-skew-fyi": "Ubuntu-22.04", - "linux-local-ssd-rel-dev": "Ubuntu-22.04", - "linux-network-sandbox-rel": "Ubuntu-22.04", - "linux-official": "Ubuntu-22.04", - "linux-perfetto-rel": "Ubuntu-22.04", - "linux-presubmit": "Ubuntu-22.04", - "linux-rel-cft": "Ubuntu-22.04", - "linux-rel-jammy-dev": "Ubuntu-22.04", - "linux-rel-no-external-ip": "Ubuntu-22.04", - "linux-remote-ssd-rel-dev": "Ubuntu-22.04", - "linux-rust-x64-dbg": "Ubuntu-22.04", - "linux-rust-x64-rel": "Ubuntu-22.04", - "linux-swangle-chromium-x64": "Ubuntu-22.04", - "linux-swangle-chromium-x64-exp": "Ubuntu-22.04", - "linux-swangle-tot-swiftshader-x64": "Ubuntu-22.04", - "linux-swangle-x64": "Ubuntu-22.04", - "linux-swangle-x64-exp": "Ubuntu-22.04", - "linux-ubsan-fyi-rel": "Ubuntu-22.04", - "linux-ubsan-vptr": "Ubuntu-22.04", - "linux-updater-builder-dbg": "Ubuntu-22.04", - "linux-updater-builder-rel": "Ubuntu-22.04", - "linux-updater-tester-dbg": "Ubuntu-22.04", - "linux-updater-tester-rel": "Ubuntu-22.04", - "linux-upload-perfetto": "Ubuntu-22.04", - "linux-win_cross-rel": "Ubuntu-22.04", - "linux-wpt-content-shell-asan-fyi-rel": "Ubuntu-22.04", - "linux-wpt-content-shell-fyi-rel": "Ubuntu-22.04", - "linux-wpt-content-shell-leak-detection": "Ubuntu-22.04", - "linux-wpt-fyi-rel": "Ubuntu-22.04", - "linux-wpt-identity-fyi-rel": "Ubuntu-22.04", - "linux-wpt-input-fyi-rel": "Ubuntu-22.04", - "mac-angle-chromium-amd": "Ubuntu-22.04", - "mac-angle-chromium-intel": "Ubuntu-22.04", - "mac-fieldtrial-tester": "Ubuntu-22.04", - "mac10.13-updater-tester-dbg": "Ubuntu-22.04", - "mac10.13-updater-tester-rel": "Ubuntu-22.04", - "mac10.14-updater-tester-dbg": "Ubuntu-22.04", - "mac10.14-updater-tester-rel": "Ubuntu-22.04", - "mac10.15-updater-tester-dbg": "Ubuntu-22.04", - "mac10.15-updater-tester-rel": "Ubuntu-22.04", - "mac11-arm64-rel-tests": "Ubuntu-22.04", - "mac11-arm64-updater-tester-dbg": "Ubuntu-22.04", - "mac11-arm64-updater-tester-rel": "Ubuntu-22.04", - "mac11-x64-updater-tester-dbg": "Ubuntu-22.04", - "mac11-x64-updater-tester-rel": "Ubuntu-22.04", - "mac12-arm64-rel-tests": "Ubuntu-22.04", - "mac12-arm64-updater-tester-rel": "Ubuntu-22.04", - "mac12-x64-updater-tester-asan-dbg": "Ubuntu-22.04", - "mac13-arm64-rel-tests": "Ubuntu-22.04", - "mac13-arm64-updater-tester-dbg": "Ubuntu-22.04", - "mac13-x64-updater-tester-rel": "Ubuntu-22.04", - "metadata-exporter": "Ubuntu-22.04", - "rts-model-packager": "Ubuntu-22.04", - "win-annotator-rel": "Ubuntu-22.04", - "win-cr23-rel": "Ubuntu-22.04", - "win-network-sandbox-tester": "Ubuntu-22.04", - "win-perfetto-rel": "Ubuntu-22.04", - "win-upload-perfetto": "Ubuntu-22.04", - "win10-32-on-64-updater-tester-dbg": "Ubuntu-22.04", - "win10-32-on-64-updater-tester-rel": "Ubuntu-22.04", - "win10-angle-chromium-x64-intel": "Ubuntu-22.04", - "win10-angle-chromium-x64-nvidia": "Ubuntu-22.04", - "win10-updater-tester-dbg": "Ubuntu-22.04", - "win10-updater-tester-dbg-uac": "Ubuntu-22.04", - "win10-updater-tester-rel": "Ubuntu-22.04", - "win10-updater-tester-rel-uac": "Ubuntu-22.04", - "win10-wpt-content-shell-fyi-rel": "Ubuntu-22.04", - "win11-updater-tester-dbg-uac": "Ubuntu-22.04", - "win11-updater-tester-rel": "Ubuntu-22.04", - "win11-wpt-content-shell-fyi-rel": "Ubuntu-22.04" - }, - "codesearch": { - "gen-android-try": "Ubuntu-22.04", - "gen-chromiumos-try": "Ubuntu-22.04", - "gen-fuchsia-try": "Ubuntu-22.04", - "gen-lacros-try": "Ubuntu-22.04", - "gen-linux-try": "Ubuntu-22.04", - "gen-webview-try": "Ubuntu-22.04" - }, - "flakiness": { - "flakiness-data-packager": "Ubuntu-22.04" - }, - "flaky-reproducer": { - "runner": "Ubuntu-22.04" - }, "goma": { "Chromium Android ARM 32-bit Goma RBE Staging": "Ubuntu-18.04|Ubuntu-22.04", "Chromium Linux Goma RBE Staging": "Ubuntu-18.04|Ubuntu-22.04", "Chromium Linux Goma RBE Staging (dbg)": "Ubuntu-18.04|Ubuntu-22.04", - "Linux Builder Goma RBE Canary": "Ubuntu-22.04", - "android-archive-dbg-goma-rbe-ats-canary": "Ubuntu-22.04", - "android-archive-dbg-goma-rbe-canary": "Ubuntu-22.04", - "chromeos-amd64-generic-rel-goma-rbe-canary": "Ubuntu-22.04", - "chromeos-amd64-generic-rel-goma-rbe-staging": "Ubuntu-18.04|Ubuntu-22.04", - "linux-archive-rel-goma-rbe-ats-canary": "Ubuntu-22.04", - "linux-archive-rel-goma-rbe-canary": "Ubuntu-22.04" - }, - "infra": { - "autosharder": "Ubuntu-22.04" - }, - "reclient": { - "Comparison Linux (reclient vs reclient remote links)": "Ubuntu-22.04", - "Linux Builder (canonical wd) (reclient compare)": "Ubuntu-22.04", - "Linux Builder reclient staging": "Ubuntu-22.04", - "Linux Builder reclient staging untrusted": "Ubuntu-22.04", - "Linux Builder reclient test": "Ubuntu-22.04", - "Linux Builder reclient test (unified uploads)": "Ubuntu-22.04", - "Linux Builder reclient test (unified uploads) untrusted": "Ubuntu-22.04", - "Linux Builder reclient test untrusted": "Ubuntu-22.04", - "Simple Chrome Builder reclient staging": "Ubuntu-22.04", - "Simple Chrome Builder reclient staging untrusted": "Ubuntu-22.04", - "Simple Chrome Builder reclient test": "Ubuntu-22.04", - "Simple Chrome Builder reclient test untrusted": "Ubuntu-22.04" - }, - "reviver": { - "android-coverage-launcher": "Ubuntu-22.04", - "android-device-launcher": "Ubuntu-22.04", - "android-launcher": "Ubuntu-22.04", - "android-x64-launcher": "Ubuntu-22.04", - "coverage-runner": "Ubuntu-22.04", - "fuchsia-coordinator": "Ubuntu-22.04", - "lacros-coordinator": "Ubuntu-22.04", - "linux-launcher": "Ubuntu-22.04", - "mac-launcher": "Ubuntu-22.04", - "runner": "Ubuntu-22.04", - "win-launcher": "Ubuntu-22.04" + "chromeos-amd64-generic-rel-goma-rbe-staging": "Ubuntu-18.04|Ubuntu-22.04" }, "try": { - "3pp-linux-amd64-packager": "Ubuntu-22.04", - "android-10-arm64-rel": "Ubuntu-22.04", - "android-11-x86-rel": "Ubuntu-22.04", - "android-12-x64-dbg": "Ubuntu-22.04", - "android-12-x64-rel": "Ubuntu-22.04", - "android-12-x64-rel-compilator": "Ubuntu-22.04", - "android-12l-x64-dbg": "Ubuntu-22.04", - "android-13-x64-rel": "Ubuntu-22.04", - "android-angle-chromium-try": "Ubuntu-22.04", - "android-arm64-all-targets-dbg": "Ubuntu-22.04", - "android-arm64-rel": "Ubuntu-22.04", - "android-arm64-rel-compilator": "Ubuntu-22.04", - "android-bfcache-rel": "Ubuntu-22.04", - "android-binary-size": "Ubuntu-22.04", - "android-chrome-pie-x86-wpt-fyi-rel": "Ubuntu-22.04", - "android-clang-tidy-rel": "Ubuntu-22.04", - "android-code-coverage": "Ubuntu-22.04", - "android-code-coverage-native": "Ubuntu-22.04", - "android-cronet-arm-dbg": "Ubuntu-22.04", - "android-cronet-arm64-dbg": "Ubuntu-22.04", - "android-cronet-arm64-rel": "Ubuntu-22.04", - "android-cronet-asan-arm-rel": "Ubuntu-22.04", - "android-cronet-x86-dbg": "Ubuntu-22.04", - "android-cronet-x86-dbg-10-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-11-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-oreo-tests": "Ubuntu-22.04", - "android-cronet-x86-dbg-pie-tests": "Ubuntu-22.04", - "android-cronet-x86-rel": "Ubuntu-22.04", - "android-cronet-x86-rel-kitkat-tests": "Ubuntu-22.04", - "android-dawn-arm-rel": "Ubuntu-22.04", - "android-dawn-arm64-rel": "Ubuntu-22.04", - "android-deterministic-dbg": "Ubuntu-22.04", - "android-deterministic-rel": "Ubuntu-22.04", - "android-fieldtrial-rel": "Ubuntu-22.04", - "android-inverse-fieldtrials-pie-x86-fyi-rel": "Ubuntu-22.04", - "android-nougat-x86-rel": "Ubuntu-22.04", - "android-nougat-x86-rel-compilator": "Ubuntu-22.04", "android-official": "Ubuntu-18.04|Ubuntu-22.04", - "android-oreo-arm64-dbg": "Ubuntu-22.04", - "android-perfetto-rel": "Ubuntu-22.04", - "android-pie-arm64-dbg": "Ubuntu-22.04", - "android-pie-arm64-wpt-rel-non-cq": "Ubuntu-22.04", - "android-pie-x86-rel": "Ubuntu-22.04", - "android-rust-arm32-rel": "Ubuntu-22.04", - "android-rust-arm64-dbg": "Ubuntu-22.04", - "android-rust-arm64-rel": "Ubuntu-22.04", - "android-webview-10-x86-rel-tests": "Ubuntu-22.04", - "android-webview-12-x64-dbg": "Ubuntu-22.04", - "android-webview-13-x64-dbg": "Ubuntu-22.04", - "android-webview-nougat-arm64-dbg": "Ubuntu-22.04", - "android-webview-oreo-arm64-dbg": "Ubuntu-22.04", - "android-webview-pie-arm64-dbg": "Ubuntu-22.04", - "android-webview-pie-x86-wpt-fyi-rel": "Ubuntu-22.04", - "android-x64-cast": "Ubuntu-22.04", - "android_archive_rel_ng": "Ubuntu-22.04", - "android_arm64_dbg_recipe": "Ubuntu-22.04", - "android_blink_rel": "Ubuntu-22.04", - "android_compile_dbg": "Ubuntu-22.04", - "android_compile_x64_dbg": "Ubuntu-22.04", - "android_compile_x86_dbg": "Ubuntu-22.04", - "android_cronet": "Ubuntu-22.04", - "android_optional_gpu_tests_rel": "Ubuntu-22.04", - "android_unswarmed_pixel_aosp": "Ubuntu-22.04", - "branch-config-verifier": "Ubuntu-22.04", - "builder-config-verifier": "Ubuntu-22.04", - "chromeos-amd64-generic-cfi-thin-lto-rel": "Ubuntu-22.04", - "chromeos-amd64-generic-dbg": "Ubuntu-22.04", - "chromeos-amd64-generic-lacros-dbg": "Ubuntu-22.04", - "chromeos-amd64-generic-rel": "Ubuntu-22.04", - "chromeos-amd64-generic-rel-compilator": "Ubuntu-22.04", - "chromeos-amd64-generic-rel-rts": "Ubuntu-22.04", - "chromeos-arm-generic-dbg": "Ubuntu-22.04", - "chromeos-arm-generic-rel": "Ubuntu-22.04", - "chromeos-arm64-generic-rel": "Ubuntu-22.04", - "chromeos-jacuzzi-rel": "Ubuntu-22.04", - "chromeos-js-code-coverage": "Ubuntu-22.04", - "chromeos-js-coverage-rel": "Ubuntu-22.04", - "chromeos-octopus-rel": "Ubuntu-22.04", - "chromium_presubmit": "Ubuntu-22.04", - "dawn-android-arm-deps-rel": "Ubuntu-22.04", - "dawn-android-arm64-deps-rel": "Ubuntu-22.04", - "dawn-linux-x64-deps-rel": "Ubuntu-22.04", - "dawn-try-linux-tsan-rel": "Ubuntu-22.04", - "fuchsia-angle-try": "Ubuntu-22.04", - "fuchsia-arm64-cast-receiver-rel": "Ubuntu-22.04", - "fuchsia-arm64-rel": "Ubuntu-22.04", - "fuchsia-binary-size": "Ubuntu-22.04", - "fuchsia-clang-tidy-rel": "Ubuntu-22.04", - "fuchsia-code-coverage": "Ubuntu-22.04", - "fuchsia-compile-x64-dbg": "Ubuntu-22.04", - "fuchsia-deterministic-dbg": "Ubuntu-22.04", - "fuchsia-fyi-arm64-dbg": "Ubuntu-22.04", - "fuchsia-fyi-x64-dbg": "Ubuntu-22.04", "fuchsia-official": "Ubuntu-18.04|Ubuntu-22.04", - "fuchsia-x64-accessibility-rel": "Ubuntu-22.04", - "fuchsia-x64-cast-receiver-rel": "Ubuntu-22.04", - "fuchsia-x64-cast-receiver-rel-compilator": "Ubuntu-22.04", - "fuchsia-x64-rel": "Ubuntu-22.04", - "gpu-fyi-cq-android-arm": "Ubuntu-22.04", - "gpu-fyi-cq-android-arm64": "Ubuntu-22.04", - "gpu-fyi-cq-linux": "Ubuntu-22.04", - "gpu-fyi-try-android-m-nexus-5x-64": "Ubuntu-22.04", - "gpu-fyi-try-android-nvidia-shield-tv": "Ubuntu-22.04", - "gpu-fyi-try-android-p-pixel-2-32": "Ubuntu-22.04", - "gpu-fyi-try-android-pixel-6-64": "Ubuntu-22.04", - "gpu-fyi-try-android-r-pixel-4-32": "Ubuntu-22.04", - "gpu-fyi-try-chromeos-amd64-generic": "Ubuntu-22.04", - "gpu-fyi-try-chromeos-kevin": "Ubuntu-22.04", - "gpu-fyi-try-chromeos-skylab-kevin": "Ubuntu-22.04", - "gpu-fyi-try-lacros-amd-rel": "Ubuntu-22.04", - "gpu-fyi-try-lacros-intel-rel": "Ubuntu-22.04", - "gpu-fyi-try-linux-amd-rel": "Ubuntu-22.04", - "gpu-fyi-try-linux-intel-exp": "Ubuntu-22.04", - "gpu-fyi-try-linux-intel-rel": "Ubuntu-22.04", - "gpu-fyi-try-linux-nvidia-dbg": "Ubuntu-22.04", - "gpu-fyi-try-linux-nvidia-exp": "Ubuntu-22.04", - "gpu-fyi-try-linux-nvidia-rel": "Ubuntu-22.04", - "gpu-fyi-try-linux-nvidia-tsn": "Ubuntu-22.04", - "gpu-try-android-m-nexus-5x-64": "Ubuntu-22.04", - "gpu-try-linux-nvidia-dbg": "Ubuntu-22.04", - "gpu-try-linux-nvidia-rel": "Ubuntu-22.04", - "ios-simulator": "Ubuntu-22.04", - "lacros-amd64-generic-rel": "Ubuntu-22.04", - "lacros-amd64-generic-rel-skylab": "Ubuntu-22.04", - "lacros-arm-generic-rel": "Ubuntu-22.04", - "lacros-arm64-generic-rel": "Ubuntu-22.04", - "layout_test_leak_detection": "Ubuntu-22.04", - "leak_detection_linux": "Ubuntu-22.04", - "lacros-amd64-generic-rel-skylab-fyi": "Ubuntu-22.04", - "linux-1mbu-compile-fyi-rel": "Ubuntu-22.04", - "linux-afl-asan-rel": "Ubuntu-22.04", - "linux-angle-chromium-try": "Ubuntu-22.04", - "linux-annotator-rel": "Ubuntu-22.04", - "linux-arm64-castos": "Ubuntu-22.04", - "linux-bfcache-rel": "Ubuntu-22.04", - "linux-blink-heap-verification-try": "Ubuntu-22.04", - "linux-blink-rel": "Ubuntu-22.04", - "linux-blink-web-tests-force-accessibility-rel": "Ubuntu-22.04", - "linux-centipede-asan-rel": "Ubuntu-22.04", - "linux-cfm-rel": "Ubuntu-22.04", - "linux-chromeos-annotator-rel": "Ubuntu-22.04", - "linux-chromeos-clang-tidy-rel": "Ubuntu-22.04", - "linux-chromeos-code-coverage": "Ubuntu-22.04", - "linux-chromeos-compile-dbg": "Ubuntu-22.04", - "linux-chromeos-dbg": "Ubuntu-22.04", - "linux-chromeos-inverse-fieldtrials-fyi-rel": "Ubuntu-22.04", - "linux-chromeos-rel": "Ubuntu-22.04", - "linux-chromeos-rel-compilator": "Ubuntu-22.04", - "linux-chromeos-rel-rts": "Ubuntu-22.04", - "linux-clang-tidy-rel": "Ubuntu-22.04", - "linux-code-coverage": "Ubuntu-22.04", - "linux-cr23-rel": "Ubuntu-22.04", - "linux-dawn-rel": "Ubuntu-22.04", - "linux-dcheck-off-rel": "Ubuntu-22.04", - "linux-exp-asan-lsan-fyi-rel": "Ubuntu-22.04", - "linux-exp-msan-fyi-rel": "Ubuntu-22.04", - "linux-exp-tsan-fyi-rel": "Ubuntu-22.04", - "linux-extended-tracing-rel": "Ubuntu-22.04", - "linux-fieldtrial-rel": "Ubuntu-22.04", - "linux-gcc-rel": "Ubuntu-22.04", - "linux-headless-shell-rel": "Ubuntu-22.04", - "linux-inverse-fieldtrials-fyi-rel": "Ubuntu-22.04", - "linux-js-code-coverage": "Ubuntu-22.04", - "linux-js-coverage-rel": "Ubuntu-22.04", - "linux-lacros-asan-lsan-rel": "Ubuntu-22.04", - "linux-lacros-clang-tidy-rel": "Ubuntu-22.04", - "linux-lacros-code-coverage": "Ubuntu-22.04", - "linux-lacros-dbg": "Ubuntu-22.04", - "linux-lacros-fyi-rel": "Ubuntu-22.04", - "linux-lacros-rel": "Ubuntu-22.04", - "linux-lacros-rel-compilator": "Ubuntu-22.04", - "linux-lacros-rel-rts": "Ubuntu-22.04", - "linux-lacros-version-skew-fyi": "Ubuntu-22.04", - "linux-layout-tests-edit-ng": "Ubuntu-22.04", - "linux-libfuzzer-asan-rel": "Ubuntu-22.04", - "linux-mbi-mode-per-render-process-host-rel": "Ubuntu-22.04", - "linux-mbi-mode-per-site-instance-rel": "Ubuntu-22.04", "linux-official": "Ubuntu-18.04|Ubuntu-22.04", - "linux-perfetto-rel": "Ubuntu-22.04", - "linux-rel": "Ubuntu-22.04", - "linux-rel-cft": "Ubuntu-22.04", - "linux-rel-compilator": "Ubuntu-22.04", - "linux-rel-ml": "Ubuntu-22.04", - "linux-rust-x64-dbg": "Ubuntu-22.04", - "linux-rust-x64-rel": "Ubuntu-22.04", - "linux-swangle-chromium-try-x64": "Ubuntu-22.04", - "linux-swangle-chromium-try-x64-exp": "Ubuntu-22.04", - "linux-swangle-try-tot-swiftshader-x64": "Ubuntu-22.04", - "linux-swangle-try-x64": "Ubuntu-22.04", - "linux-swangle-try-x64-exp": "Ubuntu-22.04", - "linux-ubsan-fyi-rel": "Ubuntu-22.04", - "linux-updater-try-builder-dbg": "Ubuntu-22.04", - "linux-updater-try-builder-rel": "Ubuntu-22.04", - "linux-viz-rel": "Ubuntu-22.04", - "linux-wayland-rel": "Ubuntu-22.04", - "linux-wayland-rel-compilator": "Ubuntu-22.04", - "linux-webkit-msan-rel": "Ubuntu-22.04", - "linux-wpt-content-shell-fyi-rel": "Ubuntu-22.04", - "linux-wpt-content-shell-leak-detection": "Ubuntu-22.04", - "linux-wpt-fyi-rel": "Ubuntu-22.04", - "linux-wpt-identity-fyi-rel": "Ubuntu-22.04", - "linux-wpt-input-fyi-rel": "Ubuntu-22.04", - "linux-x64-castos": "Ubuntu-22.04", - "linux-x64-castos-audio": "Ubuntu-22.04", - "linux-x64-castos-dbg": "Ubuntu-22.04", - "linux_chromium_archive_rel_ng": "Ubuntu-22.04", - "linux_chromium_asan_rel_ng": "Ubuntu-22.04", - "linux_chromium_asan_rel_ng-compilator": "Ubuntu-22.04", - "linux_chromium_cfi_rel_ng": "Ubuntu-18.04|Ubuntu-22.04", - "linux_chromium_chromeos_asan_rel_ng": "Ubuntu-22.04", - "linux_chromium_clobber_deterministic": "Ubuntu-22.04", - "linux_chromium_clobber_rel_ng": "Ubuntu-22.04", - "linux_chromium_compile_dbg_ng": "Ubuntu-22.04", - "linux_chromium_compile_rel_ng": "Ubuntu-22.04", - "linux_chromium_dbg_ng": "Ubuntu-22.04", - "linux_chromium_msan_rel_ng": "Ubuntu-22.04", - "linux_chromium_tsan_rel_ng": "Ubuntu-22.04", - "linux_chromium_tsan_rel_ng-compilator": "Ubuntu-22.04", - "linux_chromium_ubsan_rel_ng": "Ubuntu-22.04", - "linux_optional_gpu_tests_rel": "Ubuntu-22.04", - "linux_vr": "Ubuntu-22.04", - "mac-rel": "Ubuntu-22.04", - "mac13-arm64-rel": "Ubuntu-22.04", - "network_service_linux": "Ubuntu-22.04", - "reclient-config-deployment-verifier": "Ubuntu-22.04", - "requires-testing-checker": "Ubuntu-22.04", - "targets-config-verifier": "Ubuntu-22.04", - "tricium-clang-tidy": "Ubuntu-22.04", - "tricium-metrics-analysis": "Ubuntu-22.04", - "tricium-oilpan-analysis": "Ubuntu-22.04", - "tricium-simple": "Ubuntu-22.04", - "try-nougat-phone-tester": "Ubuntu-22.04", - "win-rel": "Ubuntu-22.04" + "linux_chromium_cfi_rel_ng": "Ubuntu-18.04|Ubuntu-22.04" }, "webrtc": { "WebRTC Chromium Android Builder": "Ubuntu-18.04|Ubuntu-22.04",
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 3182b844..f2727e3 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1494,9 +1494,6 @@ category = "buildperf", short_name = "lnx", ), - # TODO(b/273407069): enable reproxy mode by default. - siso_configs = ["remote_all", "rewrapper_to_reproxy"], - siso_experiments = ["use-reproxy"], ) build_perf_builder( @@ -1528,6 +1525,8 @@ category = "buildperf", short_name = "lnxss", ), + # TODO(b/273407069): enable reproxy mode by default. + siso_configs = ["remote_all", "rewrapper_to_reproxy"], ) build_perf_builder(
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.mm b/ios/chrome/app/application_delegate/metrics_mediator.mm index 95727b77..ef762f89 100644 --- a/ios/chrome/app/application_delegate/metrics_mediator.mm +++ b/ios/chrome/app/application_delegate/metrics_mediator.mm
@@ -23,6 +23,7 @@ #import "components/previous_session_info/previous_session_info.h" #import "components/signin/public/identity_manager/tribool.h" #import "components/ukm/ios/ukm_reporting_ios_util.h" +#import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/app/application_delegate/metric_kit_subscriber.h" #import "ios/chrome/app/application_delegate/startup_information.h" #import "ios/chrome/app/startup/ios_enable_sandbox_dump_buildflags.h" @@ -60,6 +61,8 @@ #error "This file requires ARC support." #endif +@class AppState; + namespace { // The key to a NSUserDefaults entry logging the number of times classes are // loaded before a scene is attached. @@ -572,6 +575,12 @@ [[NSUserDefaults standardUserDefaults] removeObjectForKey:kAppEnteredBackgroundDateKey]; } + + // Log browser cold start for default browser promo experiment stats. + if (scenes.count != 0 && scenes[0].appState.mainBrowserState) { + LogBrowserLaunched(startupInformation.isColdStart); + } + if (!startupInformation.isColdStart) { return; }
diff --git a/ios/chrome/app/startup/chrome_app_startup_parameters.mm b/ios/chrome/app/startup/chrome_app_startup_parameters.mm index 4693ac4..5e1f0ba 100644 --- a/ios/chrome/app/startup/chrome_app_startup_parameters.mm +++ b/ios/chrome/app/startup/chrome_app_startup_parameters.mm
@@ -207,6 +207,9 @@ if (!gurl.is_valid() || gurl.scheme().length() == 0) return nil; + // Log browser started indirectly for default browser promo experiment stats. + LogBrowserIndirectlylaunched(); + if ([completeURL.scheme isEqualToString:kWidgetKitSchemeChrome]) { UMA_HISTOGRAM_ENUMERATION(kUMAMobileSessionStartActionHistogram, START_ACTION_WIDGET_KIT_COMMAND, @@ -599,6 +602,10 @@ // Search, search clipboard content) is activity that should indicate a user // that would be interested in setting Chrome as the default browser. LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeGeneral); + + // Log browser started indirectly for default browser promo experiment + // stats. + LogBrowserIndirectlylaunched(); } if ([secureSourceApp
diff --git a/ios/chrome/browser/autofill/bottom_sheet/autofill_bottom_sheet_tab_helper.mm b/ios/chrome/browser/autofill/bottom_sheet/autofill_bottom_sheet_tab_helper.mm index 7a443c8..231429e 100644 --- a/ios/chrome/browser/autofill/bottom_sheet/autofill_bottom_sheet_tab_helper.mm +++ b/ios/chrome/browser/autofill/bottom_sheet/autofill_bottom_sheet_tab_helper.mm
@@ -91,10 +91,6 @@ void AutofillBottomSheetTabHelper::ShowPasswordBottomSheet( const autofill::FormActivityParams params) { - if (!commands_handler_ || !password_account_storage_notice_handler_) { - return; - } - if (![password_account_storage_notice_handler_ shouldShowAccountStorageNotice]) { [commands_handler_ showPasswordBottomSheet:params];
diff --git a/ios/chrome/browser/default_browser/promo_statistics.h b/ios/chrome/browser/default_browser/promo_statistics.h index 0b4b6b9..da3ac90 100644 --- a/ios/chrome/browser/default_browser/promo_statistics.h +++ b/ios/chrome/browser/default_browser/promo_statistics.h
@@ -14,11 +14,17 @@ @property(nonatomic, assign) int promoDisplayCount; // Number of days since user last interacted with a promo. @property(nonatomic, assign) int numDaysSinceLastPromo; +// Number of cold starts in the last `kTriggerCriteriaExperimentStatExpiration` +// days. +@property(nonatomic, assign) int chromeColdStartCount; +// Number of warm starts in the last `kTriggerCriteriaExperimentStatExpiration` +// days. +@property(nonatomic, assign) int chromeWarmStartCount; +// Number of indirect starts in the last +// `kTriggerCriteriaExperimentStatExpiration` days. +@property(nonatomic, assign) int chromeIndirectStartCount; -// TODO(crbug.com/1456438): Implement rest of the metrics: -// ChromeOpenCount -// ChromeOpenIndirectlyCount -// ActiveDayCount +// TODO: // OmniboxClipboardUseCount // PasswordManagerUseCount // BookmarkUseCount
diff --git a/ios/chrome/browser/default_browser/utils.h b/ios/chrome/browser/default_browser/utils.h index e4eafba..8c9c25c 100644 --- a/ios/chrome/browser/default_browser/utils.h +++ b/ios/chrome/browser/default_browser/utils.h
@@ -67,6 +67,21 @@ // seen the promo. extern NSString* const kLastTimeUserInteractedWithPromo; +// Key in storage containing all the recent timestamps of browser cold starts up +// to allowed maximum number of past events. +extern NSString* const kAllTimestampsAppLaunchColdStart; + +// Key in storage containing all the recent timestamps of browser warm starts up +// to allowed maximum number of past events. +extern NSString* const kAllTimestampsAppLaunchWarmStart; + +// Key in storage containing all the recent timestamps of browser indirect +// starts up to allowed maximum number of past events. +extern NSString* const kAllTimestampsAppLaunchIndirectStart; + +// Helper function to set `data` for `key` into the storage object. +void SetObjectIntoStorageForKey(NSString* key, NSObject* data); + // Logs the timestamp of opening an HTTP(S) link sent and opened by the app. void LogOpenHTTPURLFromExternalURL(); @@ -248,4 +263,14 @@ // Records given promo stats for "Appear" action into UMA histograms. void RecordPromoStatsToUMAForAppear(PromoStatistics* promo_stats); +// Logs browser launched for default browser promo trigger criteria experiment +// stats to NSUserDefaults. `LogBrowserIndirectlylaunched` and +// `LogBrowserLaunched` will have overlap. +void LogBrowserLaunched(bool is_cold_start); + +// Log browser started indirectly(by widget or external url) for default browser +// promo experiment stats to NSUserDefaults. `LogBrowserIndirectlylaunched` and +// `LogBrowserLaunched` will have overlap. +void LogBrowserIndirectlylaunched(); + #endif // IOS_CHROME_BROWSER_DEFAULT_BROWSER_UTILS_H_
diff --git a/ios/chrome/browser/default_browser/utils.mm b/ios/chrome/browser/default_browser/utils.mm index e51c6ce..8da090e 100644 --- a/ios/chrome/browser/default_browser/utils.mm +++ b/ios/chrome/browser/default_browser/utils.mm
@@ -152,6 +152,10 @@ // Maximum time range between valid user URL pastes to notify the FET. constexpr base::TimeDelta kMaximumTimeBetweenValidURLPastes = base::Days(7); +// Time threshold for default browser trigger criteria experiment statistics. +constexpr base::TimeDelta kTriggerCriteriaExperimentStatExpiration = + base::Days(14); + // List of DefaultPromoType considered by MostRecentInterestDefaultPromoType. const DefaultPromoType kDefaultPromoTypes[] = { DefaultPromoTypeStaySafe, @@ -230,11 +234,6 @@ [defaults setObject:storage forKey:kDefaultBrowserUtilsKey]; } -// Helper function to set `data` for `key` into the storage object. -void SetObjectIntoStorageForKey(NSString* key, NSObject* data) { - UpdateStorageWithDictionary(@{key : data}); -} - // Helper function to get the storage key for a specific promo type. NSString* StorageKeyForDefaultPromoType(DefaultPromoType type) { switch (type) { @@ -253,9 +252,10 @@ return nil; } -// Loads from NSUserDefaults the time of the last non-expired events. -std::vector<base::Time> LoadTimestampsForPromoType(DefaultPromoType type) { - NSString* key = StorageKeyForDefaultPromoType(type); +// Loads from NSUserDefaults the time of the non-expired events for the +// given key. +std::vector<base::Time> LoadActiveTimestampsForKey(NSString* key, + base::TimeDelta delay) { NSArray* dates = GetObjectFromStorageForKey<NSArray>(key); if (!dates) { return {}; @@ -272,7 +272,7 @@ } const base::Time time = base::Time::FromNSDate(date); - if (now - time > kUserActivityTimestampExpiration) { + if (now - time > delay) { continue; } @@ -282,9 +282,15 @@ return times; } -// Stores the time of the last recorded events for `type`. -void StoreTimestampsForPromoType(DefaultPromoType type, - std::vector<base::Time> times) { +// Loads from NSUserDefaults the time of the non-expired events for the +// given promo type. +std::vector<base::Time> LoadTimestampsForPromoType(DefaultPromoType type) { + return LoadActiveTimestampsForKey(StorageKeyForDefaultPromoType(type), + kUserActivityTimestampExpiration); +} + +// Stores the time of the last recorded events for `key`. +void StoreTimestampsForKey(NSString* key, std::vector<base::Time> times) { NSMutableArray<NSDate*>* dates = [[NSMutableArray alloc] initWithCapacity:times.size()]; @@ -299,10 +305,15 @@ [dates addObject:time.ToNSDate()]; } - NSString* key = StorageKeyForDefaultPromoType(type); SetObjectIntoStorageForKey(key, dates); } +// Stores the time of the last recorded events for `type`. +void StoreTimestampsForPromoType(DefaultPromoType type, + std::vector<base::Time> times) { + StoreTimestampsForKey(StorageKeyForDefaultPromoType(type), times); +} + // Returns whether an event was logged for key occuring less than `delay` // in the past. bool HasRecordedEventForKeyLessThanDelay(NSString* key, base::TimeDelta delay) { @@ -327,6 +338,11 @@ return base::Time::Now() - time > delay; } +// Returns number of events logged for key occuring less than `delay` in the +// past. +int NumRecordedEventForKeyLessThanDelay(NSString* key, base::TimeDelta delay) { + return LoadActiveTimestampsForKey(key, delay).size(); +} // `YES` if user interacted with the first run default browser screen. BOOL HasUserInteractedWithFirstRunPromoBefore() { NSNumber* number = @@ -377,6 +393,16 @@ NSString* const kLastTimeUserInteractedWithPromo = @"lastTimeUserInteractedWithFullscreenPromo"; +NSString* const kAllTimestampsAppLaunchColdStart = + @"AllTimestampsAppLaunchColdStart"; +NSString* const kAllTimestampsAppLaunchWarmStart = + @"AllTimestampsAppLaunchWarmStart"; +NSString* const kAllTimestampsAppLaunchIndirectStart = + @"AllTimestampsAppLaunchIndirectStart"; + +void SetObjectIntoStorageForKey(NSString* key, NSObject* data) { + UpdateStorageWithDictionary(@{key : data}); +} void LogOpenHTTPURLFromExternalURL() { SetObjectIntoStorageForKey(kLastHTTPURLOpenTime, [NSDate date]); @@ -826,6 +852,13 @@ } } +void CleanupStorageForTriggerExperiment() { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + + [defaults removeObjectForKey:kAllTimestampsAppLaunchColdStart]; + [defaults removeObjectForKey:kAllTimestampsAppLaunchWarmStart]; + [defaults removeObjectForKey:kAllTimestampsAppLaunchIndirectStart]; +} void RecordPromoStatsToUMAForActionString(PromoStatistics* promo_stats, const std::string& action_str) { if (!IsDefaultBrowserTriggerCriteraExperimentEnabled()) { @@ -840,6 +873,15 @@ base::UmaHistogramCounts100( base::StrCat({histogram_prefix, ".LastPromoInteractionNumDays"}), promo_stats.numDaysSinceLastPromo); + base::UmaHistogramCounts100( + base::StrCat({histogram_prefix, ".ChromeColdStartCount"}), + promo_stats.chromeColdStartCount); + base::UmaHistogramCounts100( + base::StrCat({histogram_prefix, ".ChromeWarmStartCount"}), + promo_stats.chromeWarmStartCount); + base::UmaHistogramCounts100( + base::StrCat({histogram_prefix, ".ChromeIndirectStartCount"}), + promo_stats.chromeIndirectStartCount); } PromoStatistics* CalculatePromoStatistics() { @@ -850,6 +892,15 @@ PromoStatistics* promo_stats = [[PromoStatistics alloc] init]; promo_stats.promoDisplayCount = DisplayedPromoCount(); promo_stats.numDaysSinceLastPromo = NumDaysSincePromoInteraction(); + promo_stats.chromeColdStartCount = NumRecordedEventForKeyLessThanDelay( + kAllTimestampsAppLaunchColdStart, + kTriggerCriteriaExperimentStatExpiration); + promo_stats.chromeWarmStartCount = NumRecordedEventForKeyLessThanDelay( + kAllTimestampsAppLaunchWarmStart, + kTriggerCriteriaExperimentStatExpiration); + promo_stats.chromeIndirectStartCount = NumRecordedEventForKeyLessThanDelay( + kAllTimestampsAppLaunchIndirectStart, + kTriggerCriteriaExperimentStatExpiration); return promo_stats; } @@ -863,3 +914,30 @@ void RecordPromoStatsToUMAForAppear(PromoStatistics* promo_stats) { RecordPromoStatsToUMAForActionString(promo_stats, kAppearAction); } + +void StoreCurrentTimestampForKey(NSString* key) { + std::vector<base::Time> timestamps = + LoadActiveTimestampsForKey(key, kTriggerCriteriaExperimentStatExpiration); + timestamps.push_back(base::Time::Now()); + StoreTimestampsForKey(key, timestamps); +} + +void LogBrowserLaunched(bool is_cold_start) { + if (!IsDefaultBrowserTriggerCriteraExperimentEnabled()) { + CleanupStorageForTriggerExperiment(); + return; + } + + NSString* key = is_cold_start ? kAllTimestampsAppLaunchColdStart + : kAllTimestampsAppLaunchWarmStart; + StoreCurrentTimestampForKey(key); +} + +void LogBrowserIndirectlylaunched() { + if (!IsDefaultBrowserTriggerCriteraExperimentEnabled()) { + CleanupStorageForTriggerExperiment(); + return; + } + + StoreCurrentTimestampForKey(kAllTimestampsAppLaunchIndirectStart); +}
diff --git a/ios/chrome/browser/default_browser/utils_unittest.mm b/ios/chrome/browser/default_browser/utils_unittest.mm index 6af6be3..269acf84 100644 --- a/ios/chrome/browser/default_browser/utils_unittest.mm +++ b/ios/chrome/browser/default_browser/utils_unittest.mm
@@ -26,6 +26,9 @@ // More than 7 days. constexpr base::TimeDelta kMoreThan7Days = base::Days(7) + base::Minutes(1); +// More than 14 days. +constexpr base::TimeDelta kMoreThan14Days = base::Days(14) + base::Minutes(1); + // Less than 6 hours. constexpr base::TimeDelta kLessThan6Hours = base::Hours(6) - base::Minutes(1); @@ -226,14 +229,24 @@ PromoStatistics* promo_stats = CalculatePromoStatistics(); EXPECT_EQ(0, promo_stats.promoDisplayCount); EXPECT_EQ(0, promo_stats.numDaysSinceLastPromo); + EXPECT_EQ(0, promo_stats.chromeColdStartCount); + EXPECT_EQ(0, promo_stats.chromeWarmStartCount); + EXPECT_EQ(0, promo_stats.chromeIndirectStartCount); } LogDefaultBrowserPromoDisplayed(); + LogUserInteractionWithFullscreenPromo(); + LogBrowserLaunched(true); + LogBrowserLaunched(false); + LogBrowserIndirectlylaunched(); { PromoStatistics* promo_stats = CalculatePromoStatistics(); EXPECT_EQ(0, promo_stats.promoDisplayCount); EXPECT_EQ(0, promo_stats.numDaysSinceLastPromo); + EXPECT_EQ(0, promo_stats.chromeColdStartCount); + EXPECT_EQ(0, promo_stats.chromeWarmStartCount); + EXPECT_EQ(0, promo_stats.chromeIndirectStartCount); } } @@ -269,4 +282,80 @@ EXPECT_EQ(0, promo_stats.numDaysSinceLastPromo); } } + +// Test `CalculatePromoStatistics` for chrome open metrics. +TEST_F(DefaultBrowserUtilsTest, CalculatePromoStatisticsTest_ChromeOpen) { + feature_list_.InitWithFeatures({kDefaultBrowserTriggerCriteriaExperiment}, + {}); + { + PromoStatistics* promo_stats = CalculatePromoStatistics(); + EXPECT_EQ(0, promo_stats.chromeColdStartCount); + EXPECT_EQ(0, promo_stats.chromeWarmStartCount); + EXPECT_EQ(0, promo_stats.chromeIndirectStartCount); + } + + // Adding timestamps that are older than 14 days should not change the promo + // stats. + NSDate* moreThan14DaysAgo = [[NSDate alloc] + initWithTimeIntervalSinceNow:-kMoreThan14Days.InSecondsF()]; + SetObjectIntoStorageForKey(kAllTimestampsAppLaunchColdStart, + @[ moreThan14DaysAgo ]); + SetObjectIntoStorageForKey(kAllTimestampsAppLaunchWarmStart, + @[ moreThan14DaysAgo ]); + SetObjectIntoStorageForKey(kAllTimestampsAppLaunchIndirectStart, + @[ moreThan14DaysAgo ]); + { + PromoStatistics* promo_stats = CalculatePromoStatistics(); + EXPECT_EQ(0, promo_stats.chromeColdStartCount); + EXPECT_EQ(0, promo_stats.chromeWarmStartCount); + EXPECT_EQ(0, promo_stats.chromeIndirectStartCount); + } + + // Adding timestamps that are between 7 - 14 days should be counted. + NSDate* moreThan7DaysAgo = [[NSDate alloc] + initWithTimeIntervalSinceNow:-kMoreThan7Days.InSecondsF()]; + + SetObjectIntoStorageForKey(kAllTimestampsAppLaunchColdStart, + @[ moreThan7DaysAgo, moreThan14DaysAgo ]); + SetObjectIntoStorageForKey(kAllTimestampsAppLaunchWarmStart, + @[ moreThan7DaysAgo, moreThan14DaysAgo ]); + SetObjectIntoStorageForKey(kAllTimestampsAppLaunchIndirectStart, + @[ moreThan7DaysAgo, moreThan14DaysAgo ]); + { + PromoStatistics* promo_stats = CalculatePromoStatistics(); + EXPECT_EQ(1, promo_stats.chromeColdStartCount); + EXPECT_EQ(1, promo_stats.chromeWarmStartCount); + EXPECT_EQ(1, promo_stats.chromeIndirectStartCount); + } + + LogBrowserLaunched(true); + + { + PromoStatistics* promo_stats = CalculatePromoStatistics(); + EXPECT_EQ(2, promo_stats.chromeColdStartCount); + EXPECT_EQ(1, promo_stats.chromeWarmStartCount); + EXPECT_EQ(1, promo_stats.chromeIndirectStartCount); + } + + LogBrowserLaunched(true); + LogBrowserLaunched(false); + + { + PromoStatistics* promo_stats = CalculatePromoStatistics(); + EXPECT_EQ(3, promo_stats.chromeColdStartCount); + EXPECT_EQ(2, promo_stats.chromeWarmStartCount); + EXPECT_EQ(1, promo_stats.chromeIndirectStartCount); + } + + LogBrowserLaunched(true); + LogBrowserLaunched(false); + LogBrowserIndirectlylaunched(); + + { + PromoStatistics* promo_stats = CalculatePromoStatistics(); + EXPECT_EQ(4, promo_stats.chromeColdStartCount); + EXPECT_EQ(3, promo_stats.chromeWarmStartCount); + EXPECT_EQ(2, promo_stats.chromeIndirectStartCount); + } +} } // namespace
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm index 18373004..003eed31 100644 --- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm +++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -738,9 +738,7 @@ [self shouldOpenNTPTabOnActivationOfBrowser:self.currentInterface .browser]) { DCHECK(!self.activatingBrowser); - [self beginActivatingBrowser:self.mainInterface.browser - dismissTabSwitcher:YES - focusOmnibox:NO]; + [self beginActivatingBrowser:self.mainInterface.browser focusOmnibox:NO]; OpenNewTabCommand* command = [OpenNewTabCommand commandWithIncognito:NO]; command.userInitiated = NO; @@ -748,7 +746,7 @@ id<ApplicationCommands> applicationHandler = HandlerForProtocol( browser->GetCommandDispatcher(), ApplicationCommands); [applicationHandler openURLInNewTab:command]; - [self finishActivatingBrowserDismissingTabSwitcher:YES]; + [self finishActivatingBrowserDismissingTabSwitcher]; } } @@ -1037,10 +1035,8 @@ if (self.mainCoordinator.isTabGridActive) { DCHECK(!self.activatingBrowser); - [self beginActivatingBrowser:self.mainInterface.browser - dismissTabSwitcher:YES - focusOmnibox:NO]; - [self finishActivatingBrowserDismissingTabSwitcher:YES]; + [self beginActivatingBrowser:self.mainInterface.browser focusOmnibox:NO]; + [self finishActivatingBrowserDismissingTabSwitcher]; } // If this web state list should have an NTP created when it activates, then @@ -2202,19 +2198,15 @@ - (void)tabGrid:(TabGridCoordinator*)tabGrid shouldActivateBrowser:(Browser*)browser - dismissTabGrid:(BOOL)dismissTabGrid focusOmnibox:(BOOL)focusOmnibox { - DCHECK(dismissTabGrid); - [self beginActivatingBrowser:browser - dismissTabSwitcher:dismissTabGrid - focusOmnibox:focusOmnibox]; + [self beginActivatingBrowser:browser focusOmnibox:focusOmnibox]; } - (void)tabGridDismissTransitionDidEnd:(TabGridCoordinator*)tabGrid { if (!self.sceneState.UIEnabled) { return; } - [self finishActivatingBrowserDismissingTabSwitcher:YES]; + [self finishActivatingBrowserDismissingTabSwitcher]; } - (TabGridPage)activePageForTabGrid:(TabGridCoordinator*)tabGrid { @@ -2222,19 +2214,12 @@ } // Begins the process of activating the given current model, switching which BVC -// is suspended if necessary. If `dismissTabSwitcher` is set, the tab switcher -// will also be dismissed. Note that this means that a browser can be activated -// without closing the tab switcher (e.g. thumb strip), but dismissing the tab -// switcher requires activating a browser. The omnibox will be focused after the -// tab switcher dismissal is completed if `focusOmnibox` is YES. -// TODO(crbug.com/1457148): Modify this function to remove `dismissTabSwitcher` -// as it is only needed for thumbstrip which is deprecated. +// is suspended if necessary. The omnibox will be focused after the tab switcher +// dismissal is completed if `focusOmnibox` is YES. - (void)beginActivatingBrowser:(Browser*)browser - dismissTabSwitcher:(BOOL)dismissTabSwitcher focusOmnibox:(BOOL)focusOmnibox { DCHECK(browser == self.mainInterface.browser || browser == self.incognitoInterface.browser); - DCHECK(dismissTabSwitcher); self.activatingBrowser = YES; ApplicationMode mode = (browser == self.mainInterface.browser) @@ -2244,19 +2229,13 @@ // The call to set currentBVC above does not actually display the BVC, because // _activatingBrowser is YES. So: Force the BVC transition to start. - [self displayCurrentBVCAndFocusOmnibox:focusOmnibox - dismissTabSwitcher:dismissTabSwitcher]; - // If the tab switcher was not dismissed, finish the activation process now. - if (!dismissTabSwitcher) { - [self finishActivatingBrowserDismissingTabSwitcher:NO]; - } + [self displayCurrentBVCAndFocusOmnibox:focusOmnibox]; } // Completes the process of activating the given browser. If necessary, also // finishes dismissing the tab switcher, removing it from the // screen and showing the appropriate BVC. -- (void)finishActivatingBrowserDismissingTabSwitcher: - (BOOL)dismissingTabSwitcher { +- (void)finishActivatingBrowserDismissingTabSwitcher { // In real world devices, it is possible to have an empty tab model at the // finishing block of a BVC presentation animation. This can happen when the // following occur: a) There is JS that closes the last incognito tab, b) that @@ -2269,11 +2248,9 @@ self.currentInterface.browser->GetWebStateList() && self.currentInterface.browser->GetWebStateList()->count() == 0U) { self.activatingBrowser = NO; - if (dismissingTabSwitcher) { - self.modeToDisplayOnTabSwitcherDismissal = TabSwitcherDismissalMode::NONE; - self.NTPActionAfterTabSwitcherDismissal = NO_ACTION; - [self showTabSwitcher]; - } + self.modeToDisplayOnTabSwitcherDismissal = TabSwitcherDismissalMode::NONE; + self.NTPActionAfterTabSwitcherDismissal = NO_ACTION; + [self showTabSwitcher]; return; } @@ -2286,15 +2263,13 @@ } self.activatingBrowser = NO; - if (dismissingTabSwitcher) { - self.modeToDisplayOnTabSwitcherDismissal = TabSwitcherDismissalMode::NONE; + self.modeToDisplayOnTabSwitcherDismissal = TabSwitcherDismissalMode::NONE; - ProceduralBlock action = [self completionBlockForTriggeringAction: - self.NTPActionAfterTabSwitcherDismissal]; - self.NTPActionAfterTabSwitcherDismissal = NO_ACTION; - if (action) { - action(); - } + ProceduralBlock action = [self completionBlockForTriggeringAction: + self.NTPActionAfterTabSwitcherDismissal]; + self.NTPActionAfterTabSwitcherDismissal = NO_ACTION; + if (action) { + action(); } } @@ -2596,7 +2571,7 @@ self.browserViewWrangler.currentInterface = newInterface; if (!self.activatingBrowser) { - [self displayCurrentBVCAndFocusOmnibox:NO dismissTabSwitcher:YES]; + [self displayCurrentBVCAndFocusOmnibox:NO]; } // Tell the BVC that was made current that it can use the web. @@ -2927,13 +2902,7 @@ } // Displays current (incognito/normal) BVC and optionally focuses the omnibox. -// If `dismissTabSwitcher` is NO, then the tab switcher is not dismissed, -// although the BVC will be visible. `dismissTabSwitcher` is only used in the -// thumb strip feature. -// TODO(crbug.com/1457148): Modify this function to remove `dismissTabSwitcher` -// as it is only needed for thumbstrip which is deprecated. -- (void)displayCurrentBVCAndFocusOmnibox:(BOOL)focusOmnibox - dismissTabSwitcher:(BOOL)dismissTabSwitcher { +- (void)displayCurrentBVCAndFocusOmnibox:(BOOL)focusOmnibox { ProceduralBlock completion = nil; if (focusOmnibox) { id<OmniboxCommands> omniboxHandler = HandlerForProtocol( @@ -2945,7 +2914,6 @@ [self.mainCoordinator showTabViewController:self.currentInterface.viewController incognito:self.currentInterface.incognito - shouldCloseTabGrid:dismissTabSwitcher completion:completion]; [HandlerForProtocol(self.currentInterface.browser->GetCommandDispatcher(), ApplicationCommands) @@ -3387,7 +3355,7 @@ /*in_background=*/false, /*inherit_opener=*/false, /*should_show_start_surface=*/false, /*should_skip_new_tab_animation=*/urlLoadParams.from_external); - [self beginActivatingBrowser:browser dismissTabSwitcher:YES focusOmnibox:NO]; + [self beginActivatingBrowser:browser focusOmnibox:NO]; } #pragma mark - Handling of destroying the incognito BrowserState
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h index bd1f397..ca7f6d4 100644 --- a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h +++ b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h
@@ -21,6 +21,12 @@ // Returns the estimated height of a single row in the table view. - (CGFloat)tableViewEstimatedRowHeight; +// Returns the currently selected row. +- (NSInteger)selectedRow; + +// Return the height of the table view. +- (CGFloat)tableViewHeight; + @end #endif // IOS_CHROME_BROWSER_SHARED_UI_BOTTOM_SHEET_TABLE_VIEW_BOTTOM_SHEET_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm index ecee0c4..eddc1c1 100644 --- a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm +++ b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm
@@ -118,12 +118,24 @@ UISheetPresentationControllerDetentIdentifierLarge; }]; } + + [_tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] + animated:NO + scrollPosition:UITableViewScrollPositionNone]; } - (CGFloat)tableViewEstimatedRowHeight { return kTableViewEstimatedRowHeight; } +- (NSInteger)selectedRow { + return _tableView.indexPathForSelectedRow.row; +} + +- (CGFloat)tableViewHeight { + return _tableView.contentSize.height; +} + #pragma mark - UIViewController - (void)viewDidLoad { @@ -160,7 +172,6 @@ } - (void)viewWillAppear:(BOOL)animated { - // Update height constraints for the table view. [self.view layoutIfNeeded]; // Update the custom detent with the correct initial height for the bottom
diff --git a/ios/chrome/browser/shared/ui/symbols/BUILD.gn b/ios/chrome/browser/shared/ui/symbols/BUILD.gn index 8d05d97b..d54ff030 100644 --- a/ios/chrome/browser/shared/ui/symbols/BUILD.gn +++ b/ios/chrome/browser/shared/ui/symbols/BUILD.gn
@@ -88,10 +88,6 @@ "//ios/chrome/browser/shared/ui/symbols/resources:shield", "//ios/chrome/browser/shared/ui/symbols/resources:square_bullet_square", "//ios/chrome/browser/shared/ui/symbols/resources:square_number", - "//ios/chrome/browser/shared/ui/symbols/resources:tab_grid_new_tab_button_incognito_ios14", - "//ios/chrome/browser/shared/ui/symbols/resources:tab_grid_new_tab_button_ios14", - "//ios/chrome/browser/shared/ui/symbols/resources:tab_grid_new_tab_floating_button_incognito_ios14", - "//ios/chrome/browser/shared/ui/symbols/resources:tab_grid_new_tab_floating_button_ios14", "//ios/chrome/browser/shared/ui/symbols/resources:translate", "//ios/chrome/browser/shared/ui/symbols/resources:tuner", "//ios/chrome/common/ui/colors",
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn b/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn index f3d7f1b..a055618 100644 --- a/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn +++ b/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn
@@ -242,38 +242,6 @@ ] } -imageset("tab_grid_new_tab_button_ios14") { - sources = [ - "tab_grid_new_tab_button_ios14.imageset/Contents.json", - "tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@2x.png", - "tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@3x.png", - ] -} - -imageset("tab_grid_new_tab_button_incognito_ios14") { - sources = [ - "tab_grid_new_tab_button_incognito_ios14.imageset/Contents.json", - "tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@2x.png", - "tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@3x.png", - ] -} - -imageset("tab_grid_new_tab_floating_button_ios14") { - sources = [ - "tab_grid_new_tab_floating_button_ios14.imageset/Contents.json", - "tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@2x.png", - "tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@3x.png", - ] -} - -imageset("tab_grid_new_tab_floating_button_incognito_ios14") { - sources = [ - "tab_grid_new_tab_floating_button_incognito_ios14.imageset/Contents.json", - "tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@2x.png", - "tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@3x.png", - ] -} - symbolset("chrome_product") { sources = [ "chrome_product.symbolset/Contents.json",
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/Contents.json b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/Contents.json deleted file mode 100644 index befe273..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "scale": "2x", - "filename": "tab_grid_new_tab_button_incognito_ios14@2x.png" - }, - { - "idiom": "universal", - "scale": "3x", - "filename": "tab_grid_new_tab_button_incognito_ios14@3x.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@2x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@2x.png deleted file mode 100644 index 5846b3d..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@2x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@3x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@3x.png deleted file mode 100644 index e1514e83..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_incognito_ios14.imageset/tab_grid_new_tab_button_incognito_ios14@3x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/Contents.json b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/Contents.json deleted file mode 100644 index b40dd30..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "scale": "2x", - "filename": "tab_grid_new_tab_button_ios14@2x.png" - }, - { - "idiom": "universal", - "scale": "3x", - "filename": "tab_grid_new_tab_button_ios14@3x.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@2x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@2x.png deleted file mode 100644 index 9607dd3..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@2x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@3x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@3x.png deleted file mode 100644 index d0295cd..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_button_ios14.imageset/tab_grid_new_tab_button_ios14@3x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/Contents.json b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/Contents.json deleted file mode 100644 index 000a8b2..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "scale": "2x", - "filename": "tab_grid_new_tab_floating_button_incognito_ios14@2x.png" - }, - { - "idiom": "universal", - "scale": "3x", - "filename": "tab_grid_new_tab_floating_button_incognito_ios14@3x.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@2x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@2x.png deleted file mode 100644 index cfaa5f0..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@2x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@3x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@3x.png deleted file mode 100644 index 725698a..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_incognito_ios14.imageset/tab_grid_new_tab_floating_button_incognito_ios14@3x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/Contents.json b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/Contents.json deleted file mode 100644 index 8f7872fd..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/Contents.json +++ /dev/null
@@ -1,18 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "scale": "2x", - "filename": "tab_grid_new_tab_floating_button_ios14@2x.png" - }, - { - "idiom": "universal", - "scale": "3x", - "filename": "tab_grid_new_tab_floating_button_ios14@3x.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -}
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@2x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@2x.png deleted file mode 100644 index b04b6d3..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@2x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@3x.png b/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@3x.png deleted file mode 100644 index 0646639a..0000000 --- a/ios/chrome/browser/shared/ui/symbols/resources/tab_grid_new_tab_floating_button_ios14.imageset/tab_grid_new_tab_floating_button_ios14@3x.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.h b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.h index 6a6709f..797bcb7 100644 --- a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.h +++ b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.h
@@ -56,6 +56,9 @@ // Adds/replaces the infobar and show the banner. void ShowInfoBar(); + // Called when the app has been foregrounded. + void AppWillEnterForeground(); + // BrowserObserver methods. void BrowserDestroyed(Browser* browser) override; @@ -73,8 +76,10 @@ // infobars::InfoBarManager::Observer methods. void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override; - // Track if an infobar will be displayed. + // Tracks if an infobar will be displayed. bool infobar_in_progress_ = false; + // Tracks if an infobar has been displayed since the last app foreground. + static bool infobar_displayed; // Tracks if the `IOS.TabPickup.TimeSinceLastCrossDeviceSync` metric has been // recorded. static bool transition_time_metric_recorded; @@ -98,6 +103,8 @@ base::ScopedObservation<infobars::InfoBarManager, infobars::InfoBarManager::Observer> infobar_manager_scoped_observation_{this}; + // Holds references to foreground NSNotification callback observer. + id foreground_notification_observer_; }; #endif // IOS_CHROME_BROWSER_TABS_TAB_PICKUP_TAB_PICKUP_BROWSER_AGENT_H_
diff --git a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm index 17f324b..201a95d 100644 --- a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm +++ b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm
@@ -24,6 +24,7 @@ BROWSER_USER_DATA_KEY_IMPL(TabPickupBrowserAgent) bool TabPickupBrowserAgent::transition_time_metric_recorded = false; +bool TabPickupBrowserAgent::infobar_displayed = false; TabPickupBrowserAgent::TabPickupBrowserAgent(Browser* browser) : browser_(browser), @@ -38,6 +39,14 @@ session_sync_service_->SubscribeToForeignSessionsChanged( base::BindRepeating(&TabPickupBrowserAgent::ForeignSessionsChanged, base::Unretained(this))); + + foreground_notification_observer_ = [[NSNotificationCenter defaultCenter] + addObserverForName:UIApplicationWillEnterForegroundNotification + object:nil + queue:nil + usingBlock:^(NSNotification* notification) { + this->AppWillEnterForeground(); + }]; } TabPickupBrowserAgent::~TabPickupBrowserAgent() { @@ -98,7 +107,7 @@ return; } - if (!active_web_state_ || infobar_in_progress_) { + if (!active_web_state_ || infobar_in_progress_ || infobar_displayed) { return; } @@ -155,6 +164,7 @@ InfobarType::kInfobarTypeTabPickup, std::move(delegate_)); infobar_ = infobar_manager->AddInfoBar(std::move(infobar), /*replace_existing=*/true); + infobar_displayed = true; } void TabPickupBrowserAgent::RecordTransitionTime() { @@ -175,3 +185,7 @@ base::Days(24), 50); } } + +void TabPickupBrowserAgent::AppWillEnterForeground() { + infobar_displayed = false; +}
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn b/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn index d169c1ab..ced2d40 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn
@@ -31,5 +31,12 @@ "payments_suggestion_bottom_sheet_view_controller.h", "payments_suggestion_bottom_sheet_view_controller.mm", ] - deps = [ "//ios/chrome/browser/shared/ui/bottom_sheet" ] + deps = [ + "//build:branding_buildflags", + "//components/resources:components_scaled_resources_grit", + "//ios/chrome/browser/shared/ui/bottom_sheet", + "//ios/chrome/browser/shared/ui/table_view/cells", + "//ios/chrome/browser/shared/ui/util", + "//ios/chrome/common/ui/colors", + ] }
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm index 4fb147cb..b1e3688 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm
@@ -4,17 +4,114 @@ #import "ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.h" +#import "build/branding_buildflags.h" +#import "components/grit/components_scaled_resources.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h" +#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" + #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +@interface PaymentsSuggestionBottomSheetViewController () { + // Height constraint for the bottom sheet when showing all suggestions. + NSLayoutConstraint* _heightConstraint; + + // Table view for the list of suggestions. + UITableView* _tableView; + + // List of credit cards and icon for the bottom sheet. + NSArray<id<PaymentsSuggestionBottomSheetData>>* _creditCardData; + + // View which contains the GPay logo. + UIImageView* _logoImageView; +} + +@end + @implementation PaymentsSuggestionBottomSheetViewController +- (instancetype)init { + self = [super init]; + return self; +} + +#pragma mark - UIViewController + +- (void)viewDidLoad { + self.titleView = [self setUpTitleView]; + + // Set the properties read by the super when constructing the + // views in `-[ConfirmationAlertViewController viewDidLoad]`. + // TODO(crbug.com/1450214): Use proper strings. + self.primaryActionString = @"Continue - TEST"; + self.secondaryActionString = @"No thanks - TEST"; + + [super viewDidLoad]; +} + +- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { + [super traitCollectionDidChange:previousTraitCollection]; + + if (self.traitCollection.userInterfaceStyle != + previousTraitCollection.userInterfaceStyle) { + // Make sure the GPay logo matches the new trait collection. + _logoImageView.image = [self googlePayBadgeImage]; + } +} + #pragma mark - PaymentsSuggestionBottomSheetConsumer - (void)setCreditCardData: (NSArray<id<PaymentsSuggestionBottomSheetData>>*)creditCardData { - // TODO(crbug.com/1450214): Store credit card data in the view controller + _creditCardData = creditCardData; +} + +#pragma mark - Private + +// Configures the title view of this ViewController. +- (UIView*)setUpTitleView { + _logoImageView = + [[UIImageView alloc] initWithImage:[self googlePayBadgeImage]]; + UILabel* titleLabel = [[UILabel alloc] init]; + // TODO(crbug.com/1450214): Use proper strings. + titleLabel.text = @"Autofill Payment Info - TEST"; + UIStackView* titleView = [[UIStackView alloc] + initWithArrangedSubviews:@[ _logoImageView, titleLabel ]]; + titleView.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + titleView.axis = UILayoutConstraintAxisVertical; + titleView.alignment = UIStackViewAlignmentCenter; + titleView.translatesAutoresizingMaskIntoConstraints = NO; + return titleView; +} + +// Returns the google pay badge image corresponding to the current +// UIUserInterfaceStyle (light/dark mode). +- (UIImage*)googlePayBadgeImage { + // IDR_AUTOFILL_GOOGLE_PAY_DARK only exists in official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + return self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark + ? NativeImage(IDR_AUTOFILL_GOOGLE_PAY_DARK) + : NativeImage(IDR_AUTOFILL_GOOGLE_PAY); +#else + return NativeImage(IDR_AUTOFILL_GOOGLE_PAY); +#endif +} + +// Creates the payments bottom sheet's table view, initially at minimized +// height. +- (UITableView*)createTableView { + _tableView = [super createTableView]; + + [_tableView registerClass:TableViewDetailIconCell.class + forCellReuseIdentifier:@"cell"]; + + _heightConstraint = [_tableView.heightAnchor + constraintEqualToConstant:_tableView.rowHeight * _creditCardData.count]; + _heightConstraint.active = YES; + + return _tableView; } @end
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index e5a0380..3d08aeb 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -819,10 +819,7 @@ webStateList:self.browser->GetWebStateList()]; [_sideSwipeMediator setSnapshotDelegate:self]; _sideSwipeMediator.toolbarInteractionHandler = _toolbarCoordinator; - _sideSwipeMediator.primaryToolbarSnapshotProvider = - _toolbarCoordinator.primaryToolbarSnapshotProvider; - _sideSwipeMediator.secondaryToolbarSnapshotProvider = - _toolbarCoordinator.secondaryToolbarSnapshotProvider; + _sideSwipeMediator.toolbarSnapshotProvider = _toolbarCoordinator; _bookmarksCoordinator = [[BookmarksCoordinator alloc] initWithBrowser:self.browser]; @@ -1306,10 +1303,7 @@ restorationAgent:sessionRestorationBrowserAgent browserState:browserState loadingNotifier:_urlLoadingNotifierBrowserAgent]; - self.tabEventsMediator.primaryToolbarSnapshotProvider = - _toolbarCoordinator.primaryToolbarSnapshotProvider; - self.tabEventsMediator.secondaryToolbarSnapshotProvider = - _toolbarCoordinator.secondaryToolbarSnapshotProvider; + self.tabEventsMediator.toolbarSnapshotProvider = _toolbarCoordinator; self.tabEventsMediator.consumer = browserViewController; browserViewController.reauthHandler =
diff --git a/ios/chrome/browser/ui/browser_view/tab_events_mediator.h b/ios/chrome/browser/ui/browser_view/tab_events_mediator.h index f5ba289..d9fcae95 100644 --- a/ios/chrome/browser/ui/browser_view/tab_events_mediator.h +++ b/ios/chrome/browser/ui/browser_view/tab_events_mediator.h
@@ -23,13 +23,9 @@ // Consumer for tab UI changes. @property(nonatomic, weak) id<TabConsumer> consumer; -// Handler for the interaction with the primary toolbar, including providing -// snapshot. +// Snapshot provider for top and bottom toolbars. @property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding> - primaryToolbarSnapshotProvider; -// Provider for the bottom toolbar's snapshot. -@property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding> - secondaryToolbarSnapshotProvider; + toolbarSnapshotProvider; // Creates an instance of the mediator. Observers will be installed into all // existing web states in `webStateList`. While the mediator is alive,
diff --git a/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm b/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm index 46685e7..a8c866b 100644 --- a/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm +++ b/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm
@@ -18,6 +18,7 @@ #import "ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h" #import "ios/chrome/browser/ui/tabs/switch_to_tab_animation_view.h" #import "ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" #import "ios/chrome/browser/url_loading/new_tab_animation_tab_helper.h" #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_observer_bridge.h" @@ -323,10 +324,12 @@ ->will_add_placeholder_for_next_navigation(); NewTabPageTabHelper* NTPHelper = NewTabPageTabHelper::FromWebState(webStateBeingActivated); - UIImage* topToolbarImage = [self.primaryToolbarSnapshotProvider - toolbarSideSwipeSnapshotForWebState:webStateBeingActivated]; - UIImage* bottomToolbarImage = [self.secondaryToolbarSnapshotProvider - toolbarSideSwipeSnapshotForWebState:webStateBeingActivated]; + UIImage* topToolbarImage = [self.toolbarSnapshotProvider + toolbarSideSwipeSnapshotForWebState:webStateBeingActivated + withToolbarType:ToolbarType::kPrimary]; + UIImage* bottomToolbarImage = [self.toolbarSnapshotProvider + toolbarSideSwipeSnapshotForWebState:webStateBeingActivated + withToolbarType:ToolbarType::kSecondary]; SwitchToTabAnimationPosition position = newWebStateIndex > _webStateList->active_index() ? SwitchToTabAnimationPositionAfter
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm index 56c3db2f..bab63ab 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
@@ -495,6 +495,8 @@ self.feedWrapperViewController.contentCollectionView.delegate = self; [self setMinimumHeight]; } + + [self updateAccessibilityElements]; } - (void)willUpdateSnapshot { @@ -1392,6 +1394,22 @@ } } +// Updates the accessibilityElements used by VoiceOver / Switch Control to +// iterate through on-screen elements. The feed collectionView does not seem to +// include non-feed items in its `accessibilityElements` so they are added here. +- (void)updateAccessibilityElements { + NSMutableArray* elements = [[NSMutableArray alloc] init]; + // viewControllersAboveFeed elements are added from bottom to top, so we + // iterate in reverse to get the correct order. + NSEnumerator<UIViewController*>* enumerator = + [self.viewControllersAboveFeed reverseObjectEnumerator]; + for (UIViewController* viewController in enumerator) { + [elements addObject:viewController.view]; + } + [elements addObject:self.collectionView]; + self.accessibilityElements = elements; +} + #pragma mark - Helpers - (UIViewController*)contentSuggestionsViewController {
diff --git a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm index f54079fe..ec82529 100644 --- a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm +++ b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm
@@ -41,15 +41,6 @@ // Height constraint for the bottom sheet when showing all suggestions. NSLayoutConstraint* _fullHeightConstraint; - // Table view for the list of suggestions. - UITableView* _tableView; - - // TableView's width constraint in portrait mode. - NSLayoutConstraint* _portraitTableWidthConstraint; - - // TableView's width constraint in landscape mode. - NSLayoutConstraint* _landscapeTableWidthConstraint; - // List of suggestions in the bottom sheet // The property is defined by PasswordSuggestionBottomSheetConsumer protocol. NSArray<FormSuggestion*>* _suggestions; @@ -112,13 +103,14 @@ } - (void)viewWillAppear:(BOOL)animated { - // Update height constraints for the table view. - CGFloat minimizedTableViewHeight = _tableView.contentSize.height; - if (minimizedTableViewHeight > 0 && - minimizedTableViewHeight != [self tableViewEstimatedRowHeight]) { - _minimizedHeightConstraint.constant = minimizedTableViewHeight; - _fullHeightConstraint.constant = - minimizedTableViewHeight * _suggestions.count; + // When this is called (when the view appears), the table view is minimized, + // and its height is the (dynamic) height of just one cell. + CGFloat effectiveRowHeight = [self tableViewHeight]; + if (effectiveRowHeight > 0 && + effectiveRowHeight != [self tableViewEstimatedRowHeight]) { + // Update height constraints for the table view. + _minimizedHeightConstraint.constant = effectiveRowHeight; + _fullHeightConstraint.constant = effectiveRowHeight * _suggestions.count; } [super viewWillAppear:animated]; @@ -154,11 +146,11 @@ if (_tableViewIsMinimized) { _tableViewIsMinimized = NO; - [_tableView cellForRowAtIndexPath:indexPath].accessoryView = nil; + [tableView cellForRowAtIndexPath:indexPath].accessoryView = nil; // Make separator visible on first cell. - [_tableView cellForRowAtIndexPath:indexPath].separatorInset = + [tableView cellForRowAtIndexPath:indexPath].separatorInset = UIEdgeInsetsMake(0.f, kTableViewHorizontalSpacing, 0.f, 0.f); - [self addSuggestionsToTableView]; + [self addRemainingRowsToTableView:tableView]; // Update table view height. __weak __typeof(self) weakSelf = self; @@ -231,7 +223,7 @@ // Make separator invisible on last cell CGFloat separatorLeftMargin = (_tableViewIsMinimized || [self isLastRow:indexPath]) - ? _tableView.bounds.size.width + ? tableView.bounds.size.width : kTableViewHorizontalSpacing; cell.separatorInset = UIEdgeInsetsMake(0.f, separatorLeftMargin, 0.f, 0.f); @@ -260,7 +252,7 @@ - (void)confirmationAlertPrimaryAction { // Use password button - [self.delegate willSelectSuggestion:_tableView.indexPathForSelectedRow.row]; + [self.delegate willSelectSuggestion:[self selectedRow]]; __weak __typeof(self) weakSelf = self; [self dismissViewControllerAnimated:NO completion:^{ @@ -296,24 +288,23 @@ // Creates the password bottom sheet's table view, initially at minimized // height. - (UITableView*)createTableView { - _tableView = [super createTableView]; + UITableView* tableView = [super createTableView]; - _tableView.dataSource = self; - _tableView.accessibilityIdentifier = - kPasswordSuggestionBottomSheetTableViewId; - [_tableView registerClass:TableViewURLCell.class + tableView.dataSource = self; + tableView.accessibilityIdentifier = kPasswordSuggestionBottomSheetTableViewId; + [tableView registerClass:TableViewURLCell.class forCellReuseIdentifier:@"cell"]; - _minimizedHeightConstraint = [_tableView.heightAnchor + _minimizedHeightConstraint = [tableView.heightAnchor constraintEqualToConstant:[self tableViewEstimatedRowHeight]]; _minimizedHeightConstraint.active = YES; - _fullHeightConstraint = [_tableView.heightAnchor + _fullHeightConstraint = [tableView.heightAnchor constraintEqualToConstant:[self tableViewEstimatedRowHeight] * _suggestions.count]; _fullHeightConstraint.active = NO; - return _tableView; + return tableView; } // Loads the favicon associated with the provided cell. @@ -341,7 +332,7 @@ // Notifies the delegate that a password suggestion was selected by the user. - (void)didSelectSuggestion { - [self.delegate didSelectSuggestion:_tableView.indexPathForSelectedRow.row]; + [self.delegate didSelectSuggestion:[self selectedRow]]; } // Returns whether the provided index path points to the last row of the table @@ -357,16 +348,20 @@ // Starting with a table view containing a single suggestion, add all other // suggestions to the table view. -- (void)addSuggestionsToTableView { - [_tableView beginUpdates]; - NSMutableArray<NSIndexPath*>* indexPaths = - [NSMutableArray arrayWithCapacity:_suggestions.count - 1]; - for (NSUInteger i = 1; i < _suggestions.count; i++) { - [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; +- (void)addRemainingRowsToTableView:(UITableView*)tableView { + NSUInteger currentNumberOfRows = [tableView numberOfRowsInSection:0]; + NSUInteger maximumNumberOfRows = _suggestions.count; + if (maximumNumberOfRows > currentNumberOfRows) { + [tableView beginUpdates]; + NSMutableArray<NSIndexPath*>* indexPaths = [NSMutableArray + arrayWithCapacity:maximumNumberOfRows - currentNumberOfRows]; + for (NSUInteger i = currentNumberOfRows; i < maximumNumberOfRows; i++) { + [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; + } + [tableView insertRowsAtIndexPaths:indexPaths + withRowAnimation:UITableViewRowAnimationNone]; + [tableView endUpdates]; } - [_tableView insertRowsAtIndexPaths:indexPaths - withRowAnimation:UITableViewRowAnimationNone]; - [_tableView endUpdates]; } // Creates the UI action used to open the password manager.
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm index 2eb7b38..7889242 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
@@ -223,7 +223,8 @@ // Enable the IPH Demo Mode feature to ensure the IPH triggers AppLaunchConfiguration config = [self appConfigurationForTestCase]; config.additional_args.push_back(base::StringPrintf( - "--enable-features=%s:chosen_feature/IPH_iOSHistoryOnOverflowMenuFeature", + "--enable-features=%s:chosen_feature/" + "IPH_iOSHistoryOnOverflowMenuFeature,IPHForSafariSwitcher", feature_engagement::kIPHDemoMode.name)); // Force the conditions that allow the iph to show. config.additional_args.push_back("-ForceExperienceForDeviceSwitcher");
diff --git a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.h b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.h index 196fa55..b758c193 100644 --- a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.h +++ b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.h
@@ -16,12 +16,9 @@ @interface CardSideSwipeView : UIView @property(nonatomic, weak) id<SideSwipeMediatorDelegate> delegate; -// Snapshot provider for the top toolbar. +// Snapshot provider for top and bottom toolbars. @property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding> - topToolbarSnapshotProvider; -// Snapshot provider for the bottom toolbar. -@property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding> - bottomToolbarSnapshotProvider; + toolbarSnapshotProvider; // Space reserved at the top for the toolbar. @property(nonatomic, assign) CGFloat topMargin;
diff --git a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm index 9373282..60374aa 100644 --- a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm +++ b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
@@ -19,6 +19,7 @@ #import "ios/chrome/browser/ui/side_swipe/swipe_view.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_constants.h" #import "ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/grit/ios_theme_resources.h" @@ -76,8 +77,6 @@ @synthesize backgroundTopConstraint = _backgroundTopConstraint; @synthesize delegate = _delegate; -@synthesize topToolbarSnapshotProvider = _topToolbarSnapshotProvider; -@synthesize bottomToolbarSnapshotProvider = _bottomToolbarSnapshotProvider; @synthesize topMargin = _topMargin; - (instancetype)initWithFrame:(CGRect)frame @@ -172,11 +171,13 @@ [card setHidden:NO]; web::WebState* webState = _webStateList->GetWebStateAt(index); - UIImage* topToolbarSnapshot = [self.topToolbarSnapshotProvider - toolbarSideSwipeSnapshotForWebState:webState]; + UIImage* topToolbarSnapshot = [self.toolbarSnapshotProvider + toolbarSideSwipeSnapshotForWebState:webState + withToolbarType:ToolbarType::kPrimary]; [card setTopToolbarImage:topToolbarSnapshot]; - UIImage* bottomToolbarSnapshot = [self.bottomToolbarSnapshotProvider - toolbarSideSwipeSnapshotForWebState:webState]; + UIImage* bottomToolbarSnapshot = [self.toolbarSnapshotProvider + toolbarSideSwipeSnapshotForWebState:webState + withToolbarType:ToolbarType::kSecondary]; [card setBottomToolbarImage:bottomToolbarSnapshot]; __weak CardSideSwipeView* weakSelf = self;
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.h b/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.h index b37ff4ed..f261628 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.h +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.h
@@ -55,13 +55,9 @@ @property(nonatomic, weak) id<SideSwipeMediatorDelegate> swipeDelegate; @property(nonatomic, weak) id<SideSwipeToolbarInteracting> toolbarInteractionHandler; -// Handler for the interaction with the primary toolbar, including providing -// snapshot. +// Snapshot provider for top and bottom toolbars. @property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding> - primaryToolbarSnapshotProvider; -// Provider for the bottom toolbar's snapshot. -@property(nonatomic, weak) id<SideSwipeToolbarSnapshotProviding> - secondaryToolbarSnapshotProvider; + toolbarSnapshotProvider; @property(nonatomic, weak) id<SnapshotGeneratorDelegate> snapshotDelegate; @property(nonatomic, weak) id<TabStripHighlighting> tabStripDelegate;
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.mm index 0bae8f4..0be1620 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.mm +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_mediator.mm
@@ -135,9 +135,6 @@ @synthesize inSwipe = _inSwipe; @synthesize swipeDelegate = _swipeDelegate; @synthesize toolbarInteractionHandler = _toolbarInteractionHandler; -@synthesize primaryToolbarSnapshotProvider = _primaryToolbarSnapshotProvider; -@synthesize secondaryToolbarSnapshotProvider = - _secondaryToolbarSnapshotProvider; @synthesize snapshotDelegate = _snapshotDelegate; @synthesize tabStripDelegate = _tabStripDelegate; @@ -474,10 +471,7 @@ [[CardSideSwipeView alloc] initWithFrame:frame topMargin:headerHeight webStateList:self.webStateList]; - _tabSideSwipeView.topToolbarSnapshotProvider = - self.primaryToolbarSnapshotProvider; - _tabSideSwipeView.bottomToolbarSnapshotProvider = - self.secondaryToolbarSnapshotProvider; + _tabSideSwipeView.toolbarSnapshotProvider = self.toolbarSnapshotProvider; [_tabSideSwipeView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h index 1efc4ea..92cf618 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h
@@ -61,17 +61,10 @@ // Displays the TabGrid. - (void)showTabGrid; -// Displays the given view controller. If `closeTabGrid` is yes, any -// TabSwitchers or other view controllers that may currently be visible will be -// replaced. Otherwise, the view controller is added to the current container. +// Displays the given view controller. // Runs the given `completion` block after the view controller is visible. -// `shouldCloseTabGrid` is only used for the thumb strip, where the -// tab container view controller is never dismissed. -// TODO(crbug.com/1457148): Modify this function to remove `shouldCloseTabGrid` -// as it is only needed for thumbstrip which is deprecated. - (void)showTabViewController:(UIViewController*)viewController incognito:(BOOL)incognito - shouldCloseTabGrid:(BOOL)shouldCloseTabGrid completion:(ProceduralBlock)completion; // Sets the `page` as the active (visible) one. The active page must not be the
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm index c871305..27234e6 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -156,6 +156,9 @@ // Coordinator for the "Tab List From Android Prompt" for Android switchers. TabListFromAndroidCoordinator* _tabListFromAndroidCoordinator; + + // Coordinator for the toolbars. + TabGridToolbarsCoordinator* _toolbarsCoordinator; } // Browser that contain tabs from the main pane (i.e. non-incognito). @@ -201,8 +204,6 @@ @property(nonatomic, strong) SnackbarCoordinator* incognitoSnackbarCoordinator; // Coordinator for inactive tabs. @property(nonatomic, strong) InactiveTabsCoordinator* inactiveTabsCoordinator; -// Coordinator for the toolbars. -@property(nonatomic, strong) TabGridToolbarsCoordinator* toolbarsCoordinator; // The timestamp of the user entering the tab grid. @property(nonatomic, assign) base::TimeTicks tabGridEnterTime; @@ -321,7 +322,7 @@ [self dismissPopovers]; [self.inactiveTabsCoordinator hide]; - [self.toolbarsCoordinator stop]; + [_toolbarsCoordinator stop]; if (_bookmarksCoordinator) { [_bookmarksCoordinator dismissBookmarkModalControllerAnimated:YES]; @@ -453,11 +454,10 @@ - (void)showTabViewController:(UIViewController*)viewController incognito:(BOOL)incognito - shouldCloseTabGrid:(BOOL)shouldCloseTabGrid completion:(ProceduralBlock)completion { DCHECK(viewController || self.bvcContainer); - if (shouldCloseTabGrid && !self.tabGridEnterTime.is_null()) { + if (!self.tabGridEnterTime.is_null()) { // Record when the tab switcher is dismissed. base::RecordAction(base::UserMetricsAction("MobileTabGridExited")); @@ -637,17 +637,16 @@ baseViewController.delegate = self; _baseViewController = baseViewController; - self.toolbarsCoordinator = + _toolbarsCoordinator = [[TabGridToolbarsCoordinator alloc] initWithBaseViewController:nil browser:nil]; - self.toolbarsCoordinator.searchDelegate = self.baseViewController; - self.toolbarsCoordinator.actionWrangler = self.baseViewController; - self.toolbarsCoordinator.delegateWrangler = self.baseViewController; - [self.toolbarsCoordinator start]; - self.baseViewController.topToolbar = self.toolbarsCoordinator.topToolbar; - self.baseViewController.bottomToolbar = - self.toolbarsCoordinator.bottomToolbar; - self.baseViewController.toolbarCommandsWrangler = self.toolbarsCoordinator; + _toolbarsCoordinator.searchDelegate = self.baseViewController; + _toolbarsCoordinator.actionWrangler = self.baseViewController; + _toolbarsCoordinator.delegateWrangler = self.baseViewController; + [_toolbarsCoordinator start]; + self.baseViewController.topToolbar = _toolbarsCoordinator.topToolbar; + self.baseViewController.bottomToolbar = _toolbarsCoordinator.bottomToolbar; + self.baseViewController.toolbarCommandsWrangler = _toolbarsCoordinator; self.regularTabsMediator = [[TabGridMediator alloc] initWithConsumer:baseViewController.regularTabsConsumer]; @@ -832,8 +831,8 @@ stopDispatchingForProtocol:@protocol(ApplicationSettingsCommands)]; [self.dispatcher stopDispatchingForProtocol:@protocol(BrowsingDataCommands)]; - [self.toolbarsCoordinator stop]; - self.toolbarsCoordinator = nil; + [_toolbarsCoordinator stop]; + _toolbarsCoordinator = nil; // Disconnect UI from models they observe. self.regularTabsMediator.browser = nil; @@ -877,11 +876,8 @@ #pragma mark - TabPresentationDelegate -- (void)showActiveTabInPage:(TabGridPage)page - focusOmnibox:(BOOL)focusOmnibox - closeTabGrid:(BOOL)closeTabGrid { +- (void)showActiveTabInPage:(TabGridPage)page focusOmnibox:(BOOL)focusOmnibox { DCHECK(self.regularBrowser && self.incognitoBrowser); - DCHECK(closeTabGrid); Browser* activeBrowser = nullptr; switch (page) { @@ -903,7 +899,6 @@ // into this coordinator. [self.delegate tabGrid:self shouldActivateBrowser:activeBrowser - dismissTabGrid:closeTabGrid focusOmnibox:focusOmnibox]; } @@ -1057,7 +1052,6 @@ regularWebStateList->ActivateWebStateAt(toInsertIndex); [self.delegate tabGrid:self shouldActivateBrowser:self.regularBrowser - dismissTabGrid:YES focusOmnibox:NO]; } @@ -1076,7 +1070,6 @@ - (void)showActiveRegularTabFromRecentTabs { [self.delegate tabGrid:self shouldActivateBrowser:self.regularBrowser - dismissTabGrid:YES focusOmnibox:NO]; } @@ -1090,14 +1083,12 @@ - (void)showActiveRegularTabFromHistory { [self.delegate tabGrid:self shouldActivateBrowser:self.regularBrowser - dismissTabGrid:YES focusOmnibox:NO]; } - (void)showActiveIncognitoTabFromHistory { [self.delegate tabGrid:self shouldActivateBrowser:self.incognitoBrowser - dismissTabGrid:YES focusOmnibox:NO]; }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_delegate.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_delegate.h index 5f8581b..19af3ebd 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_delegate.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_delegate.h
@@ -17,14 +17,9 @@ @protocol TabGridCoordinatorDelegate // Informs the delegate the tab switcher that the given browser should be set to -// active. If `dismissTabGrid` is YES, the tab grid itself should also be -// dismissed. This should always be the case except when using the thumb strip, -// where the tab grid is never dismissed -// TODO(crbug.com/1457148): Modify this function to remove `dismissTabGrid` as -// it is only needed for thumbstrip which is deprecated. +// active. - (void)tabGrid:(TabGridCoordinator*)tabGrid shouldActivateBrowser:(Browser*)browser - dismissTabGrid:(BOOL)dismissTabGrid focusOmnibox:(BOOL)focusOmnibox; // Informs the delegate that the tab switcher is done and should be dismissed.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm index cab4fad..99ecb6d3 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
@@ -66,7 +66,6 @@ @synthesize didEndCalled = _didEndCalled; - (void)tabGrid:(TabGridCoordinator*)tabGrid shouldActivateBrowser:(Browser*)browser - dismissTabGrid:(BOOL)dismissTabGrid focusOmnibox:(BOOL)focusOmnibox { // No-op. } @@ -238,7 +237,6 @@ TEST_F(TabGridCoordinatorTest, TabViewControllerBeforeTabSwitcher) { [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:nil]; EXPECT_EQ(normal_tab_view_controller_, coordinator_.activeViewController); @@ -259,7 +257,6 @@ [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:nil]; EXPECT_EQ(normal_tab_view_controller_, coordinator_.activeViewController); @@ -273,17 +270,16 @@ // Tests swapping between two TabViewControllers. TEST_F(TabGridCoordinatorTest, SwapTabViewControllers) { - [coordinator_ showTabViewController:normal_tab_view_controller_ - incognito:NO - shouldCloseTabGrid:YES - completion:nil]; - EXPECT_EQ(normal_tab_view_controller_, coordinator_.activeViewController); + [coordinator_ showTabViewController:normal_tab_view_controller_ + incognito:NO + completion:nil]; + EXPECT_EQ(normal_tab_view_controller_, coordinator_.activeViewController); - [coordinator_ showTabViewController:incognito_tab_view_controller_ - incognito:YES - shouldCloseTabGrid:YES - completion:nil]; - EXPECT_EQ(incognito_tab_view_controller_, coordinator_.activeViewController); + [coordinator_ showTabViewController:incognito_tab_view_controller_ + incognito:YES + completion:nil]; + EXPECT_EQ(incognito_tab_view_controller_, + coordinator_.activeViewController); } // Tests calling showTabSwitcher twice in a row with the same VC. @@ -299,13 +295,11 @@ TEST_F(TabGridCoordinatorTest, ShowTabViewControllerTwice) { [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:nil]; EXPECT_EQ(normal_tab_view_controller_, coordinator_.activeViewController); [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:nil]; EXPECT_EQ(normal_tab_view_controller_, coordinator_.activeViewController); } @@ -322,7 +316,6 @@ __block BOOL completion_handler_was_called = NO; [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:^{ completion_handler_was_called = YES; }]; @@ -337,7 +330,6 @@ delegate_.didEndCalled = NO; [coordinator_ showTabViewController:incognito_tab_view_controller_ incognito:YES - shouldCloseTabGrid:YES completion:^{ completion_handler_was_called = YES; }]; @@ -364,7 +356,6 @@ scoped_clock_.Advance(base::Seconds(20)); [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:nil]; histogram_tester_.ExpectUniqueTimeSample("IOS.TabSwitcher.TimeSpent", base::Seconds(20), 1); @@ -379,7 +370,6 @@ [coordinator_ showTabViewController:normal_tab_view_controller_ incognito:NO - shouldCloseTabGrid:YES completion:nil]; EXPECT_FALSE(coordinator_.tabGridActive);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h index 9783ff4..ff3723d3 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h
@@ -49,16 +49,8 @@ // from the tab grid. @protocol TabPresentationDelegate <NSObject> // Show the active tab in `page`, presented on top of the tab grid. The -// omnibox will be focused after the animation if `focusOmnibox` is YES. If -// `closeTabGrid` is NO, then the tab grid will not be closed, and the active -// tab will simply be displayed in its current position. -// This last parameter is used for the thumb strip, where the -// BVCContainerViewController is never dismissed. -// TODO(crbug.com/1457148): Modify this function to remove `closeTabGrid` as it -// is only needed for thumbstrip which is deprecated. -- (void)showActiveTabInPage:(TabGridPage)page - focusOmnibox:(BOOL)focusOmnibox - closeTabGrid:(BOOL)closeTabGrid; +// omnibox will be focused after the animation if `focusOmnibox` is YES. +- (void)showActiveTabInPage:(TabGridPage)page focusOmnibox:(BOOL)focusOmnibox; @end @protocol TabGridViewControllerDelegate <NSObject>
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm index 1c1ca90..af62be03 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -1425,7 +1425,6 @@ self.incognitoTabsViewController.contentNeedsAuthentication); BOOL allowNewTab = !isRecentTabPage && allowedByContentAuthentication; [self.bottomToolbar setNewTabButtonEnabled:allowNewTab]; - [self.topToolbar setNewTabButtonEnabled:allowNewTab]; } - (void)configureDoneButtonBasedOnPage:(TabGridPage)page { @@ -1495,7 +1494,6 @@ [self.bottomToolbar setCloseAllButtonEnabled:enabled]; [self.bottomToolbar setEditButtonEnabled:enabled]; [self.topToolbar setEditButtonEnabled:enabled]; - [self.topToolbar setNewTabButtonEnabled:enabled]; } // Shows the two toolbars and the floating button. Suitable for use in @@ -1668,8 +1666,7 @@ } self.activePage = page; [self.tabPresentationDelegate showActiveTabInPage:page - focusOmnibox:focusOmnibox - closeTabGrid:YES]; + focusOmnibox:focusOmnibox]; } // Creates and shows a new regular tab. @@ -2002,8 +1999,7 @@ [self setCurrentIdlePageStatus:NO]; [self.tabPresentationDelegate showActiveTabInPage:self.currentPage - focusOmnibox:NO - closeTabGrid:YES]; + focusOmnibox:NO]; } - (void)pinnedTabsViewController: @@ -2114,8 +2110,7 @@ self.activePage = self.currentPage; [self.tabPresentationDelegate showActiveTabInPage:self.currentPage - focusOmnibox:NO - closeTabGrid:YES]; + focusOmnibox:NO]; } - (void)gridViewController:(GridViewController*)gridViewController @@ -2188,7 +2183,6 @@ [self.topToolbar setDoneButtonEnabled:NO]; self.topToolbar.pageControl.userInteractionEnabled = NO; [self.bottomToolbar setDoneButtonEnabled:NO]; - [self.topToolbar setNewTabButtonEnabled:NO]; [self.topToolbar setSelectAllButtonEnabled:NO]; [self.topToolbar setEditButtonEnabled:NO]; [self.topToolbar setSearchButtonEnabled:NO]; @@ -2275,8 +2269,7 @@ // disabled. Ensure that action is only taken on a valid state. if ([self tabsPresentForPage:newActivePage]) { [self.tabPresentationDelegate showActiveTabInPage:newActivePage - focusOmnibox:NO - closeTabGrid:YES]; + focusOmnibox:NO]; // Record when users exit the tab grid to return to the current foreground // tab. base::RecordAction(base::UserMetricsAction("MobileTabGridDone"));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_bottom_toolbar.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_bottom_toolbar.mm index f51432d..76cb384 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_bottom_toolbar.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_bottom_toolbar.mm
@@ -284,16 +284,7 @@ target:nil action:nil]; - if (@available(iOS 15, *)) { - _smallNewTabButton = [[TabGridNewTabButton alloc] initWithLargeSize:NO]; - } else { - _smallNewTabButton = [[TabGridNewTabButton alloc] - initWithRegularImage:[UIImage - imageNamed:@"tab_grid_new_tab_button_ios14"] - incognitoImage: - [UIImage - imageNamed:@"tab_grid_new_tab_button_incognito_ios14"]]; - } + _smallNewTabButton = [[TabGridNewTabButton alloc] initWithLargeSize:NO]; _smallNewTabButton.translatesAutoresizingMaskIntoConstraints = NO; _smallNewTabButton.page = self.page; @@ -332,32 +323,17 @@ ]; // For other layout, display a floating new tab button. - if (@available(iOS 15, *)) { - _largeNewTabButton = [[TabGridNewTabButton alloc] initWithLargeSize:YES]; + _largeNewTabButton = [[TabGridNewTabButton alloc] initWithLargeSize:YES]; - // When a11y font size is used, long press on UIBarButtonItem will show a - // built-in a11y modal panel with image and title if set. The size is not - // taken into account. - if (base::FeatureList::IsEnabled(kSFSymbolsFollowUp)) { - _newTabButtonItem.image = - CustomSymbolWithPointSize(kPlusCircleFillSymbol, 0); - } else { - _newTabButtonItem.image = - CustomSymbolWithPointSize(kLegacyPlusCircleFillSymbol, 0); - } + // When a11y font size is used, long press on UIBarButtonItem will show a + // built-in a11y modal panel with image and title if set. The size is not + // taken into account. + if (base::FeatureList::IsEnabled(kSFSymbolsFollowUp)) { + _newTabButtonItem.image = + CustomSymbolWithPointSize(kPlusCircleFillSymbol, 0); } else { - UIImage* regularImage = - [UIImage imageNamed:@"tab_grid_new_tab_floating_button_ios14"]; - UIImage* incognitoImage = [UIImage - imageNamed:@"tab_grid_new_tab_floating_button_incognito_ios14"]; - _largeNewTabButton = - [[TabGridNewTabButton alloc] initWithRegularImage:regularImage - incognitoImage:incognitoImage]; - - // When a11y font size is used, long press on UIBarButtonItem will show a - // built-in a11y modal panel with image and title if set. The size is not - // taken into account. - _newTabButtonItem.image = DefaultSymbolWithPointSize(kPlusSymbol, 0); + _newTabButtonItem.image = + CustomSymbolWithPointSize(kLegacyPlusCircleFillSymbol, 0); } _largeNewTabButton.translatesAutoresizingMaskIntoConstraints = NO; _largeNewTabButton.page = self.page;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.h index 556ed75..01d6fae 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.h
@@ -14,12 +14,7 @@ @property(nonatomic, assign) TabGridPage page; // Init with a large/small symbol. -- (instancetype)initWithLargeSize:(BOOL)largeSize - API_AVAILABLE(ios(15))NS_DESIGNATED_INITIALIZER; -// Init with image for regular/incognito page. -- (instancetype)initWithRegularImage:(UIImage*)regularImage - incognitoImage:(UIImage*)incognitoImage - NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithLargeSize:(BOOL)largeSize NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.mm index b3de4a76..87a5ef1 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_new_tab_button.mm
@@ -30,10 +30,6 @@ @interface TabGridNewTabButton () -// Images for the open new tab button. -@property(nonatomic, strong) UIImage* regularImage; -@property(nonatomic, strong) UIImage* incognitoImage; - @property(nonatomic, strong) UIImage* symbol; @end @@ -57,65 +53,16 @@ return self; } -- (instancetype)initWithRegularImage:(UIImage*)regularImage - incognitoImage:(UIImage*)incognitoImage { - self = [super initWithFrame:CGRectZero]; - if (self) { - if (@available(iOS 15, *)) { - NOTREACHED(); - } - _regularImage = regularImage; - _incognitoImage = incognitoImage; - - self.pointerInteractionEnabled = YES; - self.pointerStyleProvider = CreateLiftEffectCirclePointerStyleProvider(); - } - return self; -} - #pragma mark - Public - (void)setPage:(TabGridPage)page { - if (@available(iOS 15, *)) { - [self setSymbolPage:page]; - } else { - [self setIconPage:page]; - } + [self setSymbolPage:page]; } #pragma mark - Private -// Sets page using icon images. -- (void)setIconPage:(TabGridPage)page { - if (@available(iOS 15, *)) { - NOTREACHED(); - } - // self.page is inited to 0 (i.e. TabGridPageIncognito) so do not early return - // here, otherwise when app is launched in incognito mode the image will be - // missing. - UIImage* renderedImage; - switch (page) { - case TabGridPageIncognitoTabs: - self.accessibilityLabel = - l10n_util::GetNSString(IDS_IOS_TAB_GRID_CREATE_NEW_INCOGNITO_TAB); - renderedImage = [_incognitoImage - imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; - break; - case TabGridPageRegularTabs: - self.accessibilityLabel = - l10n_util::GetNSString(IDS_IOS_TAB_GRID_CREATE_NEW_TAB); - renderedImage = [_regularImage - imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; - break; - case TabGridPageRemoteTabs: - break; - } - _page = page; - [self setImage:renderedImage forState:UIControlStateNormal]; -} - // Sets page using a symbol image. -- (void)setSymbolPage:(TabGridPage)page API_AVAILABLE(ios(15)) { +- (void)setSymbolPage:(TabGridPage)page { switch (page) { case TabGridPageIncognitoTabs: self.accessibilityLabel =
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm index dd5de1c..d3af1c68 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm
@@ -36,7 +36,6 @@ [topToolbar setCloseAllButtonTarget:self action:@selector(closeAllButtonTapped:)]; [topToolbar setDoneButtonTarget:self action:@selector(doneButtonTapped:)]; - [topToolbar setNewTabButtonTarget:self action:@selector(newTabButtonTapped:)]; [topToolbar setSelectAllButtonTarget:self action:@selector(selectAllButtonTapped:)]; [topToolbar setSearchButtonTarget:self action:@selector(searchButtonTapped:)];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.h index aecd127..145b7dc 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.h
@@ -37,8 +37,6 @@ // title (singular or plural). @property(nonatomic, assign) int selectedTabsCount; -// Sets target/action for tapping event on new tab button. -- (void)setNewTabButtonTarget:(id)target action:(SEL)action; // Sets target/action for tapping event on select all button. - (void)setSelectAllButtonTarget:(id)target action:(SEL)action; // Sets target/action for tapping event on close all button. @@ -53,8 +51,6 @@ - (void)setSearchBarDelegate:(id<UISearchBarDelegate>)delegate; // Set `enabled` on the search button. - (void)setSearchButtonEnabled:(BOOL)enabled; -// Set `enabled` on the new tab button. -- (void)setNewTabButtonEnabled:(BOOL)enabled; // Set `enabled` on the select all button. - (void)setSelectAllButtonEnabled:(BOOL)enabled; // Set `enabled` on the done button.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.mm index edd976a9..8f5f5cf 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_top_toolbar.mm
@@ -41,7 +41,6 @@ @implementation TabGridTopToolbar { UIBarButtonItem* _leadingButton; UIBarButtonItem* _spaceItem; - UIBarButtonItem* _newTabButton; UIBarButtonItem* _iconButtonAdditionalSpaceItem; UIBarButtonItem* _selectionModeFixedSpace; UIBarButtonItem* _selectAllButton; @@ -125,11 +124,6 @@ } } -- (void)setNewTabButtonTarget:(id)target action:(SEL)action { - _newTabButton.target = target; - _newTabButton.action = action; -} - - (void)setSelectAllButtonTarget:(id)target action:(SEL)action { _selectAllButton.target = target; _selectAllButton.action = action; @@ -158,10 +152,6 @@ _searchButton.enabled = enabled; } -- (void)setNewTabButtonEnabled:(BOOL)enabled { - _newTabButton.enabled = enabled; -} - - (void)setCloseAllButtonTarget:(id)target action:(SEL)action { _closeAllOrUndoButton.target = target; _closeAllOrUndoButton.action = action; @@ -480,12 +470,6 @@ [_searchBarView sizeToFit]; _searchBarItem = [[UIBarButtonItem alloc] initWithCustomView:_searchBarView]; - _newTabButton = [[UIBarButtonItem alloc] - initWithBarButtonSystemItem:UIBarButtonSystemItemAdd - target:nil - action:nil]; - _newTabButton.tintColor = UIColorFromRGB(kTabGridToolbarTextButtonColor); - _iconButtonAdditionalSpaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h index e788ed2..21115d1 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h
@@ -7,7 +7,7 @@ #import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h" -#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" @class ToolbarButtonFactory; namespace web { @@ -20,10 +20,6 @@ // Returns a button factory - (ToolbarButtonFactory*)buttonFactoryWithType:(ToolbarType)type; -- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState; - -- (void)resetToolbarAfterSideSwipeSnapshot; - @end #endif // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h index 580bd254..10580e2 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h
@@ -8,16 +8,18 @@ #import <UIKit/UIKit.h> #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" -#import "ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h" #import "ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h" @class AdaptiveToolbarViewController; class Browser; +namespace web { +class WebState; +} // namespace web + // Coordinator for the adaptive toolbar. This Coordinator is the super class of // the specific coordinator (primary or secondary). -@interface AdaptiveToolbarCoordinator - : ChromeCoordinator<SideSwipeToolbarSnapshotProviding, ToolbarCoordinatee> +@interface AdaptiveToolbarCoordinator : ChromeCoordinator <ToolbarCoordinatee> // The Toolbar view controller owned by this coordinator. @property(nonatomic, strong) AdaptiveToolbarViewController* viewController; @@ -34,6 +36,11 @@ - (void)setLocationBarViewController: (UIViewController*)locationBarViewController; +// Prepares the toolbar for a side swipe snapshot with `webState`. +- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState; +// Resets the toolbar after a side swipe snapshot. +- (void)resetToolbarAfterSideSwipeSnapshot; + @end #endif // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm index 08b5018..88686e0 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm
@@ -112,6 +112,19 @@ self.viewController.locationBarViewController = locationBarViewController; } +- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState { + BOOL isNTP = IsVisibleURLNewTabPage(webState); + + [self.mediator updateConsumerForWebState:webState]; + [self.viewController updateForSideSwipeSnapshotOnNTP:isNTP]; +} + +- (void)resetToolbarAfterSideSwipeSnapshot { + [self.mediator updateConsumerForWebState:self.browser->GetWebStateList() + ->GetActiveWebState()]; + [self.viewController resetAfterSideSwipeSnapshot]; +} + #pragma mark - AdaptiveToolbarViewControllerDelegate - (void)exitFullscreen { @@ -193,17 +206,4 @@ return buttonFactory; } -- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState { - BOOL isNTP = IsVisibleURLNewTabPage(webState); - - [self.mediator updateConsumerForWebState:webState]; - [self.viewController updateForSideSwipeSnapshotOnNTP:isNTP]; -} - -- (void)resetToolbarAfterSideSwipeSnapshot { - [self.mediator updateConsumerForWebState:self.browser->GetWebStateList() - ->GetActiveWebState()]; - [self.viewController resetAfterSideSwipeSnapshot]; -} - @end
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h index e823b9d..8e109bdf 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h
@@ -13,6 +13,9 @@ // Sets the progress of the progressBar to 1 then hides it. - (void)stopProgressBar; +// Whether the toolbar has the omnibox. +- (BOOL)hasOmnibox; + @end #endif // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h index 5b75af3..8151dae 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
@@ -9,7 +9,7 @@ #import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_element.h" #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_updating.h" -#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" #import "ios/chrome/browser/ui/toolbar/toolbar_consumer.h" @protocol AdaptiveToolbarMenusProvider;
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm index aefc719a..fd44f8c 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm
@@ -365,6 +365,10 @@ }]; } +- (BOOL)hasOmnibox { + return self.locationBarViewController != nil; +} + #pragma mark - PopupMenuUIUpdating - (void)updateUIForOverflowMenuIPHDisplayed {
diff --git a/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn b/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn index a8c8bdf..374c470 100644 --- a/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
@@ -18,7 +18,6 @@ "toolbar_style.h", "toolbar_tab_grid_button.h", "toolbar_tab_grid_button.mm", - "toolbar_type.h", ] deps = [ "resources:omnibox_incognito_background_color", @@ -37,6 +36,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:util_swift", "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant", + "//ios/chrome/browser/ui/toolbar/public", "//ios/chrome/browser/ui/toolbar/public:constants", "//ios/chrome/browser/web", "//ios/chrome/common:button_config",
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_visibility_configuration.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_visibility_configuration.h index 5f446c2..312da175 100644 --- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_visibility_configuration.h +++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_visibility_configuration.h
@@ -8,7 +8,7 @@ #import <UIKit/UIKit.h> #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_component_options.h" -#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" // Toolbar button configuration object giving access to visibility mask for each // button.
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h deleted file mode 100644 index 1b048dc2..0000000 --- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_BUTTONS_TOOLBAR_TYPE_H_ -#define IOS_CHROME_BROWSER_UI_TOOLBAR_BUTTONS_TOOLBAR_TYPE_H_ - -// Enum defining the different styles for the toolbar. -enum class ToolbarType { - // Primary toolbar. - kPrimary, - // Secondary toolbar. - kSecondary, -}; - -#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_BUTTONS_TOOLBAR_TYPE_H_
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h index 715d66d2..5d2d0ca8 100644 --- a/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h +++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h
@@ -14,22 +14,10 @@ class WebState; } -// Delegate for events in `PrimaryToolbarCoordinator`. -@protocol PrimaryToolbarCoordinatorDelegate <NSObject> - -// Updates toolbars and location bar for the upcoming snapshot with `webState`. -- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState; -// Resets toolbars and location bar after the snapshot. -- (void)resetToolbarAfterSideSwipeSnapshot; - -@end - // Coordinator for the primary part, the one at the top of the screen, of the // adaptive toolbar. @interface PrimaryToolbarCoordinator : AdaptiveToolbarCoordinator -// Delegate for events in `PrimaryToolbarCoordinator`. -@property(nonatomic, weak) id<PrimaryToolbarCoordinatorDelegate> delegate; // A reference to the view controller that implements the tooblar animation // protocol. @property(nonatomic, weak, readonly) id<ToolbarAnimatee> toolbarAnimatee;
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm index 0ccce3b7..da9d212 100644 --- a/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm +++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
@@ -98,16 +98,4 @@ [self.viewController triggerToolbarSlideInAnimationFromBelow:NO]; } -#pragma mark - Protected override - -- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState { - [super updateToolbarForSideSwipeSnapshot:webState]; - [self.delegate updateToolbarForSideSwipeSnapshot:webState]; -} - -- (void)resetToolbarAfterSideSwipeSnapshot { - [super resetToolbarAfterSideSwipeSnapshot]; - [self.delegate resetToolbarAfterSideSwipeSnapshot]; -} - @end
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm index fac77ec18..537d025 100644 --- a/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm +++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
@@ -77,7 +77,11 @@ [super resetAfterSideSwipeSnapshot]; self.view.backgroundColor = self.buttonFactory.toolbarConfiguration.backgroundColor; - self.view.locationBarContainer.hidden = NO; + if (self.hasOmnibox) { + self.view.locationBarContainer.hidden = NO; + } else { + DCHECK(IsBottomOmniboxSteadyStateEnabled()); + } } #pragma mark - NewTabPageControllerDelegate
diff --git a/ios/chrome/browser/ui/toolbar/public/BUILD.gn b/ios/chrome/browser/ui/toolbar/public/BUILD.gn index 2fe08fd..3f50925 100644 --- a/ios/chrome/browser/ui/toolbar/public/BUILD.gn +++ b/ios/chrome/browser/ui/toolbar/public/BUILD.gn
@@ -10,6 +10,7 @@ "side_swipe_toolbar_snapshot_providing.h", "toolbar_coordinating.h", "toolbar_height_delegate.h", + "toolbar_type.h", "toolbar_utils.h", "toolbar_utils.mm", ]
diff --git a/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h b/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h index db6cdf6..b1cd6896 100644 --- a/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h +++ b/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h
@@ -7,6 +7,8 @@ #import <UIKit/UIKit.h> +enum class ToolbarType; + namespace web { class WebState; } // namespace web @@ -16,7 +18,8 @@ // Returns a snapshot of the toolbar with the controls visibility adapted to // `webState`. -- (UIImage*)toolbarSideSwipeSnapshotForWebState:(web::WebState*)webState; +- (UIImage*)toolbarSideSwipeSnapshotForWebState:(web::WebState*)webState + withToolbarType:(ToolbarType)toolbarType; @end
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_type.h b/ios/chrome/browser/ui/toolbar/public/toolbar_type.h new file mode 100644 index 0000000..d860538 --- /dev/null +++ b/ios/chrome/browser/ui/toolbar/public/toolbar_type.h
@@ -0,0 +1,16 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_TOOLBAR_TYPE_H_ +#define IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_TOOLBAR_TYPE_H_ + +// Enum defining the different types for the toolbar. +enum class ToolbarType { + // Primary (top) toolbar. + kPrimary, + // Secondary (bottom) toolbar. + kSecondary, +}; + +#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_TOOLBAR_TYPE_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/toolbar_coordinator.h index 4cd4dbf..7781a7fa 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_coordinator.h +++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinator.h
@@ -8,24 +8,23 @@ #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_updating.h" #import "ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h" +#import "ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_coordinating.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_height_delegate.h" @protocol OmniboxPopupPresenterDelegate; @protocol OmniboxFocusDelegate; -@class PrimaryToolbarCoordinator; -@class PrimaryToolbarViewController; @protocol SharingPositioner; -@class SecondaryToolbarViewController; -@protocol SideSwipeToolbarSnapshotProviding; /// Coordinator above primary and secondary toolbars. It does not have a /// view controller. This object is also an interface between multiple toolbars /// and the objects which want to interact with them without having to know to /// which one specifically send the call. -@interface ToolbarCoordinator : ChromeCoordinator <FakeboxFocuser, - PopupMenuUIUpdating, - ToolbarCoordinating> +@interface ToolbarCoordinator + : ChromeCoordinator <FakeboxFocuser, + PopupMenuUIUpdating, + SideSwipeToolbarSnapshotProviding, + ToolbarCoordinating> /// Delegate for focusing omnibox in `locationBarCoordinator`. @property(nonatomic, weak) id<OmniboxFocusDelegate> omniboxFocusDelegate; @@ -67,13 +66,6 @@ /// Whether the omnibox popup is currently presented. - (BOOL)showingOmniboxPopup; -#pragma mark SnapshotProviding - -/// Returns the snapshop provider of primary toolbar. -- (id<SideSwipeToolbarSnapshotProviding>)primaryToolbarSnapshotProvider; -/// Returns the snapshop provider of secondary toolbar. -- (id<SideSwipeToolbarSnapshotProviding>)secondaryToolbarSnapshotProvider; - #pragma mark ToolbarHeightProviding /// The minimum height of the primary toolbar.
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/toolbar_coordinator.mm index 45fcf4c9..75d2086 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_coordinator.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinator.mm
@@ -27,6 +27,7 @@ #import "ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller_delegate.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h" #import "ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h" @@ -37,8 +38,7 @@ #error "This file requires ARC support." #endif -@interface ToolbarCoordinator () <PrimaryToolbarCoordinatorDelegate, - PrimaryToolbarViewControllerDelegate, +@interface ToolbarCoordinator () <PrimaryToolbarViewControllerDelegate, ToolbarCommands, ToolbarMediatorDelegate> { PrerenderService* _prerenderService; @@ -117,7 +117,6 @@ self.popupPresenterDelegate; [self.locationBarCoordinator start]; - self.primaryToolbarCoordinator.delegate = self; self.primaryToolbarCoordinator.viewControllerDelegate = self; [self.primaryToolbarCoordinator start]; [self.secondaryToolbarCoordinator start]; @@ -253,16 +252,6 @@ return [self.locationBarCoordinator showingOmniboxPopup]; } -#pragma mark SnapshotProviding - -- (id<SideSwipeToolbarSnapshotProviding>)primaryToolbarSnapshotProvider { - return self.primaryToolbarCoordinator; -} - -- (id<SideSwipeToolbarSnapshotProviding>)secondaryToolbarSnapshotProvider { - return self.secondaryToolbarCoordinator; -} - #pragma mark ToolbarHeightProviding - (CGFloat)collapsedPrimaryToolbarHeight { @@ -371,25 +360,6 @@ } } -#pragma mark - PrimaryToolbarCoordinatorDelegate - -- (void)updateToolbarForSideSwipeSnapshot:(web::WebState*)webState { - BOOL isNTP = IsVisibleURLNewTabPage(webState); - - // Don't do anything for a live non-ntp tab. - if (webState == self.browser->GetWebStateList()->GetActiveWebState() && - !isNTP) { - [self.locationBarCoordinator.locationBarViewController.view setHidden:NO]; - } else { - self.primaryToolbarViewController.view.hidden = NO; - [self.locationBarCoordinator.locationBarViewController.view setHidden:YES]; - } -} - -- (void)resetToolbarAfterSideSwipeSnapshot { - [self.locationBarCoordinator.locationBarViewController.view setHidden:NO]; -} - #pragma mark - PrimaryToolbarViewControllerDelegate - (void)viewControllerTraitCollectionDidChange: @@ -425,6 +395,57 @@ return NO; } +#pragma mark - SideSwipeToolbarSnapshotProviding + +- (UIImage*)toolbarSideSwipeSnapshotForWebState:(web::WebState*)webState + withToolbarType:(ToolbarType)toolbarType { + AdaptiveToolbarCoordinator* adaptiveToolbarCoordinator = + [self coordinatorWithToolbarType:toolbarType]; + + [self updateLocationBarForSideSwipeSnapshot:webState]; + [adaptiveToolbarCoordinator updateToolbarForSideSwipeSnapshot:webState]; + + UIImage* toolbarSnapshot = CaptureViewWithOption( + adaptiveToolbarCoordinator.viewController.view, + [[UIScreen mainScreen] scale], kClientSideRendering); + + [adaptiveToolbarCoordinator resetToolbarAfterSideSwipeSnapshot]; + [self resetLocationBarAfterSideSwipeSnapshot]; + + return toolbarSnapshot; +} + +#pragma mark SideSwipeToolbarSnapshotProviding Private + +/// Returns the coordinator coresponding to `toolbarType`. +- (AdaptiveToolbarCoordinator*)coordinatorWithToolbarType: + (ToolbarType)toolbarType { + switch (toolbarType) { + case ToolbarType::kPrimary: + return self.primaryToolbarCoordinator; + case ToolbarType::kSecondary: + return self.secondaryToolbarCoordinator; + } +} + +/// Prepares location bar for a side swipe snapshot with`webState`. +- (void)updateLocationBarForSideSwipeSnapshot:(web::WebState*)webState { + BOOL isNTP = IsVisibleURLNewTabPage(webState); + // Don't do anything for a live non-ntp tab. + if (webState == self.browser->GetWebStateList()->GetActiveWebState() && + !isNTP) { + [self.locationBarCoordinator.locationBarViewController.view setHidden:NO]; + } else { + self.primaryToolbarViewController.view.hidden = NO; + [self.locationBarCoordinator.locationBarViewController.view setHidden:YES]; + } +} + +/// Resets location bar after a side swipe snapshot. +- (void)resetLocationBarAfterSideSwipeSnapshot { + [self.locationBarCoordinator.locationBarViewController.view setHidden:NO]; +} + #pragma mark - ToolbarCommands - (void)triggerToolbarSlideInAnimation {
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_mediator.h b/ios/chrome/browser/ui/toolbar/toolbar_mediator.h index f7cabf3b..f4c7b87 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_mediator.h +++ b/ios/chrome/browser/ui/toolbar/toolbar_mediator.h
@@ -9,7 +9,7 @@ #import <UIKit/UIKit.h> #import "components/prefs/pref_service.h" -#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h" +#import "ios/chrome/browser/ui/toolbar/public/toolbar_type.h" class WebStateList;
diff --git a/ios/web/crw_navigation_item_storage.mm b/ios/web/crw_navigation_item_storage.mm index 1117b8b6..b9bf156 100644 --- a/ios/web/crw_navigation_item_storage.mm +++ b/ios/web/crw_navigation_item_storage.mm
@@ -73,9 +73,17 @@ storage.set_title(base::UTF16ToUTF8(_title)); web::SerializeTimeToProto(_timestamp, *storage.mutable_timestamp()); storage.set_user_agent(web::UserAgentTypeToProto(_userAgentType)); - web::SerializeReferrerToProto(_referrer, *storage.mutable_referrer()); - web::SerializeHttpRequestHeadersToProto( - _HTTPRequestHeaders, *storage.mutable_http_request_headers()); + // To reduce disk usage, NavigationItemImpl does not serialize invalid + // referrer or empty HTTP header map. The helper function responsible + // for the serialisation enforces this with assertion, so skip items + // that should not be serialised. + if (_referrer.url.is_valid()) { + web::SerializeReferrerToProto(_referrer, *storage.mutable_referrer()); + } + if (_HTTPRequestHeaders.count) { + web::SerializeHttpRequestHeadersToProto( + _HTTPRequestHeaders, *storage.mutable_http_request_headers()); + } } #pragma mark - NSObject
diff --git a/ios/web/net/cookies/crw_wk_http_cookie_store_unittest.mm b/ios/web/net/cookies/crw_wk_http_cookie_store_unittest.mm index 6128e6f2..97c95f7 100644 --- a/ios/web/net/cookies/crw_wk_http_cookie_store_unittest.mm +++ b/ios/web/net/cookies/crw_wk_http_cookie_store_unittest.mm
@@ -28,7 +28,9 @@ public: CRWWKHTTPCookieStoreTest() : crw_cookie_store_([[CRWWKHTTPCookieStore alloc] init]) { - mock_http_cookie_store_ = OCMPartialMock(CreateDataStore().httpCookieStore); + wk_website_data_store_ = CreateDataStore(); + mock_http_cookie_store_ = + OCMPartialMock(wk_website_data_store_.httpCookieStore); crw_cookie_store_.HTTPCookieStore = mock_http_cookie_store_; NSURL* test_cookie_url = [NSURL URLWithString:@"http://foo.google.com/bar"]; test_cookie_1_ = [NSHTTPCookie cookieWithProperties:@{ @@ -102,6 +104,7 @@ protected: web::WebTaskEnvironment task_environment_; CRWWKHTTPCookieStore* crw_cookie_store_; + WKWebsiteDataStore* wk_website_data_store_ = nil; id mock_http_cookie_store_ = nil; NSHTTPCookie* test_cookie_1_ = nil; NSHTTPCookie* test_cookie_2_ = nil; @@ -192,7 +195,9 @@ // Change the internal cookie store. [mock_http_cookie_store_ stopMocking]; - mock_http_cookie_store_ = OCMPartialMock(CreateDataStore().httpCookieStore); + wk_website_data_store_ = CreateDataStore(); + mock_http_cookie_store_ = + OCMPartialMock(wk_website_data_store_.httpCookieStore); crw_cookie_store_.HTTPCookieStore = mock_http_cookie_store_; // Verify that internal getAllCookies is called.
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn index feb12e1..18d46702 100644 --- a/media/gpu/v4l2/BUILD.gn +++ b/media/gpu/v4l2/BUILD.gn
@@ -159,8 +159,6 @@ "test/h264_decoder.h", "test/h264_dpb.cc", "test/h264_dpb.h", - "test/h265_decoder.cc", - "test/h265_decoder.h", "test/upstream_pix_fmt.h", "test/v4l2_ioctl_shim.cc", "test/v4l2_ioctl_shim.h", @@ -173,6 +171,13 @@ "test/vp9_decoder.h", ] + if (enable_hevc_parser_and_hw_decoder) { + sources += [ + "test/h265_decoder.cc", + "test/h265_decoder.h", + ] + } + if (is_chromeos) { sources += [ "test/av1_decoder.cc",
diff --git a/media/gpu/v4l2/mt21/mt21_util.h b/media/gpu/v4l2/mt21/mt21_util.h index 71c96ca..9643db1 100644 --- a/media/gpu/v4l2/mt21/mt21_util.h +++ b/media/gpu/v4l2/mt21/mt21_util.h
@@ -42,20 +42,15 @@ // we put the function definitions in a different translation unit, we won't get // any inlining because the linker isn't smart enough for that. // -// This anonymous namespace also helps encourage inlining. By putting -// everything in the anonymous namespace, we are telling the compiler we don't -// intend to export these symbols, which gives the compiler more freedom to -// optimize them away. We could also use "static" for this purpose, but that's -// more idiomatic of C99 than C++. +// Just in case the compiler doesn't take the hint, we sprinkle some +// "always_inline" attributes in hot functions. // // The other alternative would be to just add all of these functions in one .cc // file. We chose not to do this because then we wouldn't be able to write // granular unit tests; we would just have to settle for one giant "decompress // frame" integration test. // -// TODO(b/286891480): Investigate how much latency we really save with this -// technique, and possibly move the bulk of this code into a .cc file if we find -// the latency benefit not worth the diminished readability. +// This technique alone cuts our latency by ~40%. namespace { constexpr size_t kNumOutputLanes = 16; @@ -480,10 +475,10 @@ // our longest Golomb-Rice code is 20 bits, but we can narrow for other parts of // the algorithm. -uint8x16_t inline NarrowToU8(uint32x4_t& vec1, - uint32x4_t& vec2, - uint32x4_t& vec3, - uint32x4_t& vec4) { +__attribute__((always_inline)) uint8x16_t NarrowToU8(uint32x4_t& vec1, + uint32x4_t& vec2, + uint32x4_t& vec3, + uint32x4_t& vec4) { return vcombine_u8(vmovn_u16(vcombine_u16(vmovn_u32(vec1), vmovn_u32(vec2))), vmovn_u16(vcombine_u16(vmovn_u32(vec3), vmovn_u32(vec4)))); } @@ -496,7 +491,7 @@ // code, this portion of the code is a good place to start poking. Supposedly // there was a penalty for unaligned reads on Aarch64 as well, but I can't find // any documentation for how many cycles that is on a Cortex A72 or A53. -uint32_t inline LoadUnalignedDword(uint32_t* ptr) { +__attribute__((always_inline)) uint32_t LoadUnalignedDword(uint32_t* ptr) { uint32_t ret; memcpy(&ret, ptr, sizeof(uint32_t)); return ret; @@ -505,11 +500,12 @@ // Helpful utility for managing the accumulator. This function effectively // discards |discard_size| bits and loads in more bytes from the bitstream as // needed. -void inline VectorManageAccumulator(uint32x4_t* accumulator, - uint32x4_t* outstanding_reads, - const uint32x4_t& discard_size, - int i, - uint8_t** compressed_ptr) { +__attribute__((always_inline)) void VectorManageAccumulator( + uint32x4_t* accumulator, + uint32x4_t* outstanding_reads, + const uint32x4_t& discard_size, + int i, + uint8_t** compressed_ptr) { // We always load in a fresh dword. Often it will be from the same offsets. // This is inefficient, but it's offset by the speedup of vectorization. outstanding_reads[i] = vaddq_u32(outstanding_reads[i], discard_size); @@ -535,13 +531,14 @@ // 6. binary_component = (accumulator << unary_len) >> (32 - binary_len) // 7. symbol = (k == 8) ? 0 : (unary_component << k) + binary_component // 8. symbol = symbol / 2 * (symbol % 2 ? -1 : 1) -uint8x16_t inline VectorReadGolombRiceSymbol(uint32x4_t* accumulator, - uint32x4_t* outstanding_reads, - uint32x4_t* escape_codes, - uint32x4_t* escape_binary_len_diff, - uint32x4_t* k_vals, - uint32x4_t* dword_solid_color_mask, - uint8_t** compressed_ptr) { +__attribute__((always_inline)) uint8x16_t VectorReadGolombRiceSymbol( + uint32x4_t* accumulator, + uint32x4_t* outstanding_reads, + uint32x4_t* escape_codes, + uint32x4_t* escape_binary_len_diff, + uint32x4_t* k_vals, + uint32x4_t* dword_solid_color_mask, + uint8_t** compressed_ptr) { // leading_ones = min(count_leading_zero(~accumulator), escape_codes) // escape_lanes = leading_ones == escape_codes uint32x4_t leading_ones[4]; @@ -618,8 +615,9 @@ } // Initializes the accumulator with the first 4 bytes of compressed data. -void VectorInitializeAccumulator(uint32x4_t* accumulator, - uint8_t** compressed_ptr) { +__attribute__((always_inline)) void VectorInitializeAccumulator( + uint32x4_t* accumulator, + uint8_t** compressed_ptr) { LOOPN( { accumulator[i][0] = @@ -636,14 +634,15 @@ // Reads the 11 bit header on the compressed data and initializes some important // vectors. -uint8x16_t VectorReadCompressedHeader(uint32x4_t* accumulator, - uint32x4_t* outstanding_reads, - uint32x4_t* escape_codes, - uint32x4_t* escape_binary_len_diff, - uint32x4_t* k_vals, - uint32x4_t* dword_solid_color_mask, - uint8x16_t& solid_color_mask, - uint8_t** compressed_ptr) { +__attribute__((always_inline)) uint8x16_t VectorReadCompressedHeader( + uint32x4_t* accumulator, + uint32x4_t* outstanding_reads, + uint32x4_t* escape_codes, + uint32x4_t* escape_binary_len_diff, + uint32x4_t* k_vals, + uint32x4_t* dword_solid_color_mask, + uint8x16_t& solid_color_mask, + uint8_t** compressed_ptr) { // Parse out our K value. // k = (accumulator >> 29) + 1 // 29 comes from 32 - 3, since 32 is the size of the accumulator and 3 is the @@ -718,17 +717,20 @@ // it turns out that using a series of ternary instructions (vbslq_u8) is // slightly faster. -uint8x16_t inline VectorFirstRowPrediction(const uint8x16_t& right) { +__attribute__((always_inline)) uint8x16_t VectorFirstRowPrediction( + const uint8x16_t& right) { return right; } -uint8x16_t inline VectorLastColPrediction(const uint8x16_t& up) { +__attribute__((always_inline)) uint8x16_t VectorLastColPrediction( + const uint8x16_t& up) { return up; } -uint8x16_t inline VectorFirstColPrediction(const uint8x16_t& up, - const uint8x16_t& up_right, - const uint8x16_t& right) { +__attribute__((always_inline)) uint8x16_t VectorFirstColPrediction( + const uint8x16_t& up, + const uint8x16_t& up_right, + const uint8x16_t& right) { const uint8x16_t min_pred = vminq_u8(up, right); const uint8x16_t max_pred = vmaxq_u8(up, right); const uint8x16_t right_grad = vreinterpretq_u8_s8(vaddq_s8( @@ -741,10 +743,11 @@ return pred; } -uint8x16_t inline VectorBodyPrediction(const uint8x16_t& up_left, - const uint8x16_t& up, - const uint8x16_t& up_right, - const uint8x16_t& right) { +__attribute__((always_inline)) uint8x16_t VectorBodyPrediction( + const uint8x16_t& up_left, + const uint8x16_t& up, + const uint8x16_t& up_right, + const uint8x16_t& right) { uint8x16_t min_pred = vminq_u8(up, right); uint8x16_t max_pred = vmaxq_u8(up, right); uint8x16_t right_grad = vreinterpretq_u8_s8(vaddq_s8(
diff --git a/media/gpu/v4l2/test/v4l2_stateless_decoder.cc b/media/gpu/v4l2/test/v4l2_stateless_decoder.cc index bb5b17e..62a410ca 100644 --- a/media/gpu/v4l2/test/v4l2_stateless_decoder.cc +++ b/media/gpu/v4l2/test/v4l2_stateless_decoder.cc
@@ -20,7 +20,9 @@ #include "media/gpu/v4l2/test/av1_decoder.h" #endif #include "media/gpu/v4l2/test/h264_decoder.h" +#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) #include "media/gpu/v4l2/test/h265_decoder.h" +#endif #include "media/gpu/v4l2/test/video_decoder.h" #include "media/gpu/v4l2/test/vp8_decoder.h" #include "media/gpu/v4l2/test/vp9_decoder.h" @@ -30,7 +32,9 @@ using media::v4l2_test::Av1Decoder; #endif using media::v4l2_test::H264Decoder; +#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) using media::v4l2_test::H265Decoder; +#endif using media::v4l2_test::VideoDecoder; using media::v4l2_test::Vp8Decoder; using media::v4l2_test::Vp9Decoder; @@ -118,9 +122,11 @@ if (!decoder) decoder = Vp8Decoder::Create(stream); +#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) if (!decoder) { decoder = H265Decoder::Create(stream); } +#endif return decoder; }
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index abc016e..366c09c 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2023-06-27 12:55 UTC +# Last updated: 2023-06-28 12:54 UTC PinsListTimestamp -1687870533 +1687956894 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index 413f0f9..cc45bb2 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2023-06-27 12:55 UTC +// Last updated: 2023-06-28 12:54 UTC // { "pinsets": [
diff --git a/sandbox/win/src/nt_internals.h b/sandbox/win/src/nt_internals.h index 9a7c6472..72d96b9 100644 --- a/sandbox/win/src/nt_internals.h +++ b/sandbox/win/src/nt_internals.h
@@ -193,12 +193,6 @@ IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL); -typedef NTSTATUS(WINAPI* NtSetInformationProcessFunction)( - HANDLE ProcessHandle, - IN PROCESSINFOCLASS ProcessInformationClass, - IN PVOID ProcessInformation, - IN ULONG ProcessInformationLength); - typedef NTSTATUS(WINAPI* NtOpenThreadTokenFunction)(IN HANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, @@ -223,18 +217,6 @@ IN ULONG HandleAttributes, OUT PHANDLE TokenHandle); -typedef NTSTATUS(WINAPI* RtlCreateUserThreadFunction)( - IN HANDLE Process, - IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor, - IN BOOLEAN CreateSuspended, - IN ULONG ZeroBits, - IN SIZE_T MaximumStackSize, - IN SIZE_T CommittedStackSize, - IN LPTHREAD_START_ROUTINE StartAddress, - IN PVOID Parameter, - OUT PHANDLE Thread, - OUT PCLIENT_ID ClientId); - // ----------------------------------------------------------------------- // Memory
diff --git a/sandbox/win/src/sandbox_nt_types.h b/sandbox/win/src/sandbox_nt_types.h index 03b57e0..2000c3b 100644 --- a/sandbox/win/src/sandbox_nt_types.h +++ b/sandbox/win/src/sandbox_nt_types.h
@@ -9,6 +9,7 @@ namespace sandbox { +// clang-format off struct NtExports { bool Initialized; NtAllocateVirtualMemoryFunction AllocateVirtualMemory; @@ -18,9 +19,7 @@ NtDuplicateObjectFunction DuplicateObject; NtFreeVirtualMemoryFunction FreeVirtualMemory; NtMapViewOfSectionFunction MapViewOfSection; - NtOpenFileFunction OpenFile; NtOpenThreadFunction OpenThread; - NtOpenProcessFunction OpenProcess; NtOpenProcessTokenExFunction OpenProcessTokenEx; NtProtectVirtualMemoryFunction ProtectVirtualMemory; NtQueryAttributesFileFunction QueryAttributesFile; @@ -30,7 +29,6 @@ NtQuerySectionFunction QuerySection; NtQueryVirtualMemoryFunction QueryVirtualMemory; NtSetInformationFileFunction SetInformationFile; - NtSetInformationProcessFunction SetInformationProcess; NtSignalAndWaitForSingleObjectFunction SignalAndWaitForSingleObject; NtUnmapViewOfSectionFunction UnmapViewOfSection; NtWaitForSingleObjectFunction WaitForSingleObject; @@ -38,7 +36,6 @@ RtlAnsiStringToUnicodeStringFunction RtlAnsiStringToUnicodeString; RtlCompareUnicodeStringFunction RtlCompareUnicodeString; RtlCreateHeapFunction RtlCreateHeap; - RtlCreateUserThreadFunction RtlCreateUserThread; RtlDestroyHeapFunction RtlDestroyHeap; RtlFreeHeapFunction RtlFreeHeap; RtlNtStatusToDosErrorFunction RtlNtStatusToDosError; @@ -47,6 +44,7 @@ wcslenFunction wcslen; memcpyFunction memcpy; }; +// clang-format on // This is the value used for the ntdll level allocator. enum AllocationType {
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc index d7e71ba..82e911d 100644 --- a/sandbox/win/src/sandbox_nt_util.cc +++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -136,9 +136,7 @@ INIT_NT(DuplicateObject); INIT_NT(FreeVirtualMemory); INIT_NT(MapViewOfSection); - INIT_NT(OpenFile); INIT_NT(OpenThread); - INIT_NT(OpenProcess); INIT_NT(OpenProcessTokenEx); INIT_NT(ProtectVirtualMemory); INIT_NT(QueryAttributesFile); @@ -148,16 +146,13 @@ INIT_NT(QuerySection); INIT_NT(QueryVirtualMemory); INIT_NT(SetInformationFile); - INIT_NT(SetInformationProcess); INIT_NT(SignalAndWaitForSingleObject); INIT_NT(UnmapViewOfSection); INIT_NT(WaitForSingleObject); - INIT_RTL(RtlAllocateHeap); INIT_RTL(RtlAnsiStringToUnicodeString); INIT_RTL(RtlCompareUnicodeString); INIT_RTL(RtlCreateHeap); - INIT_RTL(RtlCreateUserThread); INIT_RTL(RtlDestroyHeap); INIT_RTL(RtlFreeHeap); INIT_RTL(RtlNtStatusToDosError);
diff --git a/services/device/public/cpp/device_feature_map.cc b/services/device/public/cpp/device_feature_map.cc index 2fc5ff5..267af24 100644 --- a/services/device/public/cpp/device_feature_map.cc +++ b/services/device/public/cpp/device_feature_map.cc
@@ -19,10 +19,10 @@ // code base. const base::Feature* const kFeaturesExposedToJava[] = { &device::kWebAuthnAndroidCredMan, + &device::kWebAuthnAndroidHybridClientUi, + &device::kWebAuthnCableViaCredMan, &device::kWebAuthnHybridLinkWithoutNotifications, &kGenericSensorExtraClasses, - &device::kWebAuthnHybridLinkWithoutNotifications, - &device::kWebAuthnAndroidHybridClientUi, }; // static
diff --git a/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java b/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java index 0e57fc9..2c8f3299a 100644 --- a/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java +++ b/services/device/public/java/src/org/chromium/device/DeviceFeatureList.java
@@ -16,8 +16,9 @@ public abstract class DeviceFeatureList { public static final String GENERIC_SENSOR_EXTRA_CLASSES = "GenericSensorExtraClasses"; public static final String WEBAUTHN_ANDROID_CRED_MAN = "WebAuthenticationAndroidCredMan"; - public static final String WEBAUTHN_HYBRID_LINK_WITHOUT_NOTIFICATIONS = - "WebAuthenticationHybridLinkWithoutNotifications"; public static final String WEBAUTHN_ANDROID_HYBRID_CLIENT_UI = "WebAuthenticationAndroidHybridClientUi"; + public static final String WEBAUTHN_CABLE_VIA_CREDMAN = "WebAuthenticationCableViaCredMan"; + public static final String WEBAUTHN_HYBRID_LINK_WITHOUT_NOTIFICATIONS = + "WebAuthenticationHybridLinkWithoutNotifications"; }
diff --git a/services/network/attribution/attribution_request_helper.h b/services/network/attribution/attribution_request_helper.h index abd03af..5c5a6d34 100644 --- a/services/network/attribution/attribution_request_helper.h +++ b/services/network/attribution/attribution_request_helper.h
@@ -52,10 +52,10 @@ kMaxValue = kNonSuitable, }; - // TODO(crbug.com/1440744): Review the number of verification tokens per - // trigger. The higher the number, the more work and bandwidth is needed to - // generate report verification tokens. The lower the number, the more likely - // it is that some reports will be sent without a verification token. + // The higher the number, the more work and bandwidth is needed to generate + // report verification tokens. The lower the number, the more likely it is + // that some reports will be sent without a verification token. Using 3, the + // probability of failure is ~.04%. See. https://crbug.com/1440744#c1 static constexpr size_t kVerificationTokensPerTrigger = 3; // Creates an AttributionRequestHelper instance if needed.
diff --git a/services/network/cors/cors_url_loader_factory_unittest.cc b/services/network/cors/cors_url_loader_factory_unittest.cc index 2c84c9d..65abcfd 100644 --- a/services/network/cors/cors_url_loader_factory_unittest.cc +++ b/services/network/cors/cors_url_loader_factory_unittest.cc
@@ -35,7 +35,6 @@ constexpr int kProcessId = 123; constexpr int kRequestId = 456; -constexpr ResourceScheduler::ClientId kResourceSchedulerClientId(99); } // namespace @@ -80,7 +79,7 @@ url::Origin::Create(test_server_.base_url()); auto resource_scheduler_client = base::MakeRefCounted<ResourceSchedulerClient>( - kResourceSchedulerClientId, IsBrowserInitiated(false), + ResourceScheduler::ClientId::Create(), IsBrowserInitiated(false), &resource_scheduler_, url_request_context_->network_quality_estimator()); cors_url_loader_factory_ = std::make_unique<CorsURLLoaderFactory>(
diff --git a/services/network/cors/cors_url_loader_test_util.cc b/services/network/cors/cors_url_loader_test_util.cc index 5566a28..33996d1 100644 --- a/services/network/cors/cors_url_loader_test_util.cc +++ b/services/network/cors/cors_url_loader_test_util.cc
@@ -294,11 +294,10 @@ auto resource_scheduler_client = base::MakeRefCounted<ResourceSchedulerClient>( - last_issued_resource_scheduler_client_id_, + ResourceScheduler::ClientId::Create(), IsBrowserInitiated(process_id == mojom::kBrowserProcessId), &resource_scheduler_, url_request_context_->network_quality_estimator()); - last_issued_resource_scheduler_client_id_.Increment(); cors_url_loader_factory_remote_.reset(); cors_url_loader_factory_ = std::make_unique<CorsURLLoaderFactory>( network_context_.get(), std::move(factory_params),
diff --git a/services/network/cors/cors_url_loader_test_util.h b/services/network/cors/cors_url_loader_test_util.h index f7bc6d2..2f6a87bf 100644 --- a/services/network/cors/cors_url_loader_test_util.h +++ b/services/network/cors/cors_url_loader_test_util.h
@@ -345,8 +345,6 @@ // TestURLLoaderClient that records callback activities. std::unique_ptr<TestURLLoaderClient> test_cors_loader_client_; - ResourceScheduler::ClientId last_issued_resource_scheduler_client_id_{765}; - // Holds for allowed origin access lists. OriginAccessList origin_access_list_;
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index ef82226..e96168ed 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -763,11 +763,10 @@ mojom::URLLoaderFactoryParamsPtr params) { scoped_refptr<ResourceSchedulerClient> resource_scheduler_client = base::MakeRefCounted<ResourceSchedulerClient>( - current_resource_scheduler_client_id_, + ResourceScheduler::ClientId::Create(), IsBrowserInitiated(params->process_id == mojom::kBrowserProcessId), resource_scheduler_.get(), url_request_context_->network_quality_estimator()); - current_resource_scheduler_client_id_.Increment(); CreateURLLoaderFactory(std::move(receiver), std::move(params), std::move(resource_scheduler_client)); }
diff --git a/services/network/network_context.h b/services/network/network_context.h index 3f8e1d6..952bca1 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -835,8 +835,6 @@ base::UniquePtrComparator> restricted_cookie_managers_; - ResourceScheduler::ClientId current_resource_scheduler_client_id_{0}; - // Owned by the URLRequestContext raw_ptr<net::StaticHttpUserAgentSettings> user_agent_settings_ = nullptr;
diff --git a/services/network/resource_scheduler/resource_scheduler.cc b/services/network/resource_scheduler/resource_scheduler.cc index dbde3893..b873aac 100644 --- a/services/network/resource_scheduler/resource_scheduler.cc +++ b/services/network/resource_scheduler/resource_scheduler.cc
@@ -143,6 +143,12 @@ "queued_requests_dispatch_periodicity_ms", 100)); } +// static +ResourceScheduler::ClientId ResourceScheduler::ClientId::Create() { + static uint64_t next_client_id = 0; + return ClientId(next_client_id++); +} + struct ResourceScheduler::RequestPriorityParams { RequestPriorityParams() : priority(net::DEFAULT_PRIORITY), intra_priority(0) {}
diff --git a/services/network/resource_scheduler/resource_scheduler.h b/services/network/resource_scheduler/resource_scheduler.h index 6b63d32..24e236b 100644 --- a/services/network/resource_scheduler/resource_scheduler.h +++ b/services/network/resource_scheduler/resource_scheduler.h
@@ -69,20 +69,19 @@ // the URLRequest. class COMPONENT_EXPORT(NETWORK_SERVICE) ResourceScheduler { public: - class ClientId final { + class COMPONENT_EXPORT(NETWORK_SERVICE) ClientId final { public: - explicit constexpr ClientId(uint64_t id) : id_(id) {} + static ClientId Create(); + ~ClientId() = default; - void Increment() { ++id_; } bool operator<(const ClientId& that) const { return id_ < that.id_; } bool operator==(const ClientId& that) const { return id_ == that.id_; } - constexpr ClientId AddForTesting(uint64_t n) const { - return ClientId(id_ + n); - } + static ClientId CreateForTest(uint64_t id) { return ClientId(id); } private: + explicit ClientId(uint64_t id) : id_(id) {} uint64_t id_; };
diff --git a/services/network/resource_scheduler/resource_scheduler_unittest.cc b/services/network/resource_scheduler/resource_scheduler_unittest.cc index 52af38d..7647b328 100644 --- a/services/network/resource_scheduler/resource_scheduler_unittest.cc +++ b/services/network/resource_scheduler/resource_scheduler_unittest.cc
@@ -82,10 +82,10 @@ class TestRequestFactory; using ClientId = ResourceScheduler::ClientId; -constexpr ClientId kClientId1(30); -constexpr ClientId kClientId2(60); -constexpr ClientId kTrustedClientId(120); -constexpr ClientId kBackgroundClientId(150); +const ClientId kClientId1 = ClientId::CreateForTest(30); +const ClientId kClientId2 = ClientId::CreateForTest(60); +const ClientId kTrustedClientId = ClientId::CreateForTest(120); +const ClientId kBackgroundClientId = ClientId::CreateForTest(150); const size_t kMaxNumDelayableRequestsPerHostPerClient = 6;
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index 70d5309a..eacbff1 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -756,7 +756,7 @@ url_request_context_ = context_builder.Build(); context().set_url_request_context(url_request_context_.get()); resource_scheduler_client_ = base::MakeRefCounted<ResourceSchedulerClient>( - kResourceSchedulerClientId, IsBrowserInitiated(false), + ResourceScheduler::ClientId::Create(), IsBrowserInitiated(false), &resource_scheduler_, url_request_context_->network_quality_estimator()); context().set_resource_scheduler_client(resource_scheduler_client_.get()); @@ -1144,7 +1144,6 @@ static constexpr int kProcessId = 4; static constexpr int kRouteId = 8; - static constexpr ResourceScheduler::ClientId kResourceSchedulerClientId{99}; // |OnServerReceivedRequest| allows subclasses to register additional logic to // execute once a request reaches the test server.
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json index 5eb40273..3490ba0e 100644 --- a/testing/buildbot/chromium.angle.json +++ b/testing/buildbot/chromium.angle.json
@@ -80,7 +80,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "containment_type": "AUTO", @@ -136,7 +136,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "containment_type": "AUTO",
diff --git a/testing/buildbot/chromium.cft.json b/testing/buildbot/chromium.cft.json index 7bbfd58..dbca8d9 100644 --- a/testing/buildbot/chromium.cft.json +++ b/testing/buildbot/chromium.cft.json
@@ -1011,23 +1011,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "nacl_loader_unittests", - "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "dimension_sets": [ - { - "cpu": "arm64", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "native_theme_unittests", "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/" }, @@ -1199,23 +1182,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "remoting_unittests", - "test_id_prefix": "ninja://remoting:remoting_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "dimension_sets": [ - { - "cpu": "arm64", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "sandbox_linux_unittests", "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" }, @@ -1495,23 +1461,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "vr_common_unittests", - "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "dimension_sets": [ - { - "cpu": "arm64", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 7a52fe0..26773ee 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -159,7 +159,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -244,7 +244,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2244,7 +2244,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -2314,7 +2314,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json index 2f24baad..6833495 100644 --- a/testing/buildbot/chromium.coverage.json +++ b/testing/buildbot/chromium.coverage.json
@@ -9694,7 +9694,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9746,7 +9746,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9798,7 +9798,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9850,7 +9850,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9902,7 +9902,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9954,7 +9954,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10006,7 +10006,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10058,7 +10058,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10110,7 +10110,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10162,7 +10162,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10214,7 +10214,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10266,7 +10266,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10318,7 +10318,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10370,7 +10370,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10422,7 +10422,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10474,7 +10474,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10526,7 +10526,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10578,7 +10578,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10630,7 +10630,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10682,7 +10682,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10734,7 +10734,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10786,7 +10786,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10838,7 +10838,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10890,7 +10890,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10942,7 +10942,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10994,7 +10994,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11046,7 +11046,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11098,7 +11098,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11150,7 +11150,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11202,7 +11202,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11254,7 +11254,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11306,7 +11306,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11358,7 +11358,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11410,7 +11410,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11462,7 +11462,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11514,7 +11514,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11567,7 +11567,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11620,7 +11620,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11673,7 +11673,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11726,7 +11726,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11779,7 +11779,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11832,7 +11832,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11885,7 +11885,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11938,7 +11938,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11992,7 +11992,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12046,7 +12046,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12100,7 +12100,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12154,7 +12154,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12208,7 +12208,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12262,7 +12262,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12316,7 +12316,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12370,7 +12370,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12424,7 +12424,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12478,7 +12478,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12532,7 +12532,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12586,7 +12586,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12640,7 +12640,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12694,7 +12694,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12748,7 +12748,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12802,7 +12802,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12856,7 +12856,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12910,7 +12910,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12964,7 +12964,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13018,7 +13018,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13072,7 +13072,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13125,7 +13125,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13178,7 +13178,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13231,7 +13231,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13284,7 +13284,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13337,7 +13337,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13390,7 +13390,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13443,7 +13443,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13497,7 +13497,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13551,7 +13551,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13605,7 +13605,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13659,7 +13659,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13713,7 +13713,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13767,7 +13767,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13820,7 +13820,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13872,7 +13872,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13924,7 +13924,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13976,7 +13976,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14028,7 +14028,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14080,7 +14080,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14132,7 +14132,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14184,7 +14184,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14237,7 +14237,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14291,7 +14291,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14345,7 +14345,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14399,7 +14399,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14453,7 +14453,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14507,7 +14507,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14561,7 +14561,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14614,7 +14614,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14666,7 +14666,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14718,7 +14718,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14771,7 +14771,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14824,7 +14824,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14876,7 +14876,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14929,7 +14929,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14982,7 +14982,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15035,7 +15035,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15088,7 +15088,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15141,7 +15141,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15194,7 +15194,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15247,7 +15247,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15299,7 +15299,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15351,7 +15351,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15403,7 +15403,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15455,7 +15455,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15507,7 +15507,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15559,7 +15559,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15611,7 +15611,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15663,7 +15663,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15715,7 +15715,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15767,7 +15767,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15820,7 +15820,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15873,7 +15873,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15926,7 +15926,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15979,7 +15979,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16032,7 +16032,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16085,7 +16085,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16138,7 +16138,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16190,7 +16190,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16242,7 +16242,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16294,7 +16294,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16346,7 +16346,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16398,7 +16398,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16450,7 +16450,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16502,7 +16502,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16554,7 +16554,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16606,7 +16606,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16658,7 +16658,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16710,7 +16710,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16762,7 +16762,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16814,7 +16814,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16866,7 +16866,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16918,7 +16918,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16970,7 +16970,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17022,7 +17022,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17074,7 +17074,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17126,7 +17126,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17178,7 +17178,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17230,7 +17230,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17282,7 +17282,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17334,7 +17334,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17386,7 +17386,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17438,7 +17438,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17490,7 +17490,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17542,7 +17542,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17594,7 +17594,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17646,7 +17646,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17698,7 +17698,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17750,7 +17750,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17802,7 +17802,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17854,7 +17854,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17906,7 +17906,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17958,7 +17958,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18010,7 +18010,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18062,7 +18062,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18114,7 +18114,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18166,7 +18166,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18218,7 +18218,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18270,7 +18270,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18322,7 +18322,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18374,7 +18374,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18426,7 +18426,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18478,7 +18478,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18530,7 +18530,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18582,7 +18582,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18634,7 +18634,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 856c93f..21078c8 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -1280,7 +1280,8 @@ "os": "Mac-13" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" @@ -4167,7 +4168,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4217,7 +4218,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4268,7 +4269,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4318,7 +4319,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4368,7 +4369,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4418,7 +4419,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4468,7 +4469,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4518,7 +4519,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4568,7 +4569,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4618,7 +4619,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4668,7 +4669,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4718,7 +4719,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4768,7 +4769,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4818,7 +4819,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4868,7 +4869,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4918,7 +4919,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -4970,7 +4971,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5024,7 +5025,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5074,7 +5075,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5124,7 +5125,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5174,7 +5175,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5224,7 +5225,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5274,7 +5275,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5324,7 +5325,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5374,7 +5375,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5424,7 +5425,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5474,7 +5475,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5524,7 +5525,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5574,7 +5575,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5624,7 +5625,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5674,7 +5675,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5724,7 +5725,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5774,7 +5775,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5824,7 +5825,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5874,7 +5875,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5924,7 +5925,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -5974,7 +5975,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6024,7 +6025,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6074,7 +6075,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6124,7 +6125,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6174,7 +6175,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6224,7 +6225,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6274,7 +6275,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6324,7 +6325,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6374,7 +6375,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6424,7 +6425,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6474,7 +6475,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6524,7 +6525,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6574,7 +6575,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6624,7 +6625,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6674,7 +6675,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6730,7 +6731,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6783,7 +6784,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6836,7 +6837,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6890,7 +6891,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6944,7 +6945,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -6998,7 +6999,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7052,7 +7053,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7106,7 +7107,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7160,7 +7161,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7213,7 +7214,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7266,7 +7267,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7320,7 +7321,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7374,7 +7375,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7428,7 +7429,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7482,7 +7483,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7535,7 +7536,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7588,7 +7589,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7641,7 +7642,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7699,7 +7700,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7749,7 +7750,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7799,7 +7800,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7849,7 +7850,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7899,7 +7900,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7949,7 +7950,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -7999,7 +8000,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8049,7 +8050,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8099,7 +8100,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8149,7 +8150,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8199,7 +8200,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8249,7 +8250,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8299,7 +8300,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8349,7 +8350,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8399,7 +8400,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8449,7 +8450,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8499,7 +8500,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8549,7 +8550,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8599,7 +8600,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8649,7 +8650,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8699,7 +8700,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8752,7 +8753,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8805,7 +8806,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8858,7 +8859,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8911,7 +8912,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8965,7 +8966,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9019,7 +9020,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9073,7 +9074,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9127,7 +9128,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9181,7 +9182,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9235,7 +9236,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9289,7 +9290,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9343,7 +9344,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9397,7 +9398,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9451,7 +9452,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9504,7 +9505,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9557,7 +9558,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9610,7 +9611,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9664,7 +9665,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9718,7 +9719,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9769,7 +9770,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9819,7 +9820,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9869,7 +9870,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9919,7 +9920,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9969,7 +9970,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10022,7 +10023,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10076,7 +10077,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10130,7 +10131,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10181,7 +10182,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10231,7 +10232,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10282,7 +10283,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10335,7 +10336,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10388,7 +10389,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10441,7 +10442,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10491,7 +10492,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10541,7 +10542,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10591,7 +10592,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10641,7 +10642,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10691,7 +10692,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10741,7 +10742,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10794,7 +10795,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10847,7 +10848,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10900,7 +10901,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10953,7 +10954,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11003,7 +11004,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11053,7 +11054,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11103,7 +11104,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11153,7 +11154,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11203,7 +11204,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11253,7 +11254,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11303,7 +11304,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11353,7 +11354,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11403,7 +11404,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11453,7 +11454,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11503,7 +11504,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11553,7 +11554,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11603,7 +11604,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11653,7 +11654,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11703,7 +11704,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11753,7 +11754,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11803,7 +11804,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11853,7 +11854,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11903,7 +11904,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11953,7 +11954,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12003,7 +12004,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12053,7 +12054,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12103,7 +12104,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12153,7 +12154,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12203,7 +12204,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12253,7 +12254,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12303,7 +12304,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12353,7 +12354,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12403,7 +12404,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12457,7 +12458,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12511,7 +12512,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12565,7 +12566,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12615,7 +12616,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12665,7 +12666,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12715,7 +12716,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12765,7 +12766,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12815,7 +12816,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12865,7 +12866,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12915,7 +12916,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12965,7 +12966,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13016,7 +13017,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13067,7 +13068,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13119,7 +13120,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13171,7 +13172,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13223,7 +13224,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13274,7 +13275,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13325,7 +13326,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13376,7 +13377,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13427,7 +13428,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13477,7 +13478,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13528,7 +13529,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13579,7 +13580,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13629,7 +13630,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13679,7 +13680,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13730,7 +13731,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13780,7 +13781,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13830,7 +13831,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13880,7 +13881,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13930,7 +13931,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13980,7 +13981,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14030,7 +14031,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14080,7 +14081,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14130,7 +14131,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14180,7 +14181,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14236,7 +14237,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14288,7 +14289,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14340,7 +14341,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14392,7 +14393,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14444,7 +14445,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14496,7 +14497,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14548,7 +14549,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14600,7 +14601,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14652,7 +14653,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14704,7 +14705,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14756,7 +14757,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14808,7 +14809,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14860,7 +14861,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14912,7 +14913,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14964,7 +14965,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15016,7 +15017,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15068,7 +15069,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15120,7 +15121,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15173,7 +15174,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15226,7 +15227,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15279,7 +15280,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15333,7 +15334,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15387,7 +15388,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15441,7 +15442,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15495,7 +15496,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15549,7 +15550,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15603,7 +15604,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15656,7 +15657,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15709,7 +15710,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15763,7 +15764,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15816,7 +15817,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15868,7 +15869,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15921,7 +15922,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15975,7 +15976,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16028,7 +16029,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16080,7 +16081,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16132,7 +16133,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16185,7 +16186,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16238,7 +16239,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16290,7 +16291,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16343,7 +16344,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16396,7 +16397,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16448,7 +16449,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16500,7 +16501,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16552,7 +16553,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16604,7 +16605,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16657,7 +16658,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16710,7 +16711,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16762,7 +16763,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16814,7 +16815,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16866,7 +16867,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16918,7 +16919,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16970,7 +16971,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17022,7 +17023,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17074,7 +17075,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17126,7 +17127,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17178,7 +17179,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17230,7 +17231,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17282,7 +17283,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17334,7 +17335,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17386,7 +17387,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17438,7 +17439,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17490,7 +17491,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17542,7 +17543,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17594,7 +17595,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17646,7 +17647,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17699,7 +17700,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17754,7 +17755,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17804,7 +17805,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17854,7 +17855,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17904,7 +17905,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17954,7 +17955,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18004,7 +18005,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18054,7 +18055,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18104,7 +18105,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18154,7 +18155,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18204,7 +18205,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18254,7 +18255,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18304,7 +18305,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18354,7 +18355,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18404,7 +18405,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18454,7 +18455,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18504,7 +18505,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18554,7 +18555,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18604,7 +18605,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18657,7 +18658,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18710,7 +18711,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18763,7 +18764,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18816,7 +18817,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18869,7 +18870,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18923,7 +18924,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18977,7 +18978,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19031,7 +19032,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19085,7 +19086,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19139,7 +19140,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19193,7 +19194,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19247,7 +19248,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19301,7 +19302,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19355,7 +19356,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19409,7 +19410,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19463,7 +19464,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19516,7 +19517,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19569,7 +19570,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19622,7 +19623,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19675,7 +19676,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19729,7 +19730,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19783,7 +19784,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19837,7 +19838,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19888,7 +19889,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19938,7 +19939,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19988,7 +19989,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20038,7 +20039,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20091,7 +20092,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20145,7 +20146,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20199,7 +20200,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20253,7 +20254,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20304,7 +20305,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20355,7 +20356,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20405,7 +20406,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20456,7 +20457,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20509,7 +20510,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20562,7 +20563,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20615,7 +20616,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20668,7 +20669,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20718,7 +20719,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20768,7 +20769,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20818,7 +20819,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20868,7 +20869,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20918,7 +20919,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -20971,7 +20972,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21024,7 +21025,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21077,7 +21078,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21127,7 +21128,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21177,7 +21178,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21227,7 +21228,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21277,7 +21278,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21327,7 +21328,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21377,7 +21378,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21427,7 +21428,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21477,7 +21478,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21527,7 +21528,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21577,7 +21578,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21627,7 +21628,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21677,7 +21678,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21727,7 +21728,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21777,7 +21778,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21827,7 +21828,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21877,7 +21878,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21927,7 +21928,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -21977,7 +21978,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22027,7 +22028,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22077,7 +22078,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22127,7 +22128,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22177,7 +22178,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22227,7 +22228,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22277,7 +22278,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22341,7 +22342,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22393,7 +22394,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22445,7 +22446,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22497,7 +22498,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22549,7 +22550,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22601,7 +22602,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22653,7 +22654,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22705,7 +22706,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22757,7 +22758,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22809,7 +22810,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22861,7 +22862,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22913,7 +22914,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -22965,7 +22966,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23017,7 +23018,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23069,7 +23070,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23121,7 +23122,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23173,7 +23174,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23225,7 +23226,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23280,7 +23281,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23335,7 +23336,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23390,7 +23391,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23445,7 +23446,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23501,7 +23502,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23557,7 +23558,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23613,7 +23614,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23669,7 +23670,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23725,7 +23726,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23781,7 +23782,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23837,7 +23838,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23893,7 +23894,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -23949,7 +23950,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24004,7 +24005,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24059,7 +24060,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24114,7 +24115,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24170,7 +24171,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24226,7 +24227,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24279,7 +24280,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24331,7 +24332,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24383,7 +24384,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24435,7 +24436,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24490,7 +24491,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24546,7 +24547,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24602,7 +24603,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24655,7 +24656,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24708,7 +24709,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24760,7 +24761,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24813,7 +24814,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24868,7 +24869,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24923,7 +24924,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -24978,7 +24979,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25030,7 +25031,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25082,7 +25083,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25134,7 +25135,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25186,7 +25187,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25238,7 +25239,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25293,7 +25294,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25348,7 +25349,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25403,7 +25404,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25455,7 +25456,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25507,7 +25508,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25559,7 +25560,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25611,7 +25612,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25663,7 +25664,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25715,7 +25716,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25767,7 +25768,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25819,7 +25820,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25871,7 +25872,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25923,7 +25924,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -25975,7 +25976,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26027,7 +26028,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26079,7 +26080,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26131,7 +26132,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26183,7 +26184,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26235,7 +26236,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26287,7 +26288,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26339,7 +26340,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26391,7 +26392,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26443,7 +26444,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26495,7 +26496,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26547,7 +26548,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26599,7 +26600,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26651,7 +26652,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26708,7 +26709,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26758,7 +26759,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26808,7 +26809,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26858,7 +26859,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26908,7 +26909,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -26958,7 +26959,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27008,7 +27009,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27058,7 +27059,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27108,7 +27109,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27158,7 +27159,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27208,7 +27209,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27258,7 +27259,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27308,7 +27309,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27358,7 +27359,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27408,7 +27409,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27458,7 +27459,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27508,7 +27509,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27558,7 +27559,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27608,7 +27609,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27658,7 +27659,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27708,7 +27709,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27761,7 +27762,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27814,7 +27815,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27867,7 +27868,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27921,7 +27922,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -27975,7 +27976,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28029,7 +28030,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28083,7 +28084,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28137,7 +28138,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28191,7 +28192,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28244,7 +28245,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28297,7 +28298,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28351,7 +28352,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28402,7 +28403,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28452,7 +28453,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28502,7 +28503,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28555,7 +28556,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28609,7 +28610,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28660,7 +28661,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28710,7 +28711,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28761,7 +28762,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28812,7 +28813,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28862,7 +28863,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28913,7 +28914,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -28964,7 +28965,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29014,7 +29015,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29067,7 +29068,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29120,7 +29121,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29170,7 +29171,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29220,7 +29221,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29270,7 +29271,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29320,7 +29321,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29370,7 +29371,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29423,7 +29424,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29476,7 +29477,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29526,7 +29527,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29576,7 +29577,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29626,7 +29627,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29676,7 +29677,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29726,7 +29727,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29776,7 +29777,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29826,7 +29827,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29876,7 +29877,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29926,7 +29927,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -29976,7 +29977,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30026,7 +30027,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30076,7 +30077,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30126,7 +30127,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30176,7 +30177,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30226,7 +30227,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30276,7 +30277,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30326,7 +30327,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30376,7 +30377,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30426,7 +30427,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30476,7 +30477,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30526,7 +30527,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30576,7 +30577,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30626,7 +30627,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30683,7 +30684,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30733,7 +30734,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30783,7 +30784,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30833,7 +30834,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30883,7 +30884,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30933,7 +30934,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -30983,7 +30984,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31033,7 +31034,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31083,7 +31084,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31133,7 +31134,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31183,7 +31184,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31233,7 +31234,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31283,7 +31284,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31333,7 +31334,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31383,7 +31384,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31433,7 +31434,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31483,7 +31484,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31533,7 +31534,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31583,7 +31584,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31633,7 +31634,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31683,7 +31684,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31734,7 +31735,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31785,7 +31786,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31836,7 +31837,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31888,7 +31889,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31940,7 +31941,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -31992,7 +31993,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32044,7 +32045,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32096,7 +32097,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32148,7 +32149,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32199,7 +32200,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32250,7 +32251,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32302,7 +32303,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32353,7 +32354,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32403,7 +32404,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32453,7 +32454,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32504,7 +32505,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32556,7 +32557,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32607,7 +32608,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32657,7 +32658,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32707,7 +32708,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32758,7 +32759,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32809,7 +32810,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32859,7 +32860,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32910,7 +32911,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -32961,7 +32962,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33011,7 +33012,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33061,7 +33062,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33111,7 +33112,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33161,7 +33162,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33211,7 +33212,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33262,7 +33263,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33313,7 +33314,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33363,7 +33364,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33413,7 +33414,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33463,7 +33464,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33513,7 +33514,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33563,7 +33564,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33613,7 +33614,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33663,7 +33664,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33713,7 +33714,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33763,7 +33764,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33813,7 +33814,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33863,7 +33864,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33913,7 +33914,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -33963,7 +33964,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34013,7 +34014,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34063,7 +34064,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34113,7 +34114,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34163,7 +34164,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34213,7 +34214,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34263,7 +34264,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34313,7 +34314,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34363,7 +34364,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34413,7 +34414,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -34463,7 +34464,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -44589,7 +44590,8 @@ } ], "expiration": 21600, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index ffe708b6..af8a05e4 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -1200,7 +1200,8 @@ "os": "Mac-10.15" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" @@ -8832,7 +8833,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8883,7 +8884,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8934,7 +8935,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -8985,7 +8986,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9036,7 +9037,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9087,7 +9088,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9138,7 +9139,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9189,7 +9190,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9240,7 +9241,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9291,7 +9292,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9342,7 +9343,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9393,7 +9394,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9445,7 +9446,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9497,7 +9498,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9548,7 +9549,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9599,7 +9600,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9650,7 +9651,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9702,7 +9703,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9753,7 +9754,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9804,7 +9805,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9855,7 +9856,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9907,7 +9908,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -9958,7 +9959,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10009,7 +10010,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10060,7 +10061,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10111,7 +10112,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10162,7 +10163,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10213,7 +10214,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10264,7 +10265,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10315,7 +10316,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10366,7 +10367,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10417,7 +10418,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10468,7 +10469,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10519,7 +10520,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10570,7 +10571,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10621,7 +10622,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10679,7 +10680,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10730,7 +10731,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10781,7 +10782,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10832,7 +10833,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10883,7 +10884,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10934,7 +10935,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -10985,7 +10986,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11036,7 +11037,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11087,7 +11088,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11138,7 +11139,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11189,7 +11190,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11240,7 +11241,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11291,7 +11292,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11342,7 +11343,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11393,7 +11394,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11444,7 +11445,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11495,7 +11496,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11546,7 +11547,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11598,7 +11599,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11650,7 +11651,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11702,7 +11703,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11754,7 +11755,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11806,7 +11807,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11859,7 +11860,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11912,7 +11913,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -11965,7 +11966,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12018,7 +12019,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12071,7 +12072,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12124,7 +12125,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12177,7 +12178,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12230,7 +12231,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12283,7 +12284,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12336,7 +12337,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12389,7 +12390,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12442,7 +12443,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12494,7 +12495,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12546,7 +12547,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12598,7 +12599,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12650,7 +12651,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12703,7 +12704,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12756,7 +12757,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12809,7 +12810,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12861,7 +12862,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12912,7 +12913,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -12963,7 +12964,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13014,7 +13015,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13066,7 +13067,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13119,7 +13120,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13172,7 +13173,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13225,7 +13226,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13277,7 +13278,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13328,7 +13329,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13380,7 +13381,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13432,7 +13433,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13484,7 +13485,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13536,7 +13537,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13588,7 +13589,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13639,7 +13640,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13690,7 +13691,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13741,7 +13742,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13792,7 +13793,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13843,7 +13844,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13895,7 +13896,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13947,7 +13948,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -13999,7 +14000,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14051,7 +14052,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14102,7 +14103,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14153,7 +14154,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14204,7 +14205,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14255,7 +14256,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14306,7 +14307,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14357,7 +14358,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14408,7 +14409,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14459,7 +14460,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14510,7 +14511,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14561,7 +14562,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14612,7 +14613,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14663,7 +14664,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14714,7 +14715,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14765,7 +14766,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14816,7 +14817,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14867,7 +14868,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14918,7 +14919,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14969,7 +14970,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15020,7 +15021,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15071,7 +15072,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15122,7 +15123,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15173,7 +15174,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15224,7 +15225,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15275,7 +15276,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15332,7 +15333,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15382,7 +15383,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15432,7 +15433,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15482,7 +15483,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15532,7 +15533,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15582,7 +15583,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15632,7 +15633,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15682,7 +15683,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15732,7 +15733,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15782,7 +15783,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15832,7 +15833,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15882,7 +15883,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15935,7 +15936,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15988,7 +15989,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16041,7 +16042,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16094,7 +16095,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16148,7 +16149,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16202,7 +16203,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16256,7 +16257,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16310,7 +16311,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16364,7 +16365,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16418,7 +16419,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16472,7 +16473,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16526,7 +16527,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16579,7 +16580,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16632,7 +16633,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16685,7 +16686,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16739,7 +16740,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16793,7 +16794,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16844,7 +16845,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16894,7 +16895,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16944,7 +16945,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16994,7 +16995,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17047,7 +17048,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17101,7 +17102,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17155,7 +17156,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17207,7 +17208,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17258,7 +17259,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17311,7 +17312,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17364,7 +17365,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17417,7 +17418,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17467,7 +17468,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17517,7 +17518,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17567,7 +17568,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17617,7 +17618,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17670,7 +17671,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17723,7 +17724,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17773,7 +17774,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17823,7 +17824,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17873,7 +17874,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17923,7 +17924,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -17973,7 +17974,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18023,7 +18024,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18073,7 +18074,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18123,7 +18124,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18173,7 +18174,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18223,7 +18224,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18273,7 +18274,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18323,7 +18324,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18373,7 +18374,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18423,7 +18424,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18473,7 +18474,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18523,7 +18524,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18573,7 +18574,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18623,7 +18624,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18673,7 +18674,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -18723,7 +18724,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19886,7 +19887,8 @@ "os": "Mac-11" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" @@ -21559,7 +21561,8 @@ "os": "Mac-12" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" @@ -23256,7 +23259,8 @@ "os": "Mac-13" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index d05468b..d4c6f60 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -1767,7 +1767,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1782,7 +1782,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1797,7 +1797,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1813,7 +1813,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1828,7 +1828,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1843,7 +1843,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1858,7 +1858,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1873,7 +1873,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1888,7 +1888,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1903,7 +1903,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1919,7 +1919,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1934,7 +1934,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1949,7 +1949,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1964,7 +1964,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1986,7 +1986,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2004,7 +2004,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2019,7 +2019,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2034,7 +2034,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2049,7 +2049,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2064,7 +2064,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2079,7 +2079,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2094,7 +2094,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2109,7 +2109,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2124,7 +2124,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2139,7 +2139,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2155,7 +2155,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2170,7 +2170,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2185,7 +2185,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2200,7 +2200,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2215,7 +2215,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2230,7 +2230,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2245,7 +2245,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2261,7 +2261,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2276,7 +2276,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2291,7 +2291,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2306,7 +2306,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2321,7 +2321,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2336,7 +2336,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2351,7 +2351,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2366,7 +2366,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2405,7 +2405,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2420,7 +2420,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2435,7 +2435,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2450,7 +2450,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2465,7 +2465,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2480,7 +2480,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2495,7 +2495,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2517,7 +2517,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2532,7 +2532,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2547,7 +2547,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2563,7 +2563,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2578,7 +2578,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2593,7 +2593,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2608,7 +2608,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2623,7 +2623,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2638,7 +2638,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2653,7 +2653,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2668,7 +2668,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2683,7 +2683,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2698,7 +2698,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2713,7 +2713,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2728,7 +2728,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2743,7 +2743,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2758,7 +2758,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2773,7 +2773,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2788,7 +2788,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2803,7 +2803,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2819,7 +2819,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2834,7 +2834,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2849,7 +2849,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2864,7 +2864,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2879,7 +2879,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2894,7 +2894,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2909,7 +2909,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2924,7 +2924,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2939,7 +2939,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2954,7 +2954,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2969,7 +2969,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2985,7 +2985,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3000,7 +3000,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3015,7 +3015,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3030,7 +3030,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3045,7 +3045,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3066,7 +3066,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3081,7 +3081,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3096,7 +3096,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3111,7 +3111,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3126,7 +3126,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3142,7 +3142,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3157,7 +3157,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -11752,7 +11752,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -11786,7 +11786,7 @@ "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -14364,7 +14364,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14414,7 +14414,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14464,7 +14464,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14514,7 +14514,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14564,7 +14564,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14614,7 +14614,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14664,7 +14664,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14714,7 +14714,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14764,7 +14764,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14814,7 +14814,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14864,7 +14864,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14914,7 +14914,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -14964,7 +14964,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15014,7 +15014,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15064,7 +15064,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15114,7 +15114,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15164,7 +15164,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15214,7 +15214,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15264,7 +15264,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15314,7 +15314,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15364,7 +15364,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15414,7 +15414,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15464,7 +15464,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15515,7 +15515,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15566,7 +15566,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15616,7 +15616,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15666,7 +15666,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15716,7 +15716,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15766,7 +15766,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15816,7 +15816,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15866,7 +15866,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15916,7 +15916,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -15966,7 +15966,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16016,7 +16016,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16066,7 +16066,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16116,7 +16116,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16166,7 +16166,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16216,7 +16216,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16266,7 +16266,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16316,7 +16316,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16366,7 +16366,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16416,7 +16416,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16466,7 +16466,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16516,7 +16516,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16566,7 +16566,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16616,7 +16616,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16666,7 +16666,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -16716,7 +16716,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -19955,13 +19955,16 @@ "test_id_prefix": "ninja://remoting:remoting_unittests/" }, { + "args": [ + "--gtest_filter=-SandboxBPF.ApplyBasicAllowlistPolicy:SandboxBPF.SyntheticPolicy:SandboxBPF.UnsafeTrapWithCond" + ], "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, "swarming": { "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json index d19cec2b..53b3961 100644 --- a/testing/buildbot/chromium.webrtc.fyi.json +++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -694,7 +694,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [ @@ -744,7 +744,7 @@ { "cipd_package": "infra/tools/mac_toolchain/${platform}", "location": ".", - "revision": "git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77" + "revision": "git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1" } ], "dimension_sets": [
diff --git a/testing/buildbot/client.v8.chromium.json b/testing/buildbot/client.v8.chromium.json index 38c38cd..38f76c5f 100644 --- a/testing/buildbot/client.v8.chromium.json +++ b/testing/buildbot/client.v8.chromium.json
@@ -392,7 +392,8 @@ "os": "Ubuntu-22.04" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" @@ -898,7 +899,8 @@ "os": "Ubuntu-22.04" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 7af1b1b..71fb879 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -1034,7 +1034,7 @@ { "cipd_package": 'infra/tools/mac_toolchain/${platform}', 'location': '.', - 'revision': 'git_revision:0ecab437ae2532a879b1203efc48f54bc6cadb77', + 'revision': 'git_revision:278fb59d5eb5d2d2da6175c0f97103bffad579b1', }, ], },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 088d647..73a20bf 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -3319,6 +3319,7 @@ 'linux-exp-tsan-fyi-rel', # The TSan bot sets enable_nacl=false 'Mac ASan 64 Tests (1)', # The mac asan bot sets enable_nacl=false 'win-arm64-rel', # Not available on arm64. + 'linux-arm64-rel-cft', # Not available on arm64. ], }, 'net_unittests': { @@ -3725,20 +3726,22 @@ 'linux-lacros-tester-rel', ], }, + 'remoting_unittests': { + 'remove_from': [ + # Not available on Linux ARM64 + 'linux-arm64-rel-cft', + ], + }, 'sandbox_linux_unittests': { 'remove_from': [ 'android-asan', # https://crbug.com/962650 ], 'modifications': { 'linux-ubsan-vptr': { - 'swarming': { - 'dimension_sets': [ - { - # TODO(crbug.com/1456464): Move this test to jammy. - 'os': 'Ubuntu-18.04', - }, - ], - }, + 'args': [ + # TODO(crbug.com/1456464): Remove this. + '--gtest_filter=-SandboxBPF.ApplyBasicAllowlistPolicy:SandboxBPF.SyntheticPolicy:SandboxBPF.UnsafeTrapWithCond', + ], }, }, }, @@ -4363,6 +4366,8 @@ 'vr_common_unittests': { 'remove_from': [ 'android-pie-x86-rel', + # Not available on Linux ARM64 + 'linux-arm64-rel-cft', ], }, 'vulkan_pixel_skia_gold_test': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 053c912..97fa8d1a 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -556,7 +556,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], }, @@ -1675,7 +1675,11 @@ 'ppapi_unittests': {}, 'remoting_unittests': {}, 'services_unittests': {}, - 'sync_integration_tests': {}, + 'sync_integration_tests': { + 'swarming': { + 'shards': 3, + }, + }, 'unit_tests': {}, }, @@ -4711,7 +4715,11 @@ 'remoting_unittests': {}, 'service_manager_unittests': {}, # https://crbug.com/843134 'snapshot_unittests': {}, - 'sync_integration_tests': {}, + 'sync_integration_tests': { + 'swarming': { + 'shards': 3, + }, + }, 'views_unittests': {}, },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 1943f66..7a0cb80 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -5108,7 +5108,7 @@ }, 'Linux CFI': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'test_suites': { 'gtest_tests': 'chromium_linux_and_gl_gtests', @@ -5183,7 +5183,7 @@ }, 'WebKit Linux Leak': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'test_suites': { 'isolated_scripts': 'chromium_webkit_isolated_scripts',
diff --git a/testing/gtest_ios/run-unittest.sh b/testing/gtest_ios/run-unittest.sh deleted file mode 100755 index 096901f..0000000 --- a/testing/gtest_ios/run-unittest.sh +++ /dev/null
@@ -1,87 +0,0 @@ -#!/bin/bash -p - -# Copyright 2012 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -set -eu - -# Environment sanitization. Set a known-safe PATH. Clear environment variables -# that might impact the interpreter's operation. The |bash -p| invocation -# on the #! line takes the bite out of BASH_ENV, ENV, and SHELLOPTS (among -# other features), but clearing them here ensures that they won't impact any -# shell scripts used as utility programs. SHELLOPTS is read-only and can't be -# unset, only unexported. -export PATH="/usr/bin:/bin:/usr/sbin:/sbin" -unset BASH_ENV CDPATH ENV GLOBIGNORE IFS POSIXLY_CORRECT -export -n SHELLOPTS - -readonly ScriptDir=$(dirname "$(echo ${0} | sed -e "s,^\([^/]\),$(pwd)/\1,")") -readonly ScriptName=$(basename "${0}") -readonly ThisScript="${ScriptDir}/${ScriptName}" -readonly SimExecutable="${BUILD_DIR}/ninja-iossim/${CONFIGURATION}/iossim" - -# Helper to print a line formatted for Xcodes build output parser. -XcodeNote() { - echo "${ThisScript}:${1}: note: ${2}" -} - -# Helper to print a divider to make things stick out in a busy output window. -XcodeHeader() { - echo "note: _________________________________________________________________" - echo "note: _________________________________________________________________" - echo "note: _________________________________________________________________" - XcodeNote "$1" ">>>>> $2" - echo "note: _________________________________________________________________" - echo "note: _________________________________________________________________" - echo "note: _________________________________________________________________" -} - -# Kills the iPhone Simulator if it is running. -KillSimulator() { - /usr/bin/killall "iPhone Simulator" 2> /dev/null || true -} - -# Runs tests via the iPhone Simulator for multiple devices. -RunTests() { - local -r appPath="${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app" - - if [[ ! -x "${SimExecutable}" ]]; then - echo "Unable to run tests: ${SimExecutable} was not found/executable." - exit 1 - fi - - for device in 'iPhone' 'iPad'; do - iosVersion="6.1" - KillSimulator - local command=( - "${SimExecutable}" "-d${device}" "-s${iosVersion}" "${appPath}" - ) - # Pass along any command line flags - if [[ "$#" -gt 0 ]]; then - command+=( "--" "${@}" ) - fi - XcodeHeader ${LINENO} "Launching tests for ${device} (iOS ${iosVersion})" - "${command[@]}" - - # If the command didn't exit successfully, abort. - if [[ $? -ne 0 ]]; then - exit $?; - fi - done -} - -# Time to get to work. - -if [[ "${PLATFORM_NAME}" != "iphonesimulator" ]]; then - XcodeNote ${LINENO} "Skipping running of unittests for device build." -else - if [[ "$#" -gt 0 ]]; then - RunTests "${@}" - else - RunTests - fi - KillSimulator -fi - -exit 0
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 2c73aad9..338ccd9 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -11531,6 +11531,28 @@ ] } ], + "RemoveNonStandardAppearanceValue": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "chromeos_lacros", + "fuchsia", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "RemoveNonStandardAppearanceValue" + ] + } + ] + } + ], "RenderBlockingFonts": [ { "platforms": [ @@ -15109,22 +15131,6 @@ ] } ], - "WebRTC-RtcEventLogNewFormat": [ - { - "platforms": [ - "linux", - "mac", - "windows", - "chromeos", - "chromeos_lacros" - ], - "experiments": [ - { - "name": "Enabled" - } - ] - } - ], "WebRTC-RttMult": [ { "platforms": [
diff --git a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom index a9d8b17d..e59f6c0 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
@@ -43,6 +43,8 @@ kInternalForcedColor = 0, kInternalForcedOutlineColor = 0, kInternalForcedVisitedColor = 0, + kInternalOverflowBlock = 0, + kInternalOverflowInline = 0, // This CSSSampleId represents page load for CSS histograms. It is recorded once // per page visit for each CSS histogram being logged on the blink side and the
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index 80e351f..be8b3de5 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3933,6 +3933,7 @@ kURLSearchParamsDeleteFnBehaviourDiverged = 4593, kTextWrapPretty = 4594, kTextWrapPrettyFail = 4595, + kContainerQueryEvalUnknown = 4596, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_theme_engine.h b/third_party/blink/public/platform/web_theme_engine.h index 97f1dbf3..191fb1e 100644 --- a/third_party/blink/public/platform/web_theme_engine.h +++ b/third_party/blink/public/platform/web_theme_engine.h
@@ -132,6 +132,12 @@ float zoom; }; + enum class ArrowDirection : int { + kDown, + kLeft, + kRight, + }; + // Extra parameters for PartMenuList struct MenuListExtraParams { bool has_border; @@ -139,6 +145,7 @@ int arrow_x; int arrow_y; int arrow_size; + ArrowDirection arrow_direction; SkColor arrow_color; SkColor background_color; bool fill_content_area;
diff --git a/third_party/blink/renderer/core/css/container_query_evaluator.cc b/third_party/blink/renderer/core/css/container_query_evaluator.cc index f435cda..29d3f344 100644 --- a/third_party/blink/renderer/core/css/container_query_evaluator.cc +++ b/third_party/blink/renderer/core/css/container_query_evaluator.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/css/container_query_evaluator.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/css/container_query.h" #include "third_party/blink/renderer/core/css/container_query_scroll_snapshot.h" #include "third_party/blink/renderer/core/css/css_container_values.h" @@ -180,6 +181,13 @@ const ContainerQuery& container_query) const { CHECK(media_query_evaluator_); + if (container_query.Selector().HasUnknownFeature()) { + Element* container = + media_query_evaluator_->GetMediaValues().ContainerElement(); + CHECK(container); + container->GetDocument().CountUse(WebFeature::kContainerQueryEvalUnknown); + } + MediaQueryResultFlags result_flags; bool value = (media_query_evaluator_->Eval(*container_query.query_, &result_flags) ==
diff --git a/third_party/blink/renderer/core/css/container_query_evaluator_test.cc b/third_party/blink/renderer/core/css/container_query_evaluator_test.cc index 27e7600c..cb834d5f 100644 --- a/third_party/blink/renderer/core/css/container_query_evaluator_test.cc +++ b/third_party/blink/renderer/core/css/container_query_evaluator_test.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/css/container_query_evaluator.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/css/container_query.h" #include "third_party/blink/renderer/core/css/css_container_rule.h" #include "third_party/blink/renderer/core/css/css_custom_property_declaration.h" @@ -917,4 +918,38 @@ EXPECT_EQ(evaluator, container->GetContainerQueryEvaluator()); } +struct EvalUnknownQueries { + const char* query_string; + bool contains_unknown; +}; + +EvalUnknownQueries eval_unknown_queries[] = { + {"style(--foo: bar)", false}, + {"style(--foo: bar) or (foo: bar)", true}, + {"style(--foo: bar) and unknown()", true}, + {"style(font-size: 10px)", true}, + {"(width > 30px) and (height < 900px)", false}, + {"(width > 0px) or (unknown())", true}, + {"(height > 0px) and ((width > 20px) and unknown())", true}, + {"(not (unknown: 10px)) or (height)", true}, + {"(width: 'wide')", true}, +}; + +class UseCountEvalUnknownTest + : public ContainerQueryEvaluatorTest, + public ::testing::WithParamInterface<EvalUnknownQueries> {}; + +INSTANTIATE_TEST_SUITE_P(ContainerQueryEvaluatorTest, + UseCountEvalUnknownTest, + testing::ValuesIn(eval_unknown_queries)); + +TEST_P(UseCountEvalUnknownTest, All) { + EvalUnknownQueries param = GetParam(); + SCOPED_TRACE(param.query_string); + + Eval(param.query_string, 100.0, 100.0, type_size, horizontal); + EXPECT_EQ(GetDocument().IsUseCounted(WebFeature::kContainerQueryEvalUnknown), + param.contains_unknown); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/container_selector.cc b/third_party/blink/renderer/core/css/container_selector.cc index f7fd12a..e088717d 100644 --- a/third_party/blink/renderer/core/css/container_selector.cc +++ b/third_party/blink/renderer/core/css/container_selector.cc
@@ -32,6 +32,9 @@ if (feature_flags & MediaQueryExpNode::kFeatureState) { has_sticky_query_ = true; } + if (feature_flags & MediaQueryExpNode::kFeatureUnknown) { + has_unknown_feature_ = true; + } } unsigned ContainerSelector::GetHash() const {
diff --git a/third_party/blink/renderer/core/css/container_selector.h b/third_party/blink/renderer/core/css/container_selector.h index 7be1e8e..108b9067 100644 --- a/third_party/blink/renderer/core/css/container_selector.h +++ b/third_party/blink/renderer/core/css/container_selector.h
@@ -65,6 +65,7 @@ bool SelectsStyleContainers() const { return has_style_query_; } bool SelectsStickyContainers() const { return has_sticky_query_; } + bool HasUnknownFeature() const { return has_unknown_feature_; } PhysicalAxes GetPhysicalAxes() const { return physical_axes_; } LogicalAxes GetLogicalAxes() const { return logical_axes_; } @@ -75,6 +76,7 @@ LogicalAxes logical_axes_{kLogicalAxisNone}; bool has_style_query_{false}; bool has_sticky_query_{false}; + bool has_unknown_feature_{false}; }; class ScopedContainerSelector
diff --git a/third_party/blink/renderer/core/css/css_default_style_sheets.cc b/third_party/blink/renderer/core/css/css_default_style_sheets.cc index 4e2b256..6c1741c 100644 --- a/third_party/blink/renderer/core/css/css_default_style_sheets.cc +++ b/third_party/blink/renderer/core/css/css_default_style_sheets.cc
@@ -38,6 +38,7 @@ #include "third_party/blink/renderer/core/execution_context/security_context.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/html/forms/html_button_element.h" +#include "third_party/blink/renderer/core/html/forms/html_select_element.h" #include "third_party/blink/renderer/core/html/forms/html_text_area_element.h" #include "third_party/blink/renderer/core/html/html_anchor_element.h" #include "third_party/blink/renderer/core/html/html_html_element.h" @@ -364,7 +365,7 @@ !form_controls_not_vertical_style_sheet_ && (IsA<HTMLProgressElement>(element) || IsA<HTMLMeterElement>(element) || IsA<HTMLInputElement>(element) || IsA<HTMLTextAreaElement>(element) || - IsA<HTMLButtonElement>(element))) { + IsA<HTMLButtonElement>(element) || IsA<HTMLSelectElement>(element))) { form_controls_not_vertical_style_sheet_ = ParseUASheet(UncompressResourceAsASCIIString( IDR_UASTYLE_FORM_CONTROLS_NOT_VERTICAL_CSS));
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index 9434204..9d9ac91 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -3760,6 +3760,13 @@ runtime_flag: "CSSLogicalOverflow", }, { + name: "-internal-overflow-inline", + logical_property_group: { + name: "overflow", + resolver: "inline", + }, + }, + { name: "overflow-block", logical_property_group: { name: "overflow", @@ -3768,6 +3775,13 @@ runtime_flag: "CSSLogicalOverflow", }, { + name: "-internal-overflow-block", + logical_property_group: { + name: "overflow", + resolver: "block", + }, + }, + { name: "overflow-clip-margin", property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], field_template: "external",
diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc index 4c22e4c..79439d32 100644 --- a/third_party/blink/renderer/core/css/css_property_equality.cc +++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -1074,6 +1074,8 @@ case CSSPropertyID::kInsetInlineEnd: case CSSPropertyID::kInsetBlockStart: case CSSPropertyID::kInsetBlockEnd: + case CSSPropertyID::kInternalOverflowBlock: + case CSSPropertyID::kInternalOverflowInline: case CSSPropertyID::kOverflowBlock: case CSSPropertyID::kOverflowInline: case CSSPropertyID::kOverscrollBehaviorBlock:
diff --git a/third_party/blink/renderer/core/css/form_controls_not_vertical.css b/third_party/blink/renderer/core/css/form_controls_not_vertical.css index 7d98269..5af317ce 100644 --- a/third_party/blink/renderer/core/css/form_controls_not_vertical.css +++ b/third_party/blink/renderer/core/css/form_controls_not_vertical.css
@@ -11,6 +11,6 @@ /* TODO(crbug.com/681917): These form controls don't go vertical if FormControlsVerticalWritingModeSupport is disabled. */ -input[type="range"], input[type="color"], input[type="button"], input[type="submit"], input[type="reset"], input[type="file"], textarea, meter, progress, button:not(::-internal-selectmenu-button) { +input[type="range"], input[type="color"], input[type="button"], input[type="submit"], input[type="reset"], input[type="file"], textarea, select, meter, progress, button:not(::-internal-selectmenu-button) { writing-mode: horizontal-tb !important; } \ No newline at end of file
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc index ba8ea7b8..285aa60e 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -1251,6 +1251,8 @@ return value_id == CSSValueID::kNormal || value_id == CSSValueID::kBreakWord || value_id == CSSValueID::kAnywhere; + case CSSPropertyID::kInternalOverflowBlock: + case CSSPropertyID::kInternalOverflowInline: case CSSPropertyID::kOverflowBlock: case CSSPropertyID::kOverflowInline: case CSSPropertyID::kOverflowX: @@ -1647,6 +1649,8 @@ CSSPropertyID::kForcedColorAdjust, CSSPropertyID::kHyphens, CSSPropertyID::kImageRendering, + CSSPropertyID::kInternalOverflowBlock, + CSSPropertyID::kInternalOverflowInline, CSSPropertyID::kListStylePosition, CSSPropertyID::kMaskType, CSSPropertyID::kMathShift,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h index 05d6cd7..716380fe 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h
@@ -238,6 +238,7 @@ // instead. next_ = buffer_.back(); buffer_.pop_back(); + offset_ = tokenizer_.PreviousOffset(); break; } else if (buffer_.back().GetBlockType() == CSSParserToken::kBlockStart) { nesting_level++;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc index 87180d4..7ce9ae93 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc
@@ -197,6 +197,78 @@ EXPECT_EQ(13U, stream.LookAheadOffset()); } +TEST(CSSParserTokenStreamTest, ConsumeUntilPeekedTypeOffset) { + CSSTokenizer tokenizer(String("a b c;d e f")); + CSSParserTokenStream stream(tokenizer); + + // a + EXPECT_EQ(kIdentToken, stream.Peek().GetType()); + EXPECT_EQ(0u, stream.Offset()); + + stream.ConsumeUntilPeekedTypeIs<kSemicolonToken>(); + EXPECT_EQ(kSemicolonToken, stream.Peek().GetType()); + EXPECT_EQ(5u, stream.Offset()); + + // Again, when we're already at kSemicolonToken. + stream.ConsumeUntilPeekedTypeIs<kSemicolonToken>(); + EXPECT_EQ(kSemicolonToken, stream.Peek().GetType()); + EXPECT_EQ(5u, stream.Offset()); +} + +TEST(CSSParserTokenStreamTest, ConsumeUntilPeekedTypeOffsetEndOfFile) { + CSSTokenizer tokenizer(String("a b c")); + CSSParserTokenStream stream(tokenizer); + + // a + EXPECT_EQ(kIdentToken, stream.Peek().GetType()); + EXPECT_EQ(0u, stream.Offset()); + + stream.ConsumeUntilPeekedTypeIs<kSemicolonToken>(); + EXPECT_TRUE(stream.AtEnd()); + EXPECT_EQ(5u, stream.Offset()); + + // Again, when we're already at EOF. + stream.ConsumeUntilPeekedTypeIs<kSemicolonToken>(); + EXPECT_TRUE(stream.AtEnd()); + EXPECT_EQ(5u, stream.Offset()); +} + +TEST(CSSParserTokenStreamTest, ConsumeUntilPeekedTypeOffsetEndOfBlock) { + CSSTokenizer tokenizer(String("a { a b c } d ;")); + CSSParserTokenStream stream(tokenizer); + + // a + EXPECT_EQ(0u, stream.Offset()); + EXPECT_EQ(kIdentToken, stream.Consume().GetType()); + + EXPECT_EQ(1u, stream.Offset()); + EXPECT_EQ(kWhitespaceToken, stream.Consume().GetType()); + + EXPECT_EQ(kLeftBraceToken, stream.Peek().GetType()); + EXPECT_EQ(2u, stream.Offset()); + + { + CSSParserTokenStream::BlockGuard guard(stream); + + EXPECT_EQ(kWhitespaceToken, stream.Peek().GetType()); + EXPECT_EQ(3u, stream.Offset()); + + stream.ConsumeUntilPeekedTypeIs<kSemicolonToken>(); + EXPECT_TRUE(stream.AtEnd()); // End of block. + EXPECT_EQ(kRightBraceToken, stream.UncheckedPeek().GetType()); + EXPECT_EQ(10u, stream.Offset()); + + // Again, when we're already at the end-of-block. + stream.ConsumeUntilPeekedTypeIs<kSemicolonToken>(); + EXPECT_TRUE(stream.AtEnd()); // End of block. + EXPECT_EQ(kRightBraceToken, stream.UncheckedPeek().GetType()); + EXPECT_EQ(10u, stream.Offset()); + } + + EXPECT_EQ(kWhitespaceToken, stream.Peek().GetType()); + EXPECT_EQ(11u, stream.Offset()); +} + TEST(CSSParserTokenStreamTest, ConsumeUntilPeekedTypeIsEmpty) { CSSTokenizer tokenizer(String("{23 }")); CSSParserTokenStream stream(tokenizer);
diff --git a/third_party/blink/renderer/core/frame/deprecation/DEPS b/third_party/blink/renderer/core/frame/deprecation/DEPS new file mode 100644 index 0000000..338ef19 --- /dev/null +++ b/third_party/blink/renderer/core/frame/deprecation/DEPS
@@ -0,0 +1,5 @@ +specific_include_rules = { + "deprecation.cc": [ + "+base/command_line.h" + ] +}
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc index 2dfdc198..f5975e6f 100644 --- a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc
@@ -4,15 +4,19 @@ #include "third_party/blink/renderer/core/frame/deprecation/deprecation.h" -#include "base/time/time.h" +#include "base/command_line.h" #include "build/build_config.h" +#include "third_party/blink/public/common/switches.h" +#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" #include "third_party/blink/public/mojom/reporting/reporting.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/renderer/bindings/core/v8/capture_source_location.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/deprecation/deprecation_info.h" #include "third_party/blink/renderer/core/frame/deprecation/deprecation_report_body.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" +#include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/report.h" #include "third_party/blink/renderer/core/frame/reporting_context.h" #include "third_party/blink/renderer/core/inspector/inspector_audits_issue.h" @@ -24,6 +28,32 @@ namespace blink { +namespace { + +// Send the deprecation info to the browser process, currently only supports +// frame. +void SendToBrowser(ExecutionContext* context, const DeprecationInfo& info) { + // Command line switch is set when the feature is turned on by the browser + // process. + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + blink::switches::kLegacyTechReportPolicyEnabled)) { + return; + } + + if (auto* window = DynamicTo<LocalDOMWindow>(context)) { + if (LocalFrame* frame = window->GetFrame()) { + std::unique_ptr<SourceLocation> source_location = + CaptureSourceLocation(context); + frame->GetLocalFrameHostRemote().SendLegacyTechEvent( + info.type_, mojom::blink::LegacyTechEventCodeLocation::New( + source_location->Url(), source_location->LineNumber(), + source_location->ColumnNumber())); + } + } +} + +} // namespace + Deprecation::Deprecation() : mute_count_(0) {} void Deprecation::ClearSuppression() { @@ -89,6 +119,9 @@ // Send the deprecation message as a DevTools issue. AuditsIssue::ReportDeprecationIssue(context, info.type_); + // Send the deprecation message to browser process for enterprise usage. + SendToBrowser(context, info); + // Send the deprecation report to the Reporting API and any // ReportingObservers. DeprecationReportBody* body = MakeGarbageCollected<DeprecationReportBody>(
diff --git a/third_party/blink/renderer/core/html/forms/menu_list_inner_element.cc b/third_party/blink/renderer/core/html/forms/menu_list_inner_element.cc index 6aab4c7..43dd290 100644 --- a/third_party/blink/renderer/core/html/forms/menu_list_inner_element.cc +++ b/third_party/blink/renderer/core/html/forms/menu_list_inner_element.cc
@@ -59,24 +59,30 @@ ItemPosition::kStart, OverflowAlignment::kDefault)); } - // We set margin-left/right instead of padding-left/right to clip text by - // 'overflow: hidden'. + // We set margin-* instead of padding-* to clip text by 'overflow: hidden'. + LogicalToPhysicalSetter margin_setter(style_builder.GetWritingDirection(), + style_builder, + &ComputedStyleBuilder::SetMarginTop, + &ComputedStyleBuilder::SetMarginRight, + &ComputedStyleBuilder::SetMarginBottom, + &ComputedStyleBuilder::SetMarginLeft); LayoutTheme& theme = LayoutTheme::GetTheme(); Length margin_start = Length::Fixed(theme.PopupInternalPaddingStart(parent_style)); Length margin_end = Length::Fixed( theme.PopupInternalPaddingEnd(GetDocument().GetFrame(), parent_style)); - if (parent_style.IsLeftToRightDirection()) { - style_builder.SetMarginLeft(margin_start); - style_builder.SetMarginRight(margin_end); - } else { - style_builder.SetMarginLeft(margin_end); - style_builder.SetMarginRight(margin_start); - } + margin_setter.SetInlineEnd(margin_end); + margin_setter.SetInlineStart(margin_start); style_builder.SetTextAlign(parent_style.GetTextAlign(true)); - style_builder.SetPaddingTop( + LogicalToPhysicalSetter padding_setter( + style_builder.GetWritingDirection(), style_builder, + &ComputedStyleBuilder::SetPaddingTop, + &ComputedStyleBuilder::SetPaddingRight, + &ComputedStyleBuilder::SetPaddingBottom, + &ComputedStyleBuilder::SetPaddingLeft); + padding_setter.SetBlockStart( Length::Fixed(theme.PopupInternalPaddingTop(parent_style))); - style_builder.SetPaddingBottom( + padding_setter.SetBlockEnd( Length::Fixed(theme.PopupInternalPaddingBottom(parent_style))); if (const ComputedStyle* option_style =
diff --git a/third_party/blink/renderer/core/html/forms/select_type.cc b/third_party/blink/renderer/core/html/forms/select_type.cc index c7de99c7..21e969a 100644 --- a/third_party/blink/renderer/core/html/forms/select_type.cc +++ b/third_party/blink/renderer/core/html/forms/select_type.cc
@@ -830,21 +830,31 @@ bool handled = false; HTMLOptionElement* end_option = nullptr; + char const* key_next = "ArrowDown"; + char const* key_previous = "ArrowUp"; + const ComputedStyle* style = select_->GetComputedStyle(); + if (style->GetWritingMode() == WritingMode::kVerticalLr) { + key_next = "ArrowRight"; + key_previous = "ArrowLeft"; + } else if (style->GetWritingMode() == WritingMode::kVerticalRl) { + key_next = "ArrowLeft"; + key_previous = "ArrowRight"; + } if (!active_selection_end_) { // Initialize the end index - if (key == "ArrowDown" || key == "PageDown") { + if (key == key_next || key == "PageDown") { HTMLOptionElement* start_option = select_->LastSelectedOption(); handled = true; - if (key == "ArrowDown") { + if (key == key_next) { end_option = NextSelectableOption(start_option); } else { end_option = NextSelectableOptionPageAway(start_option, kSkipForwards); } - } else if (key == "ArrowUp" || key == "PageUp") { + } else if (key == key_previous || key == "PageUp") { HTMLOptionElement* start_option = select_->SelectedOption(); handled = true; - if (key == "ArrowUp") { + if (key == key_previous) { end_option = PreviousSelectableOption(start_option); } else { end_option = @@ -853,10 +863,10 @@ } } else { // Set the end index based on the current end index. - if (key == "ArrowDown") { + if (key == key_next) { end_option = NextSelectableOption(active_selection_end_); handled = true; - } else if (key == "ArrowUp") { + } else if (key == key_previous) { end_option = PreviousSelectableOption(active_selection_end_); handled = true; } else if (key == "PageDown") {
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css index b7077b2..62d7313 100644 --- a/third_party/blink/renderer/core/html/resources/html.css +++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -408,7 +408,7 @@ } /* Form controls don't go vertical. */ -input:not([type="range"]):not([type="color"]):not([type="button"]):not([type="reset"]):not([type="submit"]):not([type="file"]), select { +input:not([type="range"]):not([type="color"]):not([type="button"]):not([type="reset"]):not([type="submit"]):not([type="file"]) { writing-mode: horizontal-tb !important; } @@ -930,8 +930,8 @@ select:-internal-list-box { appearance: auto; align-items: flex-start; - overflow-x: hidden; - overflow-y: scroll; + -internal-overflow-inline: hidden; + -internal-overflow-block: scroll; vertical-align: text-bottom; white-space: nowrap; border-radius: 2px;
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index f1a34d4..ee086d4 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -161,7 +161,7 @@ // parent-child order in the list. Remove our descendants here so they // will be re-inserted after us. if (LayoutBlock* cb = ContainingBlock()) { - cb->RemovePositionedObjects(this, kNewContainingBlock); + cb->RemovePositionedObjects(this); } } } @@ -389,9 +389,7 @@ } } -void LayoutBlock::RemovePositionedObjects( - LayoutObject* stay_within, - ContainingBlockState containing_block_state) { +void LayoutBlock::RemovePositionedObjects(LayoutObject* stay_within) { NOT_DESTROYED(); auto ProcessPositionedObjectRemoval = [&](LayoutObject* positioned_object) { @@ -400,8 +398,7 @@ return false; } - if (containing_block_state == kNewContainingBlock) - positioned_object->SetChildNeedsLayout(kMarkOnlyThis); + positioned_object->SetChildNeedsLayout(kMarkOnlyThis); // It is parent blocks job to add positioned child to positioned objects // list of its containing block.
diff --git a/third_party/blink/renderer/core/layout/layout_block.h b/third_party/blink/renderer/core/layout/layout_block.h index a291d31f..4d7a49a 100644 --- a/third_party/blink/renderer/core/layout/layout_block.h +++ b/third_party/blink/renderer/core/layout/layout_block.h
@@ -44,8 +44,6 @@ typedef HeapHashMap<WeakMember<const LayoutBox>, Member<LayoutBlock>> TrackedContainerMap; -enum ContainingBlockState { kNewContainingBlock, kSameContainingBlock }; - // LayoutBlock is the class that is used by any LayoutObject // that is a containing block. // http://www.w3.org/TR/CSS2/visuren.html#containing-block @@ -154,8 +152,7 @@ void AddChild(LayoutObject* new_child, LayoutObject* before_child = nullptr) override; - void RemovePositionedObjects(LayoutObject*, - ContainingBlockState = kSameContainingBlock); + void RemovePositionedObjects(LayoutObject*); void AddSvgTextDescendant(LayoutBox& svg_text); void RemoveSvgTextDescendant(LayoutBox& svg_text);
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index b02ace6..121a8a0 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -310,24 +310,27 @@ // TODO(crbug.com/1040826): This function is written in LayoutObject API // so that this works in both of the legacy layout and LayoutNG. We // should have LayoutNG-specific code. -LayoutUnit ListBoxItemHeight(const HTMLSelectElement& select, - const LayoutBox& box) { +LayoutUnit ListBoxItemBlockSize(const HTMLSelectElement& select, + const LayoutBox& box) { const auto& items = select.GetListItems(); if (items.empty() || box.ShouldApplySizeContainment()) return ListBoxDefaultItemHeight(box); - LayoutUnit max_height; + LayoutUnit max_block_size; for (Element* element : items) { if (auto* optgroup = DynamicTo<HTMLOptGroupElement>(element)) element = &optgroup->OptGroupLabelElement(); - LayoutUnit item_height; - if (auto* layout_box = element->GetLayoutBox()) - item_height = layout_box->Size().height; - else - item_height = ListBoxDefaultItemHeight(box); - max_height = std::max(max_height, item_height); + LayoutUnit item_block_size; + if (auto* layout_box = element->GetLayoutBox()) { + item_block_size = box.StyleRef().IsHorizontalWritingMode() + ? layout_box->Size().height + : layout_box->Size().width; + } else { + item_block_size = ListBoxDefaultItemHeight(box); + } + max_block_size = std::max(max_block_size, item_block_size); } - return max_height; + return max_block_size; } LayoutUnit MenuListIntrinsicInlineSize(const HTMLSelectElement& select, @@ -1365,7 +1368,7 @@ if (const auto* select = DynamicTo<HTMLSelectElement>(GetNode())) { if (select->UsesMenuList()) return MenuListIntrinsicBlockSize(*select, *this); - return ListBoxItemHeight(*select, *this) * select->ListBoxSize() - + return ListBoxItemBlockSize(*select, *this) * select->ListBoxSize() - ComputeLogicalScrollbars().BlockSum(); } if (IsTextField()) {
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc index 159c897..a08b5a4 100644 --- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc +++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -253,21 +253,21 @@ // Clear our positioned objects list. Our absolute and fixed positioned // descendants will be inserted into our containing block's positioned // objects list during layout. - block->RemovePositionedObjects(nullptr, kNewContainingBlock); + block->RemovePositionedObjects(nullptr); } if (!could_contain_absolute && can_contain_absolute) { // Remove our absolute positioned descendants from their current // containing block. // They will be inserted into our positioned objects list during layout. if (LayoutBlock* cb = block->ContainingBlockForAbsolutePosition()) - cb->RemovePositionedObjects(this, kNewContainingBlock); + cb->RemovePositionedObjects(this); } if (!could_contain_fixed && can_contain_fixed) { // Remove our fixed positioned descendants from their current containing // block. // They will be inserted into our positioned objects list during layout. if (LayoutBlock* cb = block->ContainingBlockForFixedPosition()) - cb->RemovePositionedObjects(this, kNewContainingBlock); + cb->RemovePositionedObjects(this); } } @@ -982,13 +982,6 @@ LayoutObject* before_child, bool full_remove_insert) { NOT_DESTROYED(); - // This condition is rarely hit since this function is usually called on - // anonymous blocks which can no longer carry positioned objects (see r120761) - // or when fullRemoveInsert is false. - auto* block = DynamicTo<LayoutBlock>(this); - if (full_remove_insert && block) { - block->RemovePositionedObjects(nullptr); - } DCHECK(!before_child || to_box_model_object == before_child->Parent()); for (LayoutObject* child = start_child; child && child != end_child;) {
diff --git a/third_party/blink/renderer/core/paint/theme_painter_default.cc b/third_party/blink/renderer/core/paint/theme_painter_default.cc index 684ead4..e916161d 100644 --- a/third_party/blink/renderer/core/paint/theme_painter_default.cc +++ b/third_party/blink/renderer/core/paint/theme_painter_default.cc
@@ -345,23 +345,58 @@ const ComputedStyle& style, const gfx::Rect& rect, WebThemeEngine::ExtraParams& extra_params) { - const int left = rect.x() + floorf(style.BorderLeftWidth()); - const int right = rect.x() + rect.width() - floorf(style.BorderRightWidth()); - const int middle = rect.y() + rect.height() / 2; + if (IsHorizontalWritingMode(style.GetWritingMode()) || + !RuntimeEnabledFeatures:: + FormControlsVerticalWritingModeSupportEnabled()) { + extra_params.menu_list.arrow_direction = + WebThemeEngine::ArrowDirection::kDown; + const int left = rect.x() + floorf(style.BorderLeftWidth()); + const int right = + rect.x() + rect.width() - floorf(style.BorderRightWidth()); + const int middle = rect.y() + rect.height() / 2; - extra_params.menu_list.arrow_y = middle; - float arrow_box_width = - theme_.ClampedMenuListArrowPaddingSize(document.GetFrame(), style); - float arrow_scale_factor = arrow_box_width / theme_.MenuListArrowWidthInDIP(); - // TODO(tkent): This should be 7.0 to match scroll bar buttons. - float arrow_size = 8.0 * arrow_scale_factor; - // Put the arrow at the center of paddingForArrow area. - // |arrowX| is the left position for Aura theme engine. - extra_params.menu_list.arrow_x = - (style.Direction() == TextDirection::kRtl) - ? left + (arrow_box_width - arrow_size) / 2 - : right - (arrow_box_width + arrow_size) / 2; - extra_params.menu_list.arrow_size = arrow_size; + extra_params.menu_list.arrow_y = middle; + float arrow_box_width = + theme_.ClampedMenuListArrowPaddingSize(document.GetFrame(), style); + float arrow_scale_factor = + arrow_box_width / theme_.MenuListArrowWidthInDIP(); + // TODO(tkent): This should be 7.0 to match scroll bar buttons. + float arrow_size = 8.0 * arrow_scale_factor; + // Put the arrow at the center of paddingForArrow area. + // |arrowX| is the left position for Aura theme engine. + extra_params.menu_list.arrow_x = + (style.Direction() == TextDirection::kRtl) + ? left + (arrow_box_width - arrow_size) / 2 + : right - (arrow_box_width + arrow_size) / 2; + extra_params.menu_list.arrow_size = arrow_size; + } else { + if (style.GetWritingMode() == WritingMode::kVerticalLr) { + extra_params.menu_list.arrow_direction = + WebThemeEngine::ArrowDirection::kRight; + } else { + extra_params.menu_list.arrow_direction = + WebThemeEngine::ArrowDirection::kLeft; + } + const int bottom = rect.y() + floorf(style.BorderBottomWidth()); + const int top = rect.y() + rect.height() - floorf(style.BorderTopWidth()); + const int middle = rect.x() + rect.width() / 2; + + extra_params.menu_list.arrow_x = middle; + float arrow_box_height = + theme_.ClampedMenuListArrowPaddingSize(document.GetFrame(), style); + float arrow_scale_factor = + arrow_box_height / theme_.MenuListArrowWidthInDIP(); + // TODO(tkent): This should be 7.0 to match scroll bar buttons. + float arrow_size = 8.0 * arrow_scale_factor; + // Put the arrow at the center of paddingForArrow area. + // |arrowY| is the bottom position for Aura theme engine. + extra_params.menu_list.arrow_y = + (style.Direction() == TextDirection::kRtl) + ? bottom + (arrow_box_height - arrow_size) / 2 + : top - (arrow_box_height + arrow_size) / 2; + extra_params.menu_list.arrow_size = arrow_size; + } + // TODO: (https://crbug.com/1227305)This color still does not support forced // dark mode extra_params.menu_list.arrow_color =
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc index 6b28940..012160d4 100644 --- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc +++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -134,33 +134,6 @@ Persistent<const MediaTrackConstraints> constraints_; }; -// This adapter simplifies iteration over supported basic and advanced -// MediaTrackConstraintSets in a MediaTrackConstraints. -// A MediaTrackConstraints is itself a (basic) MediaTrackConstraintSet and it -// may contain advanced MediaTrackConstraintSets. So far, only the basic -// MediaTrackConstraintSet and the first advanced MediaTrackConstraintSet are -// supported by this implementation. -// TODO(crbug.com/1408091): Add support for advanced constraint sets beyond -// the first one and remove this helper class. -class AllSupportedConstraintSets { - public: - using ForwardIterator = AllConstraintSets::ForwardIterator; - - explicit AllSupportedConstraintSets(const MediaTrackConstraints* constraints) - : all_constraint_sets_(constraints) {} - ForwardIterator begin() const { return all_constraint_sets_.begin(); } - ForwardIterator end() const { - const auto* constraints = all_constraint_sets_.GetConstraints(); - return ForwardIterator(constraints, constraints->hasAdvanced() && - !constraints->advanced().empty() - ? 2u - : 1u); - } - - private: - AllConstraintSets all_constraint_sets_; -}; - using CopyPanTiltZoom = base::StrongAlias<class CopyPanTiltZoomTag, bool>; template <typename T> @@ -247,7 +220,10 @@ void CopyConstraints(const MediaTrackConstraints* source, MediaTrackConstraints* destination) { HeapVector<Member<MediaTrackConstraintSet>> destination_constraint_sets; - for (const auto* source_constraint_set : AllSupportedConstraintSets(source)) { + if (source->hasAdvanced() && !source->advanced().empty()) { + destination_constraint_sets.reserve(source->advanced().size()); + } + for (const auto* source_constraint_set : AllConstraintSets(source)) { if (source_constraint_set == source) { CopyConstraintSet(source_constraint_set, destination); } else { @@ -1641,7 +1617,7 @@ ScriptPromiseResolver* resolver) const { if (!IsPageVisible()) { for (const MediaTrackConstraintSet* constraint_set : - AllSupportedConstraintSets(constraints)) { + AllConstraintSets(constraints)) { if ((constraint_set->hasPan() && !IsBooleanFalseConstraint(constraint_set->pan())) || (constraint_set->hasTilt() && @@ -1676,7 +1652,7 @@ auto* effective_settings = MediaTrackSettings::Create(); for (const MediaTrackConstraintSet* constraint_set : - AllSupportedConstraintSets(constraints)) { + AllConstraintSets(constraints)) { const MediaTrackConstraintSetType constraint_set_type = GetMediaTrackConstraintSetType(constraint_set, constraints); const bool may_reject = @@ -1711,7 +1687,7 @@ ExecutionContext* context = GetExecutionContext(); for (const MediaTrackConstraintSet* constraint_set : - AllSupportedConstraintSets(constraints)) { + AllConstraintSets(constraints)) { if (constraint_set->hasWhiteBalanceMode()) { UseCounter::Count(context, WebFeature::kImageCaptureWhiteBalanceMode); }
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc b/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc index c163d70..23ca12a 100644 --- a/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc +++ b/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc
@@ -1207,6 +1207,64 @@ EXPECT_EQ(capture_error->Constraint(), "pan"); } +TEST_F(ImageCaptureConstraintTest, ApplyAdvancedBareValueConstraints) { + V8TestingScope scope; + image_capture_->SetExecutionContext(scope.GetExecutionContext()); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + + // Create constraints: + // {advanced: [ + // {}, + // { + // whiteBalanceMode: "...", + // exposureMode: ["...", ...], + // focusMode: ["...", ...], + // exposureCompensation: ..., + // ... + // } + // ]} + auto* constraint_set = MediaTrackConstraintSet::Create(); + PopulateConstraintSet<ConstrainWithBareValueCreator>(constraint_set, + all_capabilities_); + auto* constraints = MediaTrackConstraints::Create(); + constraints->setAdvanced({MediaTrackConstraintSet::Create(), constraint_set}); + auto settings = media::mojom::blink::PhotoSettings::New(); + // Should apply the constraints to the settings as is and succeed. + EXPECT_TRUE(image_capture_->CheckAndApplyMediaTrackConstraintsToSettings( + &*settings, constraints, resolver)); + CheckExactValues(settings, all_capabilities_); +} + +TEST_F(ImageCaptureConstraintTest, ApplyAdvancedExactConstraints) { + V8TestingScope scope; + image_capture_->SetExecutionContext(scope.GetExecutionContext()); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); + + // Create constraints: + // {advanced: [ + // {}, + // { + // whiteBalanceMode: {exact: "..."}, + // exposureMode: {exact: ["...", ...]}, + // focusMode: {exact: ["...", ...]}, + // exposureCompensation: {exact: ...}, + // ... + // } + // ]} + auto* constraint_set = MediaTrackConstraintSet::Create(); + PopulateConstraintSet<ConstrainWithExactDictionaryCreator>(constraint_set, + all_capabilities_); + auto* constraints = MediaTrackConstraints::Create(); + constraints->setAdvanced({MediaTrackConstraintSet::Create(), constraint_set}); + auto settings = media::mojom::blink::PhotoSettings::New(); + // Should apply the constraints to the settings as is and succeed. + EXPECT_TRUE(image_capture_->CheckAndApplyMediaTrackConstraintsToSettings( + &*settings, constraints, resolver)); + CheckExactValues(settings, all_capabilities_); +} + TEST_F(ImageCaptureConstraintTest, ApplyAdvancedIdealConstraints) { V8TestingScope scope; image_capture_->SetExecutionContext(scope.GetExecutionContext()); @@ -1417,10 +1475,11 @@ MakeGarbageCollected<ScriptPromiseResolver>(scope.GetScriptState()); resolver->Promise().Then(nullptr, MakeGarbageCollected<ScriptFunction>( scope.GetScriptState(), capture_error)); - // TODO(crbug.com/1408091): This is not spec compliant. This should fail with - // a `SecurityError`. - EXPECT_TRUE(image_capture_->CheckAndApplyMediaTrackConstraintsToSettings( + EXPECT_FALSE(image_capture_->CheckAndApplyMediaTrackConstraintsToSettings( &*settings, constraints, resolver)); + scope.PerformMicrotaskCheckpoint(); // Resolve/reject promises. + EXPECT_TRUE(capture_error->WasCalled()); + EXPECT_EQ(capture_error->Name(), "SecurityError"); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_android.cc b/third_party/blink/renderer/platform/theme/web_theme_engine_android.cc index 9e996d2..6f5afe8 100644 --- a/third_party/blink/renderer/platform/theme/web_theme_engine_android.cc +++ b/third_party/blink/renderer/platform/theme/web_theme_engine_android.cc
@@ -7,6 +7,7 @@ #include "base/notreached.h" #include "base/system/sys_info.h" #include "skia/ext/platform_canvas.h" +#include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/renderer/platform/theme/web_theme_engine_conversions.h" #include "ui/native_theme/native_theme.h" @@ -55,7 +56,7 @@ native_theme_extra_params->text_field.zoom = extra_params->text_field.zoom; break; - case WebThemeEngine::kPartMenuList: + case WebThemeEngine::kPartMenuList: { native_theme_extra_params->menu_list.has_border = extra_params->menu_list.has_border; native_theme_extra_params->menu_list.has_border_radius = @@ -66,12 +67,17 @@ extra_params->menu_list.arrow_y; native_theme_extra_params->menu_list.arrow_size = extra_params->menu_list.arrow_size; + // Need to explicit cast so we can assign enum to enum. + ui::NativeTheme::ArrowDirection dir = ui::NativeTheme::ArrowDirection( + extra_params->menu_list.arrow_direction); + native_theme_extra_params->menu_list.arrow_direction = dir; native_theme_extra_params->menu_list.arrow_color = extra_params->menu_list.arrow_color; native_theme_extra_params->menu_list.background_color = extra_params->menu_list.background_color; native_theme_extra_params->menu_list.zoom = extra_params->menu_list.zoom; break; + } case WebThemeEngine::kPartSliderTrack: native_theme_extra_params->slider.thumb_x = extra_params->slider.thumb_x; native_theme_extra_params->slider.thumb_y = extra_params->slider.thumb_y;
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc index 7de8dc7..6c68da5 100644 --- a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc +++ b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc
@@ -6,6 +6,7 @@ #include "build/build_config.h" #include "skia/ext/platform_canvas.h" +#include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/renderer/platform/graphics/scrollbar_theme_settings.h" #include "third_party/blink/renderer/platform/theme/web_theme_engine_conversions.h" #include "ui/color/color_provider_utils.h" @@ -88,7 +89,7 @@ native_theme_extra_params->text_field.zoom = extra_params->text_field.zoom; break; - case WebThemeEngine::kPartMenuList: + case WebThemeEngine::kPartMenuList: { native_theme_extra_params->menu_list.has_border = extra_params->menu_list.has_border; native_theme_extra_params->menu_list.has_border_radius = @@ -99,12 +100,17 @@ extra_params->menu_list.arrow_y; native_theme_extra_params->menu_list.arrow_size = extra_params->menu_list.arrow_size; + // Need to explicit cast so we can assign enum to enum. + ui::NativeTheme::ArrowDirection dir = ui::NativeTheme::ArrowDirection( + extra_params->menu_list.arrow_direction); + native_theme_extra_params->menu_list.arrow_direction = dir; native_theme_extra_params->menu_list.arrow_color = extra_params->menu_list.arrow_color; native_theme_extra_params->menu_list.background_color = extra_params->menu_list.background_color; native_theme_extra_params->menu_list.zoom = extra_params->menu_list.zoom; break; + } case WebThemeEngine::kPartSliderTrack: native_theme_extra_params->slider.thumb_x = extra_params->slider.thumb_x; native_theme_extra_params->slider.thumb_y = extra_params->slider.thumb_y;
diff --git a/third_party/blink/tools/apache_config/win-httpd-php8.conf b/third_party/blink/tools/apache_config/win-httpd-php8.conf index 216909e..33acbf1 100644 --- a/third_party/blink/tools/apache_config/win-httpd-php8.conf +++ b/third_party/blink/tools/apache_config/win-httpd-php8.conf
@@ -14,6 +14,7 @@ LoadModule cgi_module modules/mod_cgi.so LoadModule env_module modules/mod_env.so LoadModule headers_module modules/mod_headers.so +LoadModule dir_module modules/mod_dir.so LoadModule log_config_module modules/mod_log_config.so LoadModule mime_module modules/mod_mime.so LoadModule php_module modules/php8apache2_4.dll @@ -125,6 +126,11 @@ SSLEngine On </VirtualHost> +<IfModule ssl_module> + SSLRandomSeed startup builtin + SSLRandomSeed connect builtin +</IfModule> + # # Apple-specific filesystem protection. #
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 408a291..e00cdc2f 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -900,6 +900,14 @@ ], }, { + 'paths': [ + 'third_party/blink/renderer/core/frame/deprecation/deprecation.cc' + ], + 'allowed': [ + 'base::CommandLine', + ] + }, + { 'paths': ['third_party/blink/renderer/core/frame/visual_viewport.cc'], 'allowed': [ 'cc::SolidColorScrollbarLayer',
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 86dec7f..b98f1b7 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1423,12 +1423,6 @@ crbug.com/750992 [ Win ] external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-020.xht [ Failure ] crbug.com/1432009 external/wpt/css/css-writing-modes/forms/range-input-appearance-native-vertical-rtl.optional.html [ Failure ] crbug.com/1432009 external/wpt/css/css-writing-modes/forms/range-input-appearance-none-vertical-rtl.optional.html [ Failure ] -crbug.com/1394042 external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-horizontal.optional.html [ Failure ] -crbug.com/1394042 external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vlr.optional.html [ Failure ] -crbug.com/1394042 external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vrl.optional.html [ Failure ] -crbug.com/1394042 external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-horizontal.optional.html [ Failure ] -crbug.com/1394042 external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vlr.optional.html [ Failure ] -crbug.com/1394042 external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vrl.optional.html [ Failure ] ### With LayoutNGFragmentItem enabled crbug.com/982194 [ Win10.20h2 ] fast/writing-mode/border-image-vertical-lr.html [ Failure Pass ] @@ -3162,7 +3156,6 @@ crbug.com/626703 external/wpt/webrtc-extensions/transfer-datachannel-service-worker.https.html [ Timeout ] crbug.com/626703 external/wpt/webrtc-extensions/transfer-datachannel.html [ Timeout ] crbug.com/626703 [ Win ] external/wpt/websockets/Create-blocked-port.any.worker.html?wpt_flags=h2 [ Failure Timeout ] -crbug.com/626703 [ Win11 ] external/wpt/websockets/stream/tentative/constructor.any.serviceworker.html?wss [ Failure Timeout ] crbug.com/1209223 external/wpt/html/syntax/xmldecl/xmldecl-2.html [ Failure ] crbug.com/626703 [ Mac ] editing/pasteboard/drag-selected-image-to-contenteditable.html [ Failure ] crbug.com/626703 [ Mac ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Failure Pass Timeout ] @@ -3385,7 +3378,7 @@ crbug.com/481431 external/wpt/css/css-break/box-decoration-break-clone-001.html [ Failure ] crbug.com/481431 external/wpt/css/css-break/box-decoration-break-clone-002.html [ Failure ] crbug.com/481431 external/wpt/css/css-break/box-decoration-break-clone-004.html [ Failure ] -crbug.com/1416181 external/wpt/css/css-break/float-with-large-margin-bottom-cross-page-002-print.html [ Failure ] +crbug.com/1458768 external/wpt/css/css-break/float-with-large-margin-bottom-cross-page-002-print.html [ Failure ] crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-039.html [ Failure ] crbug.com/1058792 external/wpt/css/css-break/transform-007.html [ Failure ] crbug.com/1224888 external/wpt/css/css-break/transform-009.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index d725a0d7..00f9686 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -54,7 +54,7 @@ "exclusive_tests": ["http/tests/serviceworker/reduce-accept-language/fetch-event-headers.html", "navigator_language/reduce_accept_language"], "args": ["--enable-features=ReduceAcceptLanguage"], - "expires": "Jul 1, 2023" + "expires": "Jan 1, 2024" }, { "prefix": "gpu", @@ -136,7 +136,7 @@ "args": ["--attribution-reporting-debug-mode", "--enable-features=AttributionReportingCrossAppWeb,AttributionReportingReportVerification,PrivacySandboxAdsAPIsOverride,PrivacySandboxAggregationService:trusted_server_url/https%3A%2F%2Fweb-platform.test%3A8444%2Fwpt_internal%2Fattribution-reporting%2Fresources%2FpublicKeys", "--additional-private-state-token-key-commitments={\"https://web-platform.test:8444\":{\"PrivateStateTokenV3VOPRF\":{\"protocol_version\":\"PrivateStateTokenV3VOPRF\",\"id\":1,\"batchsize\":1,\"keys\":{\"0\":{\"Y\":\"AAAAAASqh8oivosFN46xxx7zIK10bh07Younm5hZ90HgglQqOFUC8l2/VSlsOlReOHJ2CrfJ6CG1adnTkKJhZ0BtbSPWBwviQtdl64MWJc7sSg9HPvWfTjDigX5ihbzihG8V8aA=\",\"expiry\":\"253402300799000000\"}}}}}"], - "expires": "Jul 1, 2023" + "expires": "Oct 8, 2023" }, { "prefix": "attribution-reporting-cross-app-web", @@ -144,7 +144,7 @@ "bases": ["http/tests/inspector-protocol/attribution-reporting/os"], "exclusive_tests": "ALL", "args": ["--enable-features=AttributionReportingCrossAppWeb,PrivacySandboxAdsAPIsOverride"], - "expires": "Jul 1, 2023" + "expires": "Oct 8, 2023" }, { "prefix": "off-main-thread-css-paint", @@ -969,7 +969,7 @@ "platforms": ["Linux", "Mac", "Win"], "bases": ["external/wpt/client-hints", "wpt_internal/client-hints"], "args": ["--disable-features=UserAgentClientHint"], - "expires": "Jul 1, 2023" + "expires": "Jul 1, 2024" }, { "prefix": "web-bluetooth-new-permissions-backend", @@ -1095,21 +1095,21 @@ "platforms": ["Linux", "Mac", "Win"], "bases": ["external/wpt/html/browsers/windows/post-message"], "args": ["--enable-features=PostMessageFirstPartyToThirdPartyDifferentBucketSameOriginBlocked"], - "expires": "Jul 1, 2023" + "expires": "Jul 1, 2024" }, { "prefix": "post-message-third-party-to-first-party-different-bucket-same-origin-blocked", "platforms": ["Linux", "Mac", "Win"], "bases": ["external/wpt/html/browsers/windows/post-message"], "args": ["--enable-features=PostMessageThirdPartyToFirstPartyDifferentBucketSameOriginBlocked"], - "expires": "Jul 1, 2023" + "expires": "Jul 1, 2024" }, { "prefix": "post-message-third-party-to-third-party-different-bucket-same-origin-blocked", "platforms": ["Linux", "Mac", "Win"], "bases": ["external/wpt/html/browsers/windows/post-message"], "args": ["--enable-features=PostMessageThirdPartyToThirdPartyDifferentBucketSameOriginBlocked"], - "expires": "Jul 1, 2023" + "expires": "Jul 1, 2024" }, "isInputPending requires threaded compositing and layerized iframes",
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index aea6fafa..a66b7db 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -274347,11 +274347,11 @@ "support": { ".cache": { "gitignore2.json": [ - "c6dd4c4c77b06a62d8ae0b5528ddf5b10238af4e", + "b4d66b482d4915537982292f9c67398197bacaf2", [] ], "mtime.json": [ - "b431133cf6a9823d8ada3e4d8aa9ce69b0ad9736", + "fbf589faaa83f6165cac4bcac21af28b72a71f88", [] ] }, @@ -286988,6 +286988,10 @@ "51ec44e9cf55daa92b0822590933275a6706b9aa", [] ], + "absolute-non-replaced-height-010.xht.ini": [ + "e94f313b00b5739a5d3a5088c8d95bf418191160", + [] + ], "absolute-non-replaced-max-001-ref.html": [ "742b3063abd693a543ca4ce88bda161ae04d8668", [] @@ -298228,7 +298232,7 @@ [] ], "fit-content-item-001.html.ini": [ - "cfe00742e2f5cbea1d612ec6c492578b81e23e5c", + "d1cc072d8040ea280e39f16d44b63dfb212bc3db", [] ], "fixed-table-layout-with-percentage-width-in-flex-item-ref.html": [ @@ -300288,7 +300292,7 @@ [] ], "stretch-flex-item-checkbox-input.html.ini": [ - "63968e3e8e8a1f7bcc28f0ec74185129bd03b86d", + "2f2d23f1e5756a9ba9400a19c7e6ff70e1de45ac", [] ], "stretch-flex-item-radio-input-ref.html": [ @@ -312774,6 +312778,10 @@ } }, "fallback-intrinsic-sizes": { + "constructor-error.https.html.ini": [ + "1244ec0ebc2cc18d26f4101095e6d3eb2cd70586", + [] + ], "fallback-ref.html": [ "6808e14eb683fde8c30a2c89318c6cccba12ca1a", [] @@ -331862,7 +331870,7 @@ [] ], "font-size-adjust.html.ini": [ - "64e92c75075f0184164479c1a354a368f49b5236", + "1ea6d84d6e4fe59d91a2f2a22422ba5ec340f838", [] ], "font-size-expected.txt": [ @@ -340388,7 +340396,7 @@ [] ], "backdrop-filters-contrast.html.ini": [ - "923a67218fc2052a0b42d095c26ed22eaaf3c0ad", + "fc131d21d075b1be62195667bb8017af4b332030", [] ], "backdrop-filters-grayscale-001.html.ini": [ @@ -340608,7 +340616,7 @@ [] ], "effect-reference-on-transparent-element.html.ini": [ - "c1e39f8489802a36df955e901638e61ce8e92895", + "f9df782a8c3e548e9250dc1ef7a1523ec0cd293d", [] ], "fecolormatrix-type-ref.html": [ @@ -341686,10 +341694,6 @@ [] ], "parsing": { - "offset-anchor-parsing-valid-expected.txt": [ - "50b5afc614c2ed904412c36ba7ece7ea1f6226c4", - [] - ], "offset-anchor-parsing-valid.html.ini": [ "d29b9bc82ab0c18909e6ca5aea686342ec962a3d", [] @@ -341710,10 +341714,6 @@ "3904fa7f1f71a8b03a31fbd0964399404176907e", [] ], - "offset-position-parsing-valid-expected.txt": [ - "d59b7ae3bec46e5058b670a83ea9320868db11af", - [] - ], "offset-position-parsing-valid.html.ini": [ "ca9c85fb9ac9f852a976560e6779fc33112ad8aa", [] @@ -342252,6 +342252,10 @@ "bc7ecb9ff7c1f7b16f13f2e062b378de24ff613a", [] ], + "nth-child-of-in-is.html.ini": [ + "f9fe3f144c32d2d4ad0e335da5b8f3f30fc914b5", + [] + ], "nth-child-of-in-shadow-root-ref.html": [ "060c07decac51542a483c4c8206070fd1cbf4933", [] @@ -379306,7 +379310,7 @@ [] ], "mediasource-worker-play-terminate-worker.html.ini": [ - "3c9a865ebf8eb3cad5d7ea0867383fe22a0915ad", + "314869d225787c5b246c143edfbccffffcf46030", [] ], "mediasource-worker-play-terminate-worker.js": [ @@ -383539,7 +383543,7 @@ [] ], "modulepreload-as.html.ini": [ - "18f7393bb223f3036c7a80f1ac73a97f3d93e438", + "e573c5913ebab1de13a56802cbd2574945ad4790", [] ], "modulepreload-expected.txt": [ @@ -398456,6 +398460,18 @@ "5f8621ef83660c66f0d037ea28fafefb558140f1", [] ], + "encoded-video-chunk.any-expected.txt": [ + "bca2eae6d43d323efedcb12faaf60f98a510424b", + [] + ], + "encoded-video-chunk.any.js.ini": [ + "b9e31dfb31d97ca9a0717c82d2ee543b7ec31464", + [] + ], + "encoded-video-chunk.any.worker-expected.txt": [ + "bca2eae6d43d323efedcb12faaf60f98a510424b", + [] + ], "encoded-video-chunk.crossOriginIsolated.https.any.js.headers": [ "5f8621ef83660c66f0d037ea28fafefb558140f1", [] @@ -398517,7 +398533,7 @@ [] ], "full-cycle-test.https.any.js.ini": [ - "ca6be7aa6ceed8d98c471eff11ef28dae57c547d", + "17b4bcdb912fb57e9f64da0186a724e64732c3cd", [] ], "h264.annexb": [ @@ -398553,7 +398569,7 @@ [] ], "reconfiguring-encoder.https.any.js.ini": [ - "4be5117d7ae64849f5fb7719904268423fbcbaa8", + "42d752ba7ebd0468e33adcb5b071e9add02b002f", [] ], "sfx-aac.mp4": [ @@ -399139,7 +399155,7 @@ [] ], "fixtures.py": [ - "ba166ae8da87de03ec68c9c112f67c0d2a6036f3", + "957be6b0f462b1a7f1b61bcfb48cadb01c5f8f7d", [] ], "fixtures_bidi.py": [ @@ -399682,7 +399698,7 @@ [] ], "021.html.ini": [ - "275b8e8b8c4c5779a59f3f5a920c73d7ccb5e971", + "d2b2b309858fb7c29fb7924ca95d03436c892857", [] ], "025-1.js": [ @@ -399705,7 +399721,7 @@ [] ], "idlharness.https.window.js.ini": [ - "00aa467cf20852384ca9c1fdf07e247db4503dd5", + "65d07b5455944e251a37c200fc2f62f857117484", [] ] }, @@ -458060,6 +458076,13 @@ {} ] ], + "hit-test-in-vertical-rl.html": [ + "526e33d7924668782fd0116c5a13d2aeda570b08", + [ + null, + {} + ] + ], "hit-test-transformed-child.html": [ "ac0fd54c9f35dda0f01f5b8eb92fd7df7a3b5bb7", [ @@ -476994,7 +477017,7 @@ ] ], "offset-anchor-parsing-valid.html": [ - "97a3c54131f1af3b71c635ee5ff37be8a3502ff0", + "6cb4d44117fa6361fc87efdee22e79bc6df749b5", [ null, {} @@ -477071,7 +477094,7 @@ ] ], "offset-position-parsing-valid.html": [ - "032a5b42b46d5bae228e6a112c50623d76dbc1b1", + "bc0d19a460f4f22f9a061ae6932f31637c7231d6", [ null, {} @@ -642265,7 +642288,7 @@ ] ], "encoded-video-chunk.any.js": [ - "0cf0d8de4408dc1dc634b064c9a3fd313a04f813", + "9b60e59a79311dea38d8cb4cad1d3d1cebf2ff3a", [ "webcodecs/encoded-video-chunk.any.html", {
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini new file mode 100644 index 0000000..e94f313b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini
@@ -0,0 +1,3 @@ +[absolute-non-replaced-height-010.xht] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/fit-content-item-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/fit-content-item-001.html.ini index cfe00742..d1cc072 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/fit-content-item-001.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/fit-content-item-001.html.ini
@@ -1,3 +1,4 @@ [fit-content-item-001.html] expected: if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/stretch-flex-item-checkbox-input.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/stretch-flex-item-checkbox-input.html.ini index 63968e3e..2f2d23f1 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/stretch-flex-item-checkbox-input.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/stretch-flex-item-checkbox-input.html.ini
@@ -1,3 +1,4 @@ [stretch-flex-item-checkbox-input.html] expected: if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-intrinsic-sizes/constructor-error.https.html.ini b/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-intrinsic-sizes/constructor-error.https.html.ini new file mode 100644 index 0000000..1244ec0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-layout-api/fallback-intrinsic-sizes/constructor-error.https.html.ini
@@ -0,0 +1,3 @@ +[constructor-error.https.html] + expected: + if product == "chrome": [ERROR, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-adjust.html.ini b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-adjust.html.ini index 64e92c75..1ea6d84 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-adjust.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-adjust.html.ini
@@ -1,3 +1,6 @@ [font-size-adjust.html] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): CRASH + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): CRASH [Can set 'font-size-adjust' to a number: -3.14] expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-horizontal.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-horizontal.optional.html.ini deleted file mode 100644 index cc4eb839..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-horizontal.optional.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[select-multiple-appearance-native-horizontal.optional.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vlr.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vlr.optional.html.ini deleted file mode 100644 index 133c2d7..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vlr.optional.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[select-multiple-appearance-native-vlr.optional.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vrl.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vrl.optional.html.ini deleted file mode 100644 index 014d6bc..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-native-vrl.optional.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[select-multiple-appearance-native-vrl.optional.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-horizontal.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-horizontal.optional.html.ini deleted file mode 100644 index 3ff4071f..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-horizontal.optional.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[select-multiple-appearance-none-horizontal.optional.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vlr.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vlr.optional.html.ini deleted file mode 100644 index aa77d13dc..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vlr.optional.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[select-multiple-appearance-none-vlr.optional.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vrl.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vrl.optional.html.ini deleted file mode 100644 index 5049c1b..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-appearance-none-vrl.optional.html.ini +++ /dev/null
@@ -1,2 +0,0 @@ -[select-multiple-appearance-none-vrl.optional.html] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-scrolling.optional-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-scrolling.optional-expected.txt deleted file mode 100644 index 464cdd6..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-scrolling.optional-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS select[multiple][style="writing-mode: horizontal-tb"] scrolls correctly -FAIL select[multiple][style="writing-mode: vertical-lr"] scrolls correctly assert_true: select should be scrollable in block axis expected true got false -FAIL select[multiple][style="writing-mode: vertical-rl"] scrolls correctly assert_true: select should be scrollable in block axis expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-scrolling.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-scrolling.optional.html.ini deleted file mode 100644 index cddf88f..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-multiple-scrolling.optional.html.ini +++ /dev/null
@@ -1,6 +0,0 @@ -[select-multiple-scrolling.optional.html] - [select[multiple\][style="writing-mode: vertical-lr"\] scrolls correctly] - expected: FAIL - - [select[multiple\][style="writing-mode: vertical-rl"\] scrolls correctly] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-size-scrolling-and-sizing.optional-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-size-scrolling-and-sizing.optional-expected.txt deleted file mode 100644 index c6bc659..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-size-scrolling-and-sizing.optional-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -This is a testharness.js-based test. -PASS select[size][style="writing-mode: horizontal-tb"] scrolls correctly -PASS select[size][style="writing-mode: horizontal-tb"] sizing works correctly -FAIL select[size][style="writing-mode: vertical-lr"] scrolls correctly assert_true: select should be scrollable in block axis expected true got false -FAIL select[size][style="writing-mode: vertical-lr"] sizing works correctly assert_true: clientWidth increased when increasing size expected true got false -FAIL select[size][style="writing-mode: vertical-rl"] scrolls correctly assert_true: select should be scrollable in block axis expected true got false -FAIL select[size][style="writing-mode: vertical-rl"] sizing works correctly assert_true: clientWidth increased when increasing size expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-size-scrolling-and-sizing.optional.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-size-scrolling-and-sizing.optional.html.ini deleted file mode 100644 index 71f238a3..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/select-size-scrolling-and-sizing.optional.html.ini +++ /dev/null
@@ -1,12 +0,0 @@ -[select-size-scrolling-and-sizing.optional.html] - [select[size\][style="writing-mode: vertical-lr"\] scrolls correctly] - expected: FAIL - - [select[size\][style="writing-mode: vertical-lr"\] sizing works correctly] - expected: FAIL - - [select[size\][style="writing-mode: vertical-rl"\] scrolls correctly] - expected: FAIL - - [select[size\][style="writing-mode: vertical-rl"\] sizing works correctly] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html.ini b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html.ini index 923a672..fc131d2 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html.ini
@@ -1,3 +1,4 @@ [backdrop-filters-contrast.html] expected: if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/effect-reference-on-transparent-element.html.ini b/third_party/blink/web_tests/external/wpt/css/filter-effects/effect-reference-on-transparent-element.html.ini index c1e39f8..f9df782 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/effect-reference-on-transparent-element.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/effect-reference-on-transparent-element.html.ini
@@ -1,3 +1,4 @@ [effect-reference-on-transparent-element.html] expected: + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid-expected.txt deleted file mode 100644 index 50b5afc..0000000 --- a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -PASS e.style['offset-anchor'] = "auto" should set the property value -PASS e.style['offset-anchor'] = "left bottom" should set the property value -FAIL e.style['offset-anchor'] = "center center" should set the property value assert_equals: serialization should be canonical expected "center" but got "center center" -PASS e.style['offset-anchor'] = "right center" should set the property value -PASS e.style['offset-anchor'] = "center top" should set the property value -PASS e.style['offset-anchor'] = "center bottom" should set the property value -PASS e.style['offset-anchor'] = "calc(20% + 10px) center" should set the property value -PASS e.style['offset-anchor'] = "right 30em" should set the property value -PASS e.style['offset-anchor'] = "10px 20%" should set the property value -PASS e.style['offset-anchor'] = "left -10px top -20%" should set the property value -PASS e.style['offset-anchor'] = "right 10% bottom 20em" should set the property value -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html b/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html index 97a3c54..6cb4d44 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-anchor-parsing-valid.html
@@ -15,7 +15,7 @@ test_valid_value("offset-anchor", "auto"); test_valid_value("offset-anchor", "left bottom"); -test_valid_value("offset-anchor", "center center", "center"); +test_valid_value("offset-anchor", "center center"); test_valid_value("offset-anchor", "right center"); test_valid_value("offset-anchor", "center top"); test_valid_value("offset-anchor", "center bottom");
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid-expected.txt deleted file mode 100644 index d59b7ae..0000000 --- a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -PASS e.style['offset-position'] = "auto" should set the property value -PASS e.style['offset-position'] = "normal" should set the property value -PASS e.style['offset-position'] = "left bottom" should set the property value -FAIL e.style['offset-position'] = "center center" should set the property value assert_equals: serialization should be canonical expected "center" but got "center center" -PASS e.style['offset-position'] = "right center" should set the property value -PASS e.style['offset-position'] = "center top" should set the property value -PASS e.style['offset-position'] = "center bottom" should set the property value -PASS e.style['offset-position'] = "calc(20% + 10px) center" should set the property value -PASS e.style['offset-position'] = "right 30em" should set the property value -PASS e.style['offset-position'] = "10px 20%" should set the property value -PASS e.style['offset-position'] = "left -10px top -20%" should set the property value -PASS e.style['offset-position'] = "right 10% bottom 20em" should set the property value -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html b/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html index 032a5b42..bc0d19a4 100644 --- a/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html +++ b/third_party/blink/web_tests/external/wpt/css/motion/parsing/offset-position-parsing-valid.html
@@ -16,7 +16,7 @@ test_valid_value("offset-position", "normal"); test_valid_value("offset-position", "left bottom"); -test_valid_value("offset-position", "center center", "center"); +test_valid_value("offset-position", "center center"); test_valid_value("offset-position", "right center"); test_valid_value("offset-position", "center top"); test_valid_value("offset-position", "center bottom");
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/page-size-001-print-ref.html b/third_party/blink/web_tests/external/wpt/css/printing/page-size-001-print-ref.html new file mode 100644 index 0000000..8bfd271 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/printing/page-size-001-print-ref.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { size: 300px 400px; } + body { margin: 0; } +</style> +<div style="height:400px;">Page 1</div> +<div style="height:400px;">Page 2</div> +<div style="height:400px;">Page 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/page-size-001-print.html b/third_party/blink/web_tests/external/wpt/css/printing/page-size-001-print.html new file mode 100644 index 0000000..19d72b02 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/printing/page-size-001-print.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-page-3/#page-size-prop"> +<link rel="match" href="page-size-001-print-ref.html"> +<style> + @page { size: 300px 400px; } + body { margin: 0; } +</style> +<div style="break-before:page;">Page 1</div> +<div style="break-before:page;">Page 2</div> +<div style="break-before:page;">Page 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/page-size-002-print-ref.html b/third_party/blink/web_tests/external/wpt/css/printing/page-size-002-print-ref.html new file mode 100644 index 0000000..aa8cb6e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/printing/page-size-002-print-ref.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { size: 300px 50px; } + body { margin: 0; } +</style> +<div style="height:50px;">Page 1</div> +<div style="height:50px;">Page 2</div> +<div style="height:50px;">Page 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/page-size-002-print.html b/third_party/blink/web_tests/external/wpt/css/printing/page-size-002-print.html new file mode 100644 index 0000000..8ecf381 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/printing/page-size-002-print.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-page-3/#page-size-prop"> +<link rel="match" href="page-size-002-print-ref.html"> +<style> + @page { size: 300px 50px; } + body { margin: 0; } +</style> +<div style="break-before:page;">Page 1</div> +<div style="break-before:page;">Page 2</div> +<div style="break-before:page;">Page 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/page-size-003-print-ref.html b/third_party/blink/web_tests/external/wpt/css/printing/page-size-003-print-ref.html new file mode 100644 index 0000000..38ea1508 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/printing/page-size-003-print-ref.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<style> + @page { + size: 300px 100px; + margin: 25px; + } + body { margin: 0; } +</style> +<div style="height:50px;">Page 1</div> +<div style="height:50px;">Page 2</div> +<div style="height:50px;">Page 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/printing/page-size-003-print.html b/third_party/blink/web_tests/external/wpt/css/printing/page-size-003-print.html new file mode 100644 index 0000000..805ff0e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/printing/page-size-003-print.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-page-3/#page-size-prop"> +<link rel="match" href="page-size-003-print-ref.html"> +<style> + @page { + size: 300px 100px; + margin: 25px; + } + body { margin: 0; } +</style> +<div style="break-before:page;">Page 1</div> +<div style="break-before:page;">Page 2</div> +<div style="break-before:page;">Page 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/nth-child-of-in-is.html.ini b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/nth-child-of-in-is.html.ini new file mode 100644 index 0000000..f9fe3f14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/nth-child-of-in-is.html.ini
@@ -0,0 +1,3 @@ +[nth-child-of-in-is.html] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini b/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini index 3c9a865..314869d2 100644 --- a/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini +++ b/third_party/blink/web_tests/external/wpt/media-source/dedicated-worker/mediasource-worker-play-terminate-worker.html.ini
@@ -1,17 +1,20 @@ [mediasource-worker-play-terminate-worker.html] [Test worker MediaSource termination after at least 5 main thread setTimeouts, starting counting before setting srcObject] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - - [Test worker MediaSource termination after at least 6 main thread setTimeouts, starting counting before setting srcObject] - expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL [Test worker MediaSource termination after at least 7 main thread setTimeouts, starting counting before setting srcObject] expected: if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] + + [Test worker MediaSource termination after at least 8 main thread setTimeouts, starting counting before setting srcObject] + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + + [Test worker MediaSource termination after at least 9 main thread setTimeouts, starting counting before setting srcObject] + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini b/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini index 18f7393..e573c59 100644 --- a/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini +++ b/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini
@@ -1,85 +1,99 @@ [modulepreload-as.html] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): OK - if (product == "content_shell") and (os == "mac") and (port == "mac11"): OK + if (product == "content_shell") and (os == "win") and (port == "win11"): [ERROR, TIMEOUT] if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): TIMEOUT - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): TIMEOUT + if (product == "content_shell") and (os == "mac") and (port == "mac11"): OK + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): OK + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [ERROR, OK] + if (product == "content_shell") and (os == "mac") and (port == "mac12"): [ERROR, OK] ERROR [Modulepreload with as="audio"] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [Modulepreload with as="audioworklet"] expected: FAIL [Modulepreload with as="document"] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] FAIL [Modulepreload with as="embed"] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS - if product == "chrome": [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": PASS FAIL [Modulepreload with as="fetch"] expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] [Modulepreload with as="font"] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PASS - if product == "chrome": [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if product == "chrome": PASS FAIL [Modulepreload with as="frame"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS - if product == "chrome": [PASS, FAIL] - FAIL - - [Modulepreload with as="iMaGe"] - expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - - [Modulepreload with as="iframe"] - expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS - if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS if product == "chrome": PASS FAIL - [Modulepreload with as="image"] + [Modulepreload with as="iMaGe"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL + if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] + + [Modulepreload with as="iframe"] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): FAIL + [Modulepreload with as="image"] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS + if (product == "content_shell") and (os == "win"): PASS + if product == "chrome": PASS + FAIL + [Modulepreload with as="invalid-dest"] expected: FAIL [Modulepreload with as="manifest"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL [Modulepreload with as="object"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac12"): [PASS, FAIL] [Modulepreload with as="paintworklet"] expected: FAIL @@ -87,6 +101,8 @@ [Modulepreload with as="report"] expected: if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac12"): [PASS, FAIL] if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL [Modulepreload with as="serviceworker"] @@ -97,31 +113,32 @@ [Modulepreload with as="style"] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] FAIL [Modulepreload with as="track"] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if (product == "content_shell") and (os == "win") and (port == "win11"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PASS - if product == "chrome": [PASS, FAIL] + if (product == "content_shell") and (os == "linux"): PASS + if product == "chrome": PASS FAIL [Modulepreload with as="video"] expected: + if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL - if product == "chrome": [PASS, FAIL] [Modulepreload with as="webidentity"] expected: + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS + if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] if (product == "content_shell") and (os == "linux"): PASS - if (product == "content_shell") and (os == "win"): PASS if product == "chrome": PASS FAIL @@ -130,7 +147,9 @@ [Modulepreload with as="xslt"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL + if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any-expected.txt b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any-expected.txt new file mode 100644 index 0000000..bca2eae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +PASS Test we can construct an EncodedVideoChunk. +PASS Test copyTo() exception if destiation invalid +FAIL Test we can construct an zero-sized EncodedVideoChunk. Failed to execute 'copyTo' on 'EncodedVideoChunk': destination is detached. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js index 0cf0d8de4..9b60e59 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js +++ b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js
@@ -42,4 +42,15 @@ assert_throws_js( TypeError, () => chunk.copyTo(detached), 'destination is detached'); -}, 'Test copyTo() exception if destiation invalid'); \ No newline at end of file +}, 'Test copyTo() exception if destiation invalid'); + +test(t => { + let chunk = new EncodedVideoChunk({type: 'key', + timestamp: 10, + duration: 300, + data: new Uint8Array()}); + assert_equals(chunk.byteLength, 0, 'byteLength'); + let copyDest = new Uint8Array(); + chunk.copyTo(copyDest); + assert_equals(copyDest.length, 0, 'copyDest.length'); +}, 'Test we can construct an zero-sized EncodedVideoChunk.');
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js.ini b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js.ini new file mode 100644 index 0000000..b9e31df --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.js.ini
@@ -0,0 +1,8 @@ +[encoded-video-chunk.any.html] + [Test we can construct an zero-sized EncodedVideoChunk.] + expected: FAIL + + +[encoded-video-chunk.any.worker.html] + [Test we can construct an zero-sized EncodedVideoChunk.] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.worker-expected.txt new file mode 100644 index 0000000..bca2eae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webcodecs/encoded-video-chunk.any.worker-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +PASS Test we can construct an EncodedVideoChunk. +PASS Test copyTo() exception if destiation invalid +FAIL Test we can construct an zero-sized EncodedVideoChunk. Failed to execute 'copyTo' on 'EncodedVideoChunk': destination is detached. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini b/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini index ca6be7aa..17b4bcd 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini +++ b/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini
@@ -1,27 +1,24 @@ [full-cycle-test.https.any.html?h264_annexb] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac11"): ERROR - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): ERROR - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): TIMEOUT if (product == "content_shell") and (os == "mac") and (port == "mac13"): ERROR + if (product == "content_shell") and (os == "mac") and (port == "mac11"): ERROR + if (product == "content_shell") and (os == "mac") and (port == "mac12"): ERROR if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): ERROR + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): TIMEOUT + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): ERROR [Encoding and decoding cycle] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL - PRECONDITION_FAILED + if (product == "content_shell") and (os == "win"): PRECONDITION_FAILED + if (product == "content_shell") and (os == "linux"): PRECONDITION_FAILED + if product == "chrome": PRECONDITION_FAILED + FAIL [Encoding and decoding cycle w/ stripped color space] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL - PRECONDITION_FAILED + if (product == "content_shell") and (os == "win"): PRECONDITION_FAILED + if (product == "content_shell") and (os == "linux"): PRECONDITION_FAILED + if product == "chrome": PRECONDITION_FAILED + FAIL [full-cycle-test.https.any.html?h264_avc]
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini b/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini index 4be5117..42d752ba 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini +++ b/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini
@@ -1,15 +1,13 @@ [reconfiguring-encoder.https.any.html?h264_annexb] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12"): ERROR if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): ERROR if (product == "content_shell") and (os == "mac") and (port == "mac13"): ERROR if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): ERROR [Reconfiguring encoder] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL PRECONDITION_FAILED @@ -17,12 +15,14 @@ expected: if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): ERROR if (product == "content_shell") and (os == "mac") and (port == "mac13"): ERROR + if (product == "content_shell") and (os == "mac") and (port == "mac12"): ERROR if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): ERROR [Reconfiguring encoder] expected: if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py index ba166ae..957be6b 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py
@@ -330,7 +330,7 @@ <input id="hidden" type="hidden"/> <input id="text" type="text"/> - {iframe(frame_doc)} + {iframe(frame_doc, **kwargs)} <img /> <svg></svg>
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini b/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini index 275b8e8..d2b2b30 100644 --- a/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini +++ b/third_party/blink/web_tests/external/wpt/webmessaging/without-ports/021.html.ini
@@ -1,7 +1,8 @@ [021.html] [cross-origin test] expected: + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS] if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webmidi/idlharness.https.window.js.ini b/third_party/blink/web_tests/external/wpt/webmidi/idlharness.https.window.js.ini index 00aa467c..65d07b5 100644 --- a/third_party/blink/web_tests/external/wpt/webmidi/idlharness.https.window.js.ini +++ b/third_party/blink/web_tests/external/wpt/webmidi/idlharness.https.window.js.ini
@@ -1,36 +1,62 @@ [idlharness.https.window.html] [MIDIAccess interface: access must inherit property "inputs" with the proper type] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [MIDIAccess interface: access must inherit property "onstatechange" with the proper type] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [MIDIAccess interface: access must inherit property "outputs" with the proper type] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [MIDIAccess interface: access must inherit property "sysexEnabled" with the proper type] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [MIDIAccess must be primary interface of access] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [MIDIInputMap must be primary interface of inputs] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [MIDIOutput interface: operation clear()] expected: FAIL + [MIDIOutput interface: output must inherit property "clear()" with the proper type] + expected: + if (product == "content_shell") and (os == "linux"): FAIL + [MIDIOutputMap must be primary interface of outputs] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [Stringification of access] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [Stringification of inputs] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [Stringification of outputs] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL [idl_test setup] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux"): PASS + FAIL
diff --git a/third_party/mediapipe/DIR_METADATA b/third_party/mediapipe/DIR_METADATA new file mode 100644 index 0000000..fb4428a --- /dev/null +++ b/third_party/mediapipe/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail: { + component: "Internals>OptimizationGuide" +}
diff --git a/third_party/mediapipe/OWNERS b/third_party/mediapipe/OWNERS new file mode 100644 index 0000000..d1a123e --- /dev/null +++ b/third_party/mediapipe/OWNERS
@@ -0,0 +1,6 @@ +cduvall@chromium.org +mcrouse@chromium.org +robertogden@chromium.org +sky@chromium.org +sophiechang@chromium.org +tbansal@chromium.org
diff --git a/third_party/mediapipe/README.chromium b/third_party/mediapipe/README.chromium new file mode 100644 index 0000000..1800ff5 --- /dev/null +++ b/third_party/mediapipe/README.chromium
@@ -0,0 +1,15 @@ +Name: MediaPipe +Short Name: mediapipe +URL: https://github.com/google/mediapipe +Version: 201b2d739d994c51bb1b72336a09b8a93ed982d2 +Date: 2023/05/23 +License: Apache 2.0 +License File: LICENSE +Security Critical: Yes +CPEPrefix: unknown + +Description: +MediaPipe Tasks provides the core programming interface of the MediaPipe +Solutions suite, including a set of libraries for deploying innovative ML +solutions onto devices with a minimum of code. It supports multiple platforms, +including Android, Web / JavaScript, Python, and support for iOS is coming soon.
diff --git a/third_party/mediapipe/update.sh b/third_party/mediapipe/update.sh new file mode 100755 index 0000000..0b1c54f --- /dev/null +++ b/third_party/mediapipe/update.sh
@@ -0,0 +1,71 @@ +#!/bin/bash +# Copyright 2023 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. + +set -e + +if [[ $(basename ${PWD}) != "src" ]]; then + echo "Please set the current working directory to chromium/src first!" + exit 1 +fi +SRC_DIR=${PWD} + +MP_VERSION=$(grep -oP 'Version: \K[0-9a-f]+' third_party/mediapipe/README.chromium) + +function join_by { + local d=${1-} + local f=${2-} + if shift 2; then + printf "%s" "$f" "${@/#/$d}" + fi +} + +EXCLUDE_PATTERNS=( + # Directories + .git/ + audio/ + docs/ + ios/ + java/ + models/ + objc/ + python/ + vision/ + web/ + + # Suffixes + py$ + + # Wildcards + example + test +) +EXCLUDE_PATTERN=$(join_by '|' "${EXCLUDE_PATTERNS[@]}") + +if [[ -d "/tmp/mediapipe" ]]; then + rm -rf /tmp/mediapipe +fi +mkdir -p /tmp/mediapipe +curl -s -L "https://github.com/google/mediapipe/archive/${MP_VERSION}.tar.gz" | tar xz --strip=1 -C /tmp/mediapipe + +cd /tmp/mediapipe +FILES=$(find . -type f | grep -Ev "${EXCLUDE_PATTERN}") +cd "${SRC_DIR}" + +rm -rf third_party/mediapipe/src +mkdir -p third_party/mediapipe/src + +cd third_party/mediapipe/src/ +for file in ${FILES[@]} ; do + mkdir -p "$(dirname ${file})" + cp "/tmp/mediapipe/${file}" "${file}" +done +cd "${SRC_DIR}" + +for patch_file in $(ls third_party/mediapipe/patches/) ; do + echo "Attempting to apply ${patch_file}" + git apply "${patch_file}" +done + +rm -rf /tmp/mediapipe
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 8a21cef..d73f55af 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: a35b3c1bf18063ed60cf35443b4aef1b50579d37 +Version: 34128a35deab88cda6352c11a7e53c276db3a2b0 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index aa2e705..3285194 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -485,7 +485,7 @@ "includes": [4020], }, "<(SHARED_INTERMEDIATE_DIR)/components/policy/resources/webui/resources.grd": { - "META": {"sizes": {"includes": [20]}}, + "META": {"sizes": {"includes": [30]}}, "includes": [4040], }, "<(SHARED_INTERMEDIATE_DIR)/components/version_ui/resources/resources.grd": {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b9250f45..d7be603 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -31137,14 +31137,6 @@ <int value="2" label="Both entities are non-tombstone"/> </enum> -<enum name="DuplicateDownloadEvent"> - <int value="0" label="Shown"/> - <int value="1" label="Confirmed"/> - <int value="2" label="Canceled"/> - <int value="3" label="Link Clicked"/> - <int value="4" label="Dismissed"/> -</enum> - <enum name="DXGI_COLOR_SPACE_TYPE"> <summary> DirectX color space type. Documented here: @@ -43494,6 +43486,7 @@ <int value="4593" label="URLSearchParamsDeleteFnBehaviourDiverged"/> <int value="4594" label="TextWrapPretty"/> <int value="4595" label="TextWrapPrettyFail"/> + <int value="4596" label="ContainerQueryEvalUnknown"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -62927,6 +62920,7 @@ <int value="-496119023" label="WebXR:enabled"/> <int value="-495991146" label="CustomizeChromeSidePanel:disabled"/> <int value="-495585885" label="enable-spdy-proxy-dev-auth-origin"/> + <int value="-495265247" label="FedCmWithoutWellKnownEnforcement:enabled"/> <int value="-494722408" label="ContentSuggestionsLargeThumbnail:enabled"/> <int value="-494595710" label="LargeFaviconFromGoogle:disabled"/> <int value="-493551777" label="StaleWhileRevalidate2:disabled"/> @@ -63480,6 +63474,7 @@ <int value="-200160012" label="RelatedSearchesUi:disabled"/> <int value="-199690952" label="PageInfoV2:enabled"/> <int value="-198388861" label="ArcNearbyShareFuseBox:disabled"/> + <int value="-198266781" label="FedCmWithoutWellKnownEnforcement:disabled"/> <int value="-198002129" label="MetricsSettingsAndroid:disabled"/> <int value="-197862414" label="PrivacyIndicators:enabled"/> <int value="-196110497" label="force-text-direction"/>
diff --git a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS index 1a39bb9..a300720a 100644 --- a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS +++ b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
@@ -116,6 +116,7 @@ # cryptohome emaxx@chromium.org jorgelo@chromium.org +hcyang@google.com # custom_tabs eirage@chromium.org lizeb@chromium.org @@ -290,6 +291,7 @@ iby@chromium.org mutexlox@chromium.org xuhong@chromium.org +hcyang@google.com # plugin_vm # see crostini # power
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index adeda9a..496e5b5 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -769,7 +769,7 @@ </histogram> <histogram name="Android.ContactsPicker.ContactCount" units="Contacts" - expires_after="2023-11-19"> + expires_after="2024-06-01"> <owner>finnur@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -779,7 +779,7 @@ </histogram> <histogram name="Android.ContactsPicker.DialogAction" - enum="ContactsPickerDialogAction" expires_after="2023-11-19"> + enum="ContactsPickerDialogAction" expires_after="2024-06-01"> <owner>finnur@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -789,32 +789,35 @@ </histogram> <histogram name="Android.ContactsPicker.PropertiesRequested" - enum="ContactsPickerProperties" expires_after="2023-06-01"> + enum="ContactsPickerProperties" expires_after="2024-06-01"> <owner>finnur@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> The contact properties requested by the website (names, emails, telephone - numbers). Measured once when the Contacts Picker dialog is dismissed. + numbers). Measured once when the Contacts Picker dialog is dismissed. Note: + This metric was not logged in June 2023. </summary> </histogram> <histogram name="Android.ContactsPicker.SelectCount" units="Contacts" - expires_after="2023-06-01"> + expires_after="2024-06-01"> <owner>finnur@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> Measures the total number of contacts selected in the contacts picker. - Measured once when the Contacts Picker dialog is dismissed. + Measured once when the Contacts Picker dialog is dismissed. Note: This + metric was not logged in June 2023. </summary> </histogram> <histogram name="Android.ContactsPicker.SelectPercentage" units="%" - expires_after="2023-06-01"> + expires_after="2024-06-01"> <owner>finnur@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> Measures the percentage of contacts selected in the contacts picker. - Measured once when the Contacts Picker dialog is dismissed. + Measured once when the Contacts Picker dialog is dismissed. Note: This + metric was not logged in June 2023. </summary> </histogram> @@ -3242,16 +3245,6 @@ </summary> </histogram> -<histogram name="Android.PlayServices.Installed" enum="BooleanInstalled" - expires_after="2022-12-25"> - <owner>twellington@chromium.org</owner> - <owner>tedchoc@chromium.org</owner> - <summary> - Whether Google Play Services is installed on the device. Recorded during - deferred startup. - </summary> -</histogram> - <histogram name="Android.PlayServices.Version" units="versioncode" expires_after="2023-11-12"> <owner>twellington@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml index aba7235..ed17913 100644 --- a/tools/metrics/histograms/metadata/browser/histograms.xml +++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -193,15 +193,21 @@ </summary> </histogram> -<histogram name="Browser.ERP.RecordsPerUpload" units="records" - expires_after="2024-01-31"> +<histogram name="Browser.ERP.RecordsPerUploadFrom{ManagementStatus}Device" + units="records" expires_after="2024-01-31"> <owner>jrhilke@chromium.org</owner> <owner>lbaraz@chromium.org</owner> <owner>cros-reporting-team@google.com</owner> <summary> Recorded when uploading records to the reporting server. Counts the number - of records batched into a single upload request. + of records batched into a single upload request from a {ManagementStatus} + device. Uploads containing zero records will not be included as those are + just encryption key requests. </summary> + <token key="ManagementStatus"> + <variant name="Managed" summary="managed"/> + <variant name="Unmanaged" summary="unmanaged"/> + </token> </histogram> <histogram name="Browser.ERP.ResponsePayloadSize" units="bytes"
diff --git a/tools/metrics/histograms/metadata/cryptohome/OWNERS b/tools/metrics/histograms/metadata/cryptohome/OWNERS index 259e426f..27be04a 100644 --- a/tools/metrics/histograms/metadata/cryptohome/OWNERS +++ b/tools/metrics/histograms/metadata/cryptohome/OWNERS
@@ -4,3 +4,4 @@ # Use chromium-metrics-reviews@google.com as a backup. emaxx@chromium.org jorgelo@chromium.org +hcyang@google.com
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml index 3144588..fded66d7 100644 --- a/tools/metrics/histograms/metadata/download/histograms.xml +++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -409,23 +409,6 @@ <summary>The size of successfully completed downloads.</summary> </histogram> -<histogram name="Download.DuplicateDialogEvent.{Type}" - enum="DuplicateDownloadEvent" expires_after="2022-12-03"> - <owner>qinmin@chromium.org</owner> - <owner>clank-downloads@chromium.org</owner> - <summary> - Records user interactions on the duplicate download dialog on Android, - either for a regular download or an offline page. One user interaction could - trigger multiple histograms to be recorded. For example, clicking the text - link could record both the link click histogram and the dialog dismiss - histogram. - </summary> - <token key="Type"> - <variant name="Download"/> - <variant name="OfflinePage"/> - </token> -</histogram> - <histogram name="Download.HttpResponseCode" enum="HttpResponseCode" expires_after="never"> <!-- expires-never: Used to monitor download system health. -->
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index 234716f24..f91fdcb0 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -40,7 +40,9 @@ <variant name="LacrosBrowser" summary="Handler for open browser windows and browsing data on Lacros"/> <variant name="LacrosExtension" summary="Handler for extensions on Lacros"/> + <variant name="LacrosWebApp" summary="Handler for web apps on Lacros"/> <variant name="PrintJobs" summary="Handler for print jobs"/> + <variant name="WebApp" summary="Handler for web apps"/> </variants> <variants name="Enterprise_CrdSessionType"> @@ -2034,29 +2036,6 @@ </summary> </histogram> -<histogram name="Enterprise.FirstRun.AppRestrictionLoadTime" units="ms" - expires_after="2022-01-09"> - <owner>wenyufu@chromium.org</owner> - <owner>twellington@chromium.org</owner> - <summary> - Records the time it takes to retrieve application restrictions from the - system using an AsyncTask. Recording during first run experience on Android - only. - </summary> -</histogram> - -<histogram name="Enterprise.FirstRun.AppRestrictionLoadTime.Medium" units="ms" - expires_after="2022-04-24"> - <owner>skym@chromium.org</owner> - <owner>twellington@chromium.org</owner> - <owner>wenyufu@chromium.org</owner> - <summary> - Records the time it takes to retrieve application restrictions from the - system using an AsyncTask. Recording during first run experience on Android - only. Has a bigger range (0-3 minutes) than the non-Medium version. - </summary> -</histogram> - <histogram name="Enterprise.InvalidDevicePolicyFilesStatus" enum="InvalidDevicePolicyFilesStatus" expires_after="2023-12-01"> <owner>emaxx@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index dbc1bf39..b18eea6 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -604,8 +604,19 @@ <variant name="Dismiss"/> </token> <token key="PromoStat"> - <variant name="LastPromoNumDays"/> - <variant name="PromoDisplayCount"/> + <variant name="ChromeColdStartCount" + summary="Represents number of time Chrome cold starts"/> + <variant name="ChromeOpenIndirectlyCount" + summary="Represents number of time Chrome indirect (by widget or + external url) starts"/> + <variant name="ChromeWarmStartCount" + summary="Represents number of time Chrome warm starts"/> + <variant name="LastPromoNumDays" + summary="Represents number of days since last default browser promo + was displayed"/> + <variant name="PromoDisplayCount" + summary="Represents number of default browser promos displayed to the + user"/> </token> </histogram> @@ -1702,7 +1713,7 @@ </histogram> <histogram name="IOS.PasswordManager.Favicons.Count" units="count" - expires_after="2023-09-03"> + expires_after="2023-11-28"> <owner>veronguyen@google.com</owner> <owner>tmartino@chromium.org</owner> <summary> @@ -1712,7 +1723,7 @@ </histogram> <histogram name="IOS.PasswordManager.Favicons.Percentage" units="%" - expires_after="2023-07-01"> + expires_after="2023-11-28"> <owner>veronguyen@google.com</owner> <owner>tmartino@chromium.org</owner> <summary> @@ -1722,7 +1733,7 @@ </histogram> <histogram name="IOS.PasswordManager.PasswordsWithFavicons.Count" units="count" - expires_after="2023-11-19"> + expires_after="2023-11-28"> <owner>veronguyen@google.com</owner> <owner>tmartino@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml index 136e4d5..3da625ae 100644 --- a/tools/metrics/histograms/metadata/mobile/histograms.xml +++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -1304,7 +1304,7 @@ </histogram> <histogram base="true" name="MobileStartup.ToolbarInflationTime" units="ms" - expires_after="M82"> + expires_after="2023-12-28"> <owner>pasko@chromium.org</owner> <summary> Android: The time spent performing toolbar layout inflation.
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml index 41f8a49..32ea571 100644 --- a/tools/metrics/histograms/metadata/oobe/histograms.xml +++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -31,6 +31,7 @@ <variants name="OOBELegacyScreenName"> <variant name="Adb-sideloading"/> + <variant name="Add-child"/> <variant name="App-downloading"/> <variant name="Assistant-optin-flow"/> <variant name="Auto-enrollment-check"/> @@ -120,6 +121,11 @@ <variants name="OOBEScreenName_ExitReason"> <variant name="Adb-sideloading.Next"/> + <variant name="Add-child.Back"/> + <variant name="Add-child.CreateChildAccount"/> + <variant name="Add-child.EnterpriseEnroll"/> + <variant name="Add-child.KioskEnterpriseEnroll"/> + <variant name="Add-child.SignInAsChild"/> <variant name="App-downloading.Next"/> <variant name="Assistant-optin-flow.Next"/> <variant name="Auto-enrollment-check.Next"/> @@ -211,15 +217,30 @@ <variant name="Terms-of-service.Declined"/> <variant name="Theme-selection.Proceed"/> <variant name="User-creation.Cancel"/> - <variant name="User-creation.CreateChildAccount"/> + <variant name="User-creation.CreateChildAccount"> + <obsolete> + This histogram was available before introducing software update sreen + which requiered split the add child step into it is own screen this + changes is implemented in M-117. Add-child.CreateChildAccount is replacing + this one. + </obsolete> + </variant> <variant name="User-creation.EnterpriseEnroll"/> <variant name="User-creation.KioskEnterpriseEnroll"/> <variant name="User-creation.SignIn"/> - <variant name="User-creation.SignInAsChild"/> + <variant name="User-creation.SignInAsChild"> + <obsolete> + This histogram was available before introducing software update sreen + which requiered split the add child step into it is own screen this + changes is implemented in M-117. Add-child.SignInAsChild histogram is + replacing this one. + </obsolete> + </variant> <variant name="Wrong-hwid.Next"/> </variants> <variants name="OOBEScreenShownBeforeNetworkError"> + <variant name="AddChild" summary="Add Child Screen"/> <variant name="Enrollment" summary="Enrollment or Autoenrollment"/> <variant name="Signin" summary="Signin Screen"/> <variant name="Update" summary="Update Screen"/>
diff --git a/tools/metrics/histograms/metadata/platform/OWNERS b/tools/metrics/histograms/metadata/platform/OWNERS index f1e98689..14a3596 100644 --- a/tools/metrics/histograms/metadata/platform/OWNERS +++ b/tools/metrics/histograms/metadata/platform/OWNERS
@@ -5,3 +5,4 @@ iby@chromium.org mutexlox@chromium.org xuhong@chromium.org +hcyang@google.com
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml index 14944af..fbaad25 100644 --- a/tools/metrics/histograms/metadata/sb_client/histograms.xml +++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -34,6 +34,21 @@ <variant name="Shown" summary="shown"/> </variants> +<histogram name="SBClientDownload.AutoOpen{State}FileType" + enum="SBClientDownloadExtensions" expires_after="2024-06-27"> + <owner>drubery@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + Records the extension of files downloaded with auto-open {State}. This can + be used to decide the impact of changing the `auto_open_hint` in the file + type policy. It is logged on every successful download. + </summary> + <token key="State"> + <variant name="Disabled" summary="disabled"/> + <variant name="Enabled" summary="enabled"/> + </token> +</histogram> + <histogram name="SBClientDownload.CheckDownloadStats" enum="SBClientDownloadCheckDownloadStats" expires_after="2023-12-04"> <owner>vakh@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml index 8298557..61e4a77b 100644 --- a/tools/metrics/histograms/metadata/session/histograms.xml +++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -719,6 +719,39 @@ </summary> </histogram> +<histogram name="Session.TotalDurationMax1Day.WithHistorySync" units="ms" + expires_after="2024-06-15"> + <owner>mastiz@chromium.org</owner> + <owner>msarda@chromium.org</owner> + <owner>treib@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <summary> + The amount of active browsing time that was spent with history sync enabled. + This means the user opted in to sync and did not disable history, OR (on + supported platforms) the user is signed-in and specifically opted in to + history. If history is disabled by enterprise policy, that counts as + "not opted in". + + This time is measured from when the user starts interacting with the browser + until either they stopped interacting with the browser or their history sync + status changes. These end-points are when the metric is emitted. For details + on how "stopped interacting with the browser" is decided, see the + description of Session.TotalDuration. + + Because a duration can end either because the user became inactive or + because their status changed, the distribution of individual durations + measured are unlikely to be helpful. Instead, please compare total + durations. + + This metric is recorded on Win/Mac/Linux/iOS/Android. + + One caveat with this metric is that if the user has multiple profiles open + at the same time, their session activity will be logged from all the + profiles, instead of only from the profile that the user is using at that + moment. + </summary> +</histogram> + <histogram name="Session.TotalDurationMax1Day.WithoutAccount" units="ms" expires_after="never"> <!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) --> @@ -764,6 +797,37 @@ </summary> </histogram> +<histogram name="Session.TotalDurationMax1Day.WithoutHistorySync" units="ms" + expires_after="2024-06-15"> + <owner>mastiz@chromium.org</owner> + <owner>msarda@chromium.org</owner> + <owner>treib@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <summary> + The amount of active browsing time that was spent with history sync NOT + enabled. See the description of Session.TotalDurationMax1Day.WithHistorySync + for what exactly "history sync enabled" means. + + This time is measured from when the user starts interacting with the browser + until either they stopped interacting with the browser or their history sync + status changes. These end-points are when the metric is emitted. For details + on how "stopped interacting with the browser" is decided, see the + description of Session.TotalDuration. + + Because a duration can end either because the user became inactive or + because their status changed, the distribution of individual durations + measured are unlikely to be helpful. Instead, please compare total + durations. + + This metric is recorded on Win/Mac/Linux/iOS/Android. + + One caveat with this metric is that if the user has multiple profiles open + at the same time, their session activity will be logged from all the + profiles, instead of only from the profile that the user is using at that + moment. + </summary> +</histogram> + <histogram name="Session.WebState.CustomWebViewSerializedSize" units="KB" expires_after="2023-12-10"> <owner>justincohen@chromium.org</owner>
diff --git a/ui/aura/gestures/OWNERS b/ui/aura/gestures/OWNERS index 9f2d76af..343711b35 100644 --- a/ui/aura/gestures/OWNERS +++ b/ui/aura/gestures/OWNERS
@@ -1,2 +1 @@ -rjkroege@chromium.org flackr@chromium.org
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index f39f991..bd831ea 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -220,12 +220,19 @@ int corner_radius; }; + enum class ArrowDirection : int { + kDown, + kLeft, + kRight, + }; + struct MenuListExtraParams { bool has_border; bool has_border_radius; int arrow_x; int arrow_y; int arrow_size; + ArrowDirection arrow_direction; SkColor arrow_color; SkColor background_color; int classic_state; // Used on Windows when uxtheme is not available.
diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc index 02a767f..a45825d 100644 --- a/ui/native_theme/native_theme_base.cc +++ b/ui/native_theme/native_theme_base.cc
@@ -33,6 +33,7 @@ #include "ui/gfx/geometry/skia_conversions.h" #include "ui/gfx/image/image_skia.h" #include "ui/native_theme/common_theme.h" +#include "ui/native_theme/native_theme.h" namespace { @@ -937,30 +938,65 @@ flags.setStyle(cc::PaintFlags::kStroke_Style); flags.setStrokeWidth(kMenuListArrowStrokeWidth); - float arrow_width = menu_list.arrow_size; - int arrow_height = arrow_width * 0.5; - gfx::Rect arrow(menu_list.arrow_x, menu_list.arrow_y - (arrow_height / 2), - arrow_width, arrow_height); - arrow.Intersect(rect); + if (menu_list.arrow_direction == ui::NativeTheme::ArrowDirection::kDown) { + float arrow_width = menu_list.arrow_size; + int arrow_height = arrow_width * 0.5; + gfx::Rect arrow(menu_list.arrow_x, menu_list.arrow_y - (arrow_height / 2), + arrow_width, arrow_height); + arrow.Intersect(rect); - if (arrow_width != arrow.width() || arrow_height != arrow.height()) { - // The arrow is clipped after being constrained to the paint rect so we - // need to recalculate its size. - int height_clip = arrow_height - arrow.height(); - int width_clip = arrow_width - arrow.width(); - if (height_clip > width_clip) { - arrow.set_width(arrow.height() * 1.6); - } else { - arrow.set_height(arrow.width() * 0.6); + if (arrow_width != arrow.width() || arrow_height != arrow.height()) { + // The arrow is clipped after being constrained to the paint rect so we + // need to recalculate its size. + int height_clip = arrow_height - arrow.height(); + int width_clip = arrow_width - arrow.width(); + if (height_clip > width_clip) { + arrow.set_width(arrow.height() * 1.6); + } else { + arrow.set_height(arrow.width() * 0.6); + } + arrow.set_y(menu_list.arrow_y - (arrow.height() / 2)); } - arrow.set_y(menu_list.arrow_y - (arrow.height() / 2)); - } - SkPath path; - path.moveTo(arrow.x(), arrow.y()); - path.lineTo(arrow.x() + arrow.width() / 2, arrow.y() + arrow.height()); - path.lineTo(arrow.x() + arrow.width(), arrow.y()); - canvas->drawPath(path, flags); + SkPath path; + path.moveTo(arrow.x(), arrow.y()); + path.lineTo(arrow.x() + arrow.width() / 2, arrow.y() + arrow.height()); + path.lineTo(arrow.x() + arrow.width(), arrow.y()); + canvas->drawPath(path, flags); + } else { + // Arrow direction is either left or right + float arrow_height = menu_list.arrow_size; + int arrow_width = arrow_height * 0.5; + gfx::Rect arrow(menu_list.arrow_x - (arrow_width / 2), menu_list.arrow_y, + arrow_width, arrow_height); + arrow.Intersect(rect); + + if (arrow_width != arrow.width() || arrow_height != arrow.height()) { + // The arrow is clipped after being constrained to the paint rect so we + // need to recalculate its size. + int height_clip = arrow_height - arrow.height(); + int width_clip = arrow_width - arrow.width(); + if (height_clip > width_clip) { + arrow.set_width(arrow.height() * 0.6); + } else { + arrow.set_height(arrow.width() * 1.6); + } + arrow.set_x(menu_list.arrow_x - (arrow.width() / 2)); + } + + SkPath path; + if (menu_list.arrow_direction == ui::NativeTheme::ArrowDirection::kLeft) { + path.moveTo(arrow.x() + arrow.width(), arrow.y()); + path.lineTo(arrow.x(), arrow.y() + arrow.height() / 2); + path.lineTo(arrow.x() + arrow.width(), arrow.y() + arrow.height()); + } else { + // Arrow direction is right + path.moveTo(arrow.x(), arrow.y()); + path.lineTo(arrow.x() + arrow.width(), arrow.y() + arrow.height() / 2); + path.lineTo(arrow.x(), arrow.y() + arrow.height()); + } + canvas->drawPath(path, flags); + } } void NativeThemeBase::PaintMenuPopupBackground(
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index ca2270cef..fe89414 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -147,7 +147,9 @@ std::unique_ptr<Button> BubbleFrameView::CreateCloseButton( Button::PressedCallback callback) { auto close_button = CreateVectorImageButtonWithNativeTheme( - std::move(callback), vector_icons::kCloseRoundedIcon); + std::move(callback), features::IsChromeRefresh2023() + ? vector_icons::kCloseChromeRefreshIcon + : vector_icons::kCloseRoundedIcon); close_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_APP_CLOSE)); close_button->SetAccessibleName(l10n_util::GetStringUTF16(IDS_APP_CLOSE)); close_button->SizeToPreferredSize();