diff --git a/DEPS b/DEPS index 64819dc..4c30a33 100644 --- a/DEPS +++ b/DEPS
@@ -222,7 +222,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '0547b914f691524b917090b9c7e6e784c47470f3', + 'skia_revision': '7d336c9557bd8537e922ee83b1138e4cd23fee6b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -234,7 +234,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '979876586da6be6bb0b828df40e4b01cecee0680', + 'angle_revision': '4264138a69fb4d026a8c313bbd5e97d9c8acae53', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -269,7 +269,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': 'c99c097393be34b251bf6052fe218dd25b588e6d', + 'nacl_revision': 'd9b3fa4b519b8b2ad6ca9ea544d787f833e32a28', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -293,7 +293,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'f61fac04928dc5d84be9dce9ea4f642527f3fd58', + 'catapult_revision': '4ba18870d259bfdfdfe9947cb80cae8747d2563f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -301,7 +301,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': 'e10e664318f49ab3129b413125f6cfe024e1f3e2', + 'devtools_frontend_revision': '4738f715b40965fdd021254b7e0acd643650501a', # 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. @@ -662,7 +662,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'Ltwx2vcIpYTtp89tT0JClFy6KyiEclyO07UwPbyTMXAC', + 'version': '8ymOVjQjOi0Kqm2eK7w5debfFGiVd8D3o25g0vGiNM0C', }, ], 'dep_type': 'cipd', @@ -673,7 +673,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'Sch8kv_Es4Iq1jZS4_85FIhXTunvu70ARaCgQb5_ZYwC', + 'version': 'Pb8fAlCfoVz4kjLkIDYHIiELmddMg-czeF9CIaNkdxkC', }, ], 'dep_type': 'cipd', @@ -738,7 +738,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'zxYzGNpCuNmZZYQcKjcgCxw3eXROUqPq57kFfMvMuT0C', + 'version': 'b--AoMYQfqDHN-sIzYSbG81zEmkj3AaINEpQJDwib6gC', }, ], 'condition': 'checkout_android', @@ -1343,7 +1343,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '3dd5b80bc4f172dd82925bb259cb7c82348409c5', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + 'bffb5c2247c5705401499ff13b686b119d9918b6', + Var('chromium_git') + '/openscreen' + '@' + '616a118d38a26882a930a0c34f5881b35809544b', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + 'bf21ccb1007bb531b45d9978919a56ea5059c245', @@ -1360,7 +1360,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '97facadd961825cf2b6eb12398e0908a102d0c4a', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '5e0184587a2853fa0bdb659e8716b0b3e6ca962f', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1589,7 +1589,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '827cad9e402b63bbe38787456115bcb681a8a152', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ed8964de52179ad80adb66c5b23347ac5870f4ba', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '10e5f3284d07b46dfb4bea5076d865655b0b2a04', 'src/third_party/webrtc': Var('webrtc_git') + '/src.git' + '@' + '51969310ef432a9c340bb091eea1f1553ca01587', @@ -1653,7 +1653,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6e70cb7f840eb56d2a89c87e74583c2c7eec79ae', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@06c0d6a5e40abce1a05a2973e10cb428eb2c307d', 'condition': 'checkout_src_internal', },
diff --git a/WATCHLISTS b/WATCHLISTS index 3c9624e..7208296 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -2374,7 +2374,6 @@ 'stevenjb+watch-network@chromium.org'], 'chromeos_tast_control': ['chromeos-engprod+watch@google.com', 'bpastene+watch@chromium.org', - 'mukai+watch@chromium.org', 'chrome-os-gardeners+watch@google.com'], 'chromeos_timezone': ['alemate+watch@chromium.org'], 'chromeos_webui': ['alemate+watch@chromium.org'],
diff --git a/android_webview/browser/gfx/aw_draw_fn_impl.cc b/android_webview/browser/gfx/aw_draw_fn_impl.cc index 8097845d..60add3fb 100644 --- a/android_webview/browser/gfx/aw_draw_fn_impl.cc +++ b/android_webview/browser/gfx/aw_draw_fn_impl.cc
@@ -244,7 +244,7 @@ RenderThreadManager::InsideHardwareReleaseReset release_reset( &render_thread_manager_); render_thread_manager_.DestroyHardwareRendererOnRT( - false /* save_restore */); + false /* save_restore */, false /* abandon_context */); } interop_.reset();
diff --git a/android_webview/browser/gfx/aw_gl_functor.cc b/android_webview/browser/gfx/aw_gl_functor.cc index f2b8d302..6221476 100644 --- a/android_webview/browser/gfx/aw_gl_functor.cc +++ b/android_webview/browser/gfx/aw_gl_functor.cc
@@ -83,7 +83,8 @@ if (!draw_functor_succeeded) { LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; // Calling release on wrong thread intentionally. - render_thread_manager_.DestroyHardwareRendererOnRT(true /* save_restore */); + render_thread_manager_.DestroyHardwareRendererOnRT( + true /* save_restore */, false /* abandon_context */); } } @@ -98,9 +99,12 @@ break; case AwDrawGLInfo::kModeProcessNoContext: LOG(ERROR) << "Received unexpected kModeProcessNoContext"; - FALLTHROUGH; + render_thread_manager_.DestroyHardwareRendererOnRT( + save_restore, true /* abandon_context */); + break; case AwDrawGLInfo::kModeProcess: - render_thread_manager_.DestroyHardwareRendererOnRT(save_restore); + render_thread_manager_.DestroyHardwareRendererOnRT( + save_restore, false /* abandon_context */); break; case AwDrawGLInfo::kModeDraw: { HardwareRendererDrawParams params{
diff --git a/android_webview/browser/gfx/display_scheduler_webview.cc b/android_webview/browser/gfx/display_scheduler_webview.cc index d009671..8adb2bf 100644 --- a/android_webview/browser/gfx/display_scheduler_webview.cc +++ b/android_webview/browser/gfx/display_scheduler_webview.cc
@@ -47,8 +47,6 @@ root_frame_sink_->SetNeedsDraw(needs_draw); } void DisplaySchedulerWebView::OutputSurfaceLost() { - // WebView can't handle surface lost so this isn't called. - NOTREACHED(); } bool DisplaySchedulerWebView::IsFrameSinkOverlayed(
diff --git a/android_webview/browser/gfx/hardware_renderer.h b/android_webview/browser/gfx/hardware_renderer.h index 7bc9e39..da29de2 100644 --- a/android_webview/browser/gfx/hardware_renderer.h +++ b/android_webview/browser/gfx/hardware_renderer.h
@@ -68,6 +68,7 @@ void CommitFrame(); virtual void RemoveOverlays( OverlaysParams::MergeTransactionFn merge_transaction) = 0; + virtual void AbandonContext() = 0; protected: explicit HardwareRenderer(RenderThreadManager* state);
diff --git a/android_webview/browser/gfx/hardware_renderer_viz.cc b/android_webview/browser/gfx/hardware_renderer_viz.cc index dcbef57..72fbb8c 100644 --- a/android_webview/browser/gfx/hardware_renderer_viz.cc +++ b/android_webview/browser/gfx/hardware_renderer_viz.cc
@@ -80,6 +80,7 @@ ChildFrame* child_frame); void PostDrawOnViz(viz::FrameTimingDetailsMap* timing_details); void RemoveOverlaysOnViz(); + void MarkExpectContextLossOnViz(); OverlayProcessorWebView* overlay_processor() { return overlay_processor_webview_; @@ -113,6 +114,7 @@ std::unique_ptr<viz::HitTestAggregator> hit_test_aggregator_; viz::SurfaceId child_surface_id_; const bool viz_frame_submission_; + bool expect_context_loss_ = false; // Initialized in ctor and never changes, so it's safe to access from both // threads. Can be null, if overlays are disabled. @@ -268,6 +270,11 @@ overlay_processor_webview_->RemoveOverlays(); } +void HardwareRendererViz::OnViz::MarkExpectContextLossOnViz() { + DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_); + expect_context_loss_ = true; +} + viz::FrameSinkManagerImpl* HardwareRendererViz::OnViz::GetFrameSinkManager() { DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_); return VizCompositorThreadRunnerWebView::GetInstance()->GetFrameSinkManager(); @@ -275,8 +282,10 @@ void HardwareRendererViz::OnViz::DisplayOutputSurfaceLost() { DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_); - // Android WebView does not handle context loss. - LOG(FATAL) << "Render thread context loss"; + if (!expect_context_loss_) { + // Android WebView does not handle real context loss. + LOG(FATAL) << "Render thread context loss"; + } } void HardwareRendererViz::OnViz::DisplayWillDrawAndSwap( @@ -456,4 +465,14 @@ } } +void HardwareRendererViz::AbandonContext() { + VizCompositorThreadRunnerWebView::GetInstance()->task_runner()->PostTask( + FROM_HERE, + base::BindOnce(&HardwareRendererViz::OnViz::MarkExpectContextLossOnViz, + base::Unretained(on_viz_.get()))); + output_surface_provider_.MarkExpectContextLoss(); + output_surface_provider_.shared_context_state()->MarkContextLost( + gpu::error::ContextLostReason::kUnknown); +} + } // namespace android_webview
diff --git a/android_webview/browser/gfx/hardware_renderer_viz.h b/android_webview/browser/gfx/hardware_renderer_viz.h index b8bf7e1..5430a9b98 100644 --- a/android_webview/browser/gfx/hardware_renderer_viz.h +++ b/android_webview/browser/gfx/hardware_renderer_viz.h
@@ -30,6 +30,7 @@ const OverlaysParams& overlays_params) override; void RemoveOverlays( OverlaysParams::MergeTransactionFn merge_transaction) override; + void AbandonContext() override; private: class OnViz;
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.cc b/android_webview/browser/gfx/output_surface_provider_webview.cc index 3d68b3d..970bf52 100644 --- a/android_webview/browser/gfx/output_surface_provider_webview.cc +++ b/android_webview/browser/gfx/output_surface_provider_webview.cc
@@ -30,12 +30,16 @@ namespace { -void OnContextLost(bool synthetic_loss) { +void OnContextLost(std::unique_ptr<bool> expect_loss, bool synthetic_loss) { + if (expect_loss && *expect_loss) + return; // TODO(https://crbug.com/1112841): Debugging contexts losts. WebView will // intentionally crash in HardwareRendererViz::OnViz::DisplayOutputSurface // that will happen after this callback. That crash happens on viz thread and // doesn't have any useful information. Crash here on RenderThread to // understand the reason of context losts. + // If this implementation changes, need to ensure `expect_loss` access from + // MarkExpectContextLoss is still valid. LOG(FATAL) << "Non owned context lost!"; } @@ -115,9 +119,12 @@ gl::init::CreateGLContext(share_group.get(), gl_surface_.get(), attribs); gl_context->MakeCurrent(gl_surface_.get()); + auto expect_context_loss_ptr = std::make_unique<bool>(false); + expect_context_loss_ = expect_context_loss_ptr.get(); shared_context_state_ = base::MakeRefCounted<gpu::SharedContextState>( share_group, gl_surface_, std::move(gl_context), - false /* use_virtualized_gl_contexts */, base::BindOnce(&OnContextLost), + false /* use_virtualized_gl_contexts */, + base::BindOnce(&OnContextLost, std::move(expect_context_loss_ptr)), GpuServiceWebView::GetInstance()->gpu_preferences().gr_context_type, vulkan_context_provider_); if (!enable_vulkan_) { @@ -167,4 +174,12 @@ display_compositor_controller, renderer_settings_, debug_settings()); } +void OutputSurfaceProviderWebView::MarkExpectContextLoss() { + // This is safe because either the OnContextLost callback has run and we've + // already crashed or it has not run and this pointer is still valid. + if (expect_context_loss_) + *expect_context_loss_ = true; + expect_context_loss_ = nullptr; +} + } // namespace android_webview
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.h b/android_webview/browser/gfx/output_surface_provider_webview.h index fff5f38..36f25e6 100644 --- a/android_webview/browser/gfx/output_surface_provider_webview.h +++ b/android_webview/browser/gfx/output_surface_provider_webview.h
@@ -37,6 +37,7 @@ std::unique_ptr<viz::OutputSurface> CreateOutputSurface( viz::DisplayCompositorMemoryAndTaskController* display_compositor_controller); + void MarkExpectContextLoss(); const viz::RendererSettings& renderer_settings() const { return renderer_settings_; @@ -60,6 +61,7 @@ scoped_refptr<AwGLSurface> gl_surface_; scoped_refptr<gpu::SharedContextState> shared_context_state_; bool enable_vulkan_; + bool* expect_context_loss_ = nullptr; }; } // namespace android_webview
diff --git a/android_webview/browser/gfx/render_thread_manager.cc b/android_webview/browser/gfx/render_thread_manager.cc index 6fde0f6d..2fe8290 100644 --- a/android_webview/browser/gfx/render_thread_manager.cc +++ b/android_webview/browser/gfx/render_thread_manager.cc
@@ -224,14 +224,17 @@ hardware_renderer_->RemoveOverlays(merge_transaction); } -void RenderThreadManager::DestroyHardwareRendererOnRT(bool save_restore) { +void RenderThreadManager::DestroyHardwareRendererOnRT(bool save_restore, + bool abandon_context) { GpuServiceWebView::GetInstance(); absl::optional<ScopedAppGLStateRestore> state_restore; - if (!vulkan_context_provider_) { + if (!vulkan_context_provider_ && !abandon_context) { state_restore.emplace(ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT, save_restore); } + if (abandon_context && hardware_renderer_) + hardware_renderer_->AbandonContext(); hardware_renderer_.reset(); }
diff --git a/android_webview/browser/gfx/render_thread_manager.h b/android_webview/browser/gfx/render_thread_manager.h index 2545acc3..6f1f5ce 100644 --- a/android_webview/browser/gfx/render_thread_manager.h +++ b/android_webview/browser/gfx/render_thread_manager.h
@@ -65,7 +65,7 @@ void DrawOnRT(bool save_restore, const HardwareRendererDrawParams& params, const OverlaysParams& overlays_params); - void DestroyHardwareRendererOnRT(bool save_restore); + void DestroyHardwareRendererOnRT(bool save_restore, bool abandon_context); void RemoveOverlaysOnRT(OverlaysParams::MergeTransactionFn merge_transaction); // May be created on either thread.
diff --git a/android_webview/browser/gfx/test/fake_window.cc b/android_webview/browser/gfx/test/fake_window.cc index 4e451d32..ee2e1f1f0 100644 --- a/android_webview/browser/gfx/test/fake_window.cc +++ b/android_webview/browser/gfx/test/fake_window.cc
@@ -280,7 +280,7 @@ RenderThreadManager::InsideHardwareReleaseReset release_reset( render_thread_manager_.get()); render_thread_manager_->DestroyHardwareRendererOnRT( - false /* save_restore */); + false /* save_restore */, false /* abandon_context */); } render_thread_manager_.reset(); std::move(callback).Run(); @@ -301,7 +301,9 @@ void FakeFunctor::Invoke(WindowHooks* hooks) { DCHECK(render_thread_manager_); hooks->WillProcessOnRT(); - render_thread_manager_->DestroyHardwareRendererOnRT(false /* save_restore */); + bool abandon_context = true; // For test coverage. + render_thread_manager_->DestroyHardwareRendererOnRT(false /* save_restore */, + abandon_context); hooks->DidProcessOnRT(); }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java index 41ef710..3f90266 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -616,4 +616,43 @@ webServer.shutdown(); } } + + /** + * Fragment navigation triggered by history APIs can trigger onPageFinished. + */ + @Test + @MediumTest + @Feature({"AndroidWebView"}) + public void testCalledForHistoryApiFragmentNavigation() throws Throwable { + TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = + mContentsClient.getOnPageFinishedHelper(); + AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents); + TestWebServer webServer = TestWebServer.start(); + try { + final String testHtml = "<html><head>Header</head><body>Body</body></html>"; + final String testPath = "/test.html"; + final String fragmentPath = "/test.html#fragment"; + + final String testUrl = webServer.setResponse(testPath, testHtml, null); + final String fragmentUrl = webServer.getResponseUrl(fragmentPath); + + int currentCallCount = onPageFinishedHelper.getCallCount(); + mActivityTestRule.loadUrlSync(mAwContents, onPageFinishedHelper, testUrl); + onPageFinishedHelper.waitForCallback(currentCallCount); + Assert.assertEquals(testUrl, onPageFinishedHelper.getUrl()); + Assert.assertEquals(1, onPageFinishedHelper.getCallCount()); + + currentCallCount = onPageFinishedHelper.getCallCount(); + // History APIs can trigger fragment navigation, and this fragment navigation will + // trigger onPageFinished, the parameter url carried by onPageFinished will be the + // parameter url carried by history API. + mActivityTestRule.executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, + "history.pushState(null, null, '" + fragmentPath + "');"); + onPageFinishedHelper.waitForCallback(currentCallCount); + Assert.assertEquals(fragmentUrl, onPageFinishedHelper.getUrl()); + Assert.assertEquals(2, onPageFinishedHelper.getCallCount()); + } finally { + webServer.shutdown(); + } + } }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 9caf12d..0e70218 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -2093,8 +2093,11 @@ "assistant/assistant_suggestions_controller_impl_unittest.cc", "assistant/model/assistant_query_history_unittest.cc", "assistant/ui/assistant_web_container_view_unittest.cc", + "assistant/ui/colors/assistant_colors_util_unittest.cc", "assistant/ui/main_stage/assistant_onboarding_view_unittest.cc", "assistant/ui/main_stage/assistant_opt_in_view_unittest.cc", + "assistant/ui/main_stage/assistant_query_view_unittest.cc", + "assistant/ui/main_stage/assistant_zero_state_view_unittest.cc", "assistant/ui/main_stage/suggestion_chip_view_unittest.cc", "assistant/util/deep_link_util_unittest.cc", "assistant/util/resource_util_unittest.cc", @@ -2477,6 +2480,8 @@ "//ash/assistant/model", "//ash/assistant/ui", "//ash/assistant/ui:constants", + "//ash/assistant/ui/colors:assistant_colors_util", + "//ash/assistant/ui/colors:assistant_colors_views", "//ash/assistant/ui/test_support", "//ash/assistant/util", "//ash/components:unit_tests", @@ -2574,6 +2579,7 @@ "//ui/base/ime", "//ui/base/ime/chromeos", "//ui/chromeos", + "//ui/chromeos/colors:cros_colors_views", "//ui/chromeos/events", "//ui/compositor", "//ui/compositor:test_support",
diff --git a/ash/OWNERS b/ash/OWNERS index 4eb7905..0a052c7 100644 --- a/ash/OWNERS +++ b/ash/OWNERS
@@ -1,7 +1,6 @@ set noparent afakhry@chromium.org jamescook@chromium.org -mukai@chromium.org oshima@chromium.org sky@chromium.org xiyuan@chromium.org
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index 37e2605..bd24417b 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -134,6 +134,8 @@ "//ash/assistant/model", "//ash/assistant/ui", "//ash/assistant/ui:constants", + "//ash/assistant/ui/colors:assistant_colors_util", + "//ash/assistant/ui/colors:assistant_colors_views", "//ash/assistant/util", "//ash/keyboard/ui", "//ash/public/cpp/app_list/vector_icons", @@ -257,6 +259,7 @@ "//ash/assistant/model", "//ash/assistant/ui", "//ash/assistant/ui:constants", + "//ash/assistant/ui/colors:assistant_colors_views", "//ash/constants", "//ash/keyboard/ui", "//ash/keyboard/ui:test_support",
diff --git a/ash/app_list/views/assistant/assistant_main_stage.cc b/ash/app_list/views/assistant/assistant_main_stage.cc index a7eea99..8c426c4 100644 --- a/ash/app_list/views/assistant/assistant_main_stage.cc +++ b/ash/app_list/views/assistant/assistant_main_stage.cc
@@ -236,7 +236,6 @@ query_view_ = content_layout_container->AddChildView( std::make_unique<AssistantQueryView>()); query_view_->SetPaintToLayer(); - query_view_->SetBackground(views::CreateSolidBackground(SK_ColorWHITE)); query_view_->AddObserver(this); // UI element container.
diff --git a/ash/app_list/views/assistant/assistant_page_view.cc b/ash/app_list/views/assistant/assistant_page_view.cc index 7fc527a..a66a0d4 100644 --- a/ash/app_list/views/assistant/assistant_page_view.cc +++ b/ash/app_list/views/assistant/assistant_page_view.cc
@@ -16,6 +16,8 @@ #include "ash/assistant/model/assistant_ui_model.h" #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_view_delegate.h" +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/assistant/ui/colors/assistant_colors_util.h" #include "ash/assistant/util/assistant_util.h" #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/assistant/assistant_state.h" @@ -423,6 +425,13 @@ } } +void AssistantPageView::OnThemeChanged() { + views::View::OnThemeChanged(); + + background()->SetNativeControlColor(ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate)); +} + void AssistantPageView::InitLayout() { SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); @@ -431,7 +440,9 @@ view_shadow_->SetRoundedCornerRadius( kSearchBoxBorderCornerRadiusSearchResult); - SetBackground(views::CreateSolidBackground(SK_ColorWHITE)); + SetBackground( + views::CreateSolidBackground(ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate))); SetLayoutManager(std::make_unique<AssistantPageViewLayout>(this)); // |assistant_view_delegate_| could be nullptr in test.
diff --git a/ash/app_list/views/assistant/assistant_page_view.h b/ash/app_list/views/assistant/assistant_page_view.h index 02fdf17..35972750 100644 --- a/ash/app_list/views/assistant/assistant_page_view.h +++ b/ash/app_list/views/assistant/assistant_page_view.h
@@ -76,6 +76,9 @@ absl::optional<AssistantEntryPoint> entry_point, absl::optional<AssistantExitPoint> exit_point) override; + // views::View: + void OnThemeChanged() override; + private: void InitLayout(); void MaybeUpdateAppListState(int child_height);
diff --git a/ash/app_list/views/assistant/assistant_page_view_unittest.cc b/ash/app_list/views/assistant/assistant_page_view_unittest.cc index 9c1d1b0..31e9d51 100644 --- a/ash/app_list/views/assistant/assistant_page_view_unittest.cc +++ b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
@@ -6,16 +6,24 @@ #include "ash/assistant/model/assistant_ui_model.h" #include "ash/assistant/test/assistant_ash_test_base.h" #include "ash/assistant/ui/assistant_ui_constants.h" +#include "ash/assistant/ui/colors/assistant_colors.h" #include "ash/assistant/ui/main_stage/assistant_onboarding_suggestion_view.h" #include "ash/assistant/ui/main_stage/suggestion_chip_view.h" +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/app_list/app_list_types.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "ash/style/ash_color_provider.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" #include "chromeos/services/assistant/public/cpp/features.h" +#include "third_party/skia/include/core/SkColor.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/events/event.h" +#include "ui/views/background.h" #include "ui/views/controls/textfield/textfield.h" #include "ui/views/focus/focus_manager.h" #include "ui/views/widget/widget.h" @@ -904,6 +912,35 @@ EXPECT_EQ(kAnyChip, base::UTF16ToUTF8(chip->GetText())); } +TEST_F(AssistantPageViewTest, Theme) { + ASSERT_FALSE(features::IsDarkLightModeEnabled()); + + ShowAssistantUi(); + + EXPECT_EQ(page_view()->background()->get_color(), SK_ColorWHITE); +} + +TEST_F(AssistantPageViewTest, ThemeDarkLightMode) { + base::test::ScopedFeatureList scoped_feature_list(features::kDarkLightMode); + AshColorProvider::Get()->OnActiveUserPrefServiceChanged( + Shell::Get()->session_controller()->GetActivePrefService()); + + ShowAssistantUi(); + + EXPECT_EQ(page_view()->background()->get_color(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + + Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean( + prefs::kDarkModeEnabled, true); + + EXPECT_EQ(page_view()->background()->get_color(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); +} + // Tests the |AssistantPageView| with tablet mode enabled. class AssistantPageViewTabletModeTest : public AssistantPageViewTest { public:
diff --git a/ash/assistant/ui/BUILD.gn b/ash/assistant/ui/BUILD.gn index d3c3729..a85961d 100644 --- a/ash/assistant/ui/BUILD.gn +++ b/ash/assistant/ui/BUILD.gn
@@ -89,6 +89,8 @@ deps = [ "//ash/assistant/model", "//ash/assistant/ui:constants", + "//ash/assistant/ui/colors:assistant_colors_util", + "//ash/assistant/ui/colors:assistant_colors_views", "//ash/assistant/util", "//ash/keyboard/ui", "//ash/public/cpp", @@ -101,6 +103,7 @@ "//chromeos/services/libassistant/public/cpp:structs", "//chromeos/ui/vector_icons", "//ui/aura", + "//ui/chromeos/colors:cros_colors_views", "//ui/compositor", "//ui/gfx", "//ui/views",
diff --git a/ash/assistant/ui/DEPS b/ash/assistant/ui/DEPS index 8af7df8..e22c243 100644 --- a/ash/assistant/ui/DEPS +++ b/ash/assistant/ui/DEPS
@@ -4,10 +4,12 @@ "+ash/assistant/model", "+ash/assistant/ui", "+ash/assistant/util", + "+ash/constants", "+ash/keyboard/ui", "+ash/public", "+ash/resources/vector_icons", "+ash/strings", + "+ash/style", "+base", "+build/buildflag.h", "+cc/base",
diff --git a/ash/assistant/ui/assistant_view_ids.h b/ash/assistant/ui/assistant_view_ids.h index 7495ee22..6a6a661e 100644 --- a/ash/assistant/ui/assistant_view_ids.h +++ b/ash/assistant/ui/assistant_view_ids.h
@@ -37,6 +37,10 @@ // UIs in OptInView kOptInViewStyledLabel, + + // UIs in QueryView + kHighConfidenceLabel, + kLowConfidenceLabel }; } // namespace ash
diff --git a/ash/assistant/ui/colors/BUILD.gn b/ash/assistant/ui/colors/BUILD.gn new file mode 100644 index 0000000..56985462 --- /dev/null +++ b/ash/assistant/ui/colors/BUILD.gn
@@ -0,0 +1,26 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//tools/style_variable_generator/style_variable_generator.gni") + +style_variable_generator("assistant_colors") { + sources = [ + "//ui/chromeos/colors/cros_palette.json5", + "assistant_colors.json5", + ] +} + +source_set("assistant_colors_util") { + sources = [ + "assistant_colors_util.cc", + "assistant_colors_util.h", + ] + deps = [ + ":assistant_colors_views", + "//ash/constants", + "//ash/public/cpp", + "//base", + "//skia", + ] +}
diff --git a/ash/assistant/ui/colors/assistant_colors.json5 b/ash/assistant/ui/colors/assistant_colors.json5 new file mode 100644 index 0000000..704bd2a61 --- /dev/null +++ b/ash/assistant/ui/colors/assistant_colors.json5
@@ -0,0 +1,29 @@ +/* Copyright 2021 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. */ + +/* + * Color palette for Assistant UIs. + */ +{ + options: { + // Define options for proto. We are not using it for now. But we define them + // as CQ builds it. + proto: { + field_name: "assistant_colors", + // Use 2 as a field id since cros_palette.json5 takes 1. + field_id: 2, + } + }, + colors: { + bg_assistant_plate: { + // Those colors are customized colors, i.e. not in cros_palette.json5. + light: "#ecefee", + dark: "#1c2b3b", + }, + }, + opacities: { + // This is necessary to avoid C++ compile error. + fake_opacity: 0.0, + } +}
diff --git a/ash/assistant/ui/colors/assistant_colors_util.cc b/ash/assistant/ui/colors/assistant_colors_util.cc new file mode 100644 index 0000000..7488ed8 --- /dev/null +++ b/ash/assistant/ui/colors/assistant_colors_util.cc
@@ -0,0 +1,40 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/assistant/ui/colors/assistant_colors_util.h" + +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/style/color_provider.h" +#include "base/feature_list.h" + +namespace ash { +namespace assistant { +namespace { + +SkColor GetDarkLightModeFlagOffColor(assistant_colors::ColorName color_name) { + if (color_name == assistant_colors::ColorName::kBgAssistantPlate) + return SK_ColorWHITE; + + return assistant_colors::ResolveColor(color_name, /*is_dark_mode=*/false, + /*use_debug_colors=*/false); +} + +} // namespace + +SkColor ResolveAssistantColor(assistant_colors::ColorName color_name) { + // Delete this utility class and call assistant_colors::ResolveColor directly + // once dark and light mode has launched and features::IsDarkLightModeEnabled + // gets removed. + if (!features::IsDarkLightModeEnabled()) + return GetDarkLightModeFlagOffColor(color_name); + + return assistant_colors::ResolveColor( + color_name, ColorProvider::Get()->IsDarkModeEnabled(), + base::FeatureList::IsEnabled( + ash::features::kSemanticColorsDebugOverride)); +} + +} // namespace assistant +} // namespace ash
diff --git a/ash/assistant/ui/colors/assistant_colors_util.h b/ash/assistant/ui/colors/assistant_colors_util.h new file mode 100644 index 0000000..0d0ef48 --- /dev/null +++ b/ash/assistant/ui/colors/assistant_colors_util.h
@@ -0,0 +1,21 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_ASSISTANT_UI_COLORS_ASSISTANT_COLORS_UTIL_H_ +#define ASH_ASSISTANT_UI_COLORS_ASSISTANT_COLORS_UTIL_H_ + +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace ash { +namespace assistant { + +// This redirects a request to assistant_colors::ResolveColor. If kDarkLightMode +// flag is off, this resolve the color from a map defined in the cc file. +SkColor ResolveAssistantColor(assistant_colors::ColorName color_name); + +} // namespace assistant +} // namespace ash + +#endif // ASH_ASSISTANT_UI_COLORS_ASSISTANT_COLORS_UTIL_H_
diff --git a/ash/assistant/ui/colors/assistant_colors_util_unittest.cc b/ash/assistant/ui/colors/assistant_colors_util_unittest.cc new file mode 100644 index 0000000..7159e92 --- /dev/null +++ b/ash/assistant/ui/colors/assistant_colors_util_unittest.cc
@@ -0,0 +1,67 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/assistant/ui/colors/assistant_colors_util.h" + +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "ash/style/ash_color_provider.h" +#include "ash/test/ash_test_base.h" +#include "base/test/scoped_feature_list.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace ash { +namespace assistant { + +using AssistantColorsUtilUnittest = AshTestBase; + +TEST_F(AssistantColorsUtilUnittest, AssistantColor) { + base::test::ScopedFeatureList scoped_feature_list(features::kDarkLightMode); + AshColorProvider::Get()->OnActiveUserPrefServiceChanged( + Shell::Get()->session_controller()->GetActivePrefService()); + + EXPECT_EQ( + ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + + Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean( + prefs::kDarkModeEnabled, true); + + EXPECT_EQ( + ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); +} + +TEST_F(AssistantColorsUtilUnittest, AssistantColorFlagOff) { + ASSERT_FALSE(features::IsDarkLightModeEnabled()); + + EXPECT_EQ( + ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate), + SK_ColorWHITE); + EXPECT_EQ( + ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate), + SK_ColorWHITE); +} + +// ResolveAssistantColor falls back to assistant_colors::ResolveColor with dark +// mode off if the color is not defined in the cc file map and the flag is off. +TEST_F(AssistantColorsUtilUnittest, AssistantColorFlagOffFallback) { + ASSERT_FALSE(features::IsDarkLightModeEnabled()); + + EXPECT_EQ(ResolveAssistantColor(assistant_colors::ColorName::kGoogleBlue100), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kGoogleBlue100, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); +} + +} // namespace assistant +} // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_query_view.cc b/ash/assistant/ui/main_stage/assistant_query_view.cc index 960f440f..63165a03 100644 --- a/ash/assistant/ui/main_stage/assistant_query_view.cc +++ b/ash/assistant/ui/main_stage/assistant_query_view.cc
@@ -10,6 +10,9 @@ #include "ash/assistant/model/assistant_query.h" #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_view_ids.h" +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/assistant/ui/colors/assistant_colors_util.h" +#include "ash/public/cpp/style/color_provider.h" #include "base/strings/utf_string_conversions.h" #include "net/base/escape.h" #include "ui/accessibility/ax_enums.mojom.h" @@ -28,14 +31,12 @@ // Helpers --------------------------------------------------------------------- -std::unique_ptr<views::Label> CreateLabel(SkColor color) { +std::unique_ptr<views::Label> CreateLabel() { auto label = std::make_unique<views::Label>(); label->SetAutoColorReadabilityEnabled(false); label->SetLineHeight(kLineHeightDip); - label->SetBackground(views::CreateSolidBackground(SK_ColorWHITE)); label->SetFontList( assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(2)); - label->SetEnabledColor(color); label->SetElideBehavior(gfx::ElideBehavior::ELIDE_HEAD); return label; } @@ -64,7 +65,32 @@ return kHeightDip; } +void AssistantQueryView::OnThemeChanged() { + views::View::OnThemeChanged(); + + background()->SetNativeControlColor(ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate)); + + high_confidence_label_->SetBackgroundColor( + ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate)); + high_confidence_label_->SetEnabledColor( + ColorProvider::Get()->GetContentLayerColor( + ColorProvider::ContentLayerType::kTextColorPrimary)); + + low_confidence_label_->SetBackgroundColor( + ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate)); + low_confidence_label_->SetEnabledColor( + ColorProvider::Get()->GetContentLayerColor( + ColorProvider::ContentLayerType::kTextColorSecondary)); +} + void AssistantQueryView::InitLayout() { + SetBackground( + views::CreateSolidBackground(ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate))); + views::FlexLayout* layout_manager = SetLayoutManager(std::make_unique<views::FlexLayout>()); @@ -73,15 +99,16 @@ layout_manager->SetCrossAxisAlignment(views::LayoutAlignment::kCenter); // Labels - high_confidence_label_ = AddChildView(CreateLabel(kTextColorPrimary)); - + high_confidence_label_ = AddChildView(CreateLabel()); + high_confidence_label_->SetID(AssistantViewID::kHighConfidenceLabel); high_confidence_label_->SetProperty( views::kFlexBehaviorKey, views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero, views::MaximumFlexSizeRule::kPreferred) .WithOrder(2)); - low_confidence_label_ = AddChildView(CreateLabel(kTextColorSecondary)); + low_confidence_label_ = AddChildView(CreateLabel()); + low_confidence_label_->SetID(AssistantViewID::kLowConfidenceLabel); low_confidence_label_->SetProperty( views::kFlexBehaviorKey, views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
diff --git a/ash/assistant/ui/main_stage/assistant_query_view.h b/ash/assistant/ui/main_stage/assistant_query_view.h index 4a45a2e..a5890f8 100644 --- a/ash/assistant/ui/main_stage/assistant_query_view.h +++ b/ash/assistant/ui/main_stage/assistant_query_view.h
@@ -27,6 +27,7 @@ const char* GetClassName() const override; gfx::Size CalculatePreferredSize() const override; int GetHeightForWidth(int width) const override; + void OnThemeChanged() override; void SetQuery(const AssistantQuery& query);
diff --git a/ash/assistant/ui/main_stage/assistant_query_view_unittest.cc b/ash/assistant/ui/main_stage/assistant_query_view_unittest.cc new file mode 100644 index 0000000..f1dee363 --- /dev/null +++ b/ash/assistant/ui/main_stage/assistant_query_view_unittest.cc
@@ -0,0 +1,113 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/assistant/ui/main_stage/assistant_query_view.h" + +#include "ash/assistant/test/assistant_ash_test_base.h" +#include "ash/assistant/ui/assistant_ui_constants.h" +#include "ash/assistant/ui/assistant_view_ids.h" +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "ash/style/ash_color_provider.h" +#include "ash/style/scoped_light_mode_as_default.h" +#include "base/feature_list.h" +#include "base/test/scoped_feature_list.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/chromeos/colors/cros_colors.h" +#include "ui/views/background.h" +#include "ui/views/controls/label.h" +#include "ui/views/view.h" + +namespace ash { +namespace { + +using AssistantQueryViewUnittest = AssistantAshTestBase; + +TEST_F(AssistantQueryViewUnittest, ThemeDarkLightMode) { + base::test::ScopedFeatureList scoped_feature_list(features::kDarkLightMode); + AshColorProvider::Get()->OnActiveUserPrefServiceChanged( + Shell::Get()->session_controller()->GetActivePrefService()); + + ShowAssistantUi(); + + const views::View* query_view = + main_view()->GetViewByID(AssistantViewID::kQueryView); + const views::Label* high_confidence_label = static_cast<views::Label*>( + main_view()->GetViewByID(AssistantViewID::kHighConfidenceLabel)); + const views::Label* low_confidence_label = static_cast<views::Label*>( + main_view()->GetViewByID(AssistantViewID::kLowConfidenceLabel)); + + EXPECT_EQ(query_view->background()->get_color(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + EXPECT_EQ(high_confidence_label->GetBackgroundColor(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + EXPECT_EQ(high_confidence_label->GetEnabledColor(), + cros_colors::ResolveColor(cros_colors::ColorName::kTextColorPrimary, + /*is_dark_mode=*/false, + /*use_debug_colors=*/false)); + EXPECT_EQ(low_confidence_label->GetBackgroundColor(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + EXPECT_EQ( + low_confidence_label->GetEnabledColor(), + cros_colors::ResolveColor(cros_colors::ColorName::kTextColorSecondary, + /*is_dark_mode=*/false, + /*use_debug_colors=*/false)); + + Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean( + prefs::kDarkModeEnabled, true); + + EXPECT_EQ(query_view->background()->get_color(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); + EXPECT_EQ(high_confidence_label->GetBackgroundColor(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); + EXPECT_EQ(high_confidence_label->GetEnabledColor(), + cros_colors::ResolveColor(cros_colors::ColorName::kTextColorPrimary, + /*is_dark_mode=*/true, + /*use_debug_colors=*/false)); + EXPECT_EQ(low_confidence_label->GetBackgroundColor(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); + EXPECT_EQ( + low_confidence_label->GetEnabledColor(), + cros_colors::ResolveColor(cros_colors::ColorName::kTextColorSecondary, + /*is_dark_mode=*/true, + /*use_debug_colors=*/false)); +} + +TEST_F(AssistantQueryViewUnittest, Theme) { + ASSERT_FALSE(features::IsDarkLightModeEnabled()); + ScopedLightModeAsDefault scoped_light_mode_as_default; + + ShowAssistantUi(); + + const views::View* query_view = + main_view()->GetViewByID(AssistantViewID::kQueryView); + const views::Label* high_confidence_label = static_cast<views::Label*>( + main_view()->GetViewByID(AssistantViewID::kHighConfidenceLabel)); + const views::Label* low_confidence_label = static_cast<views::Label*>( + main_view()->GetViewByID(AssistantViewID::kLowConfidenceLabel)); + + EXPECT_EQ(query_view->background()->get_color(), SK_ColorWHITE); + EXPECT_EQ(high_confidence_label->GetBackgroundColor(), SK_ColorWHITE); + EXPECT_EQ(high_confidence_label->GetEnabledColor(), kTextColorPrimary); + EXPECT_EQ(low_confidence_label->GetBackgroundColor(), SK_ColorWHITE); + EXPECT_EQ(low_confidence_label->GetEnabledColor(), kTextColorSecondary); +} + +} // namespace +} // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_zero_state_view.cc b/ash/assistant/ui/main_stage/assistant_zero_state_view.cc index caa380c..3e932568 100644 --- a/ash/assistant/ui/main_stage/assistant_zero_state_view.cc +++ b/ash/assistant/ui/main_stage/assistant_zero_state_view.cc
@@ -10,9 +10,12 @@ #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_view_delegate.h" #include "ash/assistant/ui/assistant_view_ids.h" +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/assistant/ui/colors/assistant_colors_util.h" #include "ash/assistant/ui/main_stage/assistant_onboarding_view.h" #include "ash/public/cpp/assistant/assistant_state.h" #include "ash/public/cpp/assistant/controller/assistant_ui_controller.h" +#include "ash/public/cpp/style/color_provider.h" #include "ash/strings/grit/ash_strings.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "ui/base/l10n/l10n_util.h" @@ -20,6 +23,7 @@ #include "ui/views/border.h" #include "ui/views/controls/label.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/view.h" namespace ash { @@ -61,6 +65,15 @@ PreferredSizeChanged(); } +void AssistantZeroStateView::OnThemeChanged() { + views::View::OnThemeChanged(); + + greeting_label_->SetBackgroundColor(ash::assistant::ResolveAssistantColor( + assistant_colors::ColorName::kBgAssistantPlate)); + greeting_label_->SetEnabledColor(ColorProvider::Get()->GetContentLayerColor( + ColorProvider::ContentLayerType::kTextColorPrimary)); +} + void AssistantZeroStateView::OnAssistantControllerDestroying() { AssistantUiController::Get()->GetModel()->RemoveObserver(this); DCHECK(assistant_controller_observation_.IsObservingSource( @@ -94,10 +107,8 @@ greeting_label_ = AddChildView(std::make_unique<views::Label>()); greeting_label_->SetID(AssistantViewID::kGreetingLabel); greeting_label_->SetAutoColorReadabilityEnabled(false); - greeting_label_->SetBackground(views::CreateSolidBackground(SK_ColorWHITE)); greeting_label_->SetBorder( views::CreateEmptyBorder(kGreetingLabelTopMarginDip, 0, 0, 0)); - greeting_label_->SetEnabledColor(kTextColorPrimary); greeting_label_->SetFontList( assistant::ui::GetDefaultFontList() .DeriveWithSizeDelta(8)
diff --git a/ash/assistant/ui/main_stage/assistant_zero_state_view.h b/ash/assistant/ui/main_stage/assistant_zero_state_view.h index f782521..0df2695f 100644 --- a/ash/assistant/ui/main_stage/assistant_zero_state_view.h +++ b/ash/assistant/ui/main_stage/assistant_zero_state_view.h
@@ -35,6 +35,7 @@ const char* GetClassName() const override; gfx::Size CalculatePreferredSize() const override; void ChildPreferredSizeChanged(views::View* child) override; + void OnThemeChanged() override; // AssistantController: void OnAssistantControllerDestroying() override;
diff --git a/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc b/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc new file mode 100644 index 0000000..673aba78 --- /dev/null +++ b/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc
@@ -0,0 +1,73 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/assistant/ui/main_stage/assistant_zero_state_view.h" + +#include "ash/assistant/test/assistant_ash_test_base.h" +#include "ash/assistant/ui/assistant_ui_constants.h" +#include "ash/assistant/ui/assistant_view_ids.h" +#include "ash/assistant/ui/colors/assistant_colors.h" +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "ash/style/ash_color_provider.h" +#include "ash/style/scoped_light_mode_as_default.h" +#include "base/test/scoped_feature_list.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/chromeos/colors/cros_colors.h" +#include "ui/views/controls/label.h" + +namespace ash { +namespace { + +using AssistantZeroStateViewUnittest = AssistantAshTestBase; + +TEST_F(AssistantZeroStateViewUnittest, Theme) { + ASSERT_FALSE(features::IsDarkLightModeEnabled()); + ScopedLightModeAsDefault scoped_light_mode_as_default; + + ShowAssistantUi(); + + const views::Label* greeting_label = static_cast<views::Label*>( + main_view()->GetViewByID(AssistantViewID::kGreetingLabel)); + + EXPECT_EQ(greeting_label->GetBackgroundColor(), SK_ColorWHITE); + EXPECT_EQ(greeting_label->GetEnabledColor(), kTextColorPrimary); +} + +TEST_F(AssistantZeroStateViewUnittest, ThemeDarkLightMode) { + base::test::ScopedFeatureList scoped_feature_list(features::kDarkLightMode); + AshColorProvider::Get()->OnActiveUserPrefServiceChanged( + Shell::Get()->session_controller()->GetActivePrefService()); + + ShowAssistantUi(); + + const views::Label* greeting_label = static_cast<views::Label*>( + main_view()->GetViewByID(AssistantViewID::kGreetingLabel)); + + EXPECT_EQ(greeting_label->GetBackgroundColor(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/false, /*use_debug_colors=*/false)); + EXPECT_EQ(greeting_label->GetEnabledColor(), + cros_colors::ResolveColor(cros_colors::ColorName::kTextColorPrimary, + /*is_dark_mode=*/false, + /*use_debug_colors=*/false)); + + Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean( + prefs::kDarkModeEnabled, true); + + EXPECT_EQ(greeting_label->GetBackgroundColor(), + assistant_colors::ResolveColor( + assistant_colors::ColorName::kBgAssistantPlate, + /*is_dark_mode=*/true, /*use_debug_colors=*/false)); + EXPECT_EQ(greeting_label->GetEnabledColor(), + cros_colors::ResolveColor(cros_colors::ColorName::kTextColorPrimary, + /*is_dark_mode=*/true, + /*use_debug_colors=*/false)); +} + +} // namespace +} // namespace ash
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 4736f25c..24919b6 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -615,6 +615,10 @@ const base::Feature kImeSystemEmojiPicker{"SystemEmojiPicker", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enable or disable system emoji picker falling back to clipboard. +const base::Feature kImeSystemEmojiPickerClipboard{ + "SystemEmojiPickerClipboard", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables or disables Instant Tethering on Chrome OS. const base::Feature kInstantTethering{"InstantTethering", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 679bba10..8c794bf 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -234,6 +234,8 @@ extern const base::Feature kImeOptionsInSettings; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kImeSystemEmojiPicker; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kImeSystemEmojiPickerClipboard; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kInstantTethering; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kKeyboardBasedDisplayArrangementInSettings;
diff --git a/ash/services/recording/recording_service.cc b/ash/services/recording/recording_service.cc index 2d07813e..37695b2bd 100644 --- a/ash/services/recording/recording_service.cc +++ b/ash/services/recording/recording_service.cc
@@ -34,7 +34,7 @@ // For a capture size of 320 by 240, we use a bitrate of 256 kbit/s. Based on // that, we calculate the bits per second per squared pixel. -constexpr uint64_t kMinBitrateInBitsPerSecond = 256 * 1000; +constexpr uint32_t kMinBitrateInBitsPerSecond = 256 * 1000; constexpr float kBitsPerSecondPerSquarePixel = static_cast<float>(kMinBitrateInBitsPerSecond) / (320.f * 240.f); @@ -45,9 +45,9 @@ // Calculates the bitrate used to initialize the video encoder based on the // given |capture_size|. -uint64_t CalculateVpxEncoderBitrate(const gfx::Size& capture_size) { +uint32_t CalculateVpxEncoderBitrate(const gfx::Size& capture_size) { return std::max(kMinBitrateInBitsPerSecond, - static_cast<uint64_t>(capture_size.GetArea() * + static_cast<uint32_t>(capture_size.GetArea() * kBitsPerSecondPerSquarePixel)); } @@ -56,7 +56,8 @@ media::VideoEncoder::Options CreateVideoEncoderOptions( const gfx::Size& capture_size) { media::VideoEncoder::Options video_encoder_options; - video_encoder_options.bitrate = CalculateVpxEncoderBitrate(capture_size); + video_encoder_options.bitrate = + media::Bitrate::ConstantBitrate(CalculateVpxEncoderBitrate(capture_size)); video_encoder_options.framerate = kMaxFrameRate; video_encoder_options.frame_size = capture_size; // This value, expressed as a number of frames, forces the encoder to code
diff --git a/ash/webui/diagnostics_ui/diagnostics_ui.cc b/ash/webui/diagnostics_ui/diagnostics_ui.cc index 295d06231..ffe92ca 100644 --- a/ash/webui/diagnostics_ui/diagnostics_ui.cc +++ b/ash/webui/diagnostics_ui/diagnostics_ui.cc
@@ -117,6 +117,8 @@ {"memoryRoutineText", IDS_DIAGNOSTICS_MEMORY_ROUTINE_TEXT}, {"memoryTitle", IDS_DIAGNOSTICS_MEMORY_TITLE}, {"noEthernet", IDS_DIAGNOSTICS_NO_ETHERNET}, + {"notEnoughAvailableMemoryMessage", + IDS_DIAGNOSTICS_NOT_ENOUGH_AVAILABLE_MEMORY}, {"overviewText", IDS_DIAGNOSTICS_OVERVIEW}, {"percentageLabel", IDS_DIAGNOSTICS_PERCENTAGE_LABEL}, {"remainingCharge", IDS_DIAGNOSTICS_REMAINING_CHARGE_LABEL},
diff --git a/ash/webui/diagnostics_ui/resources/diagnostics_utils.js b/ash/webui/diagnostics_ui/resources/diagnostics_utils.js index 6d57abd..9269ddb 100644 --- a/ash/webui/diagnostics_ui/resources/diagnostics_utils.js +++ b/ash/webui/diagnostics_ui/resources/diagnostics_utils.js
@@ -36,6 +36,16 @@ } /** + * Converts a KiB storage value to MiB. + * @param {number} value + * @return {number} + */ +export function convertKibToMib(value) { + // 1024 KiB is 1 MiB. + return value / (2 ** 10); +} + +/** * Returns an icon from the diagnostics icon set. * @param {string} id * @return {string}
diff --git a/ash/webui/diagnostics_ui/resources/fake_data.js b/ash/webui/diagnostics_ui/resources/fake_data.js index a95d684..402c14c 100644 --- a/ash/webui/diagnostics_ui/resources/fake_data.js +++ b/ash/webui/diagnostics_ui/resources/fake_data.js
@@ -138,6 +138,30 @@ /** @type {!Array<!MemoryUsage>} */ export const fakeMemoryUsage = [ { + availableMemoryKib: 570000, + freeMemoryKib: 150000, + totalMemoryKib: 1280000, + }, + { + availableMemoryKib: 520000, + freeMemoryKib: 150000, + totalMemoryKib: 1280000, + }, + { + availableMemoryKib: 530000, + freeMemoryKib: 150000, + totalMemoryKib: 1280000, + }, + { + availableMemoryKib: 650000, + freeMemoryKib: 150000, + totalMemoryKib: 1280000, + } +]; + +/** @type {!Array<!MemoryUsage>} */ +export const fakeMemoryUsageLowAvailableMemory = [ + { availableMemoryKib: 57000, freeMemoryKib: 15000, totalMemoryKib: 128000,
diff --git a/ash/webui/diagnostics_ui/resources/memory_card.html b/ash/webui/diagnostics_ui/resources/memory_card.html index d577101..1a9581b 100644 --- a/ash/webui/diagnostics_ui/resources/memory_card.html +++ b/ash/webui/diagnostics_ui/resources/memory_card.html
@@ -14,6 +14,8 @@ is-test-running="{{isTestRunning}}" run-tests-button-text="[[i18n('runMemoryTestText')]]" learn-more-link-section="memory" - is-active="[[isActive]]"> + is-active="[[isActive]]" + additional-message="[[getRunTestsAdditionalMessage_( + memoryUsage_.availableMemoryKib)]]"> </routine-section> </diagnostics-card>
diff --git a/ash/webui/diagnostics_ui/resources/memory_card.js b/ash/webui/diagnostics_ui/resources/memory_card.js index 64d1f18..8e2a271d 100644 --- a/ash/webui/diagnostics_ui/resources/memory_card.js +++ b/ash/webui/diagnostics_ui/resources/memory_card.js
@@ -17,7 +17,7 @@ import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {MemoryUsage, MemoryUsageObserverInterface, MemoryUsageObserverReceiver, RoutineType, SystemDataProviderInterface} from './diagnostics_types.js' -import {convertKibToGibDecimalString} from './diagnostics_utils.js'; +import {convertKibToGibDecimalString, convertKibToMib} from './diagnostics_utils.js'; import {getSystemDataProvider} from './mojo_interface_provider.js'; /** @@ -138,4 +138,14 @@ Math.ceil(this.memoryUsage_.totalMemoryKib / 300000) : 0; }, + + /** + * @return {string} + * @protected + */ + getRunTestsAdditionalMessage_() { + return convertKibToMib(this.memoryUsage_.availableMemoryKib) >= 500 ? + '' : + loadTimeData.getString('notEnoughAvailableMemoryMessage'); + }, });
diff --git a/ash/wm/OWNERS b/ash/wm/OWNERS index b64db49..bd373b3 100644 --- a/ash/wm/OWNERS +++ b/ash/wm/OWNERS
@@ -1,4 +1,3 @@ -mukai@chromium.org xdai@chromium.org sammiequon@chromium.org minch@chromium.org
diff --git a/base/allocator/partition_allocator/partition_alloc_constants.h b/base/allocator/partition_allocator/partition_alloc_constants.h index 3648d8a9c..9e87cc4 100644 --- a/base/allocator/partition_allocator/partition_alloc_constants.h +++ b/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -320,6 +320,11 @@ constexpr unsigned char kQuarantinedByte = 0xEF; +// 1 is smaller than anything we can use, as it is not properly aligned. Not +// using a large size, since PartitionBucket::slot_size is a uint32_t, and +// static_cast<uint32_t>(-1) is too close to a "real" size. +constexpr size_t kInvalidBucketSize = 1; + // Flags for `PartitionAllocFlags`. enum PartitionAllocFlags { PartitionAllocReturnNull = 1 << 0,
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc index c9be495..7fda2c3 100644 --- a/base/allocator/partition_allocator/partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -3396,6 +3396,23 @@ // defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID) && // !BUILDFLAG(IS_CHROMECAST) +// Checks the bucket index logic. +TEST_F(PartitionAllocTest, GetIndex) { + BucketIndexLookup lookup{}; + + for (size_t size = 0; size < kMaxBucketed; size++) { + size_t index = BucketIndexLookup::GetIndex(size); + ASSERT_GE(lookup.bucket_sizes()[index], size); + } + + // Make sure that power-of-two have exactly matching buckets. + for (size_t size = (1 << (kMinBucketedOrder - 1)); size < kMaxBucketed; + size <<= 1) { + size_t index = BucketIndexLookup::GetIndex(size); + ASSERT_EQ(lookup.bucket_sizes()[index], size); + } +} + } // namespace internal } // namespace base
diff --git a/base/allocator/partition_allocator/partition_bucket_lookup.h b/base/allocator/partition_allocator/partition_bucket_lookup.h index d6a3a9f..f54966c9 100644 --- a/base/allocator/partition_allocator/partition_bucket_lookup.h +++ b/base/allocator/partition_allocator/partition_bucket_lookup.h
@@ -107,7 +107,6 @@ public: ALWAYS_INLINE constexpr static size_t GetIndex(size_t size); - private: constexpr BucketIndexLookup() { constexpr uint16_t sentinel_bucket_index = kNumBuckets; @@ -116,40 +115,73 @@ uint16_t* bucket_index_ptr = &bucket_index_lookup_[0]; uint16_t bucket_index = 0; - for (uint8_t order = 0; order <= kBitsPerSizeT; ++order) { + // Very small allocations, smaller than the first bucketed order -> + // everything goes to the first bucket. + for (uint8_t order = 0; order < kMinBucketedOrder; ++order) { for (uint16_t j = 0; j < kNumBucketsPerOrder; ++j) { - if (order < kMinBucketedOrder) { - // Use the bucket of the finest granularity for malloc(0) etc. - *bucket_index_ptr++ = 0; - } else if (order > kMaxBucketedOrder) { - *bucket_index_ptr++ = sentinel_bucket_index; - } else { - uint16_t valid_bucket_index = bucket_index; - while (bucket_sizes_[valid_bucket_index] % kSmallestBucket) - valid_bucket_index++; - *bucket_index_ptr++ = valid_bucket_index; - bucket_index++; - } + *bucket_index_ptr++ = 0; } } - PA_DCHECK(bucket_index == kNumBuckets); + + // Normal buckets. + for (uint8_t order = kMinBucketedOrder; order <= kMaxBucketedOrder; + ++order) { + size_t size = static_cast<size_t>(1) << (order - 1); + size_t current_increment = size >> kNumBucketsPerOrderBits; + for (uint16_t j = 0; j < kNumBucketsPerOrder; ++j) { + *bucket_index_ptr++ = bucket_index; + + // For small sizes, buckets are close together (current_increment is + // small). For instance, for: + // - kAlignment == 16 (which is the case on most 64 bit systems) + // - kNumBucketsPerOrder == 4 + // + // The 3 next buckets after 16 are {20, 24, 28}. None of these are a + // multiple of kAlignment, so they use the next bucket, that is 32 here. + if (size % kAlignment != 0) { + PA_DCHECK(bucket_sizes_[bucket_index] > size); + // Do not increment bucket_index, since in the example above + // current_size may be 20, and bucket_sizes_[bucket_index] == 32. + } else { + PA_DCHECK(bucket_sizes_[bucket_index] == size); + bucket_index++; + } + + size += current_increment; + } + } + + // Direct-mapped, and overflow. + for (uint8_t order = kMaxBucketedOrder + 1; order <= kBitsPerSizeT; + ++order) { + for (uint16_t j = 0; j < kNumBucketsPerOrder; ++j) { + *bucket_index_ptr++ = sentinel_bucket_index; + } + } + + // Smaller because some buckets are not valid due to alignment constraints. + PA_DCHECK(bucket_index < kNumBuckets); PA_DCHECK(bucket_index_ptr == bucket_index_lookup_ + ((kBitsPerSizeT + 1) * kNumBucketsPerOrder)); // And there's one last bucket lookup that will be hit for e.g. malloc(-1), // which tries to overflow to a non-existent order. *bucket_index_ptr = sentinel_bucket_index; } + constexpr const size_t* bucket_sizes() const { return &bucket_sizes_[0]; } + private: constexpr void InitBucketSizes() { size_t current_size = kSmallestBucket; size_t current_increment = kSmallestBucket >> kNumBucketsPerOrderBits; size_t* bucket_size = &bucket_sizes_[0]; for (size_t i = 0; i < kNumBucketedOrders; ++i) { for (size_t j = 0; j < kNumBucketsPerOrder; ++j) { - *bucket_size = current_size; - // Disable pseudo buckets so that touching them faults. + // All bucket sizes have to be multiples of kAlignment, skip otherwise. + if (current_size % kAlignment == 0) { + *bucket_size = current_size; + ++bucket_size; + } current_size += current_increment; - ++bucket_size; } current_increment <<= 1; }
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index 46d59b6..7a57fc7 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -552,30 +552,22 @@ inverted_self = ~reinterpret_cast<uintptr_t>(this); // Set up the actual usable buckets first. - // Note that typical values (i.e. min allocation size of 8) will result in - // pseudo buckets (size==9 etc. or more generally, size is not a multiple - // of the smallest allocation granularity). - // We avoid them in the bucket lookup map, but we tolerate them to keep the - // code simpler and the structures more generic. - size_t i, j; - size_t current_size = kSmallestBucket; - size_t current_increment = kSmallestBucket >> kNumBucketsPerOrderBits; - Bucket* bucket = &buckets[0]; - for (i = 0; i < kNumBucketedOrders; ++i) { - for (j = 0; j < kNumBucketsPerOrder; ++j) { - bucket->Init(current_size); - // Disable pseudo buckets so that touching them faults. - if (current_size % kSmallestBucket) { - bucket->active_slot_spans_head = nullptr; - PA_DCHECK(!bucket->is_valid()); - } - current_size += current_increment; - ++bucket; - } - current_increment <<= 1; + constexpr internal::BucketIndexLookup lookup{}; + size_t bucket_index = 0; + while (lookup.bucket_sizes()[bucket_index]) { + buckets[bucket_index].Init(lookup.bucket_sizes()[bucket_index]); + bucket_index++; } - PA_DCHECK(current_size == 1 << kMaxBucketedOrder); - PA_DCHECK(bucket == &buckets[0] + kNumBuckets); + PA_DCHECK(bucket_index < kNumBuckets); + + // Remaining buckets are not usable, and not real. + for (size_t index = bucket_index; index < kNumBuckets; index++) { + // Cannot init with size 0 since it computes 1 / size, but make sure the + // bucket is invalid. + buckets[index].Init(kInvalidBucketSize); + buckets[index].active_slot_spans_head = nullptr; + PA_DCHECK(!buckets[index].is_valid()); + } #if !defined(PA_THREAD_CACHE_SUPPORTED) // TLS in ThreadCache not supported on other OSes.
diff --git a/base/allocator/partition_allocator/thread_cache.cc b/base/allocator/partition_allocator/thread_cache.cc index 6dd3de5..1f1d7e0c 100644 --- a/base/allocator/partition_allocator/thread_cache.cc +++ b/base/allocator/partition_allocator/thread_cache.cc
@@ -183,6 +183,14 @@ // Clear the guard to prevent this from crashing. tcache->is_in_thread_cache_ = false; #endif + // There is a PA_DCHECK() in code called from |Purge()| checking that thread + // cache memory accounting is correct. Since we are after fork() and the + // other threads got interrupted mid-flight, this guarantee does not hold, + // and we get inconsistent results. Rather than giving up on checking this + // invariant in regular code, reset it here so that the PA_DCHECK() + // passes. See crbug.com/1216964. + tcache->cached_memory_ = tcache->CachedMemory(); + tcache->Purge(); tcache = tcache->next_; }
diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc index aacaac5..ed492eb 100644 --- a/base/trace_event/malloc_dump_provider.cc +++ b/base/trace_event/malloc_dump_provider.cc
@@ -37,6 +37,10 @@ #include "base/allocator/allocator_shim_default_dispatch_to_partition_alloc.h" #endif +#if defined(PA_THREAD_CACHE_ALLOC_STATS) +#include "base/allocator/partition_allocator/partition_alloc_constants.h" +#endif + namespace base { namespace trace_event { @@ -391,9 +395,11 @@ if (detailed) { std::string name = dump->absolute_name(); for (size_t i = 0; i < kNumBuckets; i++) { - std::string dump_name = - base::StringPrintf("%s/buckets_alloc/%d", name.c_str(), - static_cast<int>(stats.bucket_size_[i])); + size_t bucket_size = stats.bucket_size_[i]; + if (bucket_size == kInvalidBucketSize) + continue; + std::string dump_name = base::StringPrintf( + "%s/buckets_alloc/%d", name.c_str(), static_cast<int>(bucket_size)); auto* buckets_alloc_dump = pmd->CreateAllocatorDump(dump_name); buckets_alloc_dump->AddScalar("count", "objects", stats.allocs_per_bucket_[i]);
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 97508d03..e157ee9 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1609,6 +1609,9 @@ # TODO(thakis): Only for no_chromium_code? http://crbug.com/912662 "-Wno-ignored-pragma-optimize", + # TODO(https://crbug.com/989932): Evaluate and possibly enable. + "-Wno-implicit-int-float-conversion", + # TODO(https://crbug.com/999886): Clean up, enable. "-Wno-final-dtor-non-final-class",
diff --git a/build/config/fuchsia/test/network_capabilities.test-cmx b/build/config/fuchsia/test/network_capabilities.test-cmx index 54b9e411..dfeb131a 100644 --- a/build/config/fuchsia/test/network_capabilities.test-cmx +++ b/build/config/fuchsia/test/network_capabilities.test-cmx
@@ -5,11 +5,11 @@ "fuchsia.net.NameLookup": "fuchsia-pkg://fuchsia.com/dns-resolver#meta/dns-resolver.cmx", "fuchsia.net.interfaces.State": "fuchsia-pkg://fuchsia.com/netstack#meta/netstack.cmx", "fuchsia.posix.socket.Provider": "fuchsia-pkg://fuchsia.com/netstack#meta/netstack.cmx" - } + }, + "system-services": [ + "fuchsia.device.NameProvider" + ], }, - "system-services": [ - "fuchsia.device.NameProvider" - ] }, "sandbox": { "features": [
diff --git a/build/config/fuchsia/test/web_instance_host_capabilities.test-cmx b/build/config/fuchsia/test/web_instance_host_capabilities.test-cmx index 8281176..762916ba 100644 --- a/build/config/fuchsia/test/web_instance_host_capabilities.test-cmx +++ b/build/config/fuchsia/test/web_instance_host_capabilities.test-cmx
@@ -1,12 +1,4 @@ { - "facets": { - "fuchsia.test": { - "system-services": [ - "fuchsia.sys.Environment", - "fuchsia.sys.Loader" - ] - } - }, "sandbox": { "services": [ "fuchsia.sys.Environment",
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 80e86ae..76c3e9e 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -5.20210714.0.1 +5.20210715.1.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 80e86ae..3eada5270 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -5.20210714.0.1 +5.20210715.0.1
diff --git a/cc/animation/BUILD.gn b/cc/animation/BUILD.gn index ea30f94c..466d3f1 100644 --- a/cc/animation/BUILD.gn +++ b/cc/animation/BUILD.gn
@@ -27,8 +27,6 @@ "keyframe_effect.h", "keyframe_model.cc", "keyframe_model.h", - "scoped_compound_transform_resolver.cc", - "scoped_compound_transform_resolver.h", "scroll_offset_animation_curve.cc", "scroll_offset_animation_curve.h", "scroll_offset_animation_curve_factory.cc",
diff --git a/cc/animation/animation_host.cc b/cc/animation/animation_host.cc index 552ee1d..091f17b4 100644 --- a/cc/animation/animation_host.cc +++ b/cc/animation/animation_host.cc
@@ -21,7 +21,6 @@ #include "cc/animation/animation_timeline.h" #include "cc/animation/element_animations.h" #include "cc/animation/keyframe_effect.h" -#include "cc/animation/scoped_compound_transform_resolver.h" #include "cc/animation/scroll_offset_animation_curve.h" #include "cc/animation/scroll_offset_animations.h" #include "cc/animation/scroll_offset_animations_impl.h" @@ -453,8 +452,6 @@ TRACE_EVENT_INSTANT0("cc", "NeedsTickAnimations", TRACE_EVENT_SCOPE_THREAD); - ScopedCompoundTransformResolver scoped_compound_transform_resolver(this); - bool animated = false; for (auto& kv : id_to_timeline_map_) { AnimationTimeline* timeline = kv.second.get(); @@ -487,20 +484,9 @@ } void AnimationHost::TickWorkletAnimations() { - bool has_worklet_animation = false; for (auto& animation : ticking_animations_) { - if (animation->IsWorkletAnimation()) { - has_worklet_animation = true; - break; - } - } - if (!has_worklet_animation) - return; - - ScopedCompoundTransformResolver scoped_compound_transform_resolver(this); - for (auto& animation : ticking_animations_) { - // TODO(crbug.com/1228417): Only need to tick non-worklet animations that - // are potentially affected by a worklet animation. + if (!animation->IsWorkletAnimation()) + continue; animation->Tick(base::TimeTicks()); } } @@ -620,11 +606,10 @@ ElementId element_id, ElementListType list_type) const { auto element_animations = GetElementAnimationsForElementId(element_id); - if (!element_animations) - return false; - - return element_animations->IsCurrentlyAnimatingTransformRelatedProperty( - list_type); + return element_animations + ? element_animations->IsCurrentlyAnimatingProperty( + TargetProperty::TRANSFORM, list_type) + : false; } bool AnimationHost::HasPotentiallyRunningFilterAnimation( @@ -662,7 +647,8 @@ ElementListType list_type) const { auto element_animations = GetElementAnimationsForElementId(element_id); return element_animations - ? element_animations->IsPotentiallyAnimatingTransform(list_type) + ? element_animations->IsPotentiallyAnimatingProperty( + TargetProperty::TRANSFORM, list_type) : false; }
diff --git a/cc/animation/animation_host.h b/cc/animation/animation_host.h index 3615ceb..224d411 100644 --- a/cc/animation/animation_host.h +++ b/cc/animation/animation_host.h
@@ -29,7 +29,6 @@ class AnimationTimeline; class ElementAnimations; class LayerTreeHost; -class ScopedCompoundTransformResolver; class ScrollOffsetAnimations; class ScrollOffsetAnimationsImpl; class WorkletAnimation; @@ -223,10 +222,6 @@ void SetCurrentFrameHadRaf(bool current_frame_had_raf); void SetNextFrameHasPendingRaf(bool next_frame_has_pending_raf); - ScopedCompoundTransformResolver* compound_transform_resolver() { - return compound_transform_resolver_; - } - private: explicit AnimationHost(ThreadInstance thread_instance); @@ -251,12 +246,6 @@ // if there is no match. WorkletAnimation* FindWorkletAnimation(WorkletAnimationId id); - friend class ScopedCompoundTransformResolver; - void set_compound_transform_resolver( - ScopedCompoundTransformResolver* resolver) { - compound_transform_resolver_ = resolver; - } - ElementToAnimationsMap element_to_animations_map_; AnimationsList ticking_animations_; @@ -289,8 +278,6 @@ PendingThroughputTrackerInfos pending_throughput_tracker_infos_; - ScopedCompoundTransformResolver* compound_transform_resolver_ = nullptr; - base::WeakPtrFactory<AnimationHost> weak_factory_{this}; };
diff --git a/cc/animation/animation_unittest.cc b/cc/animation/animation_unittest.cc index 55f5447..15fe896 100644 --- a/cc/animation/animation_unittest.cc +++ b/cc/animation/animation_unittest.cc
@@ -459,15 +459,15 @@ animation_->AddKeyframeModel(KeyframeModel::Create( std::make_unique<FakeFloatAnimationCurve>(15), 42, 73, KeyframeModel::TargetPropertyId(TargetProperty::OPACITY))); - EXPECT_EQ(base::StringPrintf("Animation{id=%d, element_id=%s, " - "keyframe_models=[KeyframeModel{id=42, " - "group=73, target_property_type=%d, " - "custom_property_name=, native_property_type=1, " - "run_state=WAITING_FOR_TARGET_AVAILABILITY, " - "element_id=(0)}]}", - animation_->id(), element_id_.ToString().c_str(), - TargetProperty::OPACITY), - animation_->ToString()); + EXPECT_EQ( + base::StringPrintf("Animation{id=%d, element_id=%s, " + "keyframe_models=[KeyframeModel{id=42, " + "group=73, target_property_type=1, " + "custom_property_name=, native_property_type=1, " + "run_state=WAITING_FOR_TARGET_AVAILABILITY, " + "element_id=(0)}]}", + animation_->id(), element_id_.ToString().c_str()), + animation_->ToString()); animation_->AddKeyframeModel(KeyframeModel::Create( std::make_unique<FakeFloatAnimationCurve>(18), 45, 76, @@ -475,14 +475,13 @@ EXPECT_EQ(base::StringPrintf( "Animation{id=%d, element_id=%s, " "keyframe_models=[KeyframeModel{id=42, " - "group=73, target_property_type=%d, custom_property_name=, " + "group=73, target_property_type=1, custom_property_name=, " "native_property_type=1, " "run_state=WAITING_FOR_TARGET_AVAILABILITY, element_id=(0)}, " - "KeyframeModel{id=45, group=76, target_property_type=%d, " + "KeyframeModel{id=45, group=76, target_property_type=5, " "custom_property_name=, native_property_type=1, " "run_state=WAITING_FOR_TARGET_AVAILABILITY, element_id=(0)}]}", - animation_->id(), element_id_.ToString().c_str(), - TargetProperty::OPACITY, TargetProperty::BOUNDS), + animation_->id(), element_id_.ToString().c_str()), animation_->ToString()); }
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc index d6969ae..bb4fad0 100644 --- a/cc/animation/element_animations.cc +++ b/cc/animation/element_animations.cc
@@ -8,7 +8,6 @@ #include <algorithm> #include <utility> -#include <vector> #include "base/numerics/ranges.h" #include "cc/animation/animation_delegate.h" @@ -16,7 +15,6 @@ #include "cc/animation/animation_host.h" #include "cc/animation/keyframe_effect.h" #include "cc/animation/keyframe_model.h" -#include "cc/animation/scoped_compound_transform_resolver.h" #include "cc/paint/filter_operations.h" #include "cc/trees/mutator_host_client.h" #include "ui/gfx/animation/keyframe/keyframed_animation_curve.h" @@ -275,23 +273,11 @@ const gfx::TransformOperations& operations, int target_property_id, gfx::KeyframeModel* keyframe_model) { - bool apply_active = KeyframeModelAffectsActiveElements(keyframe_model); - bool apply_pending = KeyframeModelAffectsPendingElements(keyframe_model); - - if (apply_active || apply_pending) { - gfx::Transform transform = operations.Apply(); - ElementId target_element_id = - CalculateTargetElementId(this, keyframe_model); - DCHECK(target_element_id); - DCHECK(animation_host_); - ScopedCompoundTransformResolver* compound_transform_resolver = - animation_host_->compound_transform_resolver(); - DCHECK(compound_transform_resolver); - compound_transform_resolver->AddTransform( - target_element_id, transform, - static_cast<TargetProperty::Type>(target_property_id), apply_active, - apply_pending); - } + gfx::Transform transform = operations.Apply(); + if (KeyframeModelAffectsActiveElements(keyframe_model)) + OnTransformAnimated(ElementListType::ACTIVE, transform, keyframe_model); + if (KeyframeModelAffectsPendingElements(keyframe_model)) + OnTransformAnimated(ElementListType::PENDING, transform, keyframe_model); } void ElementAnimations::OnScrollOffsetAnimated( @@ -444,9 +430,6 @@ bool ElementAnimations::IsPotentiallyAnimatingProperty( TargetProperty::Type target_property, ElementListType list_type) const { - // For transform related properties, call IsPotentiallyAnimatingTransform. - DCHECK(target_property < TargetProperty::Type::FIRST_TRANSFORM_PROPERTY || - target_property > TargetProperty::Type::LAST_TRANSFORM_PROPERTY); for (auto& keyframe_effect : keyframe_effects_list_) { if (keyframe_effect.IsPotentiallyAnimatingProperty(target_property, list_type)) @@ -456,23 +439,9 @@ return false; } -bool ElementAnimations::IsPotentiallyAnimatingTransform( - ElementListType list_type) const { - for (auto& keyframe_effect : keyframe_effects_list_) { - if (keyframe_effect.IsPotentiallyAnimatingTransformRelatedProperty( - list_type)) - return true; - } - return false; -} - bool ElementAnimations::IsCurrentlyAnimatingProperty( TargetProperty::Type target_property, ElementListType list_type) const { - // For transform related properties, call - // IsCurrentlyAnimatingTransformRelatedProperty. - DCHECK(target_property < TargetProperty::Type::FIRST_TRANSFORM_PROPERTY || - target_property > TargetProperty::Type::LAST_TRANSFORM_PROPERTY); for (auto& keyframe_effect : keyframe_effects_list_) { if (keyframe_effect.IsCurrentlyAnimatingProperty(target_property, list_type)) @@ -482,16 +451,6 @@ return false; } -bool ElementAnimations::IsCurrentlyAnimatingTransformRelatedProperty( - ElementListType list_type) const { - for (auto& keyframe_effect : keyframe_effects_list_) { - if (keyframe_effect.IsCurrentlyAnimatingTransformRelatedProperty(list_type)) - return true; - } - - return false; -} - void ElementAnimations::OnFilterAnimated(ElementListType list_type, const FilterOperations& filters, gfx::KeyframeModel* keyframe_model) { @@ -548,6 +507,18 @@ std::move(property_key), std::move(property_value)); } +void ElementAnimations::OnTransformAnimated( + ElementListType list_type, + const gfx::Transform& transform, + gfx::KeyframeModel* keyframe_model) { + ElementId target_element_id = CalculateTargetElementId(this, keyframe_model); + DCHECK(target_element_id); + DCHECK(animation_host_); + DCHECK(animation_host_->mutator_host_client()); + animation_host_->mutator_host_client()->SetElementTransformMutated( + target_element_id, list_type, transform); +} + void ElementAnimations::OnScrollOffsetAnimated( ElementListType list_type, const gfx::ScrollOffset& scroll_offset,
diff --git a/cc/animation/element_animations.h b/cc/animation/element_animations.h index e97dca1..8430489 100644 --- a/cc/animation/element_animations.h +++ b/cc/animation/element_animations.h
@@ -91,23 +91,11 @@ bool IsPotentiallyAnimatingProperty(TargetProperty::Type target_property, ElementListType list_type) const; - // Returns true if there is an animation that is either currently animating - // a transform related property (TRANSLATE, ROTATE, SCALE, TRANSFORM) or - // scheduled to animate this property in the future, and that affects the - // given tree type. - bool IsPotentiallyAnimatingTransform(ElementListType list_type) const; - // Returns true if there is an animation that is currently animating the given // property and that affects the given tree type. bool IsCurrentlyAnimatingProperty(TargetProperty::Type target_property, ElementListType list_type) const; - // Returns true if there is an animation that is currently animating a - // transform related property (TRANSLATE, ROTOTATE, SCALE, TRANSFROM) and that - // affects the given tree type. - bool IsCurrentlyAnimatingTransformRelatedProperty( - ElementListType list_type) const; - bool has_element_in_active_list() const { return has_element_in_active_list_; } @@ -210,6 +198,9 @@ void OnCustomPropertyAnimated(PaintWorkletInput::PropertyValue property_value, KeyframeModel* keyframe_model, int target_property_id); + void OnTransformAnimated(ElementListType list_type, + const gfx::Transform& transform, + gfx::KeyframeModel* keyframe_model); void OnScrollOffsetAnimated(ElementListType list_type, const gfx::ScrollOffset& scroll_offset, gfx::KeyframeModel* keyframe_model);
diff --git a/cc/animation/element_animations_unittest.cc b/cc/animation/element_animations_unittest.cc index 0e44243..e151dc3 100644 --- a/cc/animation/element_animations_unittest.cc +++ b/cc/animation/element_animations_unittest.cc
@@ -5,7 +5,6 @@ #include "cc/animation/element_animations.h" #include <limits> -#include <memory> #include <utility> #include "base/memory/ptr_util.h" @@ -16,12 +15,10 @@ #include "cc/animation/animation_id_provider.h" #include "cc/animation/animation_timeline.h" #include "cc/animation/keyframe_effect.h" -#include "cc/animation/scoped_compound_transform_resolver.h" #include "cc/animation/scroll_offset_animation_curve.h" #include "cc/animation/scroll_offset_animation_curve_factory.h" #include "cc/test/animation_test_common.h" #include "cc/test/animation_timelines_test_common.h" -#include "cc/trees/property_tree.h" #include "ui/gfx/animation/keyframe/keyframed_animation_curve.h" #include "ui/gfx/geometry/box_f.h" #include "ui/gfx/transform_operations.h" @@ -57,12 +54,6 @@ return base::WrapUnique( static_cast<AnimationEvents*>(mutator_events.release())); } - - void TickAnimations(TimeTicks time) { - ScrollTree scroll_tree; - host_->TickAnimations(time, scroll_tree, true); - host_impl_->TickAnimations(time, scroll_tree, true); - } }; // See animation_unittest.cc for integration with Animation. @@ -479,7 +470,7 @@ ->start_time()); } -// Tests that animations activate and deactivate as expected. +// Tests that animationss activate and deactivate as expected. TEST_F(ElementAnimationsTest, Activation) { CreateTestLayer(true, false); AttachTimelineAnimationLayer(); @@ -1509,19 +1500,17 @@ new FakeFloatTransition(1.0, 0.f, 1.f)), 2, TargetProperty::OPACITY)); - TickAnimations(kInitialTickTime); + animation_->Tick(kInitialTickTime); animation_->UpdateState(true, events.get()); EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); - - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_->UpdateState(true, events.get()); // Should not have started the float transition yet. EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); - // The float animation should have started at time 1 and should be done. - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); animation_->UpdateState(true, events.get()); EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel()); @@ -1549,14 +1538,14 @@ 2, TargetProperty::OPACITY)); // Animations with id 1 should both start now. - TickAnimations(kInitialTickTime); + animation_->Tick(kInitialTickTime); animation_->UpdateState(true, events.get()); EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); // The opacity animation should have finished at time 1, but the group // of animations with id 1 don't finish until time 2 because of the length // of the transform animation. - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); animation_->UpdateState(true, events.get()); // Should not have started the float transition yet. EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); @@ -1564,7 +1553,7 @@ // The second opacity animation should start at time 2 and should be done by // time 3. - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(3000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000)); animation_->UpdateState(true, events.get()); EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel()); @@ -1727,11 +1716,11 @@ new FakeFloatTransition(1.0, 1.f, 0.75f)), 3, 2, KeyframeModel::TargetPropertyId(TargetProperty::OPACITY))); - TickAnimations(kInitialTickTime); + animation_->Tick(kInitialTickTime); animation_->UpdateState(true, events.get()); EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_->UpdateState(true, events.get()); EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); @@ -1742,11 +1731,11 @@ ->GetKeyframeModelById(keyframe_model_id) ->SetRunState(KeyframeModel::ABORTED, kInitialTickTime + TimeDelta::FromMilliseconds(1000)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_->UpdateState(true, events.get()); EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); animation_->UpdateState(true, events.get()); EXPECT_TRUE(!animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); @@ -1798,7 +1787,7 @@ first_keyframe_model->set_is_controlling_instance_for_test(true); animation_->AddKeyframeModel(std::move(first_keyframe_model)); - TickAnimations(kInitialTickTime); + animation_->Tick(kInitialTickTime); animation_->UpdateState(true, events.get()); std::unique_ptr<KeyframeModel> second_keyframe_model( @@ -1809,9 +1798,9 @@ animation_->AddKeyframeModel(std::move(second_keyframe_model)); // Animate but don't UpdateState. - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); events = CreateEventsForTesting(); animation_->UpdateState(true, events.get()); @@ -1823,7 +1812,7 @@ EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel()); EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(3000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000)); animation_->UpdateState(true, events.get()); // The float tranisition should now be done. @@ -1932,9 +1921,9 @@ new FakeFloatTransition(1.0, 0.f, 1.f)), 5, 5, KeyframeModel::TargetPropertyId(TargetProperty::OPACITY))); - TickAnimations(kInitialTickTime); + animation_->Tick(kInitialTickTime); animation_->UpdateState(true, nullptr); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_->UpdateState(true, nullptr); EXPECT_EQ( @@ -2170,7 +2159,7 @@ second_keyframe_model->set_is_controlling_instance_for_test(true); animation_impl_->AddKeyframeModel(std::move(second_keyframe_model)); - TickAnimations(kInitialTickTime); + animation_impl_->Tick(kInitialTickTime); animation_impl_->UpdateState(true, events.get()); // Both animations should have started. @@ -2179,7 +2168,7 @@ EXPECT_EQ(AnimationEvent::STARTED, events->events_[1].type); events = CreateEventsForTesting(); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_impl_->UpdateState(true, events.get()); // The opacity animation should be finished, but should not have generated @@ -2192,7 +2181,7 @@ KeyframeModel::RUNNING, animation_impl_->keyframe_effect()->GetKeyframeModelById(1)->run_state()); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); animation_impl_->UpdateState(true, events.get()); // Both animations should have generated FINISHED events. @@ -2225,7 +2214,7 @@ second_keyframe_model->set_is_controlling_instance_for_test(true); animation_impl_->AddKeyframeModel(std::move(second_keyframe_model)); - TickAnimations(kInitialTickTime); + animation_impl_->Tick(kInitialTickTime); animation_impl_->UpdateState(true, events.get()); // Both animations should have started. @@ -2237,7 +2226,7 @@ false); events = CreateEventsForTesting(); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_impl_->UpdateState(true, events.get()); // We should have exactly 2 events: a FINISHED event for the tranform @@ -2714,14 +2703,14 @@ EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating( element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime); + animation_impl_->Tick(kInitialTickTime); animation_impl_->UpdateState(true, events.get()); animation_->DispatchAndDelegateAnimationEvent(events->events_[0]); events->events_.clear(); // Finish the animation. - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_->UpdateState(true, nullptr); EXPECT_FALSE(client_.GetHasPotentialTransformAnimation( element_id_, ElementListType::ACTIVE)); @@ -2741,7 +2730,7 @@ EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating( element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_impl_->UpdateState(true, events.get()); EXPECT_FALSE(client_impl_.GetHasPotentialTransformAnimation( element_id_, ElementListType::PENDING)); @@ -2787,7 +2776,7 @@ EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating( element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); animation_impl_->UpdateState(true, events.get()); animation_->DispatchAndDelegateAnimationEvent(events->events_[0]); @@ -2840,7 +2829,7 @@ EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating( element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000)); animation_impl_->UpdateState(true, events.get()); animation_->DispatchAndDelegateAnimationEvent(events->events_[0]); @@ -2857,7 +2846,7 @@ EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating( element_id_, ElementListType::ACTIVE)); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(4000)); + animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000)); animation_impl_->UpdateState(true, events.get()); animation_->DispatchAndDelegateAnimationEvent(events->events_[0]); @@ -3957,9 +3946,9 @@ 2, 2, KeyframeModel::TargetPropertyId(TargetProperty::OPACITY))); // Finish the first keyframe model. - TickAnimations(kInitialTickTime); + animation_->Tick(kInitialTickTime); animation_->UpdateState(true, nullptr); - TickAnimations(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); + animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); animation_->UpdateState(true, nullptr); EXPECT_EQ(
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc index 4f59e98c..99beca1 100644 --- a/cc/animation/keyframe_effect.cc +++ b/cc/animation/keyframe_effect.cc
@@ -458,10 +458,6 @@ bool KeyframeEffect::IsPotentiallyAnimatingProperty( TargetProperty::Type target_property, ElementListType list_type) const { - // For transform related properties, call - // IsPotentiallyAnimatingTransformRelatedProperty instead. - DCHECK(target_property < TargetProperty::Type::FIRST_TRANSFORM_PROPERTY || - target_property > TargetProperty::Type::LAST_TRANSFORM_PROPERTY); for (const auto& keyframe_model : keyframe_models()) { if (!keyframe_model->is_finished() && keyframe_model->TargetProperty() == target_property) { @@ -477,36 +473,9 @@ return false; } -bool KeyframeEffect::IsPotentiallyAnimatingTransformRelatedProperty( - ElementListType list_type) const { - for (const auto& keyframe_model : keyframe_models()) { - if (keyframe_model->is_finished()) - continue; - - int target_property = keyframe_model->TargetProperty(); - - if (target_property < TargetProperty::Type::FIRST_TRANSFORM_PROPERTY || - target_property > TargetProperty::Type::LAST_TRANSFORM_PROPERTY) - continue; - - auto* cc_keyframe_model = - KeyframeModel::ToCcKeyframeModel(keyframe_model.get()); - if ((list_type == ElementListType::ACTIVE && - cc_keyframe_model->affects_active_elements()) || - (list_type == ElementListType::PENDING && - cc_keyframe_model->affects_pending_elements())) - return true; - } - return false; -} - bool KeyframeEffect::IsCurrentlyAnimatingProperty( TargetProperty::Type target_property, ElementListType list_type) const { - // For transform related properties, call - // IsCurrentlyAnimatingTransformRelatedProperty instead. - DCHECK(target_property < TargetProperty::Type::FIRST_TRANSFORM_PROPERTY || - target_property > TargetProperty::Type::LAST_TRANSFORM_PROPERTY); for (const auto& keyframe_model : keyframe_models()) { auto* cc_keyframe_model = KeyframeModel::ToCcKeyframeModel(keyframe_model.get()); @@ -524,30 +493,6 @@ return false; } -bool KeyframeEffect::IsCurrentlyAnimatingTransformRelatedProperty( - ElementListType list_type) const { - for (const auto& keyframe_model : keyframe_models()) { - auto* cc_keyframe_model = - KeyframeModel::ToCcKeyframeModel(keyframe_model.get()); - if (keyframe_model->is_finished() || - !cc_keyframe_model->InEffect( - last_tick_time_.value_or(base::TimeTicks()))) - continue; - - int target_property = keyframe_model->TargetProperty(); - if (target_property < TargetProperty::Type::FIRST_TRANSFORM_PROPERTY || - target_property > TargetProperty::Type::LAST_TRANSFORM_PROPERTY) - continue; - - if ((list_type == ElementListType::ACTIVE && - cc_keyframe_model->affects_active_elements()) || - (list_type == ElementListType::PENDING && - cc_keyframe_model->affects_pending_elements())) - return true; - } - return false; -} - void KeyframeEffect::GetPropertyAnimationState( PropertyAnimationState* pending_state, PropertyAnimationState* active_state) const {
diff --git a/cc/animation/keyframe_effect.h b/cc/animation/keyframe_effect.h index 9139f2e..f0a26d7 100644 --- a/cc/animation/keyframe_effect.h +++ b/cc/animation/keyframe_effect.h
@@ -126,24 +126,11 @@ bool IsPotentiallyAnimatingProperty(TargetProperty::Type target_property, ElementListType list_type) const; - // Returns true if there is a keyframe_model that is either currently - // animating a transform related property (TRANSLATE, ROTATE, SCALE, - // TRANSFORM) or scheduled to animate such a property in the future, and that - // affects the given tree type. - bool IsPotentiallyAnimatingTransformRelatedProperty( - ElementListType list_type) const; - // Returns true if there is a keyframe_model that is currently animating the // given property and that affects the given tree type. bool IsCurrentlyAnimatingProperty(TargetProperty::Type target_property, ElementListType list_type) const; - // Returns true if there is a keyframe_model that is currently animating a - // transform related property (TRANSLATE, ROTATE, SCALE, TRANSFROM) and that - // affects the given tree type. - bool IsCurrentlyAnimatingTransformRelatedProperty( - ElementListType list_type) const; - void GetPropertyAnimationState(PropertyAnimationState* pending_state, PropertyAnimationState* active_state) const;
diff --git a/cc/animation/keyframe_model_unittest.cc b/cc/animation/keyframe_model_unittest.cc index c186a1fc..1e01ad2a 100644 --- a/cc/animation/keyframe_model_unittest.cc +++ b/cc/animation/keyframe_model_unittest.cc
@@ -1387,10 +1387,10 @@ std::make_unique<FakeFloatAnimationCurve>(15), 42, 73, KeyframeModel::TargetPropertyId(TargetProperty::OPACITY)); EXPECT_EQ(base::StringPrintf( - "KeyframeModel{id=%d, group=73, target_property_type=%d, " + "KeyframeModel{id=%d, group=73, target_property_type=1, " "custom_property_name=, native_property_type=1, " "run_state=WAITING_FOR_TARGET_AVAILABILITY, element_id=(0)}", - keyframe_model->id(), TargetProperty::OPACITY), + keyframe_model->id()), keyframe_model->ToString()); }
diff --git a/cc/animation/scoped_compound_transform_resolver.cc b/cc/animation/scoped_compound_transform_resolver.cc deleted file mode 100644 index 3c9eac32..0000000 --- a/cc/animation/scoped_compound_transform_resolver.cc +++ /dev/null
@@ -1,67 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "cc/animation/scoped_compound_transform_resolver.h" - -#include "base/notreached.h" - -namespace cc { - -ScopedCompoundTransformResolver::ScopedCompoundTransformResolver( - AnimationHost* animation_host) - : animation_host_(animation_host) { - DCHECK(animation_host_); - animation_host_->set_compound_transform_resolver(this); -} - -ScopedCompoundTransformResolver::~ScopedCompoundTransformResolver() { - for (auto& it : transform_map_) { - const ElementId element_id = it.first; - const auto& compound_transform = it.second; - ApplyCompoundTransforms(element_id, ElementListType::ACTIVE, - compound_transform.active_transforms); - ApplyCompoundTransforms(element_id, ElementListType::PENDING, - compound_transform.pending_transforms); - } - animation_host_->set_compound_transform_resolver(nullptr); -} - -void ScopedCompoundTransformResolver::ApplyCompoundTransforms( - ElementId element_id, - ElementListType list_type, - const gfx::Transform* transforms) { - DCHECK(animation_host_); - DCHECK(animation_host_->mutator_host_client()); - - gfx::Transform result; - for (size_t i = 0; i < kNumTransforms; i++) { - const gfx::Transform& transform = transforms[i]; - if (!transform.IsIdentity()) - result.PreconcatTransform(transform); - } - if (!result.IsIdentity()) { - animation_host_->mutator_host_client()->SetElementTransformMutated( - element_id, list_type, result); - } -} - -void ScopedCompoundTransformResolver::AddTransform( - ElementId element_id, - const gfx::Transform& transform, - TargetProperty::Type target_property_type, - bool apply_active, - bool apply_pending) { - DCHECK(target_property_type >= - TargetProperty::Type::FIRST_TRANSFORM_PROPERTY); - DCHECK(target_property_type <= TargetProperty::Type::LAST_TRANSFORM_PROPERTY); - size_t index = - target_property_type - TargetProperty::Type::FIRST_TRANSFORM_PROPERTY; - CompoundTransform& compound_transform = transform_map_[element_id]; - if (apply_active) - compound_transform.active_transforms[index] = transform; - if (apply_pending) - compound_transform.pending_transforms[index] = transform; -} - -} // namespace cc
diff --git a/cc/animation/scoped_compound_transform_resolver.h b/cc/animation/scoped_compound_transform_resolver.h deleted file mode 100644 index 2e6968db..0000000 --- a/cc/animation/scoped_compound_transform_resolver.h +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright (c) 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CC_ANIMATION_SCOPED_COMPOUND_TRANSFORM_RESOLVER_H_ -#define CC_ANIMATION_SCOPED_COMPOUND_TRANSFORM_RESOLVER_H_ - -#include <map> - -#include "cc/animation/animation_host.h" -#include "cc/trees/target_property.h" -#include "ui/gfx/transform.h" - -namespace cc { - -class CompoundTransform; - -class CC_ANIMATION_EXPORT ScopedCompoundTransformResolver { - public: - explicit ScopedCompoundTransformResolver(AnimationHost* host); - ~ScopedCompoundTransformResolver(); - ScopedCompoundTransformResolver(const ScopedCompoundTransformResolver&) = - delete; - ScopedCompoundTransformResolver& operator=( - const ScopedCompoundTransformResolver&) = delete; - - void AddTransform(ElementId element_id, - const gfx::Transform& transform, - TargetProperty::Type target_property_type, - bool apply_active, - bool apply_pending); - - private: - void ApplyCompoundTransforms(ElementId element_id, - ElementListType list_type, - const gfx::Transform* transforms); - - static constexpr size_t kNumTransforms = - TargetProperty::LAST_TRANSFORM_PROPERTY - - TargetProperty::FIRST_TRANSFORM_PROPERTY + 1; - - struct CompoundTransform { - gfx::Transform active_transforms[kNumTransforms]; - gfx::Transform pending_transforms[kNumTransforms]; - }; - - AnimationHost* animation_host_; - std::map<ElementId, CompoundTransform> transform_map_; -}; - -} // namespace cc - -#endif // CC_ANIMATION_SCOPED_COMPOUND_TRANSFORM_RESOLVER_H_
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 5a9b978d..91436f3 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -1876,9 +1876,6 @@ const ElementId element_id = it->second; switch (property) { case TargetProperty::TRANSFORM: - case TargetProperty::TRANSLATE: - case TargetProperty::SCALE: - case TargetProperty::ROTATE: if (TransformNode* transform_node = transform_tree.FindNodeFromElementId(element_id)) { if (mask.currently_running[property])
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index 89282e4..99083b3 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc
@@ -225,15 +225,8 @@ // in the timing of animation state updates can mean that an animation that's // in the Finished state at tree-building time on the main thread is still in // the Running state right after commit on the compositor thread. - const bool has_any_transform_animation = - HasAnyAnimationTargetingProperty(mutator_host_, layer, - TargetProperty::TRANSFORM) || - HasAnyAnimationTargetingProperty(mutator_host_, layer, - TargetProperty::TRANSLATE) || - HasAnyAnimationTargetingProperty(mutator_host_, layer, - TargetProperty::ROTATE) || - HasAnyAnimationTargetingProperty(mutator_host_, layer, - TargetProperty::SCALE); + const bool has_any_transform_animation = HasAnyAnimationTargetingProperty( + mutator_host_, layer, TargetProperty::TRANSFORM); const bool has_surface = created_render_surface;
diff --git a/cc/trees/target_property.h b/cc/trees/target_property.h index 390ba3ae..a60b371 100644 --- a/cc/trees/target_property.h +++ b/cc/trees/target_property.h
@@ -13,14 +13,7 @@ // Must be zero-based as this will be stored in a bitset. enum Type { - // Transform related properties must be sequentiallyenumerated in the same - // order in which they should be applied. - TRANSLATE = 0, - FIRST_TRANSFORM_PROPERTY = TRANSLATE, - ROTATE, - SCALE, - TRANSFORM, - LAST_TRANSFORM_PROPERTY = TRANSFORM, + TRANSFORM = 0, OPACITY, FILTER, SCROLL_OFFSET, @@ -32,7 +25,7 @@ NATIVE_PROPERTY, BACKDROP_FILTER, // These sentinels must be last - FIRST_TARGET_PROPERTY = TRANSLATE, + FIRST_TARGET_PROPERTY = TRANSFORM, LAST_TARGET_PROPERTY = BACKDROP_FILTER };
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java index 140e5716..2b7080c 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java
@@ -21,8 +21,10 @@ import static org.hamcrest.Matchers.not; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementExists; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementOnScreen; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.fullyCovers; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.getAbsoluteBoundingRect; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.scrollIntoViewIfNeeded; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistant; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.tapElement; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntil; @@ -41,6 +43,7 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; @@ -62,7 +65,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList; @@ -118,6 +120,7 @@ @Test @MediumTest + @FlakyTest(message = "see crbug.com/1207665") public void testBottomSheetHasRestrictedFixedHeight() throws Exception { ArrayList<ActionProto> list = new ArrayList<>(); @@ -163,7 +166,6 @@ .build(), list); - cleanUpWebsiteForTest(); setAccessibilityEnabledForTesting(true); runScript(script); waitUntilViewMatchesCondition(withText("Continue"), isCompletelyDisplayed()); @@ -183,6 +185,8 @@ .perform(scrollTo(), typeText("Hello World!")); onView(withId(R.id.control_container)).check(matches(isCompletelyDisplayed())); assertThat(checkElementExists(mTestRule.getWebContents(), "touch_area_four"), is(true)); + scrollIntoViewIfNeeded(mTestRule.getWebContents(), "touch_area_four"); + waitUntil(() -> checkElementOnScreen(mTestRule, "touch_area_four")); tapElement(mTestRule, "touch_area_four"); waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_four")); } @@ -234,7 +238,6 @@ .build(), list); - cleanUpWebsiteForTest(); runScript(script); waitUntilViewMatchesCondition(withText("Continue"), isCompletelyDisplayed()); @@ -274,14 +277,4 @@ tapElement(mTestRule, "touch_area_four"); waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_four")); } - - private void cleanUpWebsiteForTest() throws Exception { - // This makes sure that #touch_area_one and #touch_area_four are the topmost elements on - // the page. This way they can be clicked directly without needing to scroll. - TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper javascriptHelper = - new TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper(); - javascriptHelper.evaluateJavaScriptForTests( - mTestRule.getWebContents(), "document.getElementById('trigger-keyboard').remove()"); - javascriptHelper.waitUntilHasValue(); - } }
diff --git a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java index bd536a9..8444e988 100644 --- a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java +++ b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java
@@ -237,8 +237,6 @@ mPresentationView = surfaceView; } - mToolbarManager.setProgressBarEnabled(false); - DisplayAndroid primaryDisplay = DisplayAndroid.getNonMultiDisplay(activity); mContentVirtualDisplay = VirtualDisplayAndroid.createVirtualDisplay(); mContentVirtualDisplay.setTo(primaryDisplay); @@ -860,10 +858,6 @@ mCompositorView.onExitVr(mWindowAndroid); mContentVrWindowAndroid.destroy(); - if (mToolbarManager != null) { - mToolbarManager.setProgressBarEnabled(true); - } - if (mNonVrUiWidgetFactory != null) UiWidgetFactory.setInstance(mNonVrUiWidgetFactory); FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
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 a0fb08cd..5eaf11cc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -972,8 +972,9 @@ && savedInstanceState.getBoolean(IS_INCOGNITO_SELECTED, false)) { // This will be executed only once since SavedInstanceState will be reset a few lines // later. - AndroidSessionDurationsServiceState.restoreNativeFromSerialized( - savedInstanceState, getCurrentTabModel().getProfile()); + AndroidSessionDurationsServiceState.restoreNativeFromSerialized(savedInstanceState, + getCurrentTabModel().getProfile().getPrimaryOTRProfile( + /* createIfNeeded= */ true)); } resetSavedInstanceState();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoHistoryController.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoHistoryController.java index 2eeb48f0..f93f4bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoHistoryController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoHistoryController.java
@@ -3,18 +3,23 @@ // found in the LICENSE file. package org.chromium.chrome.browser.page_info; +import android.content.res.Resources; +import android.text.format.DateUtils; import android.view.View; import android.view.ViewGroup; import org.chromium.chrome.R; import org.chromium.chrome.browser.history.HistoryContentManager; import org.chromium.chrome.browser.history.HistoryItem; +import org.chromium.components.browser_ui.util.date.StringUtils; import org.chromium.components.page_info.PageInfoAction; import org.chromium.components.page_info.PageInfoControllerDelegate; import org.chromium.components.page_info.PageInfoMainController; import org.chromium.components.page_info.PageInfoRowView; import org.chromium.components.page_info.PageInfoSubpageController; +import java.util.Date; + /** * Class for controlling the page info history section. */ @@ -26,6 +31,7 @@ private final String mTitle; private final String mHost; private HistoryContentManager mContentManager; + private long mLastVisitedTimestamp; public PageInfoHistoryController(PageInfoMainController mainController, PageInfoRowView rowView, PageInfoControllerDelegate delegate, String host) { @@ -72,7 +78,8 @@ private void setupHistoryRow() { PageInfoRowView.ViewParams rowParams = new PageInfoRowView.ViewParams(); rowParams.title = getRowTitle(); - rowParams.visible = mDelegate.isSiteSettingsAvailable() && !mDelegate.isIncognito(); + rowParams.visible = rowParams.title != null && mDelegate.isSiteSettingsAvailable() + && !mDelegate.isIncognito(); rowParams.iconResId = R.drawable.ic_history_googblue_24dp; rowParams.clickCallback = this::launchSubpage; @@ -80,8 +87,24 @@ } private String getRowTitle() { - // TODO(crbug.com/1173154): This should return a string about how long since the last visit. - return mTitle; + if (mLastVisitedTimestamp == 0) { + return mTitle; + } + // TODO(crbug.com/1173154): Set last visit timestamp based on history query. + long difference = 0; + Resources resources = mRowView.getContext().getResources(); + if (difference == 0) { + return resources.getString(R.string.page_info_history_last_visit_today); + } else if (difference == DateUtils.DAY_IN_MILLIS) { + return resources.getString(R.string.page_info_history_last_visit_yesterday); + } else if (difference > DateUtils.DAY_IN_MILLIS + && difference <= DateUtils.DAY_IN_MILLIS * 7) { + return resources.getString(R.string.page_info_history_last_visit_days, + (int) (difference / DateUtils.DAY_IN_MILLIS)); + } else { + return resources.getString(R.string.page_info_history_last_visit_date, + StringUtils.dateToHeaderString(new Date(mLastVisitedTimestamp))); + } } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java index 6d951466..cfe67708 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java
@@ -109,7 +109,7 @@ protected @SigninAccessPoint int mSigninAccessPoint; private ModalDialogManager mModalDialogManager; private ConfirmSyncDataStateMachine mConfirmSyncDataStateMachine; - private AccountPickerDialogCoordinator mAccountPickerDialogCoordinator; + private @Nullable AccountPickerDialogCoordinator mAccountPickerDialogCoordinator; /** * Creates an argument bundle for the default {@link SyncConsentFragment} flow. @@ -488,7 +488,9 @@ if (addedAccountName == null) return; // Found the account name, dismiss the dialog if it is shown - mAccountPickerDialogCoordinator.dismissDialog(); + if (mAccountPickerDialogCoordinator != null) { + mAccountPickerDialogCoordinator.dismissDialog(); + } // Wait for the account cache to be updated and select newly-added account. mAccountSelectionPending = true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 459d45e..174b41287 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -163,6 +163,7 @@ import org.chromium.ui.base.WindowDelegate; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.util.TokenHolder; +import org.chromium.ui.vr.VrModeObserver; import org.chromium.url.GURL; import java.util.List; @@ -286,6 +287,10 @@ private TabGroupUi mTabGroupUi; + private final VrModeObserver mVrModeObserver; + private ObservableSupplierImpl<Boolean> mIsProgressBarVisibleSupplier = + new ObservableSupplierImpl<>(); + private static class TabObscuringCallback implements Callback<Boolean> { private final TabObscuringHandler mTabObscuringHandler; /** A token held while the toolbar/omnibox is obscuring all visible tabs. */ @@ -413,6 +418,20 @@ mOverviewModeBehaviorSupplier = overviewModeBehaviorSupplier; mSnackbarManager = snackbarManager; + mIsProgressBarVisibleSupplier.set(!VrModuleProvider.getDelegate().isInVr()); + mVrModeObserver = new VrModeObserver() { + @Override + public void onEnterVr() { + mIsProgressBarVisibleSupplier.set(false); + } + + @Override + public void onExitVr() { + mIsProgressBarVisibleSupplier.set(true); + } + }; + VrModuleProvider.registerVrModeObserver(mVrModeObserver); + ToolbarLayout toolbarLayout = mActivity.findViewById(R.id.toolbar); NewTabPageDelegate ntpDelegate = createNewTabPageDelegate(toolbarLayout); mLocationBarModel = new LocationBarModel(activity, ntpDelegate, @@ -979,7 +998,7 @@ } }, () -> identityDiscController.getForStartSurface(mStartSurfaceState), mCompositorViewHolder::getResourceManager, - VrModuleProvider.getDelegate()::isInVr, IncognitoUtils::isIncognitoModeEnabled, + mIsProgressBarVisibleSupplier, IncognitoUtils::isIncognitoModeEnabled, isGridTabSwitcherEnabled, isTabToGtsAnimationEnabled, isStartSurfaceEnabled, isTabGroupsAndroidContinuationEnabled, HistoryManagerUtils::showHistoryManager, PartnerBrowserCustomizations.getInstance()::isHomepageProviderAvailableAndEnabled, @@ -1333,6 +1352,8 @@ * Call to tear down all of the toolbar dependencies. */ public void destroy() { + VrModuleProvider.unregisterVrModeObserver(mVrModeObserver); + if (mInitializedWithNative) { mFindToolbarManager.removeObserver(mFindToolbarObserver); } @@ -1842,13 +1863,6 @@ } /** - * @param enabled Whether the progress bar is enabled. - */ - public void setProgressBarEnabled(boolean enabled) { - mToolbar.setProgressBarEnabled(enabled); - } - - /** * @return The {@link OmniboxStub}. */ @Nullable
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java index 382cd57..da70cda 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
@@ -36,6 +36,7 @@ import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -211,9 +212,10 @@ */ @Test @MediumTest - @CommandLineFlags.Add({"enable-features=WebXR"}) - @Restriction(RESTRICTION_TYPE_SVR) - public void testControlsVisibleAfterExitingVr_WebXr() throws InterruptedException { + @CommandLineFlags.Add({"enable-features=WebXR"}) + @Restriction(RESTRICTION_TYPE_SVR) + @FlakyTest(message = "crbug.com/1229236") + public void testControlsVisibleAfterExitingVr_WebXr() throws InterruptedException { controlsVisibleAfterExitingVrImpl("generic_webxr_page", mWebXrVrTestFramework); }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index e2874e6..d28232b 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -976,10 +976,10 @@ Clears history from all signed-in devices. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK"><a target='_blank' href='$1'></ph>myactivity.google.com<ph name="END_LINK"></a><ex></a></ex></ph>. </message> <message name="IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_GOOGLE_DSE" desc="A description explaining that search history and other forms of activity can be cleared through the Google account."> - <ph name="BEGIN_LINK_SEARCH"><a target="_blank" href="$1"></ph>Search history<ph name="END_LINK_SEARCH"></a></ph> and <ph name="BEGIN_LINK_GOOGLE"><a target="_blank" href="$2"></ph>other forms of activity<ph name="END_LINK_GOOGLE"></a></ph> may be saved in your Google Account when you're signed in. You can delete them at any time. + <ph name="BEGIN_LINK_SEARCH"><a target="_blank" href="$1"></ph>Search history<ph name="END_LINK_SEARCH"></a></ph> and <ph name="BEGIN_LINK_GOOGLE"><a target="_blank" href="$2"></ph>other forms of activity<ph name="END_LINK_GOOGLE"></a></ph> may be saved in your Google Account when you're signed in. You can delete them anytime. </message> <message name="IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_NON_GOOGLE_DSE" desc="A description explaining that other forms of activity can be cleared through the Google account."> - <ph name="BEGIN_LINK_GOOGLE"><a target="_blank" href="$1"></ph>Other forms of activity<ph name="END_LINK_GOOGLE"></a></ph> may be saved in your Google Account when you're signed in. You can delete them at any time. + <ph name="BEGIN_LINK_GOOGLE"><a target="_blank" href="$1"></ph>Other forms of activity<ph name="END_LINK_GOOGLE"></a></ph> may be saved in your Google Account when you're signed in. You can delete them anytime. </message> <message name="IDS_SETTINGS_CLEAR_NON_GOOGLE_SEARCH_HISTORY_PREPOPULATED_DSE" desc="A description informing the user about the way to clear their search history when their Default Search Engine is not Google."> Your search engine is <ph name="DSE">$1<ex>Bing</ex></ph>. See their instructions for deleting your search history, if applicable.
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_GOOGLE_DSE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_GOOGLE_DSE.png.sha1 index c548df8..72a82ee 100644 --- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_GOOGLE_DSE.png.sha1 +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_GOOGLE_DSE.png.sha1
@@ -1 +1 @@ -4b6eccb07e9d65471309ce444a7c535e61bbd5b9 \ No newline at end of file +ba73851b5bf85702bdebfee1ae2f15d76f6547f0 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_NON_GOOGLE_DSE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_NON_GOOGLE_DSE.png.sha1 index 3b8104ca..454478c 100644 --- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_NON_GOOGLE_DSE.png.sha1 +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_GOOGLE_SEARCH_HISTORY_NON_GOOGLE_DSE.png.sha1
@@ -1 +1 @@ -a5f3f95ad9744614020d11bbe053fe30faf90b3f \ No newline at end of file +b8b502242a4eaf874edee51f6dbf53bc035da947 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 68b3484..b76b177 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -5406,6 +5406,10 @@ "renderer_context_menu/spelling_options_submenu_observer.cc", "renderer_context_menu/spelling_options_submenu_observer.h", ] + + # Lens Region Search feature is available on all desktop platforms except Mac. + # TODO(crbug/1229334): Add Mac support for Lens Region Search feature. + deps += [ "//chrome/browser/lens/region_search" ] } if (is_win || is_chromeos_ash || is_mac) {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 5f9a1b3..8110013 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -4009,6 +4009,10 @@ flag_descriptions::kImeSystemEmojiPickerName, flag_descriptions::kImeSystemEmojiPickerDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kImeSystemEmojiPicker)}, + {"enable-cros-ime-system-emoji-picker-clipboard", + flag_descriptions::kImeSystemEmojiPickerClipboardName, + flag_descriptions::kImeSystemEmojiPickerClipboardDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kImeSystemEmojiPickerClipboard)}, {"enable-cros-language-settings-update-2", flag_descriptions::kCrosLanguageSettingsUpdate2Name, flag_descriptions::kCrosLanguageSettingsUpdate2Description, kOsCrOS, @@ -7669,8 +7673,8 @@ void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, flags_ui::FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries) { + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries) { FlagsStateSingleton::GetFlagsState()->GetFlagFeatureEntries( flags_storage, access, supported_entries, unsupported_entries, base::BindRepeating(&ShouldSkipConditionalFeatureEntry, @@ -7682,8 +7686,8 @@ void GetFlagFeatureEntriesForDeprecatedPage( flags_ui::FlagsStorage* flags_storage, flags_ui::FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries) { + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries) { FlagsStateSingleton::GetFlagsState()->GetFlagFeatureEntries( flags_storage, access, supported_entries, unsupported_entries, base::BindRepeating(&ShouldSkipNonDeprecatedFeatureEntry));
diff --git a/chrome/browser/about_flags.h b/chrome/browser/about_flags.h index db89eaca..88bb31c 100644 --- a/chrome/browser/about_flags.h +++ b/chrome/browser/about_flags.h
@@ -15,12 +15,12 @@ #include "base/command_line.h" #include "base/metrics/histogram_base.h" +#include "base/values.h" #include "components/flags_ui/feature_entry.h" #include "components/flags_ui/flags_state.h" namespace base { class FeatureList; -class ListValue; } namespace flags_ui { @@ -54,8 +54,8 @@ // to |unsupported_entries|. void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, flags_ui::FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries); + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries); // Gets the list of feature entries for the deprecated flags page. Entries that // are available for the current platform are appended to |supported_entries|; @@ -63,8 +63,8 @@ void GetFlagFeatureEntriesForDeprecatedPage( flags_ui::FlagsStorage* flags_storage, flags_ui::FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries); + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries); // Gets the FlagsState used in about_flags. flags_ui::FlagsState* GetCurrentFlagsState();
diff --git a/chrome/browser/android/customtabs/client_data_header_web_contents_observer.cc b/chrome/browser/android/customtabs/client_data_header_web_contents_observer.cc index 160a8ed..ec019f83 100644 --- a/chrome/browser/android/customtabs/client_data_header_web_contents_observer.cc +++ b/chrome/browser/android/customtabs/client_data_header_web_contents_observer.cc
@@ -19,9 +19,9 @@ void ClientDataHeaderWebContentsObserver::SetHeader(const std::string& header) { header_ = header; - auto frames = web_contents()->GetAllFrames(); - for (auto* frame : frames) - UpdateFrameCCTHeader(frame); + web_contents()->ForEachRenderFrameHost(base::BindRepeating( + &ClientDataHeaderWebContentsObserver::UpdateFrameCCTHeader, + base::Unretained(this))); } void ClientDataHeaderWebContentsObserver::RenderFrameCreated( @@ -31,6 +31,8 @@ void ClientDataHeaderWebContentsObserver::UpdateFrameCCTHeader( content::RenderFrameHost* render_frame_host) { + if (!render_frame_host->IsRenderFrameLive()) + return; mojo::AssociatedRemote<chrome::mojom::ChromeRenderFrame> client; render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(&client); client->SetCCTClientHeader(header_);
diff --git a/chrome/browser/android/customtabs/custom_tabs_browsertest.cc b/chrome/browser/android/customtabs/custom_tabs_browsertest.cc index 188c0f5..4d7377c 100644 --- a/chrome/browser/android/customtabs/custom_tabs_browsertest.cc +++ b/chrome/browser/android/customtabs/custom_tabs_browsertest.cc
@@ -11,6 +11,7 @@ #include "chrome/test/base/chrome_test_utils.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/prerender_test_util.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" @@ -20,17 +21,24 @@ namespace { constexpr char kHeaderValue[] = "TestApp"; +constexpr char kHeaderValue2[] = "TestApp2"; class CustomTabsHeader : public AndroidBrowserTest { public: + explicit CustomTabsHeader(size_t expected_header_count = 5) + : expected_header_count_(expected_header_count) {} + void SetUpOnMainThread() override { host_resolver()->AddRule("*", "127.0.0.1"); run_loop_ = std::make_unique<base::RunLoop>(); embedded_test_server()->RegisterRequestMonitor(base::BindLambdaForTesting( [&](const net::test_server::HttpRequest& request) { - if (request.relative_url == "/favicon.ico") + if (request.relative_url == "/favicon.ico" || + request.relative_url == + "/android/customtabs/test_window_open.html") { return; + } std::string value; auto it = request.headers.find("X-CCT-Client-Data"); @@ -46,7 +54,7 @@ } url_header_values_[path] = value; - if (url_header_values_.size() == 5) + if (url_header_values_.size() == expected_header_count_) run_loop_->Quit(); })); @@ -76,9 +84,20 @@ EXPECT_EQ(url_header_values_["google1.jpg"], kHeaderValue); EXPECT_EQ(url_header_values_["google2.jpg"], kHeaderValue); EXPECT_EQ(url_header_values_["non_google.jpg"], ""); + if (expected_header_count_ > 5) { + EXPECT_EQ(url_header_values_["google3.jpg"], kHeaderValue2); + } + } + + void AdjustHeaderValueAndMakeNewRequest(content::RenderFrameHost* host) { + auto* web_contents = content::WebContents::FromRenderFrameHost(host); + ClientDataHeaderWebContentsObserver::FromWebContents(web_contents) + ->SetHeader(kHeaderValue2); + ignore_result(ExecJs(host, "document.images[0].src = 'google3.jpg'")); } private: + const size_t expected_header_count_; std::unique_ptr<base::RunLoop> run_loop_; std::map<std::string, std::string> url_header_values_; }; @@ -96,5 +115,49 @@ ExpectClientDataHeadersSet(); } +class CustomTabsHeaderPrendering : public CustomTabsHeader { + public: + CustomTabsHeaderPrendering() + : CustomTabsHeader(/*expected_header_count=*/6), + prerender_helper_( + base::BindRepeating(&CustomTabsHeaderPrendering::web_contents, + base::Unretained(this))) {} + ~CustomTabsHeaderPrendering() override = default; + + content::test::PrerenderTestHelper* prerender_helper() { + return &prerender_helper_; + } + + content::WebContents* web_contents() { + auto* web_contents = chrome_test_utils::GetActiveWebContents(this); + return web_contents; + } + + private: + content::test::PrerenderTestHelper prerender_helper_; +}; + +// Tests that prerenders set the CCT header and that they react to when +// a new header is applied as well. +IN_PROC_BROWSER_TEST_F(CustomTabsHeaderPrendering, Prerender) { + auto* web_contents = chrome_test_utils::GetActiveWebContents(this); + const GURL main_url = embedded_test_server()->GetURL( + "www.google.com", "/android/customtabs/test_window_open.html"); + EXPECT_TRUE(content::NavigateToURL(web_contents, main_url)); + + const GURL prerender_url = CreateURL(); + // Loads a page in the prerender. + int host_id = prerender_helper()->AddPrerender(prerender_url); + content::RenderFrameHost* prerender_rfh = + prerender_helper()->GetPrerenderedMainFrameHost(host_id); + EXPECT_TRUE(WaitForRenderFrameReady(prerender_rfh)); + + // Now adjust the header and make a new request. + AdjustHeaderValueAndMakeNewRequest(prerender_rfh); + + // Expect the headers are all sent. + ExpectClientDataHeadersSet(); +} + } // namespace } // namespace customtabs
diff --git a/chrome/browser/android/metrics/android_session_durations_service.cc b/chrome/browser/android/metrics/android_session_durations_service.cc index cef5de8..08a7c2e 100644 --- a/chrome/browser/android/metrics/android_session_durations_service.cc +++ b/chrome/browser/android/metrics/android_session_durations_service.cc
@@ -167,7 +167,7 @@ JNIEnv* env, const base::android::JavaParamRef<jobject>& j_profile) { Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); - DCHECK(profile->IsIncognitoProfile()); + CHECK(profile->IsIncognitoProfile()); AndroidSessionDurationsService* duration_service = AndroidSessionDurationsServiceFactory::GetForProfile(profile); @@ -188,7 +188,7 @@ const base::android::JavaParamRef<jobject>& j_profile, const base::android::JavaParamRef<jobject>& j_duration_service) { Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); - DCHECK(profile->IsIncognitoProfile()); + CHECK(profile->IsIncognitoProfile()); AndroidSessionDurationsService* duration_service = AndroidSessionDurationsServiceFactory::GetForProfile(profile);
diff --git a/chrome/browser/apps/app_service/fake_lacros_web_apps_host.cc b/chrome/browser/apps/app_service/fake_lacros_web_apps_host.cc index ad2d8df..155b708 100644 --- a/chrome/browser/apps/app_service/fake_lacros_web_apps_host.cc +++ b/chrome/browser/apps/app_service/fake_lacros_web_apps_host.cc
@@ -114,4 +114,8 @@ LoadIconCallback callback) { NOTIMPLEMENTED(); } + +void FakeLacrosWebAppsHost::OpenNativeSettings(const std::string& app_id) { + NOTIMPLEMENTED(); +} } // namespace apps
diff --git a/chrome/browser/apps/app_service/fake_lacros_web_apps_host.h b/chrome/browser/apps/app_service/fake_lacros_web_apps_host.h index bca7a1c..ba3ff16 100644 --- a/chrome/browser/apps/app_service/fake_lacros_web_apps_host.h +++ b/chrome/browser/apps/app_service/fake_lacros_web_apps_host.h
@@ -42,6 +42,7 @@ apps::mojom::IconType icon_type, int32_t size_hint_in_dip, LoadIconCallback callback) override; + void OpenNativeSettings(const std::string& app_id) override; mojo::Receiver<crosapi::mojom::AppController> receiver_{this}; };
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc index 672fed1..936a9ab3 100644 --- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc +++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
@@ -211,6 +211,10 @@ controller_->UnpauseApp(app_id); } +void WebAppsCrosapi::OpenNativeSettings(const std::string& app_id) { + controller_->OpenNativeSettings(app_id); +} + void WebAppsCrosapi::OnApps(std::vector<apps::mojom::AppPtr> deltas) { if (!base::FeatureList::IsEnabled(features::kWebAppsCrosapi)) return;
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h index 3bba1e7..e413396 100644 --- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h +++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h
@@ -67,6 +67,7 @@ GetMenuModelCallback callback) override; void PauseApp(const std::string& app_id) override; void UnpauseApp(const std::string& app_id) override; + void OpenNativeSettings(const std::string& app_id) override; // crosapi::mojom::AppPublisher overrides. void OnApps(std::vector<apps::mojom::AppPtr> deltas) override;
diff --git a/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.cc b/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.cc index d91bb7e..9fe9bed5 100644 --- a/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.cc +++ b/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.cc
@@ -8,6 +8,8 @@ #include <utility> #include "base/bind.h" +#include "base/check.h" +#include "base/check_op.h" #include "base/location.h" #include "base/time/time.h" #include "chrome/browser/ash/attestation/attestation_ca_client.h" @@ -33,14 +35,17 @@ const base::Location& from_here, chromeos::attestation::AttestationStatus status, const std::string& data) { + DCHECK(on_success); + DCHECK(on_failure); + if (status == chromeos::attestation::ATTESTATION_SUCCESS) { on_success.Run(data); return; } + LOG(ERROR) << "Attestation DBus method or server called failed with status: " << status << ": " << from_here.ToString(); - if (!on_failure.is_null()) - on_failure.Run(status); + on_failure.Run(status); } } // namespace @@ -87,8 +92,7 @@ // We expect a registered CloudPolicyClient. if (!policy_client_->is_registered()) { - LOG(ERROR) - << "EnrollmentCertificateUploaderImpl: Invalid CloudPolicyClient."; + LOG(ERROR) << "CloudPolicyClient not registered."; RunCallbacks(Status::kFailedToFetch); return; } @@ -101,7 +105,7 @@ attestation_flow_ = default_attestation_flow_.get(); } - GetCertificate(); + GetCertificate(EnrollmentCertificateRequest::kExistingCertificate); } void EnrollmentCertificateUploaderImpl::RunCallbacks(Status status) { @@ -109,14 +113,25 @@ std::move(callbacks_.front()).Run(status); } -void EnrollmentCertificateUploaderImpl::GetCertificate() { - // We can reuse the dbus callback handler logic. +void EnrollmentCertificateUploaderImpl::GetCertificate( + EnrollmentCertificateRequest certificate_request) { + bool force_new_key = false; + switch (certificate_request) { + case EnrollmentCertificateRequest::kExistingCertificate: + force_new_key = false; + break; + case EnrollmentCertificateRequest::kNewCertificate: + force_new_key = true; + break; + } + + VLOG_IF(1, force_new_key) << "Fetching new certificate"; attestation_flow_->GetCertificate( PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, EmptyAccountId(), // Not used. std::string(), // Not used. - false, // Do not force a new key to be generated. - std::string(), // Leave key name empty to generate a default name. + force_new_key, + std::string(), // Leave key name empty to generate a default name. base::BindOnce( [](const base::RepeatingCallback<void(const std::string&)> on_success, const base::RepeatingCallback<void(AttestationStatus)> on_failure, @@ -130,10 +145,27 @@ weak_factory_.GetWeakPtr()), base::BindRepeating( &EnrollmentCertificateUploaderImpl::HandleGetCertificateFailure, - weak_factory_.GetWeakPtr()), + weak_factory_.GetWeakPtr(), certificate_request), FROM_HERE)); } +void EnrollmentCertificateUploaderImpl::HandleGetCertificateFailure( + EnrollmentCertificateRequest certificate_request, + AttestationStatus status) { + if (status == ATTESTATION_SERVER_BAD_REQUEST_FAILURE) { + LOG(ERROR) + << "Failed to fetch Enterprise Enrollment Certificate: bad request."; + RunCallbacks(Status::kFailedToFetch); + return; + } + + LOG(WARNING) << "Failed to fetch Enterprise Enrollment Certificate."; + + if (!Reschedule(certificate_request)) { + RunCallbacks(Status::kFailedToFetch); + } +} + void EnrollmentCertificateUploaderImpl::UploadCertificate( const std::string& pem_certificate_chain) { policy_client_->UploadEnterpriseEnrollmentCertificate( @@ -147,32 +179,32 @@ has_already_uploaded_ = true; VLOG(1) << "Enterprise Enrollment Certificate uploaded to DMServer."; RunCallbacks(Status::kSuccess); - } else { - LOG(ERROR) - << "Failed to upload Enterprise Enrollment Certificate to DMServer."; + return; + } + + LOG(WARNING) + << "Failed to upload Enterprise Enrollment Certificate to DMServer."; + + if (!Reschedule(EnrollmentCertificateRequest::kNewCertificate)) { RunCallbacks(Status::kFailedToUpload); } } -void EnrollmentCertificateUploaderImpl::HandleGetCertificateFailure( - AttestationStatus status) { - if (status != ATTESTATION_SERVER_BAD_REQUEST_FAILURE) - Reschedule(); - else - RunCallbacks(Status::kFailedToFetch); -} - -void EnrollmentCertificateUploaderImpl::Reschedule() { - if (++num_retries_ < retry_limit_) { - content::GetUIThreadTaskRunner({})->PostDelayedTask( - FROM_HERE, - base::BindOnce(&EnrollmentCertificateUploaderImpl::GetCertificate, - weak_factory_.GetWeakPtr()), - retry_delay_); - } else { - LOG(WARNING) << "EnrollmentCertificateUploaderImpl: Retry limit exceeded."; - RunCallbacks(Status::kFailedToFetch); +bool EnrollmentCertificateUploaderImpl::Reschedule( + EnrollmentCertificateRequest certificate_request) { + if (num_retries_ >= retry_limit_) { + LOG(ERROR) << "Retry limit exceeded to fetch enrollment certificate."; + return false; } + + ++num_retries_; + + content::GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, + base::BindOnce(&EnrollmentCertificateUploaderImpl::GetCertificate, + weak_factory_.GetWeakPtr(), certificate_request), + retry_delay_); + return true; } } // namespace attestation
diff --git a/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.h b/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.h index 5dc18fe..0047171c 100644 --- a/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.h +++ b/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.h
@@ -49,9 +49,18 @@ // Obtains a fresh enrollment certificate and uploads it. If certificate has // already been uploaded - reports success immediately and does not upload // second time. + // If fails to fetch existing certificate, retries to fetch until success or + // |retry_limit_|. + // If fails to upload existing certificate, retries to fetch and upload a new + // one until success or |retry_limit_|. void ObtainAndUploadCertificate(UploadCallback callback) override; private: + enum class EnrollmentCertificateRequest { + kExistingCertificate, + kNewCertificate + }; + // Starts certificate obtention and upload. void Start(); @@ -59,7 +68,12 @@ void RunCallbacks(Status status); // Gets a certificate. - void GetCertificate(); + void GetCertificate(EnrollmentCertificateRequest certificate_request); + + // Handles failure of getting a certificate. + void HandleGetCertificateFailure( + EnrollmentCertificateRequest certificate_request, + AttestationStatus status); // Called when a certificate upload operation completes. On success, |status| // will be true. @@ -68,13 +82,12 @@ // Uploads an enterprise certificate to the policy server. void UploadCertificate(const std::string& pem_certificate_chain); - // Handles failure of getting a certificate. - void HandleGetCertificateFailure(AttestationStatus status); - - // Reschedules a policy check (i.e. a call to Start) for a later time. + // Reschedules certificate upload from |GetCertificate()| checkpoint with + // given |certificate_request| and returns true. + // If |retry_limit_| is exceeded, does not reschedule and returns false. // TODO(crbug.com/256845): A better solution would be to wait for a dbus // signal which indicates the system is ready to process this task. - void Reschedule(); + bool Reschedule(EnrollmentCertificateRequest certificate_request); policy::CloudPolicyClient* policy_client_; AttestationFlow* attestation_flow_;
diff --git a/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl_unittest.cc b/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl_unittest.cc index e6b6d105..bf7b5539 100644 --- a/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl_unittest.cc +++ b/chrome/browser/ash/attestation/enrollment_certificate_uploader_impl_unittest.cc
@@ -25,6 +25,7 @@ using CertStatus = ash::attestation::EnrollmentCertificateUploader::Status; using testing::_; +using ::testing::InSequence; using testing::Invoke; using testing::StrictMock; using testing::WithArgs; @@ -34,6 +35,8 @@ namespace { +constexpr int kRetryLimit = 3; + void CertCallbackSuccess(AttestationFlow::CertificateCallback callback) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, @@ -73,27 +76,11 @@ settings_helper_.ReplaceDeviceSettingsProviderWithStub(); policy_client_.SetDMToken("fake_dm_token"); - uploader_.set_retry_limit(3); + uploader_.set_retry_limit(kRetryLimit); uploader_.set_retry_delay(base::TimeDelta()); } protected: - void SetupMocks() { - // Setup expected cert uploads. Use WillOnce() so StrictMock will trigger an - // error if our expectations are not met exactly. We want to verify that - // during a single run through the uploader only one upload operation occurs - // (because it is costly). - EXPECT_CALL(policy_client_, - UploadEnterpriseEnrollmentCertificate("fake_cert", _)) - .WillOnce(WithArgs<1>(Invoke(StatusCallbackSuccess))); - - // Setup expected cert generations. Again use WillOnce(). Cert generation - // is another costly operation and if it gets triggered more than once - // during a single pass this indicates a logical problem in the uploader. - EXPECT_CALL(attestation_flow_, GetCertificate(_, _, _, _, _, _)) - .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); - } - void Run(CertStatus expected_status) { uploader_.ObtainAndUploadCertificate( base::BindLambdaForTesting([expected_status](CertStatus status) { @@ -112,39 +99,138 @@ }; TEST_F(EnrollmentCertificateUploaderTest, UnregisteredPolicyClient) { + InSequence s; + + EXPECT_CALL(attestation_flow_, GetCertificate(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(policy_client_, UploadEnterpriseEnrollmentCertificate(_, _)) + .Times(0); + policy_client_.SetDMToken(""); Run(/*expected_status=*/CertStatus::kFailedToFetch); } TEST_F(EnrollmentCertificateUploaderTest, GetCertificateUnspecifiedFailure) { - EXPECT_CALL(attestation_flow_, GetCertificate(_, _, _, _, _, _)) + InSequence s; + + // Shall try to fetch existing certificate through all attempts. + constexpr int total_attempts = kRetryLimit + 1; + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/false, _, _)) + .Times(total_attempts) .WillRepeatedly(WithArgs<5>(Invoke(CertCallbackUnspecifiedFailure))); + Run(/*expected_status=*/CertStatus::kFailedToFetch); } TEST_F(EnrollmentCertificateUploaderTest, GetCertificateBadRequestFailure) { + InSequence s; + + // Shall fail without retries. EXPECT_CALL(attestation_flow_, GetCertificate(_, _, _, _, _, _)) + .Times(1) .WillOnce(WithArgs<5>(Invoke(CertCallbackBadRequestFailure))); + Run(/*expected_status=*/CertStatus::kFailedToFetch); } TEST_F(EnrollmentCertificateUploaderTest, UploadCertificateFailure) { - EXPECT_CALL(attestation_flow_, GetCertificate(_, _, _, _, _, _)) + InSequence s; + + // First, uploader shall try to fetch and upload existing certificate. After + // first failure, it shall retry with a new one until retry limit. + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/false, _, _)) + .Times(1) .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); EXPECT_CALL(policy_client_, UploadEnterpriseEnrollmentCertificate("fake_cert", _)) + .Times(1) .WillOnce(WithArgs<1>(Invoke(StatusCallbackFailure))); + for (int i = 0; i < kRetryLimit; ++i) { + // Cannot use Times(kRetryLimit) because of expected sequence. + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/true, _, _)) + .Times(1) + .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); + EXPECT_CALL(policy_client_, + UploadEnterpriseEnrollmentCertificate("fake_cert", _)) + .Times(1) + .WillOnce(WithArgs<1>(Invoke(StatusCallbackFailure))); + } + Run(/*expected_status=*/CertStatus::kFailedToUpload); } +TEST_F(EnrollmentCertificateUploaderTest, UploadCertificateSuccessWithNewKey) { + InSequence s; + + // First, uploader shall try to fetch and upload existing certificate. After + // first failure, it shall retry with a new one. + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/false, _, _)) + .Times(1) + .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); + EXPECT_CALL(policy_client_, + UploadEnterpriseEnrollmentCertificate("fake_cert", _)) + .Times(1) + .WillOnce(WithArgs<1>(Invoke(StatusCallbackFailure))); + + // Make an intermediate certificate fetch failure to check new key is still + // requested. + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/true, _, _)) + .Times(1) + .WillOnce(WithArgs<5>(Invoke(CertCallbackUnspecifiedFailure))); + + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/true, _, _)) + .Times(1) + .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); + EXPECT_CALL(policy_client_, + UploadEnterpriseEnrollmentCertificate("fake_cert", _)) + .Times(1) + .WillOnce(WithArgs<1>(Invoke(StatusCallbackSuccess))); + + Run(/*expected_status=*/CertStatus::kSuccess); +} + TEST_F(EnrollmentCertificateUploaderTest, NewCertificate) { - SetupMocks(); + InSequence s; + + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/false, _, _)) + .Times(1) + .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); + + EXPECT_CALL(policy_client_, + UploadEnterpriseEnrollmentCertificate("fake_cert", _)) + .Times(1) + .WillOnce(WithArgs<1>(Invoke(StatusCallbackSuccess))); + Run(/*expected_status=*/CertStatus::kSuccess); } TEST_F(EnrollmentCertificateUploaderTest, UploadsOnlyOnce) { - SetupMocks(); + InSequence s; + + EXPECT_CALL(attestation_flow_, + GetCertificate(PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, _, _, + /*force_new_key=*/false, _, _)) + .Times(1) + .WillOnce(WithArgs<5>(Invoke(CertCallbackSuccess))); + EXPECT_CALL(policy_client_, + UploadEnterpriseEnrollmentCertificate("fake_cert", _)) + .Times(1) + .WillOnce(WithArgs<1>(Invoke(StatusCallbackSuccess))); + Run(/*expected_status=*/CertStatus::kSuccess); // Mocks expect single upload request and will fail if requested more than // once.
diff --git a/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator.h b/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator.h index f66947f..47b0dbb7 100644 --- a/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator.h +++ b/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator.h
@@ -10,7 +10,7 @@ #include "base/callback_forward.h" #include "base/scoped_observation.h" #include "base/sequence_checker.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" #include "components/invalidation/public/invalidation_handler.h" #include "components/invalidation/public/invalidation_service.h" #include "components/invalidation/public/invalidation_util.h"
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc index c5fad163..f6217848 100644 --- a/chrome/browser/ash/crosapi/browser_manager.cc +++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -90,6 +90,15 @@ "lacros_cannot_launch_notification_id"; const char kLacrosLauncherNotifierID[] = "lacros_launcher"; +// To be sure the lacros is running with neutral priority +class ThreadPriorityDelegate : public base::LaunchOptions::PreExecDelegate { + public: + void RunAsyncSafe() override { + base::PlatformThread::SetCurrentThreadPriority( + base::ThreadPriority::NORMAL); + } +}; + base::FilePath LacrosLogPath() { return browser_util::GetUserDataDir().Append("lacros.log"); }
diff --git a/chrome/browser/ash/display/OWNERS b/chrome/browser/ash/display/OWNERS index cbb83f9..92f3fbb9 100644 --- a/chrome/browser/ash/display/OWNERS +++ b/chrome/browser/ash/display/OWNERS
@@ -1,2 +1 @@ oshima@chromium.org -mukai@chromium.org
diff --git a/chrome/browser/ash/file_manager/file_tasks.cc b/chrome/browser/ash/file_manager/file_tasks.cc index faea489..eca7f37e 100644 --- a/chrome/browser/ash/file_manager/file_tasks.cc +++ b/chrome/browser/ash/file_manager/file_tasks.cc
@@ -422,16 +422,17 @@ TaskDescriptor* task_out) { VLOG(1) << "Looking for default for MIME type: " << mime_type << " and suffix: " << suffix; - std::string task_id; if (!mime_type.empty()) { const base::DictionaryValue* mime_task_prefs = pref_service.GetDictionary(prefs::kDefaultTasksByMimeType); DCHECK(mime_task_prefs); LOG_IF(ERROR, !mime_task_prefs) << "Unable to open MIME type prefs"; - if (mime_task_prefs && - mime_task_prefs->GetStringWithoutPathExpansion(mime_type, &task_id)) { - VLOG(1) << "Found MIME default handler: " << task_id; - return ParseTaskID(task_id, task_out); + if (mime_task_prefs) { + const std::string* task_id = mime_task_prefs->FindStringKey(mime_type); + if (task_id) { + VLOG(1) << "Found MIME default handler: " << *task_id; + return ParseTaskID(*task_id, task_out); + } } } @@ -440,13 +441,16 @@ DCHECK(suffix_task_prefs); LOG_IF(ERROR, !suffix_task_prefs) << "Unable to open suffix prefs"; std::string lower_suffix = base::ToLowerASCII(suffix); - if (suffix_task_prefs) - suffix_task_prefs->GetStringWithoutPathExpansion(lower_suffix, &task_id); - VLOG_IF(1, !task_id.empty()) << "Found suffix default handler: " << task_id; - if (!task_id.empty()) { - return ParseTaskID(task_id, task_out); - } - return false; + if (!suffix_task_prefs) + return false; + + const std::string* task_id = suffix_task_prefs->FindStringKey(lower_suffix); + + if (!task_id || task_id->empty()) + return false; + + VLOG(1) << "Found suffix default handler: " << *task_id; + return ParseTaskID(*task_id, task_out); } std::string MakeTaskID(const std::string& app_id,
diff --git a/chrome/browser/ash/file_system_provider/registry.cc b/chrome/browser/ash/file_system_provider/registry.cc index 6c07e6c..7b8cb07d 100644 --- a/chrome/browser/ash/file_system_provider/registry.cc +++ b/chrome/browser/ash/file_system_provider/registry.cc
@@ -156,8 +156,10 @@ continue; } - std::string file_system_id; - std::string display_name; + const std::string* file_system_id = + file_system->FindStringKey(kPrefKeyFileSystemId); + const std::string* display_name = + file_system->FindStringKey(kPrefKeyDisplayName); absl::optional<bool> writable = file_system->FindBoolKey(kPrefKeyWritable); absl::optional<bool> supports_notify_tag = file_system->FindBoolKey(kPrefKeySupportsNotifyTag); @@ -166,12 +168,9 @@ // TODO(mtomasz): Move opened files limit to the mandatory list above in // M42. - if ((!file_system->GetStringWithoutPathExpansion(kPrefKeyFileSystemId, - &file_system_id) || - !file_system->GetStringWithoutPathExpansion(kPrefKeyDisplayName, - &display_name) || - !writable || !supports_notify_tag || file_system_id.empty() || - display_name.empty()) || + if ((!file_system_id || !display_name || !writable || + !supports_notify_tag || file_system_id->empty() || + display_name->empty()) || // Optional fields. (opened_files_limit.has_value() && opened_files_limit.value() < 0)) { LOG(ERROR) @@ -180,8 +179,8 @@ } MountOptions options; - options.file_system_id = file_system_id; - options.display_name = display_name; + options.file_system_id = *file_system_id; + options.display_name = *display_name; options.writable = writable.value(); options.supports_notify_tag = supports_notify_tag.value(); options.opened_files_limit = opened_files_limit.value_or(0); @@ -205,31 +204,29 @@ continue; } - std::string entry_path; + const std::string* entry_path = + watcher->FindStringKey(kPrefKeyWatcherEntryPath); absl::optional<bool> recursive = watcher->FindBoolKey(kPrefKeyWatcherRecursive); - std::string last_tag; + const std::string* last_tag = + watcher->FindStringKey(kPrefKeyWatcherLastTag); const base::ListValue* persistent_origins = NULL; - if (!watcher->GetStringWithoutPathExpansion(kPrefKeyWatcherEntryPath, - &entry_path) || - !recursive || - !watcher->GetStringWithoutPathExpansion(kPrefKeyWatcherLastTag, - &last_tag) || + if (!entry_path || !recursive || !last_tag || !watcher->GetListWithoutPathExpansion( kPrefKeyWatcherPersistentOrigins, &persistent_origins) || - it.key() != entry_path || entry_path.empty() || + it.key() != *entry_path || entry_path->empty() || (!options.supports_notify_tag && - (!last_tag.empty() || persistent_origins->GetSize()))) { + (!last_tag->empty() || persistent_origins->GetSize()))) { LOG(ERROR) << "Malformed watcher information in preferences."; continue; } Watcher restored_watcher; restored_watcher.entry_path = - base::FilePath::FromUTF8Unsafe(entry_path); + base::FilePath::FromUTF8Unsafe(*entry_path); restored_watcher.recursive = recursive.value(); - restored_watcher.last_tag = last_tag; + restored_watcher.last_tag = *last_tag; for (const auto& persistent_origin : persistent_origins->GetList()) { if (!persistent_origin.is_string()) { LOG(ERROR) << "Malformed subscriber information in preferences."; @@ -240,7 +237,7 @@ restored_watcher.subscribers[origin_as_gurl].persistent = true; } restored_file_system.watchers[WatcherKey( - base::FilePath::FromUTF8Unsafe(entry_path), recursive.value())] = + base::FilePath::FromUTF8Unsafe(*entry_path), recursive.value())] = restored_watcher; } }
diff --git a/chrome/browser/ash/file_system_provider/registry_unittest.cc b/chrome/browser/ash/file_system_provider/registry_unittest.cc index bed2c41..23a3704 100644 --- a/chrome/browser/ash/file_system_provider/registry_unittest.cc +++ b/chrome/browser/ash/file_system_provider/registry_unittest.cc
@@ -193,15 +193,15 @@ const base::DictionaryValue* file_system = NULL; ASSERT_TRUE(file_system_value->GetAsDictionary(&file_system)); - std::string file_system_id; - EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyFileSystemId, - &file_system_id)); - EXPECT_EQ(kFileSystemId, file_system_id); + const std::string* file_system_id = + file_system->FindStringKey(kPrefKeyFileSystemId); + EXPECT_TRUE(file_system_id); + EXPECT_EQ(kFileSystemId, *file_system_id); - std::string display_name; - EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyDisplayName, - &display_name)); - EXPECT_EQ(kDisplayName, display_name); + const std::string* display_name = + file_system->FindStringKey(kPrefKeyDisplayName); + EXPECT_TRUE(display_name); + EXPECT_EQ(kDisplayName, *display_name); absl::optional<bool> writable = file_system->FindBoolKey(kPrefKeyWritable); EXPECT_TRUE(writable.has_value()); @@ -225,20 +225,19 @@ ASSERT_TRUE(watchers_value->GetDictionaryWithoutPathExpansion( fake_watcher_.entry_path.value(), &watcher)); - std::string entry_path; - EXPECT_TRUE(watcher->GetStringWithoutPathExpansion(kPrefKeyWatcherEntryPath, - &entry_path)); - EXPECT_EQ(fake_watcher_.entry_path.value(), entry_path); + const std::string* entry_path = + watcher->FindStringKey(kPrefKeyWatcherEntryPath); + EXPECT_TRUE(entry_path); + EXPECT_EQ(fake_watcher_.entry_path.value(), *entry_path); absl::optional<bool> recursive = watcher->FindBoolKey(kPrefKeyWatcherRecursive); EXPECT_TRUE(recursive.has_value()); EXPECT_EQ(fake_watcher_.recursive, recursive.value()); - std::string last_tag; - EXPECT_TRUE(watcher->GetStringWithoutPathExpansion(kPrefKeyWatcherLastTag, - &last_tag)); - EXPECT_EQ(fake_watcher_.last_tag, last_tag); + const std::string* last_tag = watcher->FindStringKey(kPrefKeyWatcherLastTag); + EXPECT_TRUE(last_tag); + EXPECT_EQ(fake_watcher_.last_tag, *last_tag); const base::ListValue* persistent_origins = NULL; ASSERT_TRUE(watcher->GetListWithoutPathExpansion( @@ -319,10 +318,9 @@ ASSERT_TRUE(watchers_value->GetDictionaryWithoutPathExpansion( fake_watcher_.entry_path.value(), &watcher)); - std::string last_tag; - EXPECT_TRUE(watcher->GetStringWithoutPathExpansion(kPrefKeyWatcherLastTag, - &last_tag)); - EXPECT_EQ(fake_watcher_.last_tag, last_tag); + const std::string* last_tag = watcher->FindStringKey(kPrefKeyWatcherLastTag); + EXPECT_TRUE(last_tag); + EXPECT_EQ(fake_watcher_.last_tag, *last_tag); } } // namespace file_system_provider
diff --git a/chrome/browser/ash/login/auth/chrome_login_performer.h b/chrome/browser/ash/login/auth/chrome_login_performer.h index a068a19..8d76b5f8 100644 --- a/chrome/browser/ash/login/auth/chrome_login_performer.h +++ b/chrome/browser/ash/login/auth/chrome_login_performer.h
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/policy/login/wildcard_login_checker.h" +#include "chrome/browser/ash/policy/login/wildcard_login_checker.h" #include "chromeos/login/auth/auth_status_consumer.h" #include "chromeos/login/auth/authenticator.h" #include "chromeos/login/auth/extended_authenticator.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_tpm_key_manager.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_tpm_key_manager.cc index 50674f1..656b4c9 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_tpm_key_manager.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_tpm_key_manager.cc
@@ -272,11 +272,11 @@ return std::string(); const base::DictionaryValue* dict = local_state_->GetDictionary(prefs::kEasyUnlockLocalStateTpmKeys); - std::string key; + const std::string* key = nullptr; if (dict) - dict->GetStringWithoutPathExpansion(account_id.GetUserEmail(), &key); + key = dict->FindStringKey(account_id.GetUserEmail()); std::string decoded; - base::Base64Decode(key, &decoded); + base::Base64Decode(key ? *key : std::string(), &decoded); return decoded; }
diff --git a/chrome/browser/ash/login/eula_browsertest.cc b/chrome/browser/ash/login/eula_browsertest.cc index e9857cc0..22afdced 100644 --- a/chrome/browser/ash/login/eula_browsertest.cc +++ b/chrome/browser/ash/login/eula_browsertest.cc
@@ -350,8 +350,13 @@ 1))); } +#if defined(OS_CHROMEOS) && defined(NDEBUG) +#define MAYBE_AdditionalToS DISABLED_AdditionalToS +#else +#define MAYBE_AdditionalToS AdditionalToS +#endif // Tests that "Additional ToS" dialog could be opened and closed. -IN_PROC_BROWSER_TEST_F(EulaTest, AdditionalToS) { +IN_PROC_BROWSER_TEST_F(EulaTest, MAYBE_AdditionalToS) { base::HistogramTester histogram_tester; ShowEulaScreen(); @@ -369,8 +374,7 @@ .CreateWaiter(test::GetOobeElementPath(kAdditionalTermsDialog) + ".open === false") ->Wait(); - - test::OobeJS().CreateFocusWaiter(kAdditionalTermsLink)->Wait(); + test::OobeJS().ExpectFocused(kAdditionalTermsLink); EXPECT_THAT( histogram_tester.GetAllSamples("OOBE.EulaScreen.UserActions"),
diff --git a/chrome/browser/ash/login/existing_user_controller_browsertest.cc b/chrome/browser/ash/login/existing_user_controller_browsertest.cc index cea62131..f118317 100644 --- a/chrome/browser/ash/login/existing_user_controller_browsertest.cc +++ b/chrome/browser/ash/login/existing_user_controller_browsertest.cc
@@ -1356,7 +1356,6 @@ AccountId::FromUserEmailGaiaId(kManagedUser, kManagedGaiaID)}; UserPolicyMixin user_policy_mixin_{&mixin_host_, managed_user_.account_id}; LoginManagerMixin login_manager_mixin_{&mixin_host_}; - ScreenLockerTester screen_locker_tester_; }; IN_PROC_BROWSER_TEST_F(ExistingUserControllerProfileTest, @@ -1373,7 +1372,7 @@ EXPECT_EQ(manager, kManager); // Set the lock screen so that the managed warning can be queried. - screen_locker_tester_.Lock(); + ScreenLockerTester().Lock(); EXPECT_TRUE(ash::LoginScreenTestApi::IsManagedMessageInDialogShown( managed_user_.account_id)); @@ -1397,7 +1396,7 @@ EXPECT_EQ(manager, kManagedDomain); // Set the lock screen so that the managed warning can be queried. - screen_locker_tester_.Lock(); + ScreenLockerTester().Lock(); EXPECT_TRUE(ash::LoginScreenTestApi::IsManagedMessageInDialogShown( managed_user_.account_id)); @@ -1418,7 +1417,7 @@ EXPECT_FALSE(user_manager::known_user::GetAccountManager( not_managed_user_.account_id, &manager)); - screen_locker_tester_.Lock(); + ScreenLockerTester().Lock(); // Verify that no managed warning is shown for an unmanaged user. EXPECT_FALSE(ash::LoginScreenTestApi::IsManagedMessageInDialogShown(
diff --git a/chrome/browser/ash/login/lock/screen_locker.cc b/chrome/browser/ash/login/lock/screen_locker.cc index 250319a..476956b 100644 --- a/chrome/browser/ash/login/lock/screen_locker.cc +++ b/chrome/browser/ash/login/lock/screen_locker.cc
@@ -713,11 +713,6 @@ ClearErrors(); screen_locker_ = nullptr; - bool state = false; - VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; - content::NotificationService::current()->Notify( - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::Source<ScreenLocker>(this), content::Details<bool>(&state)); VLOG(1) << "Calling session manager's HandleLockScreenDismissed D-Bus method"; SessionManagerClient::Get()->NotifyLockScreenDismissed(); @@ -734,11 +729,6 @@ << " second(s)"; UMA_HISTOGRAM_TIMES("ScreenLocker.ScreenLockTime", delta); - bool state = true; - VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; - content::NotificationService::current()->Notify( - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::Source<ScreenLocker>(this), content::Details<bool>(&state)); VLOG(1) << "Calling session manager's HandleLockScreenShown D-Bus method"; SessionManagerClient::Get()->NotifyLockScreenShown();
diff --git a/chrome/browser/ash/login/lock/screen_locker_tester.cc b/chrome/browser/ash/login/lock/screen_locker_tester.cc index 55d0c68..12305787 100644 --- a/chrome/browser/ash/login/lock/screen_locker_tester.cc +++ b/chrome/browser/ash/login/lock/screen_locker_tester.cc
@@ -10,6 +10,7 @@ #include "ash/public/cpp/login_screen_test_api.h" #include "base/macros.h" #include "base/run_loop.h" +#include "base/scoped_observation.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ash/login/lock/screen_locker.h" #include "chrome/browser/chrome_notification_types.h" @@ -18,7 +19,6 @@ #include "chromeos/login/auth/key.h" #include "chromeos/login/auth/stub_authenticator.h" #include "chromeos/login/auth/user_context.h" -#include "components/session_manager/core/session_manager.h" #include "components/session_manager/session_manager_types.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/render_frame_host.h" @@ -78,17 +78,29 @@ } // namespace -ScreenLockerTester::ScreenLockerTester() = default; +ScreenLockerTester::ScreenLockerTester() { + DCHECK(session_manager::SessionManager::Get()); + session_manager_observation_.Observe(session_manager::SessionManager::Get()); +} ScreenLockerTester::~ScreenLockerTester() = default; +void ScreenLockerTester::OnSessionStateChanged() { + if (IsLocked() && !on_lock_callback_.is_null()) { + std::move(on_lock_callback_).Run(); + } + if (!IsLocked() && !on_unlock_callback_.is_null()) { + std::move(on_unlock_callback_).Run(); + } +} + void ScreenLockerTester::Lock() { - content::WindowedNotificationObserver lock_state_observer( - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::NotificationService::AllSources()); + base::RunLoop run_loop; + on_lock_callback_ = run_loop.QuitClosure(); + ScreenLocker::Show(); if (!IsLocked()) - lock_state_observer.Wait(); + run_loop.Run(); ASSERT_TRUE(IsLocked()); ASSERT_EQ(session_manager::SessionState::LOCKED, session_manager::SessionManager::Get()->session_state()); @@ -96,11 +108,11 @@ } void ScreenLockerTester::WaitForUnlock() { - content::WindowedNotificationObserver lock_state_observer( - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::NotificationService::AllSources()); - if (IsLocked()) - lock_state_observer.Wait(); + if (IsLocked()) { + base::RunLoop run_loop; + on_unlock_callback_ = run_loop.QuitClosure(); + run_loop.Run(); + } ASSERT_TRUE(!IsLocked()); ASSERT_EQ(session_manager::SessionState::ACTIVE, session_manager::SessionManager::Get()->session_state());
diff --git a/chrome/browser/ash/login/lock/screen_locker_tester.h b/chrome/browser/ash/login/lock/screen_locker_tester.h index ccde14bc..81e6f90 100644 --- a/chrome/browser/ash/login/lock/screen_locker_tester.h +++ b/chrome/browser/ash/login/lock/screen_locker_tester.h
@@ -7,17 +7,22 @@ #include <string> +#include "base/callback.h" #include "base/macros.h" +#include "base/scoped_observation.h" +#include "components/session_manager/core/session_manager.h" +#include "components/session_manager/core/session_manager_observer.h" class AccountId; namespace ash { // ScreenLockerTester provides a high-level API to test the lock screen. -class ScreenLockerTester { +// Must be created after the SessionManager is initialized. +class ScreenLockerTester : public session_manager::SessionManagerObserver { public: ScreenLockerTester(); - ~ScreenLockerTester(); + ~ScreenLockerTester() override; // Synchronously lock the device. void Lock(); @@ -46,6 +51,16 @@ const std::string& password); private: + // session_manager::SessionManagerObserver: + void OnSessionStateChanged() override; + + base::ScopedObservation<session_manager::SessionManager, + session_manager::SessionManagerObserver> + session_manager_observation_{this}; + + base::OnceClosure on_lock_callback_; + base::OnceClosure on_unlock_callback_; + DISALLOW_COPY_AND_ASSIGN(ScreenLockerTester); };
diff --git a/chrome/browser/ash/login/lock_screen_utils.cc b/chrome/browser/ash/login/lock_screen_utils.cc index a801b673..7bf390c5 100644 --- a/chrome/browser/ash/login/lock_screen_utils.cc +++ b/chrome/browser/ash/login/lock_screen_utils.cc
@@ -104,13 +104,14 @@ return std::string(); } - if (!users_last_input_methods->GetStringWithoutPathExpansion( - account_id.GetUserEmail(), &input_method)) { + const std::string* input_method_str = + users_last_input_methods->FindStringKey(account_id.GetUserEmail()); + if (!input_method_str) { DVLOG(0) << "GetUserLastInputMethod: no input method for this user"; return std::string(); } - return input_method; + return *input_method_str; } void EnforceDevicePolicyInputMethods(std::string user_input_method) {
diff --git a/chrome/browser/ash/login/quick_unlock/auth_token.h b/chrome/browser/ash/login/quick_unlock/auth_token.h index fb5e96d..f31659e 100644 --- a/chrome/browser/ash/login/quick_unlock/auth_token.h +++ b/chrome/browser/ash/login/quick_unlock/auth_token.h
@@ -63,4 +63,12 @@ } // namespace quick_unlock } // namespace chromeos +// TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos +// source migration is finished. +namespace ash { +namespace quick_unlock { +using ::chromeos::quick_unlock::AuthToken; +} +} // namespace ash + #endif // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_AUTH_TOKEN_H_
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h index 3c323aa..9cf7858 100644 --- a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h +++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h
@@ -88,6 +88,7 @@ // source migration is finished. namespace ash { namespace quick_unlock { +using ::chromeos::quick_unlock::DisablePinByPolicyForTesting; using ::chromeos::quick_unlock::EnabledForTesting; using ::chromeos::quick_unlock::IsPinDisabledByPolicy; using ::chromeos::quick_unlock::IsPinEnabled;
diff --git a/chrome/browser/ash/login/ui/user_adding_screen_browsertest.cc b/chrome/browser/ash/login/ui/user_adding_screen_browsertest.cc index 085d669..122f594 100644 --- a/chrome/browser/ash/login/ui/user_adding_screen_browsertest.cc +++ b/chrome/browser/ash/login/ui/user_adding_screen_browsertest.cc
@@ -278,21 +278,10 @@ const auto& users = login_mixin_.users(); LoginUser(users[0].account_id); - { - content::WindowedNotificationObserver observer( - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::NotificationService::AllSources()); - ScreenLocker::Show(); - observer.Wait(); - } - - { - content::WindowedNotificationObserver observer( - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::NotificationService::AllSources()); - ScreenLocker::Hide(); - observer.Wait(); - } + ScreenLockerTester screen_locker_tester; + screen_locker_tester.Lock(); + ScreenLocker::Hide(); + screen_locker_tester.WaitForUnlock(); UserAddingScreen::Get()->Start(); EXPECT_EQ(user_adding_started(), 1);
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc index bba66c8..88926f06 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc +++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -54,6 +54,9 @@ #include "chrome/browser/ash/policy/external_data/handlers/printers_external_data_handler.h" #include "chrome/browser/ash/policy/external_data/handlers/user_avatar_image_external_data_handler.h" #include "chrome/browser/ash/policy/external_data/handlers/wallpaper_image_external_data_handler.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/ash/system/timezone_resolver_manager.h" @@ -64,9 +67,6 @@ #include "chrome/browser/chromeos/extensions/active_tab_permission_granter_delegate_chromeos.h" #include "chrome/browser/chromeos/extensions/extension_tab_util_delegate_chromeos.h" #include "chrome/browser/chromeos/extensions/permissions_updater_delegate_chromeos.h" -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" #include "chrome/browser/chromeos/session_length_limiter.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/permissions_updater.h"
diff --git a/chrome/browser/ash/login/users/multi_profile_user_controller.cc b/chrome/browser/ash/login/users/multi_profile_user_controller.cc index b44344a9..ee7cb61 100644 --- a/chrome/browser/ash/login/users/multi_profile_user_controller.cc +++ b/chrome/browser/ash/login/users/multi_profile_user_controller.cc
@@ -170,9 +170,12 @@ const std::string& user_email) const { const base::DictionaryValue* dict = local_state_->GetDictionary(prefs::kCachedMultiProfileUserBehavior); - std::string value; - if (dict && dict->GetStringWithoutPathExpansion(user_email, &value)) - return SanitizeBehaviorValue(value); + if (!dict) + return std::string(kBehaviorUnrestricted); + + const std::string* value = dict->FindStringKey(user_email); + if (value) + return SanitizeBehaviorValue(*value); return std::string(kBehaviorUnrestricted); }
diff --git a/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc b/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc index a14773c..f549849 100644 --- a/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc +++ b/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc
@@ -16,9 +16,9 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/login/users/multi_profile_user_controller_delegate.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/scoped_testing_local_state.h"
diff --git a/chrome/browser/ash/login/users/supervised_user_manager_impl.cc b/chrome/browser/ash/login/users/supervised_user_manager_impl.cc index a5c399e..896baeef 100644 --- a/chrome/browser/ash/login/users/supervised_user_manager_impl.cc +++ b/chrome/browser/ash/login/users/supervised_user_manager_impl.cc
@@ -114,10 +114,9 @@ PrefService* local_state = g_browser_process->local_state(); const base::DictionaryValue* manager_names = local_state->GetDictionary(kSupervisedUserManagerNames); - std::u16string result; - if (manager_names->GetStringWithoutPathExpansion(user_id, &result) && - !result.empty()) - return result; + const std::string* result = manager_names->FindStringKey(user_id); + if (result && !result->empty()) + return base::UTF8ToUTF16(*result); return base::UTF8ToUTF16(GetManagerDisplayEmail(user_id)); } @@ -182,9 +181,9 @@ if (flag.has_value()) SetUserBooleanValue(user_id, kSupervisedUserIncompleteKey, flag.value()); - std::string salt; - if (password_info->GetStringWithoutPathExpansion(kSalt, &salt)) - SetUserStringValue(user_id, kSupervisedUserPasswordSalt, salt); + const std::string* salt = password_info->FindStringKey(kSalt); + if (salt) + SetUserStringValue(user_id, kSupervisedUserPasswordSalt, *salt); g_browser_process->local_state()->CommitPendingWrite(); } @@ -194,7 +193,12 @@ std::string* out_value) const { PrefService* local_state = g_browser_process->local_state(); const base::DictionaryValue* dictionary = local_state->GetDictionary(key); - return dictionary->GetStringWithoutPathExpansion(user_id, out_value); + const std::string* value = dictionary->FindStringKey(user_id); + if (!value) + return false; + + *out_value = *value; + return true; } bool SupervisedUserManagerImpl::GetUserIntegerValue(const std::string& user_id,
diff --git a/chrome/browser/ash/ownership/owner_settings_service_ash.cc b/chrome/browser/ash/ownership/owner_settings_service_ash.cc index 0afe77da..272b4a8 100644 --- a/chrome/browser/ash/ownership/owner_settings_service_ash.cc +++ b/chrome/browser/ash/ownership/owner_settings_service_ash.cc
@@ -494,11 +494,11 @@ if (entry.GetAsDictionary(&entry_dict)) { em::DeviceLocalAccountInfoProto* account = device_local_accounts->add_account(); - std::string account_id; - if (entry_dict->GetStringWithoutPathExpansion( - kAccountsPrefDeviceLocalAccountsKeyId, &account_id)) { - account->set_account_id(account_id); - } + const std::string* account_id = + entry_dict->FindStringKey(kAccountsPrefDeviceLocalAccountsKeyId); + if (account_id) + account->set_account_id(*account_id); + absl::optional<int> type = entry_dict->FindIntKey(kAccountsPrefDeviceLocalAccountsKeyType); if (type.has_value()) { @@ -506,18 +506,15 @@ static_cast<em::DeviceLocalAccountInfoProto::AccountType>( type.value())); } - std::string kiosk_app_id; - if (entry_dict->GetStringWithoutPathExpansion( - kAccountsPrefDeviceLocalAccountsKeyKioskAppId, - &kiosk_app_id)) { - account->mutable_kiosk_app()->set_app_id(kiosk_app_id); - } - std::string kiosk_app_update_url; - if (entry_dict->GetStringWithoutPathExpansion( - kAccountsPrefDeviceLocalAccountsKeyKioskAppUpdateURL, - &kiosk_app_update_url)) { - account->mutable_kiosk_app()->set_update_url(kiosk_app_update_url); - } + const std::string* kiosk_app_id = entry_dict->FindStringKey( + kAccountsPrefDeviceLocalAccountsKeyKioskAppId); + if (kiosk_app_id) + account->mutable_kiosk_app()->set_app_id(*kiosk_app_id); + + const std::string* kiosk_app_update_url = entry_dict->FindStringKey( + kAccountsPrefDeviceLocalAccountsKeyKioskAppUpdateURL); + if (kiosk_app_update_url) + account->mutable_kiosk_app()->set_update_url(*kiosk_app_update_url); } else { NOTREACHED(); }
diff --git a/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc b/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc index e360dad3..41dcec1 100644 --- a/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc +++ b/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc
@@ -49,13 +49,13 @@ #include "chrome/browser/ash/policy/handlers/minimum_version_policy_handler_delegate_impl.h" #include "chrome/browser/ash/policy/handlers/system_proxy_handler.h" #include "chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/ash/system/timezone_util.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.h" -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_reboot_handler.h" #include "chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.h"
diff --git a/chrome/browser/ash/policy/core/device_local_account_browsertest.cc b/chrome/browser/ash/policy/core/device_local_account_browsertest.cc index 6fabfe7..97960306 100644 --- a/chrome/browser/ash/policy/core/device_local_account_browsertest.cc +++ b/chrome/browser/ash/policy/core/device_local_account_browsertest.cc
@@ -71,6 +71,7 @@ #include "chrome/browser/ash/policy/core/device_local_account_policy_service.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" #include "chrome/browser/ash/policy/external_data/cloud_external_data_manager_base_test_util.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/system/timezone_util.h" #include "chrome/browser/browser_process.h" @@ -78,7 +79,6 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h" #include "chrome/browser/chromeos/extensions/external_cache.h" -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
diff --git a/chrome/browser/ash/policy/core/device_local_account_policy_service.cc b/chrome/browser/ash/policy/core/device_local_account_policy_service.cc index b0aa18f..604797c 100644 --- a/chrome/browser/ash/policy/core/device_local_account_policy_service.cc +++ b/chrome/browser/ash/policy/core/device_local_account_policy_service.cc
@@ -25,8 +25,8 @@ #include "chrome/browser/ash/policy/core/device_local_account.h" #include "chrome/browser/ash/policy/core/device_local_account_policy_store.h" #include "chrome/browser/ash/policy/external_data/device_local_account_external_data_service.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h" #include "chrome/browser/ash/settings/device_settings_service.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h" #include "chrome/common/chrome_content_client.h" #include "chromeos/dbus/session_manager/session_manager_client.h" #include "chromeos/settings/cros_settings_names.h"
diff --git a/chrome/browser/ash/policy/core/device_local_account_policy_service_unittest.cc b/chrome/browser/ash/policy/core/device_local_account_policy_service_unittest.cc index 439ba8a..8b755e2 100644 --- a/chrome/browser/ash/policy/core/device_local_account_policy_service_unittest.cc +++ b/chrome/browser/ash/policy/core/device_local_account_policy_service_unittest.cc
@@ -25,9 +25,9 @@ #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/ash/policy/core/device_local_account.h" #include "chrome/browser/ash/policy/core/device_local_account_policy_provider.h" +#include "chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/ash/settings/device_settings_test_helper.h" -#include "chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h" #include "chrome/common/chrome_paths.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/dbus/power/power_policy_controller.h"
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder_chromeos.cc b/chrome/browser/ash/policy/core/device_policy_decoder_chromeos.cc index 30a377f..f0e19ad2 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder_chromeos.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder_chromeos.cc
@@ -17,7 +17,7 @@ #include "base/syslog_logging.h" #include "base/values.h" #include "chrome/browser/ash/policy/core/device_local_account.h" -#include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h" #include "chrome/browser/chromeos/tpm_firmware_update.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc b/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc index a74cb36..51cdd22a 100644 --- a/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc +++ b/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc
@@ -27,8 +27,8 @@ #include "chrome/browser/ash/login/users/affiliation.h" #include "chrome/browser/ash/login/users/chrome_user_manager_impl.h" #include "chrome/browser/ash/policy/core/policy_oauth2_token_fetcher.h" +#include "chrome/browser/ash/policy/login/wildcard_login_checker.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/policy/login/wildcard_login_checker.h" #include "chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h" #include "chrome/browser/chromeos/policy/reporting/arc_app_install_event_log_uploader.h" #include "chrome/browser/chromeos/policy/reporting/extension_install_event_log_uploader.h"
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.h b/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.h index 5a7c9d81..fa3f885 100644 --- a/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.h +++ b/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.h
@@ -16,7 +16,7 @@ #include "base/scoped_observation.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "chrome/browser/chromeos/policy/login/wildcard_login_checker.h" +#include "chrome/browser/ash/policy/login/wildcard_login_checker.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_manager_observer.h" #include "components/account_id/account_id.h"
diff --git a/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc b/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc index 8dda8b1..446fd5c0 100644 --- a/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc +++ b/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc
@@ -19,8 +19,8 @@ #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_test_utils.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/test/base/ui_test_utils.h" #include "components/policy/core/common/policy_pref_names.h"
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_browsertest.cc index 3b6fcac7..775e33f 100644 --- a/chrome/browser/ash/policy/dlp/dlp_content_manager_browsertest.cc +++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_browsertest.cc
@@ -22,7 +22,7 @@ #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_test_utils.h" #include "chrome/browser/ash/policy/dlp/mock_dlp_rules_manager.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/browser/policy/messaging_layer/public/report_queue_impl.h" #include "chrome/browser/policy/policy_test_utils.h"
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc index 9c0ce0d1..a8ef8706 100644 --- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc +++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc
@@ -8,7 +8,7 @@ #include "chrome/browser/ash/policy/dlp/dlp_policy_constants.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_test_utils.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/profiles/profile_manager.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/policy_constants.h"
diff --git a/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc b/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc index efc0e65..b39b495 100644 --- a/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc +++ b/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc
@@ -23,10 +23,10 @@ #include "chrome/browser/ash/policy/core/device_local_account_policy_service.h" #include "chrome/browser/ash/policy/external_data/cloud_external_data_manager_base_test_util.h" #include "chrome/browser/ash/policy/external_data/device_local_account_external_data_manager.h" +#include "chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/device_settings_test_helper.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_paths.h" #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/ash/policy/external_data/user_cloud_external_data_manager_browsertest.cc b/chrome/browser/ash/policy/external_data/user_cloud_external_data_manager_browsertest.cc index b44cec7..0981099 100644 --- a/chrome/browser/ash/policy/external_data/user_cloud_external_data_manager_browsertest.cc +++ b/chrome/browser/ash/policy/external_data/user_cloud_external_data_manager_browsertest.cc
@@ -18,7 +18,7 @@ #include "chrome/browser/ash/policy/core/user_policy_test_helper.h" #include "chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.h" #include "chrome/browser/ash/policy/external_data/cloud_external_data_manager_base_test_util.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ash/policy/handlers/restore_on_startup_browsertest_chromeos.cc b/chrome/browser/ash/policy/handlers/restore_on_startup_browsertest_chromeos.cc index a5405943..c39bf0f 100644 --- a/chrome/browser/ash/policy/handlers/restore_on_startup_browsertest_chromeos.cc +++ b/chrome/browser/ash/policy/handlers/restore_on_startup_browsertest_chromeos.cc
@@ -9,8 +9,8 @@ #include "base/macros.h" #include "base/values.h" #include "chrome/browser/ash/login/test/session_manager_state_waiter.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h"
diff --git a/chrome/browser/chromeos/policy/invalidation/README.md b/chrome/browser/ash/policy/invalidation/README.md similarity index 86% rename from chrome/browser/chromeos/policy/invalidation/README.md rename to chrome/browser/ash/policy/invalidation/README.md index 3f419587..1effd5b 100644 --- a/chrome/browser/chromeos/policy/invalidation/README.md +++ b/chrome/browser/ash/policy/invalidation/README.md
@@ -1,4 +1,4 @@ -chrome/browser/chromeos/policy/invalidation +chrome/browser/ash/policy/invalidation =========================================== This directory should contain Chrome OS specific code related to
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.cc b/chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.cc similarity index 96% rename from chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.cc rename to chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.cc index 1803e0f..6a76db6c 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.cc +++ b/chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h" #include <memory>
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h b/chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h similarity index 87% rename from chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h rename to chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h index 78c98ac25..82ad72f 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h +++ b/chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_CLOUD_POLICY_INVALIDATOR_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_CLOUD_POLICY_INVALIDATOR_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_CLOUD_POLICY_INVALIDATOR_H_ +#define CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_CLOUD_POLICY_INVALIDATOR_H_ #include <stdint.h> @@ -11,7 +11,7 @@ #include <string> #include "base/macros.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" #include "components/policy/core/common/cloud/policy_invalidation_scope.h" namespace invalidation { @@ -78,4 +78,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_CLOUD_POLICY_INVALIDATOR_H_ +#endif // CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_CLOUD_POLICY_INVALIDATOR_H_
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc b/chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc similarity index 97% rename from chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc rename to chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc index bc1f864..79314892 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc +++ b/chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/invalidation/affiliated_cloud_policy_invalidator.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_cloud_policy_invalidator.h" #include <stdint.h> @@ -14,7 +14,7 @@ #include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/ash/policy/core/device_policy_builder.h" -#include "chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h" #include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" #include "components/invalidation/impl/fake_invalidation_service.h" #include "components/invalidation/public/invalidation.h"
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.cc b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.cc similarity index 83% rename from chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.cc rename to chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.cc index 9c9cc08..9176c695 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.cc +++ b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" namespace policy {
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h similarity index 90% rename from chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h rename to chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h index 52b68a2..862b1a5e 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h +++ b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ +#define CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ #include "base/macros.h" @@ -77,4 +77,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.cc b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.cc similarity index 99% rename from chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.cc rename to chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.cc index 98f8102d..db34355 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.cc +++ b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h" #include <memory> #include <vector>
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.h b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h similarity index 91% rename from chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.h rename to chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h index 9cb214b..9e3e086 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.h +++ b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_IMPL_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_IMPL_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_IMPL_H_ +#define CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_IMPL_H_ #include <memory> #include <vector> @@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/observer_list.h" #include "base/scoped_observation.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" #include "components/invalidation/public/identity_provider.h" #include "components/session_manager/core/session_manager.h" #include "components/session_manager/core/session_manager_observer.h" @@ -117,4 +117,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_IMPL_H_ +#endif // CHROME_BROWSER_ASH_POLICY_INVALIDATION_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_IMPL_H_
diff --git a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc similarity index 99% rename from chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc rename to chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc index f3c994c..f03bdea 100644 --- a/chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc +++ b/chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider_impl.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h" #include <memory> #include <string>
diff --git a/chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.cc b/chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.cc similarity index 84% rename from chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.cc rename to chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.cc index 244b7cdf..0f6fb663 100644 --- a/chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.cc +++ b/chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h" namespace policy {
diff --git a/chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h b/chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h similarity index 62% rename from chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h rename to chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h index da72c7d0..3be4c1c 100644 --- a/chrome/browser/chromeos/policy/invalidation/fake_affiliated_invalidation_service_provider.h +++ b/chrome/browser/ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_FAKE_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_FAKE_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_INVALIDATION_FAKE_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ +#define CHROME_BROWSER_ASH_POLICY_INVALIDATION_FAKE_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ #include "base/macros.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" namespace policy { @@ -26,4 +26,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_INVALIDATION_FAKE_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_INVALIDATION_FAKE_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_
diff --git a/chrome/browser/chromeos/policy/login/blocking_login_browsertest.cc b/chrome/browser/ash/policy/login/blocking_login_browsertest.cc similarity index 100% rename from chrome/browser/chromeos/policy/login/blocking_login_browsertest.cc rename to chrome/browser/ash/policy/login/blocking_login_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/login/device_login_screen_policy_browsertest.cc b/chrome/browser/ash/policy/login/device_login_screen_policy_browsertest.cc similarity index 100% rename from chrome/browser/chromeos/policy/login/device_login_screen_policy_browsertest.cc rename to chrome/browser/ash/policy/login/device_login_screen_policy_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc b/chrome/browser/ash/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc similarity index 98% rename from chrome/browser/chromeos/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc rename to chrome/browser/ash/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc index 9e4cb17..8834303 100644 --- a/chrome/browser/chromeos/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc +++ b/chrome/browser/ash/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc
@@ -10,9 +10,9 @@ #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "chrome/browser/ash/login/test/session_manager_state_waiter.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h"
diff --git a/chrome/browser/chromeos/policy/login/login_policy_test_base.cc b/chrome/browser/ash/policy/login/login_policy_test_base.cc similarity index 98% rename from chrome/browser/chromeos/policy/login/login_policy_test_base.cc rename to chrome/browser/ash/policy/login/login_policy_test_base.cc index 0091e21..23472ff 100644 --- a/chrome/browser/chromeos/policy/login/login_policy_test_base.cc +++ b/chrome/browser/ash/policy/login/login_policy_test_base.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include <memory>
diff --git a/chrome/browser/chromeos/policy/login/login_policy_test_base.h b/chrome/browser/ash/policy/login/login_policy_test_base.h similarity index 90% rename from chrome/browser/chromeos/policy/login/login_policy_test_base.h rename to chrome/browser/ash/policy/login/login_policy_test_base.h index d0d3578..ab6ba84 100644 --- a/chrome/browser/chromeos/policy/login/login_policy_test_base.h +++ b/chrome/browser/ash/policy/login/login_policy_test_base.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_LOGIN_POLICY_TEST_BASE_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_LOGIN_POLICY_TEST_BASE_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_LOGIN_LOGIN_POLICY_TEST_BASE_H_ +#define CHROME_BROWSER_ASH_POLICY_LOGIN_LOGIN_POLICY_TEST_BASE_H_ #include <memory> #include <string> @@ -73,4 +73,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_LOGIN_POLICY_TEST_BASE_H_ +#endif // CHROME_BROWSER_ASH_POLICY_LOGIN_LOGIN_POLICY_TEST_BASE_H_
diff --git a/chrome/browser/chromeos/policy/login/login_profile_policy_provider.cc b/chrome/browser/ash/policy/login/login_profile_policy_provider.cc similarity index 98% rename from chrome/browser/chromeos/policy/login/login_profile_policy_provider.cc rename to chrome/browser/ash/policy/login/login_profile_policy_provider.cc index a6c9924..2701e75 100644 --- a/chrome/browser/chromeos/policy/login/login_profile_policy_provider.cc +++ b/chrome/browser/ash/policy/login/login_profile_policy_provider.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/login/login_profile_policy_provider.h" +#include "chrome/browser/ash/policy/login/login_profile_policy_provider.h" #include <memory> #include <string>
diff --git a/chrome/browser/chromeos/policy/login/login_profile_policy_provider.h b/chrome/browser/ash/policy/login/login_profile_policy_provider.h similarity index 87% rename from chrome/browser/chromeos/policy/login/login_profile_policy_provider.h rename to chrome/browser/ash/policy/login/login_profile_policy_provider.h index 3869ae4..caaa404 100644 --- a/chrome/browser/chromeos/policy/login/login_profile_policy_provider.h +++ b/chrome/browser/ash/policy/login/login_profile_policy_provider.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_LOGIN_PROFILE_POLICY_PROVIDER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_LOGIN_PROFILE_POLICY_PROVIDER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_LOGIN_LOGIN_PROFILE_POLICY_PROVIDER_H_ +#define CHROME_BROWSER_ASH_POLICY_LOGIN_LOGIN_PROFILE_POLICY_PROVIDER_H_ #include "base/compiler_specific.h" #include "base/macros.h" @@ -50,4 +50,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_LOGIN_PROFILE_POLICY_PROVIDER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_LOGIN_LOGIN_PROFILE_POLICY_PROVIDER_H_
diff --git a/chrome/browser/chromeos/policy/login/login_screen_accessibility_policy_browsertest.cc b/chrome/browser/ash/policy/login/login_screen_accessibility_policy_browsertest.cc similarity index 100% rename from chrome/browser/chromeos/policy/login/login_screen_accessibility_policy_browsertest.cc rename to chrome/browser/ash/policy/login/login_screen_accessibility_policy_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/login/login_screen_default_policy_browsertest.cc b/chrome/browser/ash/policy/login/login_screen_default_policy_browsertest.cc similarity index 100% rename from chrome/browser/chromeos/policy/login/login_screen_default_policy_browsertest.cc rename to chrome/browser/ash/policy/login/login_screen_default_policy_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.cc b/chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.cc similarity index 93% rename from chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.cc rename to chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.cc index a4fcb5c..3d8c096 100644 --- a/chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.cc +++ b/chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.h" +#include "chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.h" #include "components/account_manager_core/pref_names.h" #include "components/policy/core/common/policy_map.h"
diff --git a/chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.h b/chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.h similarity index 76% rename from chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.h rename to chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.h index 1a598c7..785ee25 100644 --- a/chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.h +++ b/chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_SECONDARY_GOOGLE_ACCOUNT_SIGNIN_POLICY_HANDLER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_SECONDARY_GOOGLE_ACCOUNT_SIGNIN_POLICY_HANDLER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_LOGIN_SECONDARY_GOOGLE_ACCOUNT_SIGNIN_POLICY_HANDLER_H_ +#define CHROME_BROWSER_ASH_POLICY_LOGIN_SECONDARY_GOOGLE_ACCOUNT_SIGNIN_POLICY_HANDLER_H_ #include "base/macros.h" #include "components/policy/core/browser/configuration_policy_handler.h" @@ -32,4 +32,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_SECONDARY_GOOGLE_ACCOUNT_SIGNIN_POLICY_HANDLER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_LOGIN_SECONDARY_GOOGLE_ACCOUNT_SIGNIN_POLICY_HANDLER_H_
diff --git a/chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler_unittest.cc b/chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler_unittest.cc similarity index 96% rename from chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler_unittest.cc rename to chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler_unittest.cc index 6eac8630..da978824 100644 --- a/chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler_unittest.cc +++ b/chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler_unittest.cc
@@ -7,7 +7,7 @@ #include <utility> #include "base/macros.h" -#include "chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.h" +#include "chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.h" #include "components/account_manager_core/pref_names.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_pref_names.h"
diff --git a/chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_browsertest.cc b/chrome/browser/ash/policy/login/signin_profile_extensions_policy_browsertest.cc similarity index 99% rename from chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_browsertest.cc rename to chrome/browser/ash/policy/login/signin_profile_extensions_policy_browsertest.cc index 4779d48..501fadb 100644 --- a/chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_browsertest.cc +++ b/chrome/browser/ash/policy/login/signin_profile_extensions_policy_browsertest.cc
@@ -16,7 +16,7 @@ #include "base/strings/stringprintf.h" #include "base/threading/thread_restrictions.h" #include "base/version.h" -#include "chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h" +#include "chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/policy/extension_force_install_mixin.h"
diff --git a/chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.cc b/chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.cc similarity index 96% rename from chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.cc rename to chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.cc index 8763b6d..ae5f09f 100644 --- a/chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.cc +++ b/chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h" +#include "chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h" #include "ash/constants/ash_switches.h" #include "base/bind.h"
diff --git a/chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h b/chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h similarity index 84% rename from chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h rename to chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h index 7b42f7c..db872ab 100644 --- a/chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h +++ b/chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_SIGNIN_PROFILE_EXTENSIONS_POLICY_TEST_BASE_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_SIGNIN_PROFILE_EXTENSIONS_POLICY_TEST_BASE_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_LOGIN_SIGNIN_PROFILE_EXTENSIONS_POLICY_TEST_BASE_H_ +#define CHROME_BROWSER_ASH_POLICY_LOGIN_SIGNIN_PROFILE_EXTENSIONS_POLICY_TEST_BASE_H_ #include <memory> #include <string> @@ -46,4 +46,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_SIGNIN_PROFILE_EXTENSIONS_POLICY_TEST_BASE_H_ +#endif // CHROME_BROWSER_ASH_POLICY_LOGIN_SIGNIN_PROFILE_EXTENSIONS_POLICY_TEST_BASE_H_
diff --git a/chrome/browser/chromeos/policy/login/wildcard_login_checker.cc b/chrome/browser/ash/policy/login/wildcard_login_checker.cc similarity index 97% rename from chrome/browser/chromeos/policy/login/wildcard_login_checker.cc rename to chrome/browser/ash/policy/login/wildcard_login_checker.cc index e125f2c..d69c56c 100644 --- a/chrome/browser/chromeos/policy/login/wildcard_login_checker.cc +++ b/chrome/browser/ash/policy/login/wildcard_login_checker.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/login/wildcard_login_checker.h" +#include "chrome/browser/ash/policy/login/wildcard_login_checker.h" #include <memory>
diff --git a/chrome/browser/chromeos/policy/login/wildcard_login_checker.h b/chrome/browser/ash/policy/login/wildcard_login_checker.h similarity index 91% rename from chrome/browser/chromeos/policy/login/wildcard_login_checker.h rename to chrome/browser/ash/policy/login/wildcard_login_checker.h index 728481d..2094da5 100644 --- a/chrome/browser/chromeos/policy/login/wildcard_login_checker.h +++ b/chrome/browser/ash/policy/login/wildcard_login_checker.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_WILDCARD_LOGIN_CHECKER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_WILDCARD_LOGIN_CHECKER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_LOGIN_WILDCARD_LOGIN_CHECKER_H_ +#define CHROME_BROWSER_ASH_POLICY_LOGIN_WILDCARD_LOGIN_CHECKER_H_ #include <memory> @@ -67,4 +67,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_LOGIN_WILDCARD_LOGIN_CHECKER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_LOGIN_WILDCARD_LOGIN_CHECKER_H_
diff --git a/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.cc b/chrome/browser/ash/policy/networking/device_network_configuration_updater.cc similarity index 98% rename from chrome/browser/chromeos/policy/networking/device_network_configuration_updater.cc rename to chrome/browser/ash/policy/networking/device_network_configuration_updater.cc index a7f4a346..b2aaec1 100644 --- a/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.cc +++ b/chrome/browser/ash/policy/networking/device_network_configuration_updater.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" #include <map>
diff --git a/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h b/chrome/browser/ash/policy/networking/device_network_configuration_updater.h similarity index 89% rename from chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h rename to chrome/browser/ash/policy/networking/device_network_configuration_updater.h index 6bcf97d..b20da1a 100644 --- a/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h +++ b/chrome/browser/ash/policy/networking/device_network_configuration_updater.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_ +#define CHROME_BROWSER_ASH_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_ #include <memory> #include <string> @@ -12,7 +12,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/policy/networking/network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/network_configuration_updater.h" #include "components/onc/onc_constants.h" #include "net/cert/x509_certificate.h" @@ -88,4 +88,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
diff --git a/chrome/browser/chromeos/policy/networking/network_configuration_updater.cc b/chrome/browser/ash/policy/networking/network_configuration_updater.cc similarity index 99% rename from chrome/browser/chromeos/policy/networking/network_configuration_updater.cc rename to chrome/browser/ash/policy/networking/network_configuration_updater.cc index f07d2c8aa..f5281179 100644 --- a/chrome/browser/chromeos/policy/networking/network_configuration_updater.cc +++ b/chrome/browser/ash/policy/networking/network_configuration_updater.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/networking/network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/network_configuration_updater.h" #include "base/bind.h" #include "base/callback_helpers.h"
diff --git a/chrome/browser/chromeos/policy/networking/network_configuration_updater.h b/chrome/browser/ash/policy/networking/network_configuration_updater.h similarity index 96% rename from chrome/browser/chromeos/policy/networking/network_configuration_updater.h rename to chrome/browser/ash/policy/networking/network_configuration_updater.h index 507d440..bca75e2 100644 --- a/chrome/browser/chromeos/policy/networking/network_configuration_updater.h +++ b/chrome/browser/ash/policy/networking/network_configuration_updater.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_ +#define CHROME_BROWSER_ASH_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_ #include <memory> #include <set> @@ -170,4 +170,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_
diff --git a/chrome/browser/chromeos/policy/networking/network_configuration_updater_unittest.cc b/chrome/browser/ash/policy/networking/network_configuration_updater_unittest.cc similarity index 99% rename from chrome/browser/chromeos/policy/networking/network_configuration_updater_unittest.cc rename to chrome/browser/ash/policy/networking/network_configuration_updater_unittest.cc index 5fd1f1b2..9299fd5 100644 --- a/chrome/browser/chromeos/policy/networking/network_configuration_updater_unittest.cc +++ b/chrome/browser/ash/policy/networking/network_configuration_updater_unittest.cc
@@ -15,11 +15,11 @@ #include "base/run_loop.h" #include "base/values.h" #include "chrome/browser/ash/login/session/user_session_manager.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/ash/settings/scoped_testing_cros_settings.h" -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/session_manager/session_manager_client.h" #include "chromeos/network/fake_network_device_handler.h"
diff --git a/chrome/browser/chromeos/policy/networking/network_policy_application_browsertest.cc b/chrome/browser/ash/policy/networking/network_policy_application_browsertest.cc similarity index 100% rename from chrome/browser/chromeos/policy/networking/network_policy_application_browsertest.cc rename to chrome/browser/ash/policy/networking/network_policy_application_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/networking/policy_cert_service.cc b/chrome/browser/ash/policy/networking/policy_cert_service.cc similarity index 96% rename from chrome/browser/chromeos/policy/networking/policy_cert_service.cc rename to chrome/browser/ash/policy/networking/policy_cert_service.cc index 78175ee..5649ef6 100644 --- a/chrome/browser/chromeos/policy/networking/policy_cert_service.cc +++ b/chrome/browser/ash/policy/networking/policy_cert_service.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" #include "base/bind.h" #include "base/callback_helpers.h" @@ -10,9 +10,9 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/task/post_task.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/net/profile_network_context_service.h" #include "chrome/browser/net/profile_network_context_service_factory.h"
diff --git a/chrome/browser/chromeos/policy/networking/policy_cert_service.h b/chrome/browser/ash/policy/networking/policy_cert_service.h similarity index 95% rename from chrome/browser/chromeos/policy/networking/policy_cert_service.h rename to chrome/browser/ash/policy/networking/policy_cert_service.h index f2d5d5a2..39ae8f6e2 100644 --- a/chrome/browser/chromeos/policy/networking/policy_cert_service.h +++ b/chrome/browser/ash/policy/networking/policy_cert_service.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_ +#define CHROME_BROWSER_ASH_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_ #include <memory> #include <string> @@ -136,4 +136,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_ +#endif // CHROME_BROWSER_ASH_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_
diff --git a/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.cc b/chrome/browser/ash/policy/networking/policy_cert_service_factory.cc similarity index 91% rename from chrome/browser/chromeos/policy/networking/policy_cert_service_factory.cc rename to chrome/browser/ash/policy/networking/policy_cert_service_factory.cc index 174e9c2c..ac2985d 100644 --- a/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.cc +++ b/chrome/browser/ash/policy/networking/policy_cert_service_factory.cc
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "base/containers/contains.h" #include "base/memory/singleton.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_chromeos.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h b/chrome/browser/ash/policy/networking/policy_cert_service_factory.h similarity index 90% rename from chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h rename to chrome/browser/ash/policy/networking/policy_cert_service_factory.h index 9ff64dc..3007f272 100644 --- a/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h +++ b/chrome/browser/ash/policy/networking/policy_cert_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_ASH_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_ #include <memory> #include <string> @@ -69,4 +69,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_ +#endif // CHROME_BROWSER_ASH_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_
diff --git a/chrome/browser/chromeos/policy/networking/policy_certs_browsertest.cc b/chrome/browser/ash/policy/networking/policy_certs_browsertest.cc similarity index 98% rename from chrome/browser/chromeos/policy/networking/policy_certs_browsertest.cc rename to chrome/browser/ash/policy/networking/policy_certs_browsertest.cc index 370b6cc..bbe4cd7 100644 --- a/chrome/browser/chromeos/policy/networking/policy_certs_browsertest.cc +++ b/chrome/browser/ash/policy/networking/policy_certs_browsertest.cc
@@ -28,13 +28,13 @@ #include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ash/policy/core/device_local_account.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" +#include "chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" -#include "chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/net/nss_context.h" #include "chrome/browser/policy/profile_policy_connector_builder.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.cc b/chrome/browser/ash/policy/networking/user_network_configuration_updater.cc similarity index 98% rename from chrome/browser/chromeos/policy/networking/user_network_configuration_updater.cc rename to chrome/browser/ash/policy/networking/user_network_configuration_updater.cc index 5eaea1dc..11cc8c47 100644 --- a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.cc +++ b/chrome/browser/ash/policy/networking/user_network_configuration_updater.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" #include <utility>
diff --git a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h b/chrome/browser/ash/policy/networking/user_network_configuration_updater.h similarity index 92% rename from chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h rename to chrome/browser/ash/policy/networking/user_network_configuration_updater.h index 176e422..e64668e 100644 --- a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h +++ b/chrome/browser/ash/policy/networking/user_network_configuration_updater.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_ +#define CHROME_BROWSER_ASH_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_ #include <memory> #include <vector> @@ -12,7 +12,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/policy/networking/network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/network_configuration_updater.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" @@ -125,4 +125,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_
diff --git a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.cc b/chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.cc similarity index 94% rename from chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.cc rename to chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.cc index 4e8ecb7..16e7a70 100644 --- a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.cc +++ b/chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h" #include "base/memory/singleton.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h b/chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h similarity index 85% rename from chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h rename to chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h index a4802fe..2f40080 100644 --- a/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h +++ b/chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_ +#define CHROME_BROWSER_ASH_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_ #include "base/compiler_specific.h" #include "base/macros.h" @@ -55,4 +55,4 @@ } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_ +#endif // CHROME_BROWSER_ASH_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
diff --git a/chrome/browser/chromeos/policy/off_hours/DIR_METADATA b/chrome/browser/ash/policy/off_hours/DIR_METADATA similarity index 100% rename from chrome/browser/chromeos/policy/off_hours/DIR_METADATA rename to chrome/browser/ash/policy/off_hours/DIR_METADATA
diff --git a/chrome/browser/chromeos/policy/off_hours/OWNERS b/chrome/browser/ash/policy/off_hours/OWNERS similarity index 100% rename from chrome/browser/chromeos/policy/off_hours/OWNERS rename to chrome/browser/ash/policy/off_hours/OWNERS
diff --git a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc b/chrome/browser/ash/policy/off_hours/device_off_hours_controller.cc similarity index 97% rename from chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc rename to chrome/browser/ash/policy/off_hours/device_off_hours_controller.cc index 9735fcf..6ea0ea1 100644 --- a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.cc +++ b/chrome/browser/ash/policy/off_hours/device_off_hours_controller.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h" +#include "chrome/browser/ash/policy/off_hours/device_off_hours_controller.h" #include <string> #include <tuple> @@ -14,8 +14,8 @@ #include "base/time/tick_clock.h" #include "base/time/time.h" #include "chrome/browser/ash/login/users/chrome_user_manager_util.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h" #include "chrome/browser/ash/settings/device_settings_service.h" -#include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/policy/weekly_time/time_utils.h" #include "components/prefs/pref_value_map.h"
diff --git a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h b/chrome/browser/ash/policy/off_hours/device_off_hours_controller.h similarity index 95% rename from chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h rename to chrome/browser/ash/policy/off_hours/device_off_hours_controller.h index d80d0de..f617111 100644 --- a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h +++ b/chrome/browser/ash/policy/off_hours/device_off_hours_controller.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_DEVICE_OFF_HOURS_CONTROLLER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_DEVICE_OFF_HOURS_CONTROLLER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_OFF_HOURS_DEVICE_OFF_HOURS_CONTROLLER_H_ +#define CHROME_BROWSER_ASH_POLICY_OFF_HOURS_DEVICE_OFF_HOURS_CONTROLLER_H_ #include <memory> #include <vector> @@ -154,4 +154,4 @@ } // namespace off_hours } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_DEVICE_OFF_HOURS_CONTROLLER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_OFF_HOURS_DEVICE_OFF_HOURS_CONTROLLER_H_
diff --git a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller_unittest.cc b/chrome/browser/ash/policy/off_hours/device_off_hours_controller_unittest.cc similarity index 99% rename from chrome/browser/chromeos/policy/off_hours/device_off_hours_controller_unittest.cc rename to chrome/browser/ash/policy/off_hours/device_off_hours_controller_unittest.cc index 8b3d5ba..63d9608 100644 --- a/chrome/browser/chromeos/policy/off_hours/device_off_hours_controller_unittest.cc +++ b/chrome/browser/ash/policy/off_hours/device_off_hours_controller_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h" +#include "chrome/browser/ash/policy/off_hours/device_off_hours_controller.h" #include <string> #include <utility>
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.cc b/chrome/browser/ash/policy/off_hours/off_hours_policy_applier.cc similarity index 85% rename from chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.cc rename to chrome/browser/ash/policy/off_hours/off_hours_policy_applier.cc index 2bdbdf2..544f0c4 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.cc +++ b/chrome/browser/ash/policy/off_hours/off_hours_policy_applier.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_policy_applier.h" #include "chrome/browser/ash/policy/core/device_policy_remover.h" -#include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h" namespace em = enterprise_management;
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.h b/chrome/browser/ash/policy/off_hours/off_hours_policy_applier.h similarity index 75% rename from chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.h rename to chrome/browser/ash/policy/off_hours/off_hours_policy_applier.h index 8b2c83c91..a9fa199 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.h +++ b/chrome/browser/ash/policy/off_hours/off_hours_policy_applier.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_OFF_HOURS_POLICY_APPLIER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_OFF_HOURS_POLICY_APPLIER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_OFF_HOURS_OFF_HOURS_POLICY_APPLIER_H_ +#define CHROME_BROWSER_ASH_POLICY_OFF_HOURS_OFF_HOURS_POLICY_APPLIER_H_ #include <memory> @@ -22,4 +22,4 @@ } // namespace off_hours } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_OFF_HOURS_POLICY_APPLIER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_OFF_HOURS_OFF_HOURS_POLICY_APPLIER_H_
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc b/chrome/browser/ash/policy/off_hours/off_hours_policy_applier_unittest.cc similarity index 97% rename from chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc rename to chrome/browser/ash/policy/off_hours/off_hours_policy_applier_unittest.cc index da2b0cb45..6676424f 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier_unittest.cc +++ b/chrome/browser/ash/policy/off_hours/off_hours_policy_applier_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_policy_applier.h" #include <utility>
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc b/chrome/browser/ash/policy/off_hours/off_hours_proto_parser.cc similarity index 96% rename from chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc rename to chrome/browser/ash/policy/off_hours/off_hours_proto_parser.cc index 4cc76be..7c72900f 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.cc +++ b/chrome/browser/ash/policy/off_hours/off_hours_proto_parser.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h" #include "base/time/default_clock.h" #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h b/chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h similarity index 90% rename from chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h rename to chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h index adf7126..f269eaa 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h +++ b/chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_OFF_HOURS_PROTO_PARSER_H_ -#define CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_OFF_HOURS_PROTO_PARSER_H_ +#ifndef CHROME_BROWSER_ASH_POLICY_OFF_HOURS_OFF_HOURS_PROTO_PARSER_H_ +#define CHROME_BROWSER_ASH_POLICY_OFF_HOURS_OFF_HOURS_PROTO_PARSER_H_ #include <memory> #include <string> @@ -58,4 +58,4 @@ } // namespace off_hours } // namespace policy -#endif // CHROME_BROWSER_CHROMEOS_POLICY_OFF_HOURS_OFF_HOURS_PROTO_PARSER_H_ +#endif // CHROME_BROWSER_ASH_POLICY_OFF_HOURS_OFF_HOURS_PROTO_PARSER_H_
diff --git a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc b/chrome/browser/ash/policy/off_hours/off_hours_proto_parser_unittest.cc similarity index 97% rename from chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc rename to chrome/browser/ash/policy/off_hours/off_hours_proto_parser_unittest.cc index a0c1a74d..6879a11e 100644 --- a/chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser_unittest.cc +++ b/chrome/browser/ash/policy/off_hours/off_hours_proto_parser_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h" #include <utility>
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc index ba21b6a1..c6c32b81 100644 --- a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc +++ b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc
@@ -60,6 +60,8 @@ } void DisableIlluminanceChannel() { + // TODO(https://crbug.com/1229481): SetChannelsEnabled assumes it is only + // called via a mojo pipe, as such this call is not valid and will DCHECK. sensor_device_->SetChannelsEnabled( {0}, false, base::BindOnce(&LightSamplesObserverTest::SetChannelsEnabledCallback, @@ -121,7 +123,9 @@ EXPECT_EQ(fake_observer_.num_received_ambient_lights(), 0); } -TEST_F(LightSamplesObserverTest, GetSamplesWithoutColorChannels) { +// TODO(https://crbug.com/1229481): This test hits a DCHECK in the +// DisableIlluminanceChannel call. +TEST_F(LightSamplesObserverTest, DISABLED_GetSamplesWithoutColorChannels) { SetChannels(false); mojo::Remote<chromeos::sensors::mojom::SensorDevice> light;
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc index 77dfb9fc..d3b54bdf 100644 --- a/chrome/browser/ash/settings/device_settings_provider.cc +++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -26,10 +26,10 @@ #include "chrome/browser/ash/ownership/owner_settings_service_ash.h" #include "chrome/browser/ash/policy/core/device_policy_decoder_chromeos.h" #include "chrome/browser/ash/policy/handlers/system_proxy_handler.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_proto_parser.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/ash/settings/device_settings_cache.h" #include "chrome/browser/ash/settings/stats_reporting_controller.h" -#include "chrome/browser/chromeos/policy/off_hours/off_hours_proto_parser.h" #include "chrome/browser/chromeos/tpm_firmware_update.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/settings/cros_settings_names.h"
diff --git a/chrome/browser/ash/settings/device_settings_service.cc b/chrome/browser/ash/settings/device_settings_service.cc index 3df4b5ff9..0d1d390 100644 --- a/chrome/browser/ash/settings/device_settings_service.cc +++ b/chrome/browser/ash/settings/device_settings_service.cc
@@ -12,9 +12,9 @@ #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" +#include "chrome/browser/ash/policy/off_hours/device_off_hours_controller.h" +#include "chrome/browser/ash/policy/off_hours/off_hours_policy_applier.h" #include "chrome/browser/ash/settings/session_manager_operation.h" -#include "chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h" -#include "chrome/browser/chromeos/policy/off_hours/off_hours_policy_applier.h" #include "components/ownership/owner_key_util.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/proto/chrome_device_policy.pb.h"
diff --git a/chrome/browser/browsing_data/access_context_audit_database.cc b/chrome/browser/browsing_data/access_context_audit_database.cc index 9a9427f..bce53c4 100644 --- a/chrome/browser/browsing_data/access_context_audit_database.cc +++ b/chrome/browser/browsing_data/access_context_audit_database.cc
@@ -650,7 +650,7 @@ namespace { AccessContextAuditDatabase::AccessRecord StorageAccessRecordFromStatement( - const sql::Statement& statement) { + sql::Statement& statement) { return AccessContextAuditDatabase::AccessRecord( // If the top-frame origin is empty string, that means we deleted the // top_frame_origin of a cross-site access record. In this case we set the
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index f7615ce..f6ec0b17 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -557,8 +557,6 @@ AccountPasswordStoreFactory::GetForProfile( testing_profile, ServiceAccessType::EXPLICIT_ACCESS) .get()); - ON_CALL(*account_store_, GetMetadataStore()) - .WillByDefault(Return(&account_metadata_store_)); } OSCryptMocker::SetUp();
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc index 183b84d..d953d20 100644 --- a/chrome/browser/certificate_manager_model.cc +++ b/chrome/browser/certificate_manager_model.cc
@@ -35,8 +35,8 @@ #include "chrome/browser/ash/certificate_provider/certificate_provider.h" #include "chrome/browser/ash/certificate_provider/certificate_provider_service.h" #include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h" #include "chromeos/network/onc/certificate_scope.h" #include "chromeos/network/policy_certificate_provider.h" #endif
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 37038c7..8650dd04 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -431,6 +431,7 @@ #include "chrome/browser/ash/login/signin_partition_manager.h" #include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ash/policy/handlers/system_features_disable_list_policy_handler.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/smb_client/fileapi/smbfs_file_system_backend_delegate.h" #include "chrome/browser/ash/system/input_device_settings.h" @@ -442,7 +443,6 @@ #include "chrome/browser/chromeos/fileapi/file_system_backend.h" #include "chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.h" #include "chrome/browser/chromeos/net/system_proxy_manager.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/speech/tts_chromeos.h" #include "chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h" #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc index c90b304..764757d 100644 --- a/chrome/browser/chrome_content_browser_client_unittest.cc +++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -66,8 +66,8 @@ #include "ash/webui/scanning/url_constants.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/policy/handlers/system_features_disable_list_policy_handler.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "components/policy/core/common/policy_pref_names.h"
diff --git a/chrome/browser/chrome_notification_types.h b/chrome/browser/chrome_notification_types.h index 4d0c204..79276db 100644 --- a/chrome/browser/chrome_notification_types.h +++ b/chrome/browser/chrome_notification_types.h
@@ -91,11 +91,6 @@ // TODO(https://crbug.com/796051): Remove. NOTIFICATION_PRINT_JOB_EVENT, - // Sent when a PrintJob has been released. - // Source is the WebContents that holds the print job. - // TODO(https://crbug.com/1174788): Remove. - NOTIFICATION_PRINT_JOB_RELEASED, - // Misc -------------------------------------------------------------------- #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -122,14 +117,6 @@ // NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE // TODO(https://crbug.com/1174793): Remove. NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, - - // Sent when the screen lock state has changed. The source is - // ScreenLocker and the details is a bool specifing that the - // screen is locked. When details is a false, the source object - // is being deleted, so the receiver shouldn't use the screen locker - // object. - // TODO(https://crbug.com/1174796): Remove. - NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, #endif // Sent when the applications in the NTP app launcher have been reordered.
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index e46f70d..3404babe 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -2099,6 +2099,36 @@ "../ash/policy/handlers/system_proxy_handler.h", "../ash/policy/handlers/tpm_auto_update_mode_policy_handler.cc", "../ash/policy/handlers/tpm_auto_update_mode_policy_handler.h", + "../ash/policy/invalidation/affiliated_cloud_policy_invalidator.cc", + "../ash/policy/invalidation/affiliated_cloud_policy_invalidator.h", + "../ash/policy/invalidation/affiliated_invalidation_service_provider.cc", + "../ash/policy/invalidation/affiliated_invalidation_service_provider.h", + "../ash/policy/invalidation/affiliated_invalidation_service_provider_impl.cc", + "../ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h", + "../ash/policy/login/login_profile_policy_provider.cc", + "../ash/policy/login/login_profile_policy_provider.h", + "../ash/policy/login/secondary_google_account_signin_policy_handler.cc", + "../ash/policy/login/secondary_google_account_signin_policy_handler.h", + "../ash/policy/login/wildcard_login_checker.cc", + "../ash/policy/login/wildcard_login_checker.h", + "../ash/policy/networking/device_network_configuration_updater.cc", + "../ash/policy/networking/device_network_configuration_updater.h", + "../ash/policy/networking/network_configuration_updater.cc", + "../ash/policy/networking/network_configuration_updater.h", + "../ash/policy/networking/policy_cert_service.cc", + "../ash/policy/networking/policy_cert_service.h", + "../ash/policy/networking/policy_cert_service_factory.cc", + "../ash/policy/networking/policy_cert_service_factory.h", + "../ash/policy/networking/user_network_configuration_updater.cc", + "../ash/policy/networking/user_network_configuration_updater.h", + "../ash/policy/networking/user_network_configuration_updater_factory.cc", + "../ash/policy/networking/user_network_configuration_updater_factory.h", + "../ash/policy/off_hours/device_off_hours_controller.cc", + "../ash/policy/off_hours/device_off_hours_controller.h", + "../ash/policy/off_hours/off_hours_policy_applier.cc", + "../ash/policy/off_hours/off_hours_policy_applier.h", + "../ash/policy/off_hours/off_hours_proto_parser.cc", + "../ash/policy/off_hours/off_hours_proto_parser.h", "../ash/power/auto_screen_brightness/adapter.cc", "../ash/power/auto_screen_brightness/adapter.h", "../ash/power/auto_screen_brightness/als_file_reader.cc", @@ -2822,36 +2852,6 @@ "platform_keys/platform_keys_service_factory.cc", "platform_keys/platform_keys_service_factory.h", "platform_keys/platform_keys_service_nss.cc", - "policy/invalidation/affiliated_cloud_policy_invalidator.cc", - "policy/invalidation/affiliated_cloud_policy_invalidator.h", - "policy/invalidation/affiliated_invalidation_service_provider.cc", - "policy/invalidation/affiliated_invalidation_service_provider.h", - "policy/invalidation/affiliated_invalidation_service_provider_impl.cc", - "policy/invalidation/affiliated_invalidation_service_provider_impl.h", - "policy/login/login_profile_policy_provider.cc", - "policy/login/login_profile_policy_provider.h", - "policy/login/secondary_google_account_signin_policy_handler.cc", - "policy/login/secondary_google_account_signin_policy_handler.h", - "policy/login/wildcard_login_checker.cc", - "policy/login/wildcard_login_checker.h", - "policy/networking/device_network_configuration_updater.cc", - "policy/networking/device_network_configuration_updater.h", - "policy/networking/network_configuration_updater.cc", - "policy/networking/network_configuration_updater.h", - "policy/networking/policy_cert_service.cc", - "policy/networking/policy_cert_service.h", - "policy/networking/policy_cert_service_factory.cc", - "policy/networking/policy_cert_service_factory.h", - "policy/networking/user_network_configuration_updater.cc", - "policy/networking/user_network_configuration_updater.h", - "policy/networking/user_network_configuration_updater_factory.cc", - "policy/networking/user_network_configuration_updater_factory.h", - "policy/off_hours/device_off_hours_controller.cc", - "policy/off_hours/device_off_hours_controller.h", - "policy/off_hours/off_hours_policy_applier.cc", - "policy/off_hours/off_hours_policy_applier.h", - "policy/off_hours/off_hours_proto_parser.cc", - "policy/off_hours/off_hours_proto_parser.h", "policy/remote_commands/affiliated_remote_commands_invalidator.cc", "policy/remote_commands/affiliated_remote_commands_invalidator.h", "policy/remote_commands/crd_host_delegate.cc", @@ -3975,6 +3975,15 @@ "../ash/policy/handlers/system_features_disable_list_policy_handler_unittest.cc", "../ash/policy/handlers/system_proxy_handler_unittest.cc", "../ash/policy/handlers/tpm_auto_update_mode_policy_handler_unittest.cc", + "../ash/policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc", + "../ash/policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc", + "../ash/policy/invalidation/fake_affiliated_invalidation_service_provider.cc", + "../ash/policy/invalidation/fake_affiliated_invalidation_service_provider.h", + "../ash/policy/login/secondary_google_account_signin_policy_handler_unittest.cc", + "../ash/policy/networking/network_configuration_updater_unittest.cc", + "../ash/policy/off_hours/device_off_hours_controller_unittest.cc", + "../ash/policy/off_hours/off_hours_policy_applier_unittest.cc", + "../ash/policy/off_hours/off_hours_proto_parser_unittest.cc", "../ash/power/auto_screen_brightness/adapter_unittest.cc", "../ash/power/auto_screen_brightness/als_file_reader_unittest.cc", "../ash/power/auto_screen_brightness/als_reader_unittest.cc", @@ -4196,15 +4205,6 @@ "phonehub/browser_tabs_model_provider_impl_unittest.cc", "platform_keys/key_permissions/arc_key_permissions_manager_delegate_unittest.cc", "platform_keys/key_permissions/key_permissions_service_impl_unittest.cc", - "policy/invalidation/affiliated_cloud_policy_invalidator_unittest.cc", - "policy/invalidation/affiliated_invalidation_service_provider_impl_unittest.cc", - "policy/invalidation/fake_affiliated_invalidation_service_provider.cc", - "policy/invalidation/fake_affiliated_invalidation_service_provider.h", - "policy/login/secondary_google_account_signin_policy_handler_unittest.cc", - "policy/networking/network_configuration_updater_unittest.cc", - "policy/off_hours/device_off_hours_controller_unittest.cc", - "policy/off_hours/off_hours_policy_applier_unittest.cc", - "policy/off_hours/off_hours_proto_parser_unittest.cc", "policy/remote_commands/crd_host_delegate_unittest.cc", "policy/remote_commands/device_command_get_available_routines_job_unittest.cc", "policy/remote_commands/device_command_get_routine_update_job_unittest.cc",
diff --git a/chrome/browser/chromeos/browser_context_keyed_service_factories.cc b/chrome/browser/chromeos/browser_context_keyed_service_factories.cc index 711f2f0..bd4a5659 100644 --- a/chrome/browser/chromeos/browser_context_keyed_service_factories.cc +++ b/chrome/browser/chromeos/browser_context_keyed_service_factories.cc
@@ -20,6 +20,8 @@ #include "chrome/browser/ash/plugin_vm/plugin_vm_engagement_metrics_service.h" #include "chrome/browser/ash/policy/core/user_cloud_policy_token_forwarder_factory.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" +#include "chrome/browser/ash/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/ash/smb_client/smb_service_factory.h" #include "chrome/browser/ash/web_applications/crosh_loader_factory.h" #include "chrome/browser/chromeos/android_sms/android_sms_service_factory.h" @@ -36,8 +38,6 @@ #include "chrome/browser/chromeos/phonehub/phone_hub_manager_factory.h" #include "chrome/browser/chromeos/platform_keys/key_permissions/key_permissions_service_factory.h" #include "chrome/browser/chromeos/platform_keys/key_permissions/user_private_token_kpm_service_factory.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" -#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h" #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h" #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h" #include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/login_apitest.cc b/chrome/browser/chromeos/extensions/login_screen/login/login_apitest.cc index 6905f796..e9ba10a79 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/login_apitest.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login/login_apitest.cc
@@ -199,12 +199,11 @@ } // Also checks that session is locked. - void LockScreen() { screen_locker_tester_.Lock(); } + void LockScreen() { ScreenLockerTester().Lock(); } private: chromeos::LocalPolicyTestServerMixin local_policy_mixin_{&mixin_host_}; base::DictionaryValue config_; - ScreenLockerTester screen_locker_tester_; }; IN_PROC_BROWSER_TEST_F(LoginApitest, LaunchManagedGuestSession) {
diff --git a/chrome/browser/chromeos/extensions/login_screen/login_screen_apitest_base.h b/chrome/browser/chromeos/extensions/login_screen/login_screen_apitest_base.h index bf591f9..3f7d9a10 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login_screen_apitest_base.h +++ b/chrome/browser/chromeos/extensions/login_screen/login_screen_apitest_base.h
@@ -9,7 +9,7 @@ #include <string> #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h" +#include "chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h" #include "components/version_info/version_info.h" class ExtensionTestMessageListener;
diff --git a/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/login_screen_ui_apitest.cc b/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/login_screen_ui_apitest.cc index 48ef635..894de64d 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/login_screen_ui_apitest.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/login_screen_ui_apitest.cc
@@ -7,9 +7,9 @@ #include "chrome/browser/ash/login/ui/login_screen_extension_ui/dialog_delegate.h" #include "chrome/browser/ash/login/ui/login_screen_extension_ui/window.h" +#include "chrome/browser/ash/policy/login/signin_profile_extensions_policy_test_base.h" #include "chrome/browser/chromeos/extensions/login_screen/login_screen_apitest_base.h" #include "chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler.h" -#include "chrome/browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h" #include "components/version_info/version_info.h" #include "content/public/test/browser_test.h" #include "ui/views/widget/widget.h"
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc index ad7620c..17c4c6c 100644 --- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc +++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
@@ -53,7 +53,10 @@ #include "extensions/browser/api_test_utils.h" #include "extensions/browser/extension_function_dispatcher.h" -namespace quick_unlock_private = extensions::api::quick_unlock_private; +namespace extensions { +namespace { + +namespace quick_unlock_private = api::quick_unlock_private; using CredentialCheck = quick_unlock_private::CredentialCheck; using CredentialProblem = quick_unlock_private::CredentialProblem; using CredentialRequirements = quick_unlock_private::CredentialRequirements; @@ -61,9 +64,6 @@ using QuickUnlockModeList = std::vector<QuickUnlockMode>; using CredentialList = std::vector<std::string>; -namespace chromeos { -namespace { - // The type of the test. Either based on Prefs or Cryptohome enum class TestType { kPrefs, kCryptohome }; @@ -83,7 +83,7 @@ constexpr char kValidPassword[] = "valid"; constexpr char kInvalidPassword[] = "invalid"; -class FakeEasyUnlockService : public EasyUnlockServiceRegular { +class FakeEasyUnlockService : public ash::EasyUnlockServiceRegular { public: FakeEasyUnlockService( Profile* profile, @@ -92,13 +92,13 @@ fake_secure_channel_client, chromeos::multidevice_setup::FakeMultiDeviceSetupClient* fake_multidevice_setup_client) - : EasyUnlockServiceRegular(profile, - fake_secure_channel_client, - fake_device_sync_client, - fake_multidevice_setup_client) {} + : ash::EasyUnlockServiceRegular(profile, + fake_secure_channel_client, + fake_device_sync_client, + fake_multidevice_setup_client) {} ~FakeEasyUnlockService() override {} - // EasyUnlockServiceRegular: + // ash::EasyUnlockServiceRegular: void InitializeInternal() override {} void ShutdownInternal() override {} @@ -121,15 +121,16 @@ fake_secure_channel_client.get(), fake_multidevice_setup_client.get()); } -ExtendedAuthenticator* CreateFakeAuthenticator( - AuthStatusConsumer* auth_status_consumer) { +ash::ExtendedAuthenticator* CreateFakeAuthenticator( + ash::AuthStatusConsumer* auth_status_consumer) { const AccountId account_id = AccountId::FromUserEmailGaiaId(kTestUserEmail, kTestUserGaiaId); - UserContext expected_context(user_manager::USER_TYPE_REGULAR, account_id); - expected_context.SetKey(Key(kValidPassword)); + ash::UserContext expected_context(user_manager::USER_TYPE_REGULAR, + account_id); + expected_context.SetKey(ash::Key(kValidPassword)); - ExtendedAuthenticator* authenticator = - new FakeExtendedAuthenticator(auth_status_consumer, expected_context); + auto* authenticator = new ash::FakeExtendedAuthenticator(auth_status_consumer, + expected_context); return authenticator; } @@ -149,7 +150,7 @@ } // namespace class QuickUnlockPrivateUnitTest - : public extensions::ExtensionApiUnittest, + : public ExtensionApiUnittest, public ::testing::WithParamInterface<std::tuple<TestType, bool>> { public: static std::string ParamInfoToString( @@ -166,30 +167,31 @@ void SetUp() override { // Enable/disable PIN auto submit auto param = GetParam(); - feature_list_.InitWithFeatureState( - features::kQuickUnlockPinAutosubmit, std::get<1>(param)); + feature_list_.InitWithFeatureState(ash::features::kQuickUnlockPinAutosubmit, + std::get<1>(param)); - CryptohomeMiscClient::InitializeFake(); - UserDataAuthClient::InitializeFake(); + ash::CryptohomeMiscClient::InitializeFake(); + ash::UserDataAuthClient::InitializeFake(); if (std::get<0>(param) == TestType::kCryptohome) { - auto* cryptohome_client = FakeUserDataAuthClient::Get(); + auto* cryptohome_client = ash::FakeUserDataAuthClient::Get(); cryptohome_client->set_supports_low_entropy_credentials(true); cryptohome_client->set_enable_auth_check(true); } - SystemSaltGetter::Initialize(); + ash::SystemSaltGetter::Initialize(); - fake_user_manager_ = new FakeChromeUserManager(); + fake_user_manager_ = new ash::FakeChromeUserManager(); scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( base::WrapUnique(fake_user_manager_)); ExtensionApiUnittest::SetUp(); - SystemSaltGetter::Get()->SetRawSaltForTesting({1, 2, 3, 4, 5, 6, 7, 8}); + ash::SystemSaltGetter::Get()->SetRawSaltForTesting( + {1, 2, 3, 4, 5, 6, 7, 8}); fake_user_manager_->CreateLocalState(); // Rebuild quick unlock state. - quick_unlock::EnabledForTesting(true); - quick_unlock::PinBackend::ResetForTesting(); + ash::quick_unlock::EnabledForTesting(true); + ash::quick_unlock::PinBackend::ResetForTesting(); base::RunLoop().RunUntilIdle(); @@ -216,13 +218,13 @@ fake_user_manager_->AddUser(test_account); fake_user_manager_->UserLoggedIn(test_account, kTestUserEmailHash, false, false); - ProfileHelper::Get()->SetUserToProfileMappingForTesting( + ash::ProfileHelper::Get()->SetUserToProfileMappingForTesting( fake_user_manager_->GetPrimaryUser(), profile); // Generate an auth token. auth_token_user_context_.SetAccountId(test_account); auth_token_user_context_.SetUserIDHash(kTestUserEmailHash); - token_ = quick_unlock::QuickUnlockFactory::GetForProfile(profile) + token_ = ash::quick_unlock::QuickUnlockFactory::GetForProfile(profile) ->CreateAuthToken(auth_token_user_context_); base::RunLoop().RunUntilIdle(); @@ -230,8 +232,8 @@ } void TearDown() override { - quick_unlock::EnabledForTesting(false); - quick_unlock::DisablePinByPolicyForTesting(false); + ash::quick_unlock::EnabledForTesting(false); + ash::quick_unlock::DisablePinByPolicyForTesting(false); base::RunLoop().RunUntilIdle(); @@ -240,13 +242,13 @@ fake_user_manager_ = nullptr; scoped_user_manager_.reset(); - SystemSaltGetter::Shutdown(); - UserDataAuthClient::Shutdown(); - CryptohomeMiscClient::Shutdown(); + ash::SystemSaltGetter::Shutdown(); + ash::UserDataAuthClient::Shutdown(); + ash::CryptohomeMiscClient::Shutdown(); } TestingProfile::TestingFactories GetTestingFactories() override { - return {{EasyUnlockServiceFactory::GetInstance(), + return {{ash::EasyUnlockServiceFactory::GetInstance(), base::BindRepeating(&CreateEasyUnlockServiceForTest)}}; } @@ -268,7 +270,7 @@ std::unique_ptr<quick_unlock_private::TokenInfo> GetAuthToken( const std::string& password) { // Setup a fake authenticator to avoid calling cryptohome methods. - auto* func = new extensions::QuickUnlockPrivateGetAuthTokenFunction(); + auto* func = new QuickUnlockPrivateGetAuthTokenFunction(); func->SetAuthenticatorAllocatorForTesting( base::BindRepeating(&CreateFakeAuthenticator)); @@ -285,7 +287,7 @@ // password. Expects the function to fail and returns the error. std::string RunAuthTokenWithInvalidPassword() { // Setup a fake authenticator to avoid calling cryptohome methods. - auto* func = new extensions::QuickUnlockPrivateGetAuthTokenFunction(); + auto* func = new QuickUnlockPrivateGetAuthTokenFunction(); func->SetAuthenticatorAllocatorForTesting( base::BindRepeating(&CreateFakeAuthenticator)); @@ -299,9 +301,8 @@ auto params = std::make_unique<base::ListValue>(); params->AppendString(token); params->AppendBoolean(enabled); - RunFunction( - new extensions::QuickUnlockPrivateSetLockScreenEnabledFunction(), - std::move(params)); + RunFunction(new QuickUnlockPrivateSetLockScreenEnabledFunction(), + std::move(params)); } // Wrapper for chrome.quickUnlockPrivate.setLockScreenEnabled. @@ -310,16 +311,16 @@ params->AppendString(kInvalidToken); params->AppendBoolean(enabled); return RunFunctionAndReturnError( - new extensions::QuickUnlockPrivateSetLockScreenEnabledFunction(), + new QuickUnlockPrivateSetLockScreenEnabledFunction(), std::move(params)); } // Wrapper for chrome.quickUnlockPrivate.getAvailableModes. QuickUnlockModeList GetAvailableModes() { // Run the function. - std::unique_ptr<base::Value> result = RunFunction( - new extensions::QuickUnlockPrivateGetAvailableModesFunction(), - std::make_unique<base::ListValue>()); + std::unique_ptr<base::Value> result = + RunFunction(new QuickUnlockPrivateGetAvailableModesFunction(), + std::make_unique<base::ListValue>()); // Extract the results. QuickUnlockModeList modes; @@ -337,7 +338,7 @@ // Wrapper for chrome.quickUnlockPrivate.getActiveModes. QuickUnlockModeList GetActiveModes() { std::unique_ptr<base::Value> result = - RunFunction(new extensions::QuickUnlockPrivateGetActiveModesFunction(), + RunFunction(new QuickUnlockPrivateGetActiveModesFunction(), std::make_unique<base::ListValue>()); QuickUnlockModeList modes; @@ -387,9 +388,8 @@ params->AppendString(ToString(QuickUnlockMode::QUICK_UNLOCK_MODE_PIN)); params->AppendString(pin); - std::unique_ptr<base::Value> result = - RunFunction(new extensions::QuickUnlockPrivateCheckCredentialFunction(), - std::move(params)); + std::unique_ptr<base::Value> result = RunFunction( + new QuickUnlockPrivateCheckCredentialFunction(), std::move(params)); CredentialCheck function_result; EXPECT_TRUE(CredentialCheck::Populate(*result, &function_result)); @@ -401,9 +401,9 @@ auto params = std::make_unique<base::ListValue>(); params->AppendString(ToString(QuickUnlockMode::QUICK_UNLOCK_MODE_PIN)); - std::unique_ptr<base::Value> result = RunFunction( - new extensions::QuickUnlockPrivateGetCredentialRequirementsFunction(), - std::move(params)); + std::unique_ptr<base::Value> result = + RunFunction(new QuickUnlockPrivateGetCredentialRequirementsFunction(), + std::move(params)); CredentialRequirements function_result; EXPECT_TRUE(CredentialRequirements::Populate(*result, &function_result)); @@ -438,7 +438,7 @@ const CredentialList& passwords) { std::unique_ptr<base::ListValue> params = GetSetModesParams(token_, modes, passwords); - auto* func = new extensions::QuickUnlockPrivateSetModesFunction(); + auto* func = new QuickUnlockPrivateSetModesFunction(); // Stub out event handling since we are not setting up an event router. func->SetModesChangedEventHandlerForTesting(modes_changed_handler_); @@ -458,7 +458,7 @@ std::string RunSetModesWithInvalidToken() { std::unique_ptr<base::ListValue> params = GetSetModesParams( kInvalidToken, {QuickUnlockMode::QUICK_UNLOCK_MODE_PIN}, {"111111"}); - auto* func = new extensions::QuickUnlockPrivateSetModesFunction(); + auto* func = new QuickUnlockPrivateSetModesFunction(); // Stub out event handling since we are not setting up an event router. func->SetModesChangedEventHandlerForTesting(modes_changed_handler_); @@ -468,11 +468,10 @@ } std::string SetModesWithError(const std::string& args) { - auto* func = new extensions::QuickUnlockPrivateSetModesFunction(); + auto* func = new QuickUnlockPrivateSetModesFunction(); func->SetModesChangedEventHandlerForTesting(base::DoNothing()); - return extensions::api_test_utils::RunFunctionAndReturnError(func, args, - profile()); + return api_test_utils::RunFunctionAndReturnError(func, args, profile()); } std::string token() { return token_; } @@ -484,7 +483,7 @@ bool called = false; bool is_set = false; - quick_unlock::PinBackend::GetInstance()->IsSet( + ash::quick_unlock::PinBackend::GetInstance()->IsSet( account_id, base::BindOnce( [](bool* out_called, bool* out_is_set, bool is_set) { *out_called = true; @@ -543,7 +542,8 @@ void OnUpdateUserPods() { const AccountId account_id = AccountId::FromUserEmailGaiaId(kTestUserEmail, kTestUserGaiaId); - quick_unlock::PinBackend::GetInstance()->GetExposedPinLength(account_id); + ash::quick_unlock::PinBackend::GetInstance()->GetExposedPinLength( + account_id); } void SetPin(const std::string& pin) { @@ -577,8 +577,8 @@ bool called = false; bool success = false; base::RunLoop loop; - quick_unlock::PinBackend::GetInstance()->TryAuthenticate( - account_id, Key(password), + ash::quick_unlock::PinBackend::GetInstance()->TryAuthenticate( + account_id, ash::Key(password), base::BindLambdaForTesting([&](bool auth_success) { called = true; success = auth_success; @@ -594,7 +594,7 @@ bool called = false; bool success = false; base::RunLoop loop; - quick_unlock::PinBackend::GetInstance()->SetPinAutoSubmitEnabled( + ash::quick_unlock::PinBackend::GetInstance()->SetPinAutoSubmitEnabled( account_id, pin, enabled, base::BindLambdaForTesting([&](bool autosubmit_success) { called = true; @@ -616,12 +616,11 @@ scoped_refptr<ExtensionFunction> func, std::unique_ptr<base::ListValue> params) { base::RunLoop().RunUntilIdle(); - std::unique_ptr<base::Value> result = extensions::api_test_utils:: - RunFunctionWithDelegateAndReturnSingleResult( + std::unique_ptr<base::Value> result = + api_test_utils::RunFunctionWithDelegateAndReturnSingleResult( func, std::move(params), profile(), - std::make_unique<extensions::ExtensionFunctionDispatcher>( - profile()), - extensions::api_test_utils::NONE); + std::make_unique<ExtensionFunctionDispatcher>(profile()), + api_test_utils::NONE); base::RunLoop().RunUntilIdle(); return result; } @@ -631,11 +630,9 @@ scoped_refptr<ExtensionFunction> func, std::unique_ptr<base::ListValue> params) { base::RunLoop().RunUntilIdle(); - auto dispatcher = - std::make_unique<extensions::ExtensionFunctionDispatcher>(profile()); - extensions::api_test_utils::RunFunction(func.get(), std::move(params), - profile(), std::move(dispatcher), - extensions::api_test_utils::NONE); + auto dispatcher = std::make_unique<ExtensionFunctionDispatcher>(profile()); + api_test_utils::RunFunction(func.get(), std::move(params), profile(), + std::move(dispatcher), api_test_utils::NONE); EXPECT_TRUE(func->GetResultList()->GetList().empty()); base::RunLoop().RunUntilIdle(); return func->GetError(); @@ -649,9 +646,9 @@ expect_modes_changed_ = false; } - FakeChromeUserManager* fake_user_manager_ = nullptr; + ash::FakeChromeUserManager* fake_user_manager_ = nullptr; std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; - extensions::QuickUnlockPrivateSetModesFunction::ModesChangedEventHandler + QuickUnlockPrivateSetModesFunction::ModesChangedEventHandler modes_changed_handler_; bool expect_modes_changed_ = false; chromeos::UserContext auth_token_user_context_; @@ -665,12 +662,12 @@ std::unique_ptr<quick_unlock_private::TokenInfo> token_info = GetAuthToken(kValidPassword); - quick_unlock::QuickUnlockStorage* quick_unlock_storage = - quick_unlock::QuickUnlockFactory::GetForProfile(profile()); + ash::quick_unlock::QuickUnlockStorage* quick_unlock_storage = + ash::quick_unlock::QuickUnlockFactory::GetForProfile(profile()); EXPECT_EQ(token_info->token, quick_unlock_storage->GetAuthToken()->Identifier()); EXPECT_EQ(token_info->lifetime_seconds, - quick_unlock::AuthToken::kTokenExpirationSeconds); + ash::quick_unlock::AuthToken::kTokenExpirationSeconds); } // Verifies that GetAuthTokenValid fails when an invalid password is provided. @@ -712,14 +709,14 @@ EXPECT_EQ(GetAvailableModes(), QuickUnlockModeList{QuickUnlockMode::QUICK_UNLOCK_MODE_PIN}); - quick_unlock::DisablePinByPolicyForTesting(true); + ash::quick_unlock::DisablePinByPolicyForTesting(true); EXPECT_TRUE(GetAvailableModes().empty()); } // Verfies that trying to set modes with a valid PIN failes when PIN is blocked // by policy. TEST_P(QuickUnlockPrivateUnitTest, SetModesForPinFailsWhenPinDisabledByPolicy) { - quick_unlock::DisablePinByPolicyForTesting(true); + ash::quick_unlock::DisablePinByPolicyForTesting(true); EXPECT_FALSE(SetModesWithError("[\"valid\", [\"PIN\"], [\"111\"]]").empty()); } @@ -1061,8 +1058,7 @@ // Checks that the feature flag correctly prevents all actions. TEST_P(QuickUnlockPrivateUnitTest, PinAutosubmitFeatureGuard) { const bool feature_enabled = IsAutosubmitFeatureEnabled(); - EXPECT_EQ(features::IsPinAutosubmitFeatureEnabled(), - feature_enabled); + EXPECT_EQ(ash::features::IsPinAutosubmitFeatureEnabled(), feature_enabled); } // Tests that the backfill operation sets a user value for the auto submit pref @@ -1085,7 +1081,7 @@ histogram_tester.ExpectUniqueSample( "Ash.Login.PinAutosubmit.Backfill", - quick_unlock::PinBackend::BackfillEvent::kEnabled, 1); + ash::quick_unlock::PinBackend::BackfillEvent::kEnabled, 1); } // No backfill operation if the PIN is longer than 6 digits. @@ -1106,7 +1102,7 @@ histogram_tester.ExpectUniqueSample( "Ash.Login.PinAutosubmit.Backfill", - quick_unlock::PinBackend::BackfillEvent::kDisabledDueToPinLength, 1); + ash::quick_unlock::PinBackend::BackfillEvent::kDisabledDueToPinLength, 1); } // Tests that the backfill operation sets a user value for the auto submit pref @@ -1132,7 +1128,7 @@ histogram_tester.ExpectUniqueSample( "Ash.Login.PinAutosubmit.Backfill", - quick_unlock::PinBackend::BackfillEvent::kDisabledDueToPolicy, 1); + ash::quick_unlock::PinBackend::BackfillEvent::kDisabledDueToPolicy, 1); } INSTANTIATE_TEST_SUITE_P( @@ -1141,4 +1137,5 @@ testing::Combine(testing::Values(TestType::kPrefs, TestType::kCryptohome), testing::Bool()), /*autosubmit*/ QuickUnlockPrivateUnitTest::ParamInfoToString); -} // namespace chromeos + +} // namespace extensions
diff --git a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc index 7f05a08..6074c07 100644 --- a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc +++ b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc
@@ -8,10 +8,12 @@ #include <vector> #include "ash/shell.h" +#include "base/bind.h" #include "base/callback.h" #include "base/containers/contains.h" #include "base/cpu.h" #include "base/metrics/histogram_functions.h" +#include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/apps/app_service/app_platform_metrics.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" @@ -111,17 +113,16 @@ DCHECK(app_launch_handler); handler_ = app_launch_handler; - LoadRestoreData(); + DCHECK(apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile( + handler_->profile_)); + LoadRestoreData(); if (!HasRestoreData()) return; window_handler_ = FullRestoreArcTaskHandler::GetForProfile(handler_->profile_) ->window_handler(); - DCHECK(apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile( - handler_->profile_)); - apps::AppRegistryCache& cache = apps::AppServiceProxyFactory::GetForProfile(handler_->profile_) ->AppRegistryCache(); @@ -130,18 +131,8 @@ if (!app_registry_cache_observer_.IsObserving()) app_registry_cache_observer_.Observe(&cache); - // Add the app to `app_ids` if there is a launch list from the restore data - // for the app. - std::set<std::string> app_ids; - cache.ForEachApp([&app_ids, this](const apps::AppUpdate& update) { - if (update.Readiness() == apps::mojom::Readiness::kReady && - app_ids_.find(update.AppId()) != app_ids_.end()) { - app_ids.insert(update.AppId()); - } - }); - - for (const auto& app_id : app_ids) - PrepareAppLaunching(app_id); + if (is_shelf_ready_) + PrepareLaunchApps(); } void ArcAppLaunchHandler::OnAppUpdate(const apps::AppUpdate& update) { @@ -157,7 +148,7 @@ if (update.Readiness() != apps::mojom::Readiness::kReady) return; - if (base::Contains(app_ids_, update.AppId())) + if (is_shelf_ready_ && base::Contains(app_ids_, update.AppId())) PrepareAppLaunching(update.AppId()); } @@ -200,6 +191,12 @@ } } +void ArcAppLaunchHandler::OnShelfReady() { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&ArcAppLaunchHandler::PrepareLaunchApps, + weak_ptr_factory_.GetWeakPtr())); +} + void ArcAppLaunchHandler::LaunchApp(const std::string& app_id) { if (!IsAppReady(app_id)) return; @@ -287,7 +284,15 @@ ->AppRegistryCache(); for (const auto& it : handler_->restore_data_->app_id_to_launch_list()) { - if (cache.GetAppType(it.first) != apps::mojom::AppType::kArc) + bool should_restore = false; + cache.ForOneApp(it.first, [&should_restore](const apps::AppUpdate& update) { + if (update.AppType() == apps::mojom::AppType::kArc && + apps_util::IsInstalled(update.Readiness())) { + should_restore = true; + } + }); + + if (!should_restore) continue; app_ids_.insert(it.first); @@ -305,6 +310,30 @@ windows_.size() + no_stack_windows_.size()); } +void ArcAppLaunchHandler::PrepareLaunchApps() { + is_shelf_ready_ = true; + + if (!HasRestoreData()) + return; + + apps::AppRegistryCache& cache = + apps::AppServiceProxyFactory::GetForProfile(handler_->profile_) + ->AppRegistryCache(); + + // Add the app to `app_ids` if there is a launch list from the restore data + // for the app. + std::set<std::string> app_ids; + cache.ForEachApp([&app_ids, this](const apps::AppUpdate& update) { + if (update.Readiness() == apps::mojom::Readiness::kReady && + app_ids_.find(update.AppId()) != app_ids_.end()) { + app_ids.insert(update.AppId()); + } + }); + + for (const auto& app_id : app_ids) + PrepareAppLaunching(app_id); +} + void ArcAppLaunchHandler::PrepareAppLaunching(const std::string& app_id) { DCHECK(handler_); app_ids_.erase(app_id);
diff --git a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h index f2d89e0..bc63999f 100644 --- a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h +++ b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h
@@ -61,11 +61,6 @@ // The ArcAppLaunchHandler class restores ARC apps during the system startup // phase. -// -// TODO(crbug.com/1146900): -// 1. Add memory pressure checking before launch ARC apps. -// 2. Add app launch policy. -// 3. Check whether the ARC app is ready before launch the ARC apps. class ArcAppLaunchHandler : public apps::AppRegistryCache::Observer, public chromeos::ResourcedClient::Observer, public wm::ActivationChangeObserver, @@ -93,6 +88,9 @@ void OnAppConnectionReady(); + // Invoked when ChromeShelfController is created. + void OnShelfReady(); + void LaunchApp(const std::string& app_id); // wm::ActivationChangeObserver: @@ -115,6 +113,10 @@ // `no_stack_windows_` and `app_ids_`. void LoadRestoreData(); + // Creates ghost windows or displays spin icons for all ARC apps to be + // restored. + void PrepareLaunchApps(); + // Creates the ghost windows or displays the icon with an overlaid spinner to // provide visual feedback that the app cannot be launched immediately (due to // ARC not being ready, or the system perforamcne concern) on Chrome OS. @@ -198,6 +200,11 @@ // launched. int launch_count_ = 0; + // If ChromeShelfController has not been created, we can't create the spin + // icon on shelf. `is_shelf_ready_` is used to mark whether + // ChromeShelfController is created to prepare launching apps. + bool is_shelf_ready_ = false; + // A repeating timer to check whether we can restore the ARC apps. std::unique_ptr<base::RepeatingTimer> app_launch_timer_;
diff --git a/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.cc b/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.cc index eb1b59f..3d2b464 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.cc +++ b/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.cc
@@ -70,5 +70,10 @@ arc_app_launch_handler_->OnAppConnectionReady(); } +void FullRestoreArcTaskHandler::OnShelfReady() { + if (arc_app_launch_handler_) + arc_app_launch_handler_->OnShelfReady(); +} + } // namespace full_restore } // namespace chromeos
diff --git a/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.h b/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.h index 94e3dc6..382065a 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.h +++ b/chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.h
@@ -60,6 +60,9 @@ uint32_t status_bar_color) override; void OnAppConnectionReady() override; + // Invoked when ChromeShelfController is created. + void OnShelfReady(); + private: base::ScopedObservation<ArcAppListPrefs, ArcAppListPrefs::Observer> arc_prefs_observer_{this};
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller.cc b/chrome/browser/chromeos/input_method/assistive_window_controller.cc index 99f9e00..1637dc677 100644 --- a/chrome/browser/chromeos/input_method/assistive_window_controller.cc +++ b/chrome/browser/chromeos/input_method/assistive_window_controller.cc
@@ -145,7 +145,7 @@ confirmed_length_ == 0 ? bounds.caret : bounds.composition_text); } if (grammar_suggestion_window_) { - grammar_suggestion_window_->SetAnchorRect(bounds.caret); + grammar_suggestion_window_->SetBounds(bounds_.caret); } } @@ -238,7 +238,7 @@ if (!grammar_suggestion_window_) InitGrammarSuggestionWindow(); if (window.visible) { - grammar_suggestion_window_->SetAnchorRect(bounds_.caret); + grammar_suggestion_window_->SetBounds(bounds_.caret); grammar_suggestion_window_->SetSuggestion(window.candidates[0]); grammar_suggestion_window_->Show(); } else {
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine.cc b/chrome/browser/chromeos/input_method/native_input_method_engine.cc index 088a8d1..d88122c 100644 --- a/chrome/browser/chromeos/input_method/native_input_method_engine.cc +++ b/chrome/browser/chromeos/input_method/native_input_method_engine.cc
@@ -293,9 +293,9 @@ // `IsCharacter` may return true for named keys like Enter because they have a // Unicode representation. Hence, try to convert the key into a named key // first before trying to convert it to a character key. - absl::optional<mojom::NamedDomKey> named_key = NamedDomKeyToMojom(key); - if (named_key) { - return mojom::DomKey::NewNamedKey(*named_key); + if (ui::KeycodeConverter::IsDomKeyNamed(key)) { + absl::optional<mojom::NamedDomKey> named_key = NamedDomKeyToMojom(key); + return named_key ? mojom::DomKey::NewNamedKey(*named_key) : nullptr; } if (key.IsCharacter()) { return mojom::DomKey::NewCodepoint(key.ToCharacter());
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine_unittest.cc b/chrome/browser/chromeos/input_method/native_input_method_engine_unittest.cc index ed1d4e5..0f05c316 100644 --- a/chrome/browser/chromeos/input_method/native_input_method_engine_unittest.cc +++ b/chrome/browser/chromeos/input_method/native_input_method_engine_unittest.cc
@@ -450,6 +450,43 @@ InputMethodManager::Shutdown(); } +TEST_F(NativeInputMethodEngineTest, DoesNotSendUnhandledNamedKeys) { + TestingProfile testing_profile; + SetPhysicalTypingAutocorrectEnabled(testing_profile, true); + + testing::StrictMock<MockInputMethod> mock_input_method; + input_method::InputMethodManager::Initialize( + new TestInputMethodManager(&mock_input_method)); + ui::MockIMEInputContextHandler mock_handler; + ui::IMEBridge::Get()->SetInputContextHandler(&mock_handler); + NativeInputMethodEngine engine; + engine.Initialize(std::make_unique<StubInputMethodEngineObserver>(), + /*extension_id=*/"", &testing_profile); + + { + testing::InSequence seq; + EXPECT_CALL(mock_input_method, OnFocus(_)); + EXPECT_CALL(mock_input_method, ProcessKeyEvent(_, _)).Times(0); + } + + engine.Enable(kEngineIdUs); + engine.FocusIn(ui::IMEEngineHandlerInterface::InputContext( + ui::TEXT_INPUT_TYPE_TEXT, ui::TEXT_INPUT_MODE_DEFAULT, + ui::TEXT_INPUT_FLAG_NONE, ui::TextInputClient::FOCUS_REASON_MOUSE, + /*should_do_learning=*/true)); + + // Escape is a named DOM key, but is not used by IMEs. + engine.ProcessKeyEvent( + {ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, + ui::DomKey::ESCAPE, base::TimeTicks()}, + base::DoNothing()); + engine.ProcessKeyEvent({ui::ET_KEY_RELEASED, ui::VKEY_ESCAPE, ui::EF_NONE}, + base::DoNothing()); + engine.FlushForTesting(); + + InputMethodManager::Shutdown(); +} + // TODO(crbug.com/1148157): Refactor NativeInputMethodEngine etc. to avoid // hidden dependencies on globals such as ImeBridge. class NativeInputMethodEngineWithRenderViewHostTest
diff --git a/chrome/browser/chromeos/input_method/ui/OWNERS b/chrome/browser/chromeos/input_method/ui/OWNERS index 918ad0cde..4d8d089 100644 --- a/chrome/browser/chromeos/input_method/ui/OWNERS +++ b/chrome/browser/chromeos/input_method/ui/OWNERS
@@ -6,5 +6,4 @@ keithlee@chromium.org googleo@chromium.org komatsu@chromium.org -mukai@chromium.org yukishiino@chromium.org
diff --git a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc b/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc index 262d3ca..38a751d 100644 --- a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc +++ b/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc
@@ -9,7 +9,6 @@ #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/paint_vector_icon.h" -#include "ui/views/border.h" #include "ui/views/bubble/bubble_border.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/layout/box_layout.h" @@ -23,6 +22,11 @@ namespace { constexpr SkColor kGrammarColor = gfx::kGoogleGrey700; +constexpr int kGrammarPaddingSize = 4; +constexpr float kSuggestionBorderRadius = 2; +// Large enough to make the background a circle. +constexpr float kIconBorderRadius = 100; +constexpr int kWindowOffsetY = -4; bool ShouldHighlight(const views::Button& button) { return button.GetState() == views::Button::STATE_HOVERED || @@ -38,7 +42,8 @@ SetCanActivate(false); DCHECK(parent); set_parent_window(parent); - set_margins(gfx::Insets()); + set_margins(gfx::Insets(kGrammarPaddingSize, kGrammarPaddingSize, + kGrammarPaddingSize, kGrammarPaddingSize)); SetArrow(views::BubbleBorder::Arrow::BOTTOM_LEFT); SetLayoutManager(std::make_unique<views::BoxLayout>( @@ -141,12 +146,12 @@ if (highlighted) { switch (button.id) { case ButtonId::kSuggestion: - suggestion_button_->SetBackground( - views::CreateSolidBackground(kButtonHighlightColor)); + suggestion_button_->SetBackground(views::CreateRoundedRectBackground( + kButtonHighlightColor, kSuggestionBorderRadius)); break; case ButtonId::kIgnoreSuggestion: - ignore_button_->SetBackground( - views::CreateSolidBackground(kButtonHighlightColor)); + ignore_button_->SetBackground(views::CreateRoundedRectBackground( + kButtonHighlightColor, kIconBorderRadius)); break; default: break; @@ -154,6 +159,11 @@ } } +void GrammarSuggestionWindow::SetBounds(gfx::Rect bounds) { + bounds.Offset(0, kWindowOffsetY); + SetAnchorRect(bounds); +} + SuggestionView* GrammarSuggestionWindow::GetSuggestionButtonForTesting() { return suggestion_button_; }
diff --git a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h b/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h index 8aff1b8..90c80f3e 100644 --- a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h +++ b/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h
@@ -37,6 +37,8 @@ void SetButtonHighlighted(const AssistiveWindowButton& button, bool highlighted); + void SetBounds(gfx::Rect bounds); + SuggestionView* GetSuggestionButtonForTesting(); views::Button* GetIgnoreButtonForTesting();
diff --git a/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h b/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h index 76c102c..f013bc8 100644 --- a/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h +++ b/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/macros.h" -#include "chrome/browser/chromeos/policy/invalidation/affiliated_invalidation_service_provider.h" +#include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h" #include "components/policy/core/common/cloud/policy_invalidation_scope.h" namespace policy {
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java index 14aa162..00681bb 100644 --- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java +++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java
@@ -31,6 +31,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics.MessageClearReason; @@ -151,6 +152,7 @@ @Test @CommandLineFlags. Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"}) + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage() { mCoordinator.maybeDisplayMessage( new MerchantTrustMessageContext(mMockNavigationHandle, mMockWebContents)); @@ -171,6 +173,7 @@ @Test @CommandLineFlags. Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/60000"}) + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage_LastEventWithinTimeWindow() { doReturn(System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(10)) .when(mMockMerchantTrustSignalsEvent) @@ -195,6 +198,7 @@ @Test @CommandLineFlags. Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"}) + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage_FirstTime() { setMockTrustSignalsEventData("fake_host", null); @@ -217,6 +221,7 @@ @Test @CommandLineFlags. Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"}) + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage_NoMerchantTrustData() { setMockTrustSignalsData(null); @@ -239,6 +244,7 @@ @Test @CommandLineFlags. Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"}) + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage_WithInvalidStorage() { doReturn(null).when(mMockMerchantTrustStorageFactory).getForLastUsedProfile(); @@ -281,6 +287,7 @@ @SmallTest @Test + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage_WithScheduledMessage() { doReturn(new MerchantTrustMessageContext(mMockNavigationHandle, mMockWebContents)) .when(mMockMerchantMessageScheduler) @@ -294,6 +301,7 @@ @SmallTest @Test + @DisabledTest(message = "https://crbug.com/1211897") public void testMaybeDisplayMessage_WithScheduledMessage_ForDifferentHost() { doReturn(new MerchantTrustMessageContext(mMockNavigationHandle2, mMockWebContents)) .when(mMockMerchantMessageScheduler) @@ -307,6 +315,7 @@ @SmallTest @Test + @DisabledTest(message = "https://crbug.com/1211897") public void testOnMessageEnqueued() { mCoordinator.onMessageEnqueued(null); verify(mMockMerchantTrustStorage, times(0)).save(any(MerchantTrustSignalsEvent.class)); @@ -318,6 +327,7 @@ @SmallTest @Test + @DisabledTest(message = "https://crbug.com/1211897") public void testOnMessageDismissed() { mCoordinator.onMessageDismissed(DismissReason.TIMER); verify(mMockMetrics, times(1)).recordMetricsForMessageDismissed(eq(DismissReason.TIMER)); @@ -325,6 +335,7 @@ @SmallTest @Test + @DisabledTest(message = "https://crbug.com/1211897") public void testOnMessagePrimaryAction() { mCoordinator.onMessagePrimaryAction(mDummyMerchantTrustSignals); verify(mMockMetrics, times(1)).recordMetricsForMessageTapped();
diff --git a/chrome/browser/content_settings/cookie_settings_factory.cc b/chrome/browser/content_settings/cookie_settings_factory.cc index cc9cfc12..baf46223 100644 --- a/chrome/browser/content_settings/cookie_settings_factory.cc +++ b/chrome/browser/content_settings/cookie_settings_factory.cc
@@ -7,6 +7,7 @@ #include "base/check_op.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/net/prediction_options.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" @@ -15,6 +16,7 @@ #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" +#include "components/spellcheck/browser/pref_names.h" #include "content/public/browser/browser_thread.h" #include "extensions/common/constants.h" @@ -72,9 +74,34 @@ // no DNT-related code that is executed once per Profile lifetime, and // creating a new BrowserContextKeyedService to record this metric would be // an overkill. Hence, we put it here. - // TODO(msramek): Find a better place for this metric. + // TODO(crbug.com/1228614): Find a better place for this metric. base::UmaHistogramBoolean("Privacy.DoNotTrackSetting", prefs->GetBoolean(prefs::kEnableDoNotTrack)); + // The preload setting exists on the cookie page, to avoid creating a new + // BrowserContextKeyedService to record this metric it will live here. + // TODO(crbug.com/1228614): Find a better place for this metric. + auto preload_setting_status = + static_cast<chrome_browser_net::NetworkPredictionOptions>( + prefs->GetInteger(prefs::kNetworkPredictionOptions)); + base::UmaHistogramBoolean( + "Settings.PreloadStatus.OnStartup", + (preload_setting_status != chrome_browser_net::NETWORK_PREDICTION_NEVER)); + + // The advanced spellcheck setting exists on the sync setup page, not the + // cookies page, but to avoid creating a new BrowserContextKeyedService to + // record this metric it will live here. + // TODO(crbug.com/1228614): Find a better place for this metric. + base::UmaHistogramBoolean("Settings.AutocompleteSearches.OnStartup", + prefs->GetBoolean(::prefs::kSearchSuggestEnabled)); + + // The autocomplete searches setting exists on the sync setup page, not the + // cookies page, but to avoid creating a new BrowserContextKeyedService to + // record this metric it will live here. + // TODO(crbug.com/1228614): Find a better place for this metric. + base::UmaHistogramBoolean( + "Settings.AdvancedSpellcheck.OnStartup", + prefs->GetBoolean(::spellcheck::prefs::kSpellCheckUseSpellingService)); + return new content_settings::CookieSettings( HostContentSettingsMapFactory::GetForProfile(profile), prefs, profile->IsIncognitoProfile(), extensions::kExtensionScheme);
diff --git a/chrome/browser/engagement/site_engagement_helper_browsertest.cc b/chrome/browser/engagement/site_engagement_helper_browsertest.cc index 9758ce7..6203536 100644 --- a/chrome/browser/engagement/site_engagement_helper_browsertest.cc +++ b/chrome/browser/engagement/site_engagement_helper_browsertest.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "base/run_loop.h" #include "base/timer/timer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -13,6 +14,7 @@ #include "chrome/test/base/ui_test_utils.h" #include "components/site_engagement/content/engagement_type.h" #include "components/site_engagement/content/site_engagement_metrics.h" +#include "components/site_engagement/content/site_engagement_observer.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/web_contents.h" @@ -36,7 +38,8 @@ void Start(const base::Location& posted_from, base::TimeDelta delay, base::OnceClosure user_task) override { - base::OneShotTimer::Start(posted_from, delay, std::move(user_task)); + base::OneShotTimer::Start(posted_from, base::TimeDelta::FromSeconds(0), + std::move(user_task)); // Updates |restarted_| if the timer is restarted. if (started_) @@ -76,6 +79,13 @@ base::WrapUnique(input_tracker_timer_)); } + // Set a pause timer on the media tracker for test purposes. + void SetMediaTrackerPauseTimer(SiteEngagementService::Helper* helper) { + media_tracker_timer_ = new TestOneShotTimer; + helper->media_tracker_.SetPauseTimerForTesting( + base::WrapUnique(media_tracker_timer_)); + } + bool IsInputTrackerTimerRestarted(SiteEngagementService::Helper* helper) { return input_tracker_timer_->restarted(); } @@ -95,6 +105,7 @@ net::test_server::EmbeddedTestServerHandle test_server_handle_; base::HistogramTester histogram_tester_; TestOneShotTimer* input_tracker_timer_; + TestOneShotTimer* media_tracker_timer_; }; // Tests if SiteEngagementHelper checks the primary main frame in the @@ -149,4 +160,77 @@ EngagementType::kNavigation, 1); } +class ObserverTester : public SiteEngagementObserver { + public: + explicit ObserverTester(SiteEngagementService* service) + : SiteEngagementObserver(service) {} + + void OnEngagementEvent(content::WebContents* web_contents, + const GURL& url, + double score, + EngagementType type) override { + last_updated_type_ = type; + last_updated_url_ = url; + if (type == type_waiting_) { + if (quit_closure_) + std::move(quit_closure_).Run(); + } + } + + void WaitForEngagementEvent(EngagementType type) { + type_waiting_ = type; + base::RunLoop run_loop; + quit_closure_ = run_loop.QuitClosure(); + run_loop.Run(); + } + + EngagementType last_updated_type() { return last_updated_type_; } + const GURL& last_updated_url() { return last_updated_url_; } + + private: + base::OnceClosure quit_closure_; + GURL last_updated_url_; + EngagementType last_updated_type_ = EngagementType::kLast; + EngagementType type_waiting_ = EngagementType::kLast; +}; + +IN_PROC_BROWSER_TEST_F(SiteEngagementHelperBrowserTest, + SiteEngagementHelperMediaTrackerInPrerendering) { + site_engagement::SiteEngagementService* service = + site_engagement::SiteEngagementService::Get(browser()->profile()); + ObserverTester tester(service); + + SiteEngagementService::Helper* helper = + SiteEngagementService::Helper::FromWebContents(web_contents()); + SetMediaTrackerPauseTimer(helper); + + GURL url = embedded_test_server()->GetURL("/empty.html"); + ui_test_utils::NavigateToURL(browser(), url); + EXPECT_EQ(tester.last_updated_type(), EngagementType::kNavigation); + EXPECT_EQ(tester.last_updated_url(), url); + + // Load a page in the prerender. + GURL prerender_url = + embedded_test_server()->GetURL("/media/unified_autoplay.html"); + int host_id = prerender_helper()->AddPrerender(prerender_url); + content::test::PrerenderHostObserver host_observer(*web_contents(), host_id); + content::RenderFrameHost* prerendered_frame_host = + prerender_helper()->GetPrerenderedMainFrameHost(host_id); + EXPECT_TRUE(content::ExecJs(prerendered_frame_host, "attemptPlay();")); + + EXPECT_EQ(tester.last_updated_type(), EngagementType::kNavigation); + EXPECT_EQ(tester.last_updated_url(), url); + + // Navigate the primary page to the URL. + prerender_helper()->NavigatePrimaryPage(prerender_url); + // The page should be activated from the prerendering. + EXPECT_TRUE(host_observer.was_activated()); + + EXPECT_EQ(nullptr, content::EvalJs(prerendered_frame_host, "attemptPlay();")); + + tester.WaitForEngagementEvent(EngagementType::kMediaVisible); + EXPECT_EQ(tester.last_updated_type(), EngagementType::kMediaVisible); + EXPECT_EQ(tester.last_updated_url(), prerender_url); +} + } // namespace site_engagement
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 2f9cfe3..ea7a1f24 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -335,6 +335,11 @@ "expiry_milestone": 95 }, { + "name": "autofill-address-verification-in-save-prompt", + "owners": [ "mamir", "koerber" ], + "expiry_milestone": 97 + }, + { "name": "autofill-always-return-cloud-tokenized-card", "owners": [ "aneeshali@google.com", "annelim@google.com", "jsaul@google.com" ], "expiry_milestone": 94 @@ -1633,6 +1638,11 @@ "expiry_milestone": 95 }, { + "name": "enable-cros-ime-system-emoji-picker-clipboard", + "owners": [ "jopalmer", "essential-inputs-team@google.com" ], + "expiry_milestone": 100 + }, + { "name": "enable-cros-language-settings-ime-options-in-settings", "owners": [ "jopalmer", "essential-inputs-team@google.com" ], "expiry_milestone": 97
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 12e8261..5d0fd01 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4837,6 +4837,12 @@ "Controls whether a System emoji picker, or the virtual keyboard is used " "for inserting emoji."; +const char kImeSystemEmojiPickerClipboardName[] = + "System emoji picker clipboard"; +const char kImeSystemEmojiPickerClipboardDescription[] = + "Emoji picker will insert emoji into clipboard if they can't be inserted " + "into a text field"; + const char kCrosLanguageSettingsImeOptionsInSettingsName[] = "Ime settings in settings"; const char kCrosLanguageSettingsImeOptionsInSettingsDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 6ae7cd8..748414f 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2788,6 +2788,9 @@ extern const char kImeSystemEmojiPickerName[]; extern const char kImeSystemEmojiPickerDescription[]; +extern const char kImeSystemEmojiPickerClipboardName[]; +extern const char kImeSystemEmojiPickerClipboardDescription[]; + extern const char kIntentHandlingSharingName[]; extern const char kIntentHandlingSharingDescription[];
diff --git a/chrome/browser/image_editor/BUILD.gn b/chrome/browser/image_editor/BUILD.gn index b117f25..f6df24e 100644 --- a/chrome/browser/image_editor/BUILD.gn +++ b/chrome/browser/image_editor/BUILD.gn
@@ -1,6 +1,7 @@ # Copyright 2021 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/ui.gni") assert(is_chromeos || is_linux || is_mac || is_win, "Image Editor is for desktop plaforms only") @@ -14,7 +15,12 @@ deps = [ "//base", "//content/public/browser", + "//ui/snapshot", + "//ui/views", ] + if (use_aura) { + deps += [ "//ui/wm" ] + } public_deps = [ "//base" ] }
diff --git a/chrome/browser/lens/metrics/lens_metrics.h b/chrome/browser/lens/metrics/lens_metrics.h new file mode 100644 index 0000000..b7b3980 --- /dev/null +++ b/chrome/browser/lens/metrics/lens_metrics.h
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_LENS_METRICS_LENS_METRICS_H_ +#define CHROME_BROWSER_LENS_METRICS_LENS_METRICS_H_ + +namespace lens { + +constexpr char kLensRegionSearchCaptureResultHistogramName[] = + "Search.RegionsSearch.Lens.Result"; + +// This should be kept in sync with the LensRegionSearchCaptureResult enum in +// tools/metrics/histograms/enums.xml. +enum class LensRegionSearchCaptureResult { + SUCCESS = 0, + FAILED_TO_OPEN_TAB = 1, + ERROR_CAPTURING_REGION = 2, + kMaxValue = ERROR_CAPTURING_REGION +}; + +} // namespace lens + +#endif // CHROME_BROWSER_LENS_METRICS_LENS_METRICS_H_
diff --git a/chrome/browser/lens/region_search/BUILD.gn b/chrome/browser/lens/region_search/BUILD.gn new file mode 100644 index 0000000..9330d65 --- /dev/null +++ b/chrome/browser/lens/region_search/BUILD.gn
@@ -0,0 +1,23 @@ +# Copyright 2021 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. + +# Contained Lens dependencies are currently for desktop platforms only +# TODO(crbug/1229334): Add Mac support for Lens Region Search feature. +assert(is_chromeos || is_linux || is_win, + "Lens Region Search is for desktop platforms only, excluding Mac") + +static_library("region_search") { + sources = [ + "../metrics/lens_metrics.h", + "lens_region_search_controller.cc", + "lens_region_search_controller.h", + ] + deps = [ + "//base", + "//chrome/browser/image_editor", + "//chrome/browser/ui", + "//components/lens", + "//content/public/browser", + ] +}
diff --git a/chrome/browser/lens/region_search/lens_region_search_controller.cc b/chrome/browser/lens/region_search/lens_region_search_controller.cc new file mode 100644 index 0000000..74bf329 --- /dev/null +++ b/chrome/browser/lens/region_search/lens_region_search_controller.cc
@@ -0,0 +1,76 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "chrome/browser/lens/region_search/lens_region_search_controller.h" + +#include "base/metrics/histogram_macros.h" +#include "chrome/browser/image_editor/screenshot_flow.h" +#include "chrome/browser/lens/metrics/lens_metrics.h" +#include "chrome/browser/ui/tab_contents/core_tab_helper.h" +#include "components/lens/lens_features.h" +#include "content/public/browser/web_contents.h" +#include "ui/gfx/image/image_util.h" + +namespace lens { + +LensRegionSearchController::LensRegionSearchController( + content::WebContents* web_contents) + : source_web_contents_(web_contents) { + screenshot_flow_ = + std::make_unique<image_editor::ScreenshotFlow>(web_contents); + weak_this_ = weak_factory_.GetWeakPtr(); +} + +LensRegionSearchController::~LensRegionSearchController() = default; + +void LensRegionSearchController::Start() { + if (!source_web_contents_) + return; + + if (!screenshot_flow_) + screenshot_flow_ = + std::make_unique<image_editor::ScreenshotFlow>(source_web_contents_); + + base::OnceCallback<void(const image_editor::ScreenshotCaptureResult&)> + callback = base::BindOnce(&LensRegionSearchController::OnCaptureCompleted, + weak_this_); + screenshot_flow_->Start(std::move(callback)); +} + +gfx::Image LensRegionSearchController::ResizeImageIfNecessary( + const gfx::Image& image) { + return gfx::ResizedImageForMaxDimensions( + image, features::GetMaxPixelsForRegionSearch(), + features::GetMaxPixelsForRegionSearch(), + features::GetMaxAreaForRegionSearch()); +} + +void LensRegionSearchController::RecordCaptureResult( + lens::LensRegionSearchCaptureResult result) { + UMA_HISTOGRAM_ENUMERATION(lens::kLensRegionSearchCaptureResultHistogramName, + result); +} + +void LensRegionSearchController::OnCaptureCompleted( + const image_editor::ScreenshotCaptureResult& result) { + const gfx::Image& captured_image = result.image; + // If image is empty, then record UMA and close. + if (captured_image.IsEmpty()) { + RecordCaptureResult( + lens::LensRegionSearchCaptureResult::ERROR_CAPTURING_REGION); + return; + } + + const gfx::Image& image = ResizeImageIfNecessary(captured_image); + CoreTabHelper* core_tab_helper = + CoreTabHelper::FromWebContents(source_web_contents_); + if (!core_tab_helper) { + RecordCaptureResult( + lens::LensRegionSearchCaptureResult::FAILED_TO_OPEN_TAB); + return; + } + core_tab_helper->SearchWithLensInNewTab(image); + RecordCaptureResult(lens::LensRegionSearchCaptureResult::SUCCESS); +} + +} // namespace lens
diff --git a/chrome/browser/lens/region_search/lens_region_search_controller.h b/chrome/browser/lens/region_search/lens_region_search_controller.h new file mode 100644 index 0000000..72866c1 --- /dev/null +++ b/chrome/browser/lens/region_search/lens_region_search_controller.h
@@ -0,0 +1,35 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef CHROME_BROWSER_LENS_REGION_SEARCH_LENS_REGION_SEARCH_CONTROLLER_H_ +#define CHROME_BROWSER_LENS_REGION_SEARCH_LENS_REGION_SEARCH_CONTROLLER_H_ + +#include "chrome/browser/image_editor/screenshot_flow.h" +#include "chrome/browser/lens/metrics/lens_metrics.h" +#include "content/public/browser/web_contents.h" +namespace lens { + +class LensRegionSearchController { + public: + explicit LensRegionSearchController(content::WebContents* web_contents); + ~LensRegionSearchController(); + + // Creates and runs the drag and capture flow. When run, the user enters into + // a screenshot capture mode with the ability to draw a rectagular region + // around the web contents. When finished with selection, the region is + // converted into a PNG and sent to Lens. + void Start(); + + private: + void RecordCaptureResult(lens::LensRegionSearchCaptureResult result); + + void OnCaptureCompleted(const image_editor::ScreenshotCaptureResult& result); + gfx::Image ResizeImageIfNecessary(const gfx::Image& image); + content::WebContents* source_web_contents_ = nullptr; + std::unique_ptr<image_editor::ScreenshotFlow> screenshot_flow_; + + base::WeakPtr<LensRegionSearchController> weak_this_; + base::WeakPtrFactory<LensRegionSearchController> weak_factory_{this}; +}; +} // namespace lens +#endif // CHROME_BROWSER_LENS_REGION_SEARCH_LENS_REGION_SEARCH_CONTROLLER_H_
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc index 55e6b24..bae294f 100644 --- a/chrome/browser/net/profile_network_context_service.cc +++ b/chrome/browser/net/profile_network_context_service.cc
@@ -67,10 +67,10 @@ #include "chrome/browser/ash/certificate_provider/certificate_provider.h" #include "chrome/browser/ash/certificate_provider/certificate_provider_service.h" #include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/chromeos/net/client_cert_store_chromeos.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h"
diff --git a/chrome/browser/notifications/OWNERS b/chrome/browser/notifications/OWNERS index 646b906..609dc43 100644 --- a/chrome/browser/notifications/OWNERS +++ b/chrome/browser/notifications/OWNERS
@@ -1,7 +1,6 @@ dewittj@chromium.org dimich@chromium.org knollr@chromium.org -mukai@chromium.org peter@chromium.org yoshiki@chromium.org
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc index 11aa1495..5abb0d5 100644 --- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -711,11 +711,21 @@ OriginStatus::kUnknown, OriginStatusWithThrottling::kUnknownAndThrottled); } +// Disabled due to flakiness on Linux https://crbug.com/1229601 +#if defined(OS_LINUX) +#define MAYBE_CreativeOriginStatusWithThrottlingNestedThrottled \ + DISABLED_CreativeOriginStatusWithThrottlingNestedThrottled +#else +#define MAYBE_CreativeOriginStatusWithThrottlingNestedThrottled \ + CreativeOriginStatusWithThrottlingNestedThrottled +#endif + // Test that an ad creative with the same origin as the main page, // but nested in a throttled cross-origin root ad frame, is marked as // throttled, with indeterminate creative origin status. -IN_PROC_BROWSER_TEST_F(CreativeOriginAdsPageLoadMetricsObserverBrowserTest, - CreativeOriginStatusWithThrottlingNestedThrottled) { +IN_PROC_BROWSER_TEST_F( + CreativeOriginAdsPageLoadMetricsObserverBrowserTest, + MAYBE_CreativeOriginStatusWithThrottlingNestedThrottled) { TestCreativeOriginStatus( MakeFrame( "a",
diff --git a/chrome/browser/page_load_metrics/observers/signed_exchange_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/signed_exchange_page_load_metrics_observer_unittest.cc index 5e6afc4..c335d35 100644 --- a/chrome/browser/page_load_metrics/observers/signed_exchange_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/signed_exchange_page_load_metrics_observer_unittest.cc
@@ -60,18 +60,20 @@ timing->navigation_start = base::Time::FromDoubleT(1); timing->interactive_timing->first_input_delay = base::TimeDelta::FromMilliseconds(50); + // Use timestamps larger than 1000ms, so that they will not race with + // background time in the WithSignedExchangeBackground test case. timing->interactive_timing->first_input_timestamp = - base::TimeDelta::FromMilliseconds(712); - timing->parse_timing->parse_start = base::TimeDelta::FromMilliseconds(100); - timing->paint_timing->first_paint = base::TimeDelta::FromMilliseconds(200); + base::TimeDelta::FromMilliseconds(1712); + timing->parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1100); + timing->paint_timing->first_paint = base::TimeDelta::FromMilliseconds(1200); timing->paint_timing->first_contentful_paint = - base::TimeDelta::FromMilliseconds(300); + base::TimeDelta::FromMilliseconds(1300); timing->paint_timing->first_meaningful_paint = - base::TimeDelta::FromMilliseconds(700); + base::TimeDelta::FromMilliseconds(1700); timing->document_timing->dom_content_loaded_event_start = - base::TimeDelta::FromMilliseconds(600); + base::TimeDelta::FromMilliseconds(1600); timing->document_timing->load_event_start = - base::TimeDelta::FromMilliseconds(1000); + base::TimeDelta::FromMilliseconds(2000); PopulateRequiredTimingFields(timing); } }; @@ -318,17 +320,8 @@ internal::kHistogramNotCachedSignedExchangePrefix); } -// Test is flaky on linux_tsan: crbug.com:1082135. -// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is -// complete. -#if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \ - defined(THREAD_SANITIZER) -#define MAYBE_WithSignedExchangeBackground DISABLED_WithSignedExchangeBackground -#else -#define MAYBE_WithSignedExchangeBackground WithSignedExchangeBackground -#endif TEST_F(SignedExchangePageLoadMetricsObserverTest, - MAYBE_WithSignedExchangeBackground) { + WithSignedExchangeBackground) { page_load_metrics::mojom::PageLoadTiming timing; page_load_metrics::InitPageLoadTimingForTest(&timing); PopulateRequiredTimingFields(&timing);
diff --git a/chrome/browser/payments/secure_payment_confirmation_browsertest.cc b/chrome/browser/payments/secure_payment_confirmation_browsertest.cc index 46936121..d43d85e 100644 --- a/chrome/browser/payments/secure_payment_confirmation_browsertest.cc +++ b/chrome/browser/payments/secure_payment_confirmation_browsertest.cc
@@ -175,7 +175,8 @@ EXPECT_TRUE(database_write_responded_); ASSERT_FALSE(test_controller()->app_descriptions().empty()); EXPECT_EQ(1u, test_controller()->app_descriptions().size()); - EXPECT_EQ("Stub label", test_controller()->app_descriptions().front().label); + EXPECT_EQ("display_name_for_instrument", + test_controller()->app_descriptions().front().label); } // canMakePayment() and hasEnrolledInstrument() should return false on @@ -912,9 +913,13 @@ // EvalJs waits for JavaScript promise to resolve. // The `networkData` field is the base64 encoding of 'hello world', which is // set in `get_challenge.js`. - EXPECT_EQ("{\"merchantData\":{\"merchantOrigin\":\"" + GetMerchantOrigin() + - "\",\"total\":{\"currency\":\"USD\"," + - "\"value\":\"0.01\"}},\"networkData\":\"aGVsbG8gd29ybGQ=\"}", + std::string expected_challenge_field = + base::FeatureList::IsEnabled(features::kSecurePaymentConfirmationAPIV2) + ? "undefined" + : "{\"merchantData\":{\"merchantOrigin\":\"" + GetMerchantOrigin() + + "\",\"total\":{\"currency\":\"USD\",\"value\":\"0.01\"}}," + "\"networkData\":\"aGVsbG8gd29ybGQ=\"}"; + EXPECT_EQ(expected_challenge_field, content::EvalJs(GetActiveWebContents(), content::JsReplace("getChallenge($1, $2);", credentialIdentifier, "0.01")));
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc index 41034e4..ffb3c1b 100644 --- a/chrome/browser/policy/chrome_browser_policy_connector.cc +++ b/chrome/browser/policy/chrome_browser_policy_connector.cc
@@ -162,6 +162,11 @@ chrome_browser_cloud_management_controller()->MaybeInit(local_state, url_loader_factory); } + +void ChromeBrowserPolicyConnector::SetProxyPolicyProviderForTesting( + ProxyPolicyProvider* proxy_policy_provider) { + proxy_policy_provider_ = proxy_policy_provider; +} #endif // !BUILDFLAG(IS_CHROMEOS_ASH) bool ChromeBrowserPolicyConnector::IsCommandLineSwitchSupported() const {
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.h b/chrome/browser/policy/chrome_browser_policy_connector.h index 9a91b37..58939c8 100644 --- a/chrome/browser/policy/chrome_browser_policy_connector.h +++ b/chrome/browser/policy/chrome_browser_policy_connector.h
@@ -76,17 +76,30 @@ return machine_level_user_cloud_policy_manager_.get(); } + ProxyPolicyProvider* proxy_policy_provider() { + return proxy_policy_provider_; + } + + ConfigurationPolicyProvider* command_line_policy_provider() { + return command_line_provider_; + } + // On non-Android platforms, starts controller initialization right away. // On Android, delays controller initialization until platform policies have // been initialized, or starts controller initialization right away otherwise. void InitCloudManagementController( PrefService* local_state, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); + + // Set ProxyPolicyProvider for testing, caller needs to init and shutdown the + // provider. + void SetProxyPolicyProviderForTesting( + ProxyPolicyProvider* proxy_policy_provider); #endif // !BUILDFLAG(IS_CHROMEOS_ASH) // BrowserPolicyConnector: - // Command line switch only supports Dev and Canary channel, trunk and browser - // tests on Win, Mac, Linux and Android. + // Command line switch only supports Dev and Canary channel, trunk and + // browser tests on Win, Mac, Linux and Android. bool IsCommandLineSwitchSupported() const override; static void EnableCommandLineSupportForTesting();
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 51ac33d..bac2693 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -132,8 +132,8 @@ #include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h" #include "chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.h" #include "chrome/browser/ash/policy/handlers/system_features_disable_list_policy_handler.h" +#include "chrome/browser/ash/policy/login/secondary_google_account_signin_policy_handler.h" #include "chrome/browser/chromeos/platform_keys/key_permissions/key_permissions_policy_handler.h" -#include "chrome/browser/chromeos/policy/login/secondary_google_account_signin_policy_handler.h" #include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h" #include "chrome/browser/policy/default_geolocation_policy_handler.h" #include "chromeos/dbus/power/power_policy_controller.h"
diff --git a/chrome/browser/policy/login_policy_test_base_browsertest.cc b/chrome/browser/policy/login_policy_test_base_browsertest.cc index fda1a54b..f288798 100644 --- a/chrome/browser/policy/login_policy_test_base_browsertest.cc +++ b/chrome/browser/policy/login_policy_test_base_browsertest.cc
@@ -11,9 +11,9 @@ #include "chrome/browser/ash/login/test/session_manager_state_waiter.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_chromeos.h" #include "chrome/browser/ash/policy/core/user_policy_test_helper.h" +#include "chrome/browser/ash/policy/login/login_policy_test_base.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/policy/login/login_policy_test_base.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h"
diff --git a/chrome/browser/policy/profile_policy_connector.cc b/chrome/browser/policy/profile_policy_connector.cc index d65a5ca..bd58428 100644 --- a/chrome/browser/policy/profile_policy_connector.cc +++ b/chrome/browser/policy/profile_policy_connector.cc
@@ -22,12 +22,14 @@ #include "components/policy/core/common/cloud/cloud_policy_core.h" #include "components/policy/core/common/cloud/cloud_policy_manager.h" #include "components/policy/core/common/cloud/cloud_policy_store.h" +#include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h" #include "components/policy/core/common/configuration_policy_provider.h" #include "components/policy/core/common/legacy_chrome_policy_migrator.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" #include "components/policy/core/common/policy_service_impl.h" +#include "components/policy/core/common/proxy_policy_provider.h" #include "components/policy/core/common/schema_registry_tracking_policy_provider.h" #include "components/policy/policy_constants.h" @@ -37,8 +39,8 @@ #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_chromeos.h" #include "chrome/browser/ash/policy/core/device_local_account.h" #include "chrome/browser/ash/policy/core/device_local_account_policy_provider.h" +#include "chrome/browser/ash/policy/login/login_profile_policy_provider.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/policy/login/login_profile_policy_provider.h" #include "components/policy/core/common/proxy_policy_provider.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" @@ -159,13 +161,9 @@ #endif ConfigurationPolicyProvider* platform_provider = - GetPlatformProvider(connector); + connector->GetPlatformProvider(); if (platform_provider) { - wrapped_platform_policy_provider_ = - std::make_unique<SchemaRegistryTrackingPolicyProvider>( - platform_provider); - wrapped_platform_policy_provider_->Init(schema_registry); - policy_providers_.push_back(wrapped_platform_policy_provider_.get()); + AppendPolicyProviderWithSchemaTracking(platform_provider, schema_registry); } #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -178,18 +176,15 @@ browser_policy_connector->GetDeviceActiveDirectoryPolicyManager()); } #else - for (auto* provider : connector->GetPolicyProviders()) { - // Skip the platform provider since it was already handled above. The - // platform provider should be first in the list so that it always takes - // precedence. - if (provider == platform_provider) { - continue; - } else { - // TODO(zmin): In the future, we may want to have special handling for - // the other providers too. - policy_providers_.push_back(provider); - } + ConfigurationPolicyProvider* machine_level_user_cloud_policy_provider = + connector->proxy_policy_provider(); + if (machine_level_user_cloud_policy_provider) { + AppendPolicyProviderWithSchemaTracking( + machine_level_user_cloud_policy_provider, schema_registry); } + + if (connector->command_line_policy_provider()) + policy_providers_.push_back(connector->command_line_policy_provider()); #endif if (configuration_policy_provider) @@ -278,11 +273,6 @@ is_managed_override_ = std::make_unique<bool>(is_managed); } -void ProfilePolicyConnector::SetPlatformPolicyProviderForTesting( - ConfigurationPolicyProvider* platform_policy_provider_for_testing) { - platform_policy_provider_for_testing_ = platform_policy_provider_for_testing; -} - void ProfilePolicyConnector::Shutdown() { #if BUILDFLAG(IS_CHROMEOS_ASH) if (is_primary_user_) @@ -292,8 +282,9 @@ special_user_policy_provider_->Shutdown(); #endif - if (wrapped_platform_policy_provider_) - wrapped_platform_policy_provider_->Shutdown(); + for (auto& wrapped_policy_provider : wrapped_policy_providers_) { + wrapped_policy_provider->Shutdown(); + } } bool ProfilePolicyConnector::IsManaged() const { @@ -357,11 +348,14 @@ return nullptr; } -ConfigurationPolicyProvider* ProfilePolicyConnector::GetPlatformProvider( - policy::ChromeBrowserPolicyConnector* browser_policy_connector) { - if (platform_policy_provider_for_testing_) - return platform_policy_provider_for_testing_; - return browser_policy_connector->GetPlatformProvider(); +void ProfilePolicyConnector::AppendPolicyProviderWithSchemaTracking( + ConfigurationPolicyProvider* policy_provider, + SchemaRegistry* schema_registry) { + auto wrapped_policy_provider = + std::make_unique<SchemaRegistryTrackingPolicyProvider>(policy_provider); + wrapped_policy_provider->Init(schema_registry); + policy_providers_.push_back(wrapped_policy_provider.get()); + wrapped_policy_providers_.push_back(std::move(wrapped_policy_provider)); } #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/policy/profile_policy_connector.h b/chrome/browser/policy/profile_policy_connector.h index 7c76451..cabec12f 100644 --- a/chrome/browser/policy/profile_policy_connector.h +++ b/chrome/browser/policy/profile_policy_connector.h
@@ -58,8 +58,6 @@ void InitForTesting(std::unique_ptr<PolicyService> service); void OverrideIsManagedForTesting(bool is_managed); - void SetPlatformPolicyProviderForTesting( - ConfigurationPolicyProvider* platform_policy_provider_for_testing); void Shutdown(); @@ -70,7 +68,6 @@ // must call this method only when the policies system is fully initialized. bool IsManaged() const; - // Returns true if the |policy_key| user policy is currently set via the // |configuration_policy_provider_| and isn't being overridden by a // higher-level provider. @@ -96,11 +93,9 @@ const ConfigurationPolicyProvider* DeterminePolicyProviderForPolicy( const char* policy_key) const; - // Returns the platform policy provider, which will be used as the highest - // priority policy provider in PolicyService created by this - // ProfilePolicyConnector. - ConfigurationPolicyProvider* GetPlatformProvider( - policy::ChromeBrowserPolicyConnector* browser_policy_connector); + void AppendPolicyProviderWithSchemaTracking( + ConfigurationPolicyProvider* policy_provider, + SchemaRegistry* schema_registry); #if BUILDFLAG(IS_CHROMEOS_ASH) // On Chrome OS, primary Profile user policies are forwarded to the @@ -147,18 +142,16 @@ // until the policies have been reflected in the device-wide PolicyService. std::unique_ptr<internal::ProxiedPoliciesPropagatedWatcher> proxied_policies_propagated_watcher_; - #endif // BUILDFLAG(IS_CHROMEOS_ASH) - std::unique_ptr<ConfigurationPolicyProvider> - wrapped_platform_policy_provider_; + // Wrap policy provider with SchemaRegistryTrackingPolicyProvider to track + // extensions' policy schema update. + std::vector<std::unique_ptr<ConfigurationPolicyProvider>> + wrapped_policy_providers_; + const ConfigurationPolicyProvider* configuration_policy_provider_ = nullptr; const CloudPolicyStore* policy_store_ = nullptr; - // If this is not nullptr, this provider will be used as (highest priority) - // platform policy provider. - ConfigurationPolicyProvider* platform_policy_provider_for_testing_ = nullptr; - // |policy_providers_| contains a list of the policy providers available for // the PolicyService of this connector, in decreasing order of priority. //
diff --git a/chrome/browser/policy/profile_policy_connector_unittest.cc b/chrome/browser/policy/profile_policy_connector_unittest.cc index b112376..49769bd 100644 --- a/chrome/browser/policy/profile_policy_connector_unittest.cc +++ b/chrome/browser/policy/profile_policy_connector_unittest.cc
@@ -10,18 +10,23 @@ #include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/policy/chrome_browser_policy_connector.h" #include "chrome/test/base/testing_browser_process.h" #include "components/account_id/account_id.h" #include "components/autofill/core/common/autofill_prefs.h" #include "components/policy/core/browser/browser_policy_connector.h" +#include "components/policy/core/browser/proxy_policy_handler.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/core/common/cloud/cloud_policy_manager.h" #include "components/policy/core/common/cloud/mock_cloud_policy_store.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/policy/core/common/mock_policy_service.h" #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_service.h" #include "components/policy/core/common/policy_types.h" +#include "components/policy/core/common/proxy_policy_provider.h" #include "components/policy/core/common/schema_registry.h" #include "components/policy/policy_constants.h" #include "components/policy/proto/device_management_backend.pb.h" @@ -36,8 +41,9 @@ #include "components/user_manager/scoped_user_manager.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) -using testing::Return; using testing::_; +using testing::NiceMock; +using testing::Return; namespace policy { namespace { @@ -86,6 +92,22 @@ DISALLOW_COPY_AND_ASSIGN(PolicyServiceInitializedWaiter); }; +void UpdateChromePolicyToMockProviderAndVerify( + MockConfigurationPolicyProvider* mock_policy_provider, + const ProfilePolicyConnector& connector) { + PolicyMap map; + map.Set(key::kAutofillAddressEnabled, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, base::Value(true), nullptr); + mock_policy_provider->UpdateChromePolicy(map); + EXPECT_FALSE(connector.IsProfilePolicy(key::kAutofillAddressEnabled)); + const base::Value* value = + connector.policy_service() + ->GetPolicies(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) + .GetValue(key::kAutofillAddressEnabled); + ASSERT_TRUE(value); + EXPECT_EQ(base::Value(true), *value); +} + } // namespace class ProfilePolicyConnectorTest : public testing::Test { @@ -224,13 +246,22 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) TEST_F(ProfilePolicyConnectorTest, IsProfilePolicy) { - testing::NiceMock<MockConfigurationPolicyProvider> mock_platform_provider; + NiceMock<MockConfigurationPolicyProvider> mock_platform_provider; + NiceMock<MockPolicyService> mock_policy_service_; mock_platform_provider.SetDefaultReturns( true /* is_initialization_complete_return */, true /* is_first_policy_load_complete_return */); + g_browser_process->browser_policy_connector()->SetPolicyProviderForTesting( + &mock_platform_provider); + // We don't need browser level PolicyService for this test. Setting an empty + // mock class to prevent the real one being created which is going to observe + // the local policy provider but never get destroyed until the very end. This + // will cause DCHECK failure as the local policy provider observer list is not + // clear. + g_browser_process->browser_policy_connector()->SetPolicyServiceForTesting( + &mock_policy_service_); ProfilePolicyConnector connector; - connector.SetPlatformPolicyProviderForTesting(&mock_platform_provider); connector.Init(nullptr /* user */, &schema_registry_, cloud_policy_manager_.get(), &cloud_policy_store_, g_browser_process->browser_policy_connector(), false); @@ -256,18 +287,41 @@ EXPECT_TRUE(base::Value(false).Equals(value)); // Now test with a higher-priority provider also setting the policy. - PolicyMap map; - map.Set(key::kAutofillAddressEnabled, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, base::Value(true), nullptr); - mock_platform_provider.UpdateChromePolicy(map); - EXPECT_FALSE(connector.IsProfilePolicy(key::kAutofillAddressEnabled)); - value = connector.policy_service()->GetPolicies(chrome_ns).GetValue( - key::kAutofillAddressEnabled); - ASSERT_TRUE(value); - EXPECT_TRUE(base::Value(true).Equals(value)); + UpdateChromePolicyToMockProviderAndVerify(&mock_platform_provider, connector); // Cleanup. connector.Shutdown(); + g_browser_process->browser_policy_connector()->Shutdown(); } +#if !BUILDFLAG(IS_CHROMEOS_ASH) +TEST_F(ProfilePolicyConnectorTest, MachineLevelUserCloudPolicyForProfile) { + // Setup mock MachineLevelUserCloudPolicyManager. + NiceMock<MockConfigurationPolicyProvider> + mock_machine_level_cloud_policy_provider; + mock_machine_level_cloud_policy_provider.SetDefaultReturns( + true /* is_initialization_complete_return */, + true /* is_first_policy_load_complete_return */); + + // Init and set ProxyPolicyProvider + ProxyPolicyProvider proxy_policy_provider; + proxy_policy_provider.SetDelegate(&mock_machine_level_cloud_policy_provider); + proxy_policy_provider.Init(&schema_registry_); + g_browser_process->browser_policy_connector() + ->SetProxyPolicyProviderForTesting(&proxy_policy_provider); + + ProfilePolicyConnector connector; + connector.Init(nullptr /* user */, &schema_registry_, + cloud_policy_manager_.get(), &cloud_policy_store_, + g_browser_process->browser_policy_connector(), false); + + UpdateChromePolicyToMockProviderAndVerify( + &mock_machine_level_cloud_policy_provider, connector); + + connector.Shutdown(); + g_browser_process->browser_policy_connector()->Shutdown(); + proxy_policy_provider.Shutdown(); +} +#endif // !BUILDFLAG(IS_CHROMEOS_ASH) + } // namespace policy
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 43db9e6..3de6df64 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -319,6 +319,7 @@ #include "chrome/browser/ash/policy/external_data/handlers/device_wallpaper_image_external_data_handler.h" #include "chrome/browser/ash/policy/handlers/adb_sideloading_allowance_mode_policy_handler.h" #include "chrome/browser/ash/policy/handlers/minimum_version_policy_handler.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.h" #include "chrome/browser/ash/power/power_metrics_reporter.h" #include "chrome/browser/ash/release_notes/release_notes_storage.h" @@ -333,7 +334,6 @@ #include "chrome/browser/chromeos/first_run/first_run.h" #include "chrome/browser/chromeos/full_restore/full_restore_prefs.h" #include "chrome/browser/chromeos/net/network_throttling_observer.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/chromeos/policy/reporting/app_install_event_log_manager_wrapper.h" #include "chrome/browser/chromeos/policy/reporting/arc_app_install_event_logger.h" #include "chrome/browser/chromeos/policy/reporting/extension_install_event_log_manager_wrapper.h"
diff --git a/chrome/browser/printing/background_printing_manager.cc b/chrome/browser/printing/background_printing_manager.cc index f0607203..d7a7a89 100644 --- a/chrome/browser/printing/background_printing_manager.cc +++ b/chrome/browser/printing/background_printing_manager.cc
@@ -73,12 +73,6 @@ printing_contents.contents = std::move(preview_dialog); printing_contents_map_[raw_preview_dialog] = std::move(printing_contents); - // Watch for print jobs finishing. Everything else is watched for by the - // Observer. TODO(avi, cait): finish the job of removing this last - // notification. - registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED, - content::Source<WebContents>(raw_preview_dialog)); - // Activate the initiator. PrintPreviewDialogController* dialog_controller = PrintPreviewDialogController::GetInstance(); @@ -90,14 +84,6 @@ initiator->GetDelegate()->ActivateContents(initiator); } -void BackgroundPrintingManager::Observe( - int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - DCHECK_EQ(chrome::NOTIFICATION_PRINT_JOB_RELEASED, type); - DeletePreviewContents(content::Source<WebContents>(source).ptr()); -} - void BackgroundPrintingManager::DeletePreviewContentsForBrowserContext( BrowserContext* browser_context) { std::vector<WebContents*> preview_contents_to_delete; @@ -128,9 +114,6 @@ return; } - // Stop all observation ... - registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED, - content::Source<WebContents>(preview_contents)); std::unique_ptr<WebContents> contents_to_delete = std::move(i->second.contents); printing_contents_map_.erase(i);
diff --git a/chrome/browser/printing/background_printing_manager.h b/chrome/browser/printing/background_printing_manager.h index 2042a23..99a6406 100644 --- a/chrome/browser/printing/background_printing_manager.h +++ b/chrome/browser/printing/background_printing_manager.h
@@ -12,8 +12,6 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/sequence_checker.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" namespace content { class WebContents; @@ -26,12 +24,12 @@ // The hidden WebContents are no longer part of any Browser / TabStripModel. // The WebContents started life as a ConstrainedWebDialog. // They get deleted when the printing finishes. -class BackgroundPrintingManager : public content::NotificationObserver { +class BackgroundPrintingManager { public: class Observer; BackgroundPrintingManager(); - ~BackgroundPrintingManager() override; + ~BackgroundPrintingManager(); // Takes ownership of |preview_dialog| and deletes it when |preview_dialog| // finishes printing. This removes |preview_dialog| from its ConstrainedDialog @@ -52,11 +50,6 @@ void OnPrintRequestCancelled(content::WebContents* preview_dialog); private: - // content::NotificationObserver overrides: - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; - // Schedule deletion of |preview_contents|. void DeletePreviewContents(content::WebContents* preview_contents); @@ -77,8 +70,6 @@ }; std::map<content::WebContents*, PrintingContents> printing_contents_map_; - content::NotificationRegistrar registrar_; - SEQUENCE_CHECKER(sequence_checker_); DISALLOW_COPY_AND_ASSIGN(BackgroundPrintingManager);
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc index e18abf27..9f570fe8 100644 --- a/chrome/browser/printing/print_view_manager_base.cc +++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -712,11 +712,6 @@ #endif ReleasePrinterQuery(); - - content::NotificationService::current()->Notify( - chrome::NOTIFICATION_PRINT_JOB_RELEASED, - content::Source<content::WebContents>(web_contents()), - content::NotificationService::NoDetails()); } void PrintViewManagerBase::ShowInvalidPrinterSettingsError() { @@ -762,10 +757,6 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); ReleasePrinterQuery(); TerminatePrintJob(true); - content::NotificationService::current()->Notify( - chrome::NOTIFICATION_PRINT_JOB_RELEASED, - content::Source<content::WebContents>(web_contents()), - content::NotificationService::NoDetails()); } #endif @@ -782,11 +773,6 @@ switch (event_details.type()) { case JobEventDetails::FAILED: { TerminatePrintJob(true); - - content::NotificationService::current()->Notify( - chrome::NOTIFICATION_PRINT_JOB_RELEASED, - content::Source<content::WebContents>(web_contents()), - content::NotificationService::NoDetails()); break; } case JobEventDetails::USER_INIT_DONE: @@ -831,11 +817,6 @@ // of object registration. printing_succeeded_ = true; ReleasePrintJob(); - - content::NotificationService::current()->Notify( - chrome::NOTIFICATION_PRINT_JOB_RELEASED, - content::Source<content::WebContents>(web_contents()), - content::NotificationService::NoDetails()); break; } default: {
diff --git a/chrome/browser/printing/printing_layout_browsertest.cc b/chrome/browser/printing/printing_layout_browsertest.cc deleted file mode 100644 index a08e5b9..0000000 --- a/chrome/browser/printing/printing_layout_browsertest.cc +++ /dev/null
@@ -1,477 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/command_line.h" -#include "base/cxx17_backports.h" -#include "base/files/file_enumerator.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/location.h" -#include "base/path_service.h" -#include "base/process/process_handle.h" -#include "base/run_loop.h" -#include "base/single_thread_task_runner.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/test_file_util.h" -#include "base/threading/simple_thread.h" -#include "base/threading/thread_task_runner_handle.h" -#include "build/build_config.h" -#include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/printing/print_job.h" -#include "chrome/browser/printing/print_view_manager.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/chrome_paths.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/ui_test_utils.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" -#include "content/public/browser/notification_service.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "printing/image.h" -#include "printing/printing_test.h" - -namespace { - -using printing::Image; - -const char kGenerateSwitch[] = "print-layout-generate"; - -class PrintingLayoutTest : public PrintingTest<InProcessBrowserTest>, - public content::NotificationObserver { - public: - PrintingLayoutTest() { - base::FilePath browser_directory; - base::PathService::Get(chrome::DIR_APP, &browser_directory); - emf_path_ = browser_directory.AppendASCII("metafile_dumps"); - } - - void SetUp() override { - // Make sure there is no left overs. - CleanupDumpDirectory(); - InProcessBrowserTest::SetUp(); - } - - void TearDown() override { - InProcessBrowserTest::TearDown(); - base::DeletePathRecursively(emf_path_); - } - - void SetUpCommandLine(base::CommandLine* command_line) override { - command_line->AppendSwitchPath(switches::kDebugPrint, emf_path_); - } - - protected: - void PrintNowTab() { - registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT, - content::NotificationService::AllSources()); - - content::WebContents* web_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - printing::PrintViewManager::FromWebContents(web_contents)->PrintNow(); - content::RunMessageLoop(); - registrar_.RemoveAll(); - } - - virtual void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - ASSERT_EQ(chrome::NOTIFICATION_PRINT_JOB_EVENT, type); - switch (content::Details<printing::JobEventDetails>(details)->type()) { - case printing::JobEventDetails::JOB_DONE: { - // Succeeded. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated()); - break; - } - case printing::JobEventDetails::USER_INIT_CANCELED: - case printing::JobEventDetails::FAILED: { - // Failed. - ASSERT_TRUE(false); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated()); - break; - } - case printing::JobEventDetails::NEW_DOC: - case printing::JobEventDetails::USER_INIT_DONE: - case printing::JobEventDetails::DEFAULT_INIT_DONE: -#if defined(OS_WIN) - case printing::JobEventDetails::PAGE_DONE: -#endif - case printing::JobEventDetails::DOC_DONE: - case printing::JobEventDetails::ALL_PAGES_REQUESTED: { - // Don't care. - break; - } - default: { - NOTREACHED(); - break; - } - } - } - - // Finds the dump for the last print job and compares it to the data named - // |verification_name|. Compares the saved printed job pixels with the test - // data pixels and returns the percentage of different pixels; 0 for success, - // [0, 100] for failure. - double CompareWithResult(const std::wstring& verification_name) { - base::FilePath test_result(ScanFiles(verification_name)); - if (test_result.value().empty()) { - // 100% different, the print job buffer is not there. - return 100.; - } - - base::FilePath base_path(ui_test_utils::GetTestFilePath( - base::FilePath().AppendASCII("printing"), base::FilePath())); - base::FilePath emf(base_path.Append(verification_name + L".emf")); - base::FilePath png(base_path.Append(verification_name + L".png")); - - base::FilePath cleartype( - base_path.Append(verification_name + L"_cleartype.png")); - // Looks for Cleartype override. - if (base::PathExists(cleartype) && IsClearTypeEnabled()) - png = cleartype; - - if (GenerateFiles()) { - // Copy the .emf and generate an .png. - base::CopyFile(test_result, emf); - Image emf_content(emf); - emf_content.SaveToPng(png); - // Saving is always fine. - return 0; - } else { - // File compare between test and result. - Image emf_content(emf); - Image test_content(test_result); - Image png_content(png); - double diff_emf = emf_content.PercentageDifferent(test_content); - - EXPECT_EQ(0., diff_emf) << base::WideToUTF8(verification_name) << - " original size:" << emf_content.size().ToString() << - " result size:" << test_content.size().ToString(); - if (diff_emf) { - // Backup the result emf file. - base::FilePath failed( - base_path.Append(verification_name + L"_failed.emf")); - base::CopyFile(test_result, failed); - } - - // This verification is only to know that the EMF rendering stays - // immutable. - double diff_png = emf_content.PercentageDifferent(png_content); - EXPECT_EQ(0., diff_png) << base::WideToUTF8(verification_name) << - " original size:" << emf_content.size().ToString() << - " result size:" << test_content.size().ToString(); - if (diff_png) { - // Backup the rendered emf file to detect the rendering difference. - base::FilePath rendering( - base_path.Append(verification_name + L"_rendering.png")); - emf_content.SaveToPng(rendering); - } - return std::max(diff_png, diff_emf); - } - } - - // Makes sure the directory exists and is empty. - void CleanupDumpDirectory() { - EXPECT_TRUE(base::DieFileDie(emf_path_, true)); - EXPECT_TRUE(base::CreateDirectory(emf_path_)); - } - - // Returns if Clear Type is currently enabled. - static bool IsClearTypeEnabled() { - BOOL ct_enabled = 0; - if (SystemParametersInfo(SPI_GETCLEARTYPE, 0, &ct_enabled, 0) && ct_enabled) - return true; - UINT smoothing = 0; - if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smoothing, 0) && - smoothing == FE_FONTSMOOTHINGCLEARTYPE) - return true; - return false; - } - - private: - // Verifies that there is one .emf and one .prn file in the dump directory. - // Returns the path of the .emf file and deletes the .prn file. - std::wstring ScanFiles(const std::wstring& verification_name) { - // Try to 10 seconds. - std::wstring emf_file; - std::wstring prn_file; - bool found_emf = false; - bool found_prn = false; - for (int i = 0; i < 100; ++i) { - base::FileEnumerator enumerator(emf_path_, false, - base::FileEnumerator::FILES); - emf_file.clear(); - prn_file.clear(); - found_emf = false; - found_prn = false; - base::FilePath file; - while (!(file = enumerator.Next()).empty()) { - std::wstring ext = file.Extension(); - if (base::EqualsCaseInsensitiveASCII(base::WideToUTF8(ext), ".emf")) { - EXPECT_FALSE(found_emf) << "Found a leftover .EMF file: \"" << - emf_file << "\" and \"" << file.value() << - "\" when looking for \"" << verification_name << "\""; - found_emf = true; - emf_file = file.value(); - continue; - } - if (base::EqualsCaseInsensitiveASCII(base::WideToUTF8(ext), ".prn")) { - EXPECT_FALSE(found_prn) << "Found a leftover .PRN file: \"" << - prn_file << "\" and \"" << file.value() << - "\" when looking for \"" << verification_name << "\""; - prn_file = file.value(); - found_prn = true; - base::DeleteFile(file); - continue; - } - EXPECT_TRUE(false); - } - if (found_emf && found_prn) - break; - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); - } - EXPECT_TRUE(found_emf) << ".PRN file is: " << prn_file; - EXPECT_TRUE(found_prn) << ".EMF file is: " << emf_file; - return emf_file; - } - - static bool GenerateFiles() { - return base::CommandLine::ForCurrentProcess()->HasSwitch(kGenerateSwitch); - } - - base::FilePath emf_path_; - content::NotificationRegistrar registrar_; - - DISALLOW_COPY_AND_ASSIGN(PrintingLayoutTest); -}; - -class PrintingLayoutTextTest : public PrintingLayoutTest { - typedef PrintingLayoutTest Parent; - public: - // Returns if the test is disabled. - // http://crbug.com/64869 Until the issue is fixed, disable the test if - // ClearType is enabled. - static bool IsTestCaseDisabled() { - return Parent::IsTestCaseDisabled() || IsClearTypeEnabled(); - } -}; - -// Finds the first dialog window owned by owner_process. -HWND FindDialogWindow(DWORD owner_process) { - HWND dialog_window(NULL); - for (;;) { - dialog_window = FindWindowEx(NULL, - dialog_window, - MAKEINTATOM(32770), - NULL); - if (!dialog_window) - break; - - // The dialog must be owned by our target process. - DWORD process_id = 0; - GetWindowThreadProcessId(dialog_window, &process_id); - if (process_id == owner_process) - break; - } - return dialog_window; -} - -// Tries to close a dialog window. -bool CloseDialogWindow(HWND dialog_window) { - LRESULT res = SendMessage(dialog_window, DM_GETDEFID, 0, 0); - if (!res) - return false; - EXPECT_EQ(DC_HASDEFID, HIWORD(res)); - WORD print_button_id = LOWORD(res); - res = SendMessage( - dialog_window, - WM_COMMAND, - print_button_id, - reinterpret_cast<LPARAM>(GetDlgItem(dialog_window, print_button_id))); - return res == 0; -} - -// Dismiss the first dialog box owned by owner_process by "executing" the -// default button. -class DismissTheWindow : public base::DelegateSimpleThread::Delegate { - public: - DismissTheWindow() - : owner_process_(base::GetCurrentProcId()) { - } - - virtual void Run() { - HWND dialog_window; - for (;;) { - // First enumerate the windows. - dialog_window = FindDialogWindow(owner_process_); - - // Try to close it. - if (dialog_window) { - if (CloseDialogWindow(dialog_window)) { - break; - } - } - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); - } - - // Now verify that it indeed closed itself. - while (IsWindow(dialog_window)) { - CloseDialogWindow(dialog_window); - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); - } - } - - DWORD owner_process() { return owner_process_; } - - private: - DWORD owner_process_; -}; - -} // namespace - -// Fails, see http://crbug.com/7721. -IN_PROC_BROWSER_TEST_F(PrintingLayoutTextTest, DISABLED_Complex) { - if (IsTestCaseDisabled()) - return; - - DismissTheWindow dismisser; - base::DelegateSimpleThread close_printdlg_thread(&dismisser, - "close_printdlg_thread"); - - // Print a document, check its output. - ASSERT_TRUE(embedded_test_server()->Start()); - - ui_test_utils::NavigateToURL( - browser(), embedded_test_server()->GetURL("/printing/test1.html")); - close_printdlg_thread.Start(); - PrintNowTab(); - close_printdlg_thread.Join(); - EXPECT_EQ(0., CompareWithResult(L"test1")); -} - -struct TestPool { - const char* source; - const wchar_t* result; -}; - -const TestPool kTestPool[] = { - // ImagesB&W - "/printing/test2.html", L"test2", - // ImagesTransparent - "/printing/test3.html", L"test3", - // ImageColor - "/printing/test4.html", L"test4", -}; - -// http://crbug.com/7721 -IN_PROC_BROWSER_TEST_F(PrintingLayoutTest, DISABLED_ManyTimes) { - if (IsTestCaseDisabled()) - return; - - ASSERT_TRUE(embedded_test_server()->Start()); - - DismissTheWindow dismisser; - - ASSERT_GT(base::size(kTestPool), 0u); - for (int i = 0; i < base::size(kTestPool); ++i) { - if (i) - CleanupDumpDirectory(); - const TestPool& test = kTestPool[i % base::size(kTestPool)]; - ui_test_utils::NavigateToURL(browser(), - embedded_test_server()->GetURL(test.source)); - base::DelegateSimpleThread close_printdlg_thread1(&dismisser, - "close_printdlg_thread"); - EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process())); - close_printdlg_thread1.Start(); - PrintNowTab(); - close_printdlg_thread1.Join(); - EXPECT_EQ(0., CompareWithResult(test.result)) << test.result; - CleanupDumpDirectory(); - base::DelegateSimpleThread close_printdlg_thread2(&dismisser, - "close_printdlg_thread"); - EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process())); - close_printdlg_thread2.Start(); - PrintNowTab(); - close_printdlg_thread2.Join(); - EXPECT_EQ(0., CompareWithResult(test.result)) << test.result; - CleanupDumpDirectory(); - base::DelegateSimpleThread close_printdlg_thread3(&dismisser, - "close_printdlg_thread"); - EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process())); - close_printdlg_thread3.Start(); - PrintNowTab(); - close_printdlg_thread3.Join(); - EXPECT_EQ(0., CompareWithResult(test.result)) << test.result; - CleanupDumpDirectory(); - base::DelegateSimpleThread close_printdlg_thread4(&dismisser, - "close_printdlg_thread"); - EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process())); - close_printdlg_thread4.Start(); - PrintNowTab(); - close_printdlg_thread4.Join(); - EXPECT_EQ(0., CompareWithResult(test.result)) << test.result; - } -} - -// Prints a popup and immediately closes it. Disabled because it crashes. -IN_PROC_BROWSER_TEST_F(PrintingLayoutTest, DISABLED_Delayed) { - if (IsTestCaseDisabled()) - return; - - ASSERT_TRUE(embedded_test_server()->Start()); - - { - bool is_timeout = true; - GURL url = - embedded_test_server()->GetURL("/printing/popup_delayed_print.htm"); - ui_test_utils::NavigateToURL(browser(), url); - - DismissTheWindow dismisser; - base::DelegateSimpleThread close_printdlg_thread(&dismisser, - "close_printdlg_thread"); - close_printdlg_thread.Start(); - close_printdlg_thread.Join(); - - // Force a navigation elsewhere to verify that it's fine with it. - url = embedded_test_server()->GetURL("/printing/test1.html"); - ui_test_utils::NavigateToURL(browser(), url); - } - chrome::CloseWindow(browser()); - content::RunAllPendingInMessageLoop(); - - EXPECT_EQ(0., CompareWithResult(L"popup_delayed_print")) - << L"popup_delayed_print"; -} - -// Prints a popup and immediately closes it. http://crbug.com/7721 -IN_PROC_BROWSER_TEST_F(PrintingLayoutTest, DISABLED_IFrame) { - if (IsTestCaseDisabled()) - return; - - ASSERT_TRUE(embedded_test_server()->Start()); - - { - GURL url = embedded_test_server()->GetURL("/printing/iframe.htm"); - ui_test_utils::NavigateToURL(browser(), url); - - DismissTheWindow dismisser; - base::DelegateSimpleThread close_printdlg_thread(&dismisser, - "close_printdlg_thread"); - close_printdlg_thread.Start(); - close_printdlg_thread.Join(); - - // Force a navigation elsewhere to verify that it's fine with it. - url = embedded_test_server()->GetURL("/printing/test1.html"); - ui_test_utils::NavigateToURL(browser(), url); - } - chrome::CloseWindow(browser()); - content::RunAllPendingInMessageLoop(); - - EXPECT_EQ(0., CompareWithResult(L"iframe")) << L"iframe"; -}
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 710d933..4085669 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -223,6 +223,10 @@ #include "ui/base/resource/resource_bundle.h" #endif +#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_LINUX) +#include "chrome/browser/lens/region_search/lens_region_search_controller.h" +#endif + #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/constants/ash_features.h" #include "ash/public/cpp/clipboard_history_controller.h" @@ -968,6 +972,7 @@ AppendCurrentExtensionItems(); } +#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_LINUX) if (content_type_->SupportsGroup( ContextMenuContentType::ITEM_GROUP_LENS_REGION_SEARCH)) { if (base::FeatureList::IsEnabled(lens::features::kLensRegionSearch)) { @@ -975,6 +980,7 @@ AppendLensRegionSearchItem(); } } +#endif // Accessibility label items are appended to all menus when a screen reader // is enabled. It can be difficult to open a specific context menu with a @@ -3218,7 +3224,11 @@ } void RenderViewContextMenu::ExecLensRegionSearch() { - // TODO(crbug.com/1222313): Add click and drag image selection functionality. +#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_LINUX) + lens::LensRegionSearchController* controller = + new lens::LensRegionSearchController(source_web_contents_); + controller->Start(); +#endif } void RenderViewContextMenu::ExecSearchWebForImage() {
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc index c349e2a..bdcc7f48 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -9,6 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" +#include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/extensions/menu_manager.h" @@ -25,8 +26,8 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" -#include "components/policy/core/common/policy_pref_names.h" #include "components/lens/lens_features.h" +#include "components/policy/core/common/policy_pref_names.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/proxy_config/proxy_config_pref_names.h" @@ -688,6 +689,8 @@ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_SHOWALLSAVEDPASSWORDS)); } +// TODO(crbug/1229334): Add Mac support for Lens Region Search feature. +#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) // Verify that the Lens Region Search menu item is displayed when the feature // is enabled. TEST_F(RenderViewContextMenuPrefsTest, LensRegionSearch) { @@ -707,6 +710,7 @@ EXPECT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH)); } +#endif // Test FormatUrlForClipboard behavior // -------------------------------------------
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html index 81c9fc3e..eba7afb9 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html
@@ -49,6 +49,8 @@ .has-variants::after { /* 4px grey triangle in bottom-right. * 315 degrees means starting at bottom-right towards top-left. + * Manual color here because there isn't something easy to use, but fine for + * dark mode since dark mode is the same. */ background: linear-gradient( 315deg, var(--google-grey-refresh-500) 4px,
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_group.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_group.html index fdfd1af..181705f 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_group.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_group.html
@@ -83,8 +83,8 @@ padding: 7px 11px 7px 11px; } #clear-recents-hover:hover { - background-color: rgba(var(--google-blue-refresh-500-rgb), .04); - border: 2px solid rgba(var(--google-blue-refresh-500-rgb), .04); + background-color: var(--cros-button-background-color-secondary-hover); + border: 2px solid var(--cros-button-background-color-secondary-hover); } </style>
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html index 8d6935e5..d1d67168 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html
@@ -11,7 +11,6 @@ --emoji-per-row: 0; /* Values set in css only. */ --emoji-group-tabs-left: 0; - --emoji-divider-color: var(--google-grey-200); --emoji-picker-bottom-padding: 14px; --emoji-picker-last-emoji-left: calc(var(--emoji-picker-side-padding) + var(--emoji-size) * (var(--emoji-per-row) - 1) @@ -36,12 +35,6 @@ padding-inline-start: var(--emoji-picker-side-padding); } - @media (prefers-color-scheme-dark) { - :host { - --emoji-divider-color: var(--google-grey-900); - } - } - #search-container, #list-container { display: flex; @@ -117,7 +110,7 @@ } .divider { - border-top: 1px solid var(--emoji-divider-color); + border-top: 1px solid var(--cros-seperator-color); width: var(--emoji-picker-width); }
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html index 47e7d3a..80769858 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html
@@ -22,7 +22,7 @@ var(--emoji-picker-search-margins); --cr-search-field-underline-display: none; align-items: center; - background-color: var(--google-grey-100); + background-color: var(--cros-textfield-background-color); border: 2px solid transparent; border-radius: 40px; height: 40px; @@ -72,7 +72,7 @@ } .no-result { - color: var(--google-grey-600); + color: var(--cros-button-label-primary-color-disabled); font-family: 'Google Sans'; left: 50%; line-height: 24px;
diff --git a/chrome/browser/resources/chromeos/launcher_internals/OWNERS b/chrome/browser/resources/chromeos/launcher_internals/OWNERS new file mode 100644 index 0000000..5b86ca73 --- /dev/null +++ b/chrome/browser/resources/chromeos/launcher_internals/OWNERS
@@ -0,0 +1,3 @@ +tby@chromium.org +thanhdng@chromium.org +wrong@chromium.org
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html index d277c5a..886e27e4 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
@@ -107,7 +107,7 @@ border-radius: 4px; display: flex; margin-top: 12px; - padding: 12px; + padding: 8px; } /* dark mode */ @@ -123,8 +123,8 @@ var(--google-grey-refresh-700)); display: flex; flex-shrink: 0; - padding: 12px 0; - padding-inline-end: var(--cr-icon-button-margin-start); + margin: auto; + padding-inline-end: 10px; width: var(--cr-link-row-icon-width, var(--cr-icon-size)); }
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn index 144db98..102a18a 100644 --- a/chrome/browser/safe_browsing/BUILD.gn +++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -116,9 +116,6 @@ "network_context_service.h", "network_context_service_factory.cc", "network_context_service_factory.h", - "safe_browsing_blocking_page.cc", - "safe_browsing_blocking_page.h", - "safe_browsing_blocking_page_factory.h", "safe_browsing_navigation_observer_manager_factory.cc", "safe_browsing_navigation_observer_manager_factory.h", "safe_browsing_navigation_throttle.cc", @@ -161,6 +158,7 @@ "//components/safe_browsing/content/browser", "//components/safe_browsing/content/browser:client_side_detection", "//components/safe_browsing/content/browser:client_side_model_loader", + "//components/safe_browsing/content/browser:safe_browsing_blocking_page", "//components/safe_browsing/content/browser:safe_browsing_service", "//components/safe_browsing/content/browser/download:download_stats", "//components/safe_browsing/content/browser/password_protection", @@ -431,6 +429,7 @@ "//chrome/common/safe_browsing:proto", "//components/enterprise/common/proto:connectors_proto", "//components/safe_browsing:buildflags", + "//components/safe_browsing/content/browser:safe_browsing_blocking_page", "//components/safe_browsing/content/browser:safe_browsing_service", "//components/safe_browsing/core/browser/db:database_manager", "//components/safe_browsing/core/browser/db:test_database_manager",
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc index ba9a06d0..47194651 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
@@ -276,8 +276,16 @@ } #if BUILDFLAG(FULL_SAFE_BROWSING) + +// Disabled due to flakiness on Linux Asan https://crbug.com/1229592 +#if defined(OS_LINUX) && defined(ADDRESS_SANITIZER) +#define MAYBE_SavedPassword DISABLED_SavedPassword +#else +#define MAYBE_SavedPassword SavedPassword +#endif + IN_PROC_BROWSER_TEST_F(ChromePasswordProtectionServiceBrowserTest, - SavedPassword) { + MAYBE_SavedPassword) { base::HistogramTester histograms; SetUpPrimaryAccountWithHostedDomain(kNoHostedDomainFound); ChromePasswordProtectionService* service = GetService(/*is_incognito=*/false);
diff --git a/chrome/browser/safe_browsing/chrome_safe_browsing_blocking_page_factory.h b/chrome/browser/safe_browsing/chrome_safe_browsing_blocking_page_factory.h index 2eef35d6..caaabc5 100644 --- a/chrome/browser/safe_browsing/chrome_safe_browsing_blocking_page_factory.h +++ b/chrome/browser/safe_browsing/chrome_safe_browsing_blocking_page_factory.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_SAFE_BROWSING_CHROME_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ #define CHROME_BROWSER_SAFE_BROWSING_CHROME_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h" namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc index 49b3159..0ea0f1bf 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc
@@ -11,6 +11,7 @@ #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/task_environment.h" +#include "build/build_config.h" #include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h" @@ -212,7 +213,14 @@ << data.mime_type << " is not an expected mimetype"; } -TEST_F(FileAnalysisRequestTest, LargeFiles) { +// Disabled due to flakiness on Mac https://crbug.com/1229051 +#if defined(OS_MAC) +#define MAYBE_LargeFiles DISABLED_LargeFiles +#else +#define MAYBE_LargeFiles LargeFiles +#endif + +TEST_F(FileAnalysisRequestTest, MAYBE_LargeFiles) { base::test::TaskEnvironment task_environment; BinaryUploadService::Result result;
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc index 6286222..9156be7 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -34,8 +34,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h" #include "chrome/browser/safe_browsing/chrome_safe_browsing_blocking_page_factory.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager_factory.h" #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" @@ -65,6 +63,8 @@ #include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" #include "components/reputation/core/safety_tip_test_utils.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h" #include "components/safe_browsing/content/browser/threat_details.h" #include "components/safe_browsing/content/common/safe_browsing.mojom.h" #include "components/safe_browsing/core/browser/db/database_manager.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc index f9a19ef..3fc4734 100644 --- a/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
@@ -7,10 +7,10 @@ #include "base/memory/ptr_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/interstitials/enterprise_util.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/safe_browsing/ui_manager.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h" #include "components/security_interstitials/content/security_interstitial_tab_helper.h" #include "components/security_interstitials/core/unsafe_resource.h" #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc index 99303946..c54dee6 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -46,7 +46,6 @@ #include "chrome/browser/extensions/browsertest_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" #include "chrome/browser/safe_browsing/ui_manager.h" #include "chrome/browser/ui/browser.h" @@ -66,6 +65,7 @@ #include "components/prefs/pref_service.h" #include "components/safe_browsing/buildflags.h" #include "components/safe_browsing/content/browser/client_side_phishing_model.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" #include "components/safe_browsing/core/browser/db/database_manager.h" #include "components/safe_browsing/core/browser/db/metadata.pb.h" #include "components/safe_browsing/core/browser/db/test_database_manager.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc b/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc index 19b5760c..7b7f370 100644 --- a/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc +++ b/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
@@ -6,9 +6,9 @@ #include "base/memory/ptr_util.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/safe_browsing/ui_manager.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" #include "components/security_interstitials/content/security_interstitial_tab_helper.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/safe_browsing/test_safe_browsing_service.h b/chrome/browser/safe_browsing/test_safe_browsing_service.h index 7dda5b0..f43daa6 100644 --- a/chrome/browser/safe_browsing/test_safe_browsing_service.h +++ b/chrome/browser/safe_browsing/test_safe_browsing_service.h
@@ -5,8 +5,8 @@ #ifndef CHROME_BROWSER_SAFE_BROWSING_TEST_SAFE_BROWSING_SERVICE_H_ #define CHROME_BROWSER_SAFE_BROWSING_TEST_SAFE_BROWSING_SERVICE_H_ -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h" #include "chrome/browser/safe_browsing/services_delegate.h" #include "chrome/browser/safe_browsing/ui_manager.h"
diff --git a/chrome/browser/safe_browsing/ui_manager.cc b/chrome/browser/safe_browsing/ui_manager.cc index b92445e..9892f54 100644 --- a/chrome/browser/safe_browsing/ui_manager.cc +++ b/chrome/browser/safe_browsing/ui_manager.cc
@@ -16,14 +16,12 @@ #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.h" -#include "chrome/browser/tab_contents/tab_util.h" -#include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "components/no_state_prefetch/browser/no_state_prefetch_contents.h" #include "components/prefs/pref_service.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" #include "components/safe_browsing/content/browser/threat_details.h" #include "components/safe_browsing/core/browser/ping_manager.h" #include "components/safe_browsing/core/common/features.h"
diff --git a/chrome/browser/safe_browsing/ui_manager.h b/chrome/browser/safe_browsing/ui_manager.h index cf5ecda..421edf1 100644 --- a/chrome/browser/safe_browsing/ui_manager.h +++ b/chrome/browser/safe_browsing/ui_manager.h
@@ -14,9 +14,9 @@ #include "base/callback.h" #include "base/macros.h" #include "base/observer_list.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "components/safe_browsing/content/browser/base_ui_manager.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h" #include "components/security_interstitials/core/unsafe_resource.h" class GURL;
diff --git a/chrome/browser/safe_browsing/ui_manager_unittest.cc b/chrome/browser/safe_browsing/ui_manager_unittest.cc index 817a6fc..01618ba 100644 --- a/chrome/browser/safe_browsing/ui_manager_unittest.cc +++ b/chrome/browser/safe_browsing/ui_manager_unittest.cc
@@ -12,8 +12,6 @@ #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/safe_browsing/chrome_safe_browsing_blocking_page_factory.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager_factory.h" #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" @@ -24,6 +22,8 @@ #include "chrome/test/base/testing_profile.h" #include "components/password_manager/core/browser/mock_password_store.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h" #include "components/safe_browsing/core/browser/db/util.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/security_interstitials/content/security_interstitial_controller_client.h"
diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ssl/security_state_tab_helper.cc index 9597071d..02df671 100644 --- a/chrome/browser/ssl/security_state_tab_helper.cc +++ b/chrome/browser/ssl/security_state_tab_helper.cc
@@ -53,8 +53,8 @@ #include "url/origin.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(FULL_SAFE_BROWSING)
diff --git a/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc b/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc index 42bef1e2..8493301 100644 --- a/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc
@@ -10,6 +10,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/sync/device_info_sync_service_factory.h" +#include "chrome/browser/sync/test/integration/bookmarks_helper.h" #include "chrome/browser/sync/test/integration/device_info_helper.h" #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" #include "chrome/browser/sync/test/integration/sync_test.h" @@ -33,6 +34,8 @@ namespace { +using syncer::ModelType; +using syncer::ModelTypeSet; using testing::Contains; using testing::ElementsAre; using testing::IsSupersetOf; @@ -74,7 +77,13 @@ return base::StringPrintf("signin scoped device id %d", suffix); } -sync_pb::DeviceInfoSpecifics CreateSpecifics(int suffix) { +ModelTypeSet DefaultInterestedDataTypes() { + return Difference(syncer::ProtocolTypes(), syncer::CommitOnlyTypes()); +} + +sync_pb::DeviceInfoSpecifics CreateSpecifics( + int suffix, + const ModelTypeSet& interested_data_types) { sync_pb::DeviceInfoSpecifics specifics; specifics.set_cache_guid(CacheGuidForSuffix(suffix)); specifics.set_client_name(ClientNameForSuffix(suffix)); @@ -84,14 +93,25 @@ specifics.set_signin_scoped_device_id(SigninScopedDeviceIdForSuffix(suffix)); specifics.set_last_updated_timestamp( syncer::TimeToProtoTime(base::Time::Now())); + auto& mutable_interested_data_type_ids = + *specifics.mutable_invalidation_fields() + ->mutable_interested_data_type_ids(); + for (ModelType type : interested_data_types) { + mutable_interested_data_type_ids.Add( + syncer::GetSpecificsFieldNumberFromModelType(type)); + } return specifics; } +sync_pb::DeviceInfoSpecifics CreateSpecifics(int suffix) { + return CreateSpecifics(suffix, DefaultInterestedDataTypes()); +} + class SingleClientDeviceInfoSyncTest : public SyncTest { public: SingleClientDeviceInfoSyncTest() : SyncTest(SINGLE_CLIENT) {} - ~SingleClientDeviceInfoSyncTest() override {} + ~SingleClientDeviceInfoSyncTest() override = default; std::string GetLocalCacheGuid() { syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs()); @@ -302,6 +322,30 @@ } IN_PROC_BROWSER_TEST_F(SingleClientDeviceInfoSyncTest, + ShouldSetTheOnlyClientFlagForDataType) { + // There is a remote client which is not interested in BOOKMARKS. + const ModelTypeSet remote_interested_data_types = + Difference(DefaultInterestedDataTypes(), {syncer::BOOKMARKS}); + InjectDeviceInfoSpecificsToServer( + CreateSpecifics(/*suffix=*/1, remote_interested_data_types)); + + ASSERT_TRUE(SetupSync()); + + bookmarks_helper::AddURL(/*profile=*/0, "Title", GURL("http://foo.com")); + ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker( + /*profile=*/0, GetSyncService(0), GetFakeServer()) + .Wait()); + + sync_pb::ClientToServerMessage message; + GetFakeServer()->GetLastCommitMessage(&message); + + // Even though there is another active client, that client is not interested + // in the just-committed bookmark, so for the purpose of this commit, the + // committing client is the "single" one. + EXPECT_TRUE(message.commit().config_params().single_client()); +} + +IN_PROC_BROWSER_TEST_F(SingleClientDeviceInfoSyncTest, ShouldNotProvideTheOnlyClientFlag) { InjectDeviceInfoEntityToServer(/*suffix=*/1);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 5b29702f..ac4bc7b 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -4941,6 +4941,12 @@ } } + if (safe_browsing_mode > 0) { + deps += [ + "//components/safe_browsing/content/browser:safe_browsing_blocking_page", + ] + } + if (safe_browsing_mode == 1) { sources += [ "webui/reset_password/reset_password_ui.cc",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java index a2bffd33..1cde9ec 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
@@ -25,7 +25,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.MathUtils; import org.chromium.base.ThreadUtils; -import org.chromium.base.supplier.BooleanSupplier; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar; import org.chromium.ui.UiUtils; @@ -99,7 +99,8 @@ /** Whether or not to use the status bar color as the background of the toolbar. */ private boolean mUseStatusBarColorAsBackground; - private BooleanSupplier mIsInVrSupplier; + /** A supplier of whether the prorgress bar should be visible. */ + private ObservableSupplier<Boolean> mIsVisibleSupplier; /** * The indeterminate animating view for the progress bar. This will be null for Android @@ -179,18 +180,20 @@ * @param anchor The view to use as an anchor. * @param useStatusBarColorAsBackground Whether or not to use the status bar color as the * background of the toolbar. - * @param isInVrSupplier A supplier of the state of VR mode. + * @param isVisibleSupplier A supplier of the desired visibility of the progress bar. */ public ToolbarProgressBar(Context context, int height, View anchor, - boolean useStatusBarColorAsBackground, BooleanSupplier isInVrSupplier) { + boolean useStatusBarColorAsBackground, ObservableSupplier<Boolean> isVisibleSupplier) { super(context, height); mProgressBarHeight = height; - mIsInVrSupplier = isInVrSupplier; + mIsVisibleSupplier = isVisibleSupplier; setAlpha(0.0f); setAnchorView(anchor); mUseStatusBarColorAsBackground = useStatusBarColorAsBackground; mAnimationLogic = new ProgressAnimationSmooth(); + isVisibleSupplier.addObserver(visible -> setVisibility(visible ? View.VISIBLE : View.GONE)); + // This tells accessibility services that progress bar changes are important enough to // announce to the user even when not focused. ViewCompat.setAccessibilityLiveRegion(this, ViewCompat.ACCESSIBILITY_LIVE_REGION_POLITE); @@ -425,8 +428,8 @@ @Override public void setVisibility(int visibility) { - // The progress bar should never show up while in VR. - if (mIsInVrSupplier.getAsBoolean()) visibility = GONE; + // Hide the progress bar if it is being forced externally. + if (!mIsVisibleSupplier.get()) visibility = GONE; super.setVisibility(visibility); if (mAnimatingView != null) mAnimatingView.setVisibility(visibility); }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java index 692bb267..024b0e6 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java
@@ -22,6 +22,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.MathUtils; +import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Restriction; @@ -62,7 +63,10 @@ view.addView(anchor, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, heightPx * 2)); - mProgressBar = new ToolbarProgressBar(getActivity(), heightPx, anchor, false, () -> false); + ObservableSupplierImpl<Boolean> isVisibleSupplier = new ObservableSupplierImpl<>(); + isVisibleSupplier.set(true); + mProgressBar = + new ToolbarProgressBar(getActivity(), heightPx, anchor, false, isVisibleSupplier); @ColorInt int toolbarColor = ApiCompatibilityUtils.getColor(res, R.color.toolbar_background_primary); mProgressBar.setThemeColor(toolbarColor, false);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index 738ad42..9768664 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -26,6 +26,7 @@ import org.chromium.base.ObserverList; import org.chromium.base.TraceEvent; import org.chromium.base.supplier.BooleanSupplier; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBarCoordinator; import org.chromium.chrome.browser.omnibox.NewTabPageDelegate; @@ -115,7 +116,7 @@ * @param toolbarDataProvider The provider for toolbar data. * @param tabController The controller that handles interactions with the tab. * @param menuButtonCoordinator Coordinator for interacting with the MenuButton. - * @param isInVrSupplier A supplier of the state of VR mode. + * @param isProgressBarVisibleSupplier A supplier of whether the progress bar should be visible. * @param historyDelegate Delegate used to display navigation history. * @param partnerHomepageEnabledSupplier A supplier of a boolean indicating that partner * homepage is enabled. @@ -124,13 +125,14 @@ @CallSuper protected void initialize(ToolbarDataProvider toolbarDataProvider, ToolbarTabController tabController, MenuButtonCoordinator menuButtonCoordinator, - BooleanSupplier isInVrSupplier, HistoryDelegate historyDelegate, - BooleanSupplier partnerHomepageEnabledSupplier, OfflineDownloader offlineDownloader) { + ObservableSupplier<Boolean> isProgressBarVisibleSupplier, + HistoryDelegate historyDelegate, BooleanSupplier partnerHomepageEnabledSupplier, + OfflineDownloader offlineDownloader) { mToolbarDataProvider = toolbarDataProvider; mToolbarTabController = tabController; mMenuButtonCoordinator = menuButtonCoordinator; mPartnerHomepageEnabledSupplier = partnerHomepageEnabledSupplier; - mProgressBar = createProgressBar(isInVrSupplier); + mProgressBar = createProgressBar(isProgressBarVisibleSupplier); } /** @param overlay The coordinator for the texture version of the top toolbar. */ @@ -224,9 +226,10 @@ /** * @return A progress bar for Chrome to use. */ - private ToolbarProgressBar createProgressBar(BooleanSupplier isInVrSupplier) { + private ToolbarProgressBar createProgressBar( + ObservableSupplier<Boolean> isProgressBarVisibleSupplier) { return new ToolbarProgressBar( - getContext(), getProgressBarHeight(), this, false, isInVrSupplier); + getContext(), getProgressBarHeight(), this, false, isProgressBarVisibleSupplier); } /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index e14c4ff..66a9468 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -27,6 +27,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.BooleanSupplier; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBarCoordinator; import org.chromium.chrome.browser.omnibox.NewTabPageDelegate; @@ -488,10 +489,12 @@ @Override protected void initialize(ToolbarDataProvider toolbarDataProvider, ToolbarTabController tabController, MenuButtonCoordinator menuButtonCoordinator, - BooleanSupplier isInVrSupplier, HistoryDelegate historyDelegate, - BooleanSupplier partnerHomepageEnabledSupplier, OfflineDownloader offlineDownloader) { - super.initialize(toolbarDataProvider, tabController, menuButtonCoordinator, isInVrSupplier, - historyDelegate, partnerHomepageEnabledSupplier, offlineDownloader); + ObservableSupplier<Boolean> isProgressBarVisibleSupplier, + HistoryDelegate historyDelegate, BooleanSupplier partnerHomepageEnabledSupplier, + OfflineDownloader offlineDownloader) { + super.initialize(toolbarDataProvider, tabController, menuButtonCoordinator, + isProgressBarVisibleSupplier, historyDelegate, partnerHomepageEnabledSupplier, + offlineDownloader); mHistoryDelegate = historyDelegate; mOfflineDownloader = offlineDownloader; menuButtonCoordinator.setVisibility(true);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 6a71e22..5af4182f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -115,7 +115,7 @@ * for the {@link Invalidator} a chance to defer the actual invalidate to sync drawing. * @param identityDiscButtonSupplier Supplier of Identity Disc button. * @param resourceManagerSupplier A supplier of a resource manager for native textures. - * @param isInVrSupplier A supplier of the state of VR mode. + * @param isProgressBarVisibleSupplier A supplier of whether the progress bar is visible. * @param isInconitoModeEnabledSupplier A supplier of the incognito mode being enabled or not. * @param isGridTabSwitcherEnabled Whether grid tab switcher is enabled via a feature flag. * @param isTabToGtsAnimationEnabled Whether Tab-to-GTS animation is enabled via a feature flag. @@ -139,7 +139,8 @@ ObservableSupplier<Boolean> homepageManagedByPolicySupplier, ObservableSupplier<Boolean> identityDiscStateSupplier, Callback<Runnable> invalidatorCallback, Supplier<ButtonData> identityDiscButtonSupplier, - Supplier<ResourceManager> resourceManagerSupplier, BooleanSupplier isInVrSupplier, + Supplier<ResourceManager> resourceManagerSupplier, + ObservableSupplier<Boolean> isProgressBarVisibleSupplier, BooleanSupplier isIncognitoModeEnabledSupplier, boolean isGridTabSwitcherEnabled, boolean isTabToGtsAnimationEnabled, boolean isStartSurfaceEnabled, boolean isTabGroupsAndroidContinuationEnabled, HistoryDelegate historyDelegate, @@ -179,7 +180,8 @@ mIsGridTabSwitcherEnabled = isGridTabSwitcherEnabled; controlContainer.setToolbar(this); mToolbarLayout.initialize(toolbarDataProvider, tabController, mMenuButtonCoordinator, - isInVrSupplier, historyDelegate, partnerHomepageEnabledSupplier, offlineDownloader); + isProgressBarVisibleSupplier, historyDelegate, partnerHomepageEnabledSupplier, + offlineDownloader); mToolbarLayout.setThemeColorProvider(normalThemeColorProvider); mAppMenuButtonHelperSupplier = appMenuButtonHelperSupplier; new OneShotCallback<>(mAppMenuButtonHelperSupplier, this::setAppMenuButtonHelper); @@ -620,13 +622,6 @@ } /** - * @param enabled Whether the progress bar is enabled. - */ - public void setProgressBarEnabled(boolean enabled) { - getProgressBar().setVisibility(enabled ? View.VISIBLE : View.GONE); - } - - /** * Force to hide toolbar shadow. * @param forceHideShadow Whether toolbar shadow should be hidden. *
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc index 6ebcd4ce..fd043cab 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -3262,7 +3262,8 @@ .Has(syncer::ARC_PACKAGE)); } -TEST_P(ArcDefaultAppTest, DefaultApps) { +// Disabled due to flakiness https://crbug.com/1229496. +TEST_P(ArcDefaultAppTest, DISABLED_DefaultApps) { ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); ASSERT_NE(nullptr, prefs); @@ -3347,7 +3348,8 @@ // Test that validates disabling default app removes app from the list and this // is persistent in next sessions. -TEST_P(ArcDefaultAppTest, DisableDefaultApps) { +// Disabled due to flakiness https://crbug.com/1229496. +TEST_P(ArcDefaultAppTest, DISABLED_DisableDefaultApps) { ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); ASSERT_TRUE(prefs);
diff --git a/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc b/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc index 535e9fa..c2cec8f 100644 --- a/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc +++ b/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
@@ -33,6 +33,7 @@ #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h" #include "chrome/browser/web_applications/components/web_app_id_constants.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" +#include "chrome/browser/web_applications/test/with_crosapi_param.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/pref_names.h" @@ -45,6 +46,9 @@ #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" +using web_app::test::CrosapiParam; +using web_app::test::WithCrosapiParam; + namespace app_list { // This contains almost end-to-end tests for the launcher search backend. It is @@ -362,8 +366,12 @@ -20424143, 1); } +class AppListSearchSystemWebAppBrowserTest : public AppListSearchBrowserTest, + public WithCrosapiParam {}; + // Test that Help App shows up normally even when suggestion chip should show. -IN_PROC_BROWSER_TEST_F(AppListSearchBrowserTest, AppListSearchHasApp) { +IN_PROC_BROWSER_TEST_P(AppListSearchSystemWebAppBrowserTest, + AppListSearchHasApp) { web_app::WebAppProvider::Get(GetProfile()) ->system_web_app_manager() .InstallSystemAppsForTesting(); @@ -461,4 +469,10 @@ EXPECT_EQ(base::UTF16ToASCII(results[0]->title()), "my_folder"); } +INSTANTIATE_TEST_SUITE_P(All, + AppListSearchSystemWebAppBrowserTest, + ::testing::Values(CrosapiParam::kDisabled, + CrosapiParam::kEnabled), + WithCrosapiParam::ParamToString); + } // namespace app_list
diff --git a/chrome/browser/ui/ash/multi_user/multi_profile_support.cc b/chrome/browser/ui/ash/multi_user/multi_profile_support.cc index c1bdda0..ae5e4c5 100644 --- a/chrome/browser/ui/ash/multi_user/multi_profile_support.cc +++ b/chrome/browser/ui/ash/multi_user/multi_profile_support.cc
@@ -52,7 +52,7 @@ if (browser) { if (browser->profile()->IsOffTheRecord()) { window_type = TELEPORT_WINDOW_INCOGNITO_BROWSER; - } else if (browser->deprecated_is_app()) { + } else if (browser->is_type_app() || browser->is_type_app_popup()) { window_type = TELEPORT_WINDOW_V1_APP; } else if (browser->is_type_popup()) { window_type = TELEPORT_WINDOW_POPUP;
diff --git a/chrome/browser/ui/ash/session_controller_client_impl.h b/chrome/browser/ui/ash/session_controller_client_impl.h index 48e9a24a..db60e71a 100644 --- a/chrome/browser/ui/ash/session_controller_client_impl.h +++ b/chrome/browser/ui/ash/session_controller_client_impl.h
@@ -15,7 +15,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/crosapi/browser_manager_observer.h" -#include "chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h" +#include "chrome/browser/ash/policy/off_hours/device_off_hours_controller.h" #include "chrome/browser/supervised_user/supervised_user_service_observer.h" #include "chromeos/login/login_state/login_state.h" #include "components/session_manager/core/session_manager_observer.h"
diff --git a/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc b/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc index b7eb8f8..cf671c5 100644 --- a/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc +++ b/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
@@ -18,10 +18,10 @@ #include "chrome/browser/ash/crosapi/fake_browser_manager.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/login/users/multi_profile_user_controller.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h" #include "chrome/browser/ui/ash/test_session_controller.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc index 4d12a79..8f96430 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc
@@ -59,6 +59,12 @@ // arc::ArcSessionManager might not be set in tests. if (arc_session_manager) arc_session_manager->AddObserver(this); + + auto* arc_handler = + chromeos::full_restore::FullRestoreArcTaskHandler::GetForProfile( + observed_profile_); + if (arc_handler) + arc_handler->OnShelfReady(); } AppServiceAppWindowArcTracker::~AppServiceAppWindowArcTracker() {
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc index f3f1d2c0..6bf6877 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc
@@ -31,8 +31,12 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" +#include "chrome/browser/web_applications/components/web_app_id_constants.h" #include "chrome/browser/web_applications/components/web_application_info.h" +#include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/with_crosapi_param.h" +#include "chrome/browser/web_applications/web_app_provider.h" #include "components/arc/arc_service_manager.h" #include "components/arc/session/arc_bridge_service.h" #include "components/arc/test/arc_util_test_support.h" @@ -51,6 +55,8 @@ using extensions::AppWindow; using extensions::Extension; +using web_app::test::CrosapiParam; +using web_app::test::WithCrosapiParam; namespace mojo { @@ -834,3 +840,49 @@ windows = app_service_proxy_->InstanceRegistry().GetWindows(app_id); EXPECT_EQ(0u, windows.size()); } + +class AppServiceAppWindowSystemWebAppBrowserTest + : public AppServiceAppWindowWebAppBrowserTest, + public WithCrosapiParam {}; + +IN_PROC_BROWSER_TEST_P(AppServiceAppWindowSystemWebAppBrowserTest, + SystemWebAppWindow) { + auto& system_web_app_manager = + web_app::WebAppProvider::Get(browser()->profile()) + ->system_web_app_manager(); + system_web_app_manager.InstallSystemAppsForTesting(); + + const std::string app_id = web_app::kOsSettingsAppId; + web_app::LaunchWebAppBrowser(browser()->profile(), app_id); + + auto windows = app_service_proxy_->InstanceRegistry().GetWindows(app_id); + EXPECT_EQ(1u, windows.size()); + aura::Window* window = *windows.begin(); + EXPECT_EQ(apps::InstanceState::kStarted | apps::InstanceState::kRunning | + apps::InstanceState::kActive | apps::InstanceState::kVisible, + GetAppInstanceState(app_id, window)); + + const ash::ShelfItem& item = GetLastShelfItem(); + // Since it is already active, clicking it should minimize. + SelectItem(item.id); + EXPECT_EQ(apps::InstanceState::kStarted | apps::InstanceState::kRunning, + GetAppInstanceState(app_id, window)); + + // Click the item again to activate the app. + SelectItem(item.id); + EXPECT_EQ(apps::InstanceState::kStarted | apps::InstanceState::kRunning | + apps::InstanceState::kActive | apps::InstanceState::kVisible, + GetAppInstanceState(app_id, window)); + + controller_->Close(item.id); + // Make sure that the window is closed. + base::RunLoop().RunUntilIdle(); + windows = app_service_proxy_->InstanceRegistry().GetWindows(app_id); + EXPECT_EQ(0u, windows.size()); +} + +INSTANTIATE_TEST_SUITE_P(All, + AppServiceAppWindowSystemWebAppBrowserTest, + ::testing::Values(CrosapiParam::kDisabled, + CrosapiParam::kEnabled), + WithCrosapiParam::ParamToString);
diff --git a/chrome/browser/ui/ash/shelf/app_service/exo_app_type_resolver.cc b/chrome/browser/ui/ash/shelf/app_service/exo_app_type_resolver.cc index 156bf43..055bc1ea 100644 --- a/chrome/browser/ui/ash/shelf/app_service/exo_app_type_resolver.cc +++ b/chrome/browser/ui/ash/shelf/app_service/exo_app_type_resolver.cc
@@ -30,6 +30,9 @@ if (IsLacrosAppId(params.app_id)) { out_properties_container.SetProperty( aura::client::kAppType, static_cast<int>(ash::AppType::LACROS)); + // Make sure Lacros is treated as opaque for occlusion tracking purposes. + out_properties_container.SetProperty( + chromeos::kWindowManagerManagesOpacityKey, true); // Lacros is trusted not to abuse window activation, so grant it a // non-expiring permission to activate. out_properties_container.SetProperty(
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index a85a3b55..57ef822 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -1086,7 +1086,8 @@ // Navigation commands command_updater_.UpdateCommandEnabled( - IDC_HOME, normal_window || browser_->deprecated_is_app()); + IDC_HOME, normal_window || browser_->is_type_app() || + browser_->is_type_app_popup()); const bool is_web_app_or_custom_tab = #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -1233,15 +1234,12 @@ CanReload(browser_)); // Window management commands - command_updater_.UpdateCommandEnabled( - IDC_DUPLICATE_TAB, - !browser_->deprecated_is_app() && CanDuplicateTab(browser_)); - command_updater_.UpdateCommandEnabled(IDC_WINDOW_MUTE_SITE, - !browser_->deprecated_is_app()); - command_updater_.UpdateCommandEnabled(IDC_WINDOW_PIN_TAB, - !browser_->deprecated_is_app()); - command_updater_.UpdateCommandEnabled(IDC_WINDOW_GROUP_TAB, - !browser_->deprecated_is_app()); + bool is_app = browser_->is_type_app() || browser_->is_type_app_popup(); + command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, + !is_app && CanDuplicateTab(browser_)); + command_updater_.UpdateCommandEnabled(IDC_WINDOW_MUTE_SITE, !is_app); + command_updater_.UpdateCommandEnabled(IDC_WINDOW_PIN_TAB, !is_app); + command_updater_.UpdateCommandEnabled(IDC_WINDOW_GROUP_TAB, !is_app); command_updater_.UpdateCommandEnabled(IDC_WINDOW_CLOSE_TABS_TO_RIGHT, CanCloseTabsToRight(browser_)); command_updater_.UpdateCommandEnabled(IDC_WINDOW_CLOSE_OTHER_TABS, @@ -1585,7 +1583,8 @@ void BrowserCommandController::UpdateCommandsForTabKeyboardFocus( absl::optional<int> target_index) { command_updater_.UpdateCommandEnabled( - IDC_DUPLICATE_TARGET_TAB, !browser_->deprecated_is_app() && + IDC_DUPLICATE_TARGET_TAB, !browser_->is_type_app() && + !browser_->is_type_app_popup() && target_index.has_value() && CanDuplicateTabAt(browser_, *target_index)); const bool normal_window = browser_->is_type_normal();
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc index a5a1c68..a4af083 100644 --- a/chrome/browser/ui/browser_navigator.cc +++ b/chrome/browser/ui/browser_navigator.cc
@@ -799,6 +799,8 @@ DCHECK_GT(stripped_spec.size(), strlen(content::kViewSourceScheme)); stripped_spec.erase(0, strlen(content::kViewSourceScheme) + 1); GURL stripped_url(stripped_spec); + if (stripped_url.is_empty()) + return true; return stripped_url.is_valid() && IsURLAllowedInIncognito(stripped_url, browser_context); }
diff --git a/chrome/browser/ui/browser_navigator_unittest.cc b/chrome/browser/ui/browser_navigator_unittest.cc new file mode 100644 index 0000000..297d222 --- /dev/null +++ b/chrome/browser/ui/browser_navigator_unittest.cc
@@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/browser_navigator.h" + +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/browser_task_environment.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +class BrowserNavigatorUnitTest : public testing::Test { + public: + BrowserNavigatorUnitTest() = default; + BrowserNavigatorUnitTest(const BrowserNavigatorUnitTest&) = delete; + BrowserNavigatorUnitTest& operator=(const BrowserNavigatorUnitTest&) = delete; + ~BrowserNavigatorUnitTest() override = default; + + private: + content::BrowserTaskEnvironment task_environment_; +}; + +// Ensure empty view source is allowed in Incognito. +TEST_F(BrowserNavigatorUnitTest, EmptyViewSourceIncognito) { + TestingProfile profile; + EXPECT_TRUE(IsURLAllowedInIncognito(GURL("view-source:"), &profile)); +}
diff --git a/chrome/browser/ui/javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_desktop.cc b/chrome/browser/ui/javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_desktop.cc index c0f114a..47e7bfb 100644 --- a/chrome/browser/ui/javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_desktop.cc +++ b/chrome/browser/ui/javascript_dialogs/javascript_tab_modal_dialog_manager_delegate_desktop.cc
@@ -81,7 +81,7 @@ bool JavaScriptTabModalDialogManagerDelegateDesktop::IsApp() { Browser* browser = chrome::FindBrowserWithWebContents(web_contents_); - return browser && browser->deprecated_is_app(); + return browser && (browser->is_type_app() || browser->is_type_app_popup()); } void JavaScriptTabModalDialogManagerDelegateDesktop::OnBrowserSetLastActive(
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc index b861272..1899a2be 100644 --- a/chrome/browser/ui/tab_contents/core_tab_helper.cc +++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -88,9 +88,41 @@ void CoreTabHelper::SearchWithLensInNewTab( content::RenderFrameHost* render_frame_host, const GURL& src_url) { - SearchByImageInNewTabImpl( - render_frame_host, src_url, kImageSearchThumbnailMinSize, - lens::features::GetMaxPixels(), lens::features::GetMaxPixels()); + SearchByImageInNewTabImpl(render_frame_host, src_url, + kImageSearchThumbnailMinSize, + lens::features::GetMaxPixelsForImageSearch(), + lens::features::GetMaxPixelsForImageSearch()); +} + +void CoreTabHelper::SearchWithLensInNewTab(gfx::Image image) { + Profile* profile = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(profile); + if (!template_url_service) + return; + const TemplateURL* const default_provider = + template_url_service->GetDefaultSearchProvider(); + if (!default_provider) + return; + + TemplateURLRef::SearchTermsArgs search_args = + TemplateURLRef::SearchTermsArgs(std::u16string()); + + // Get the front and end of the image bytes in order to store them in the + // search_args to be sent as part of the PostContent in the request. + size_t image_bytes_size = image.As1xPNGBytes()->size(); + const unsigned char* image_bytes_begin = image.As1xPNGBytes()->front(); + const unsigned char* image_bytes_end = image_bytes_begin + image_bytes_size; + + search_args.image_thumbnail_content.assign(image_bytes_begin, + image_bytes_end); + search_args.image_original_size = image.Size(); + TemplateURLRef::PostContent post_content; + GURL result(default_provider->image_url_ref().ReplaceSearchTerms( + search_args, template_url_service->search_terms_data(), &post_content)); + PostContentToURL(post_content, result); } void CoreTabHelper::SearchByImageInNewTab( @@ -317,11 +349,16 @@ TemplateURLRef::PostContent post_content; GURL result(default_provider->image_url_ref().ReplaceSearchTerms( search_args, template_url_service->search_terms_data(), &post_content)); - if (!result.is_valid()) + PostContentToURL(post_content, result); +} + +void CoreTabHelper::PostContentToURL(TemplateURLRef::PostContent post_content, + GURL url) { + if (!url.is_valid()) return; content::OpenURLParams open_url_params( - result, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, + url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, false); const std::string& content_type = post_content.first; const std::string& post_data = post_content.second;
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.h b/chrome/browser/ui/tab_contents/core_tab_helper.h index 6de06ce..37c7127 100644 --- a/chrome/browser/ui/tab_contents/core_tab_helper.h +++ b/chrome/browser/ui/tab_contents/core_tab_helper.h
@@ -12,9 +12,11 @@ #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "chrome/common/chrome_render_frame.mojom.h" +#include "components/search_engines/template_url.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "ui/gfx/geometry/size.h" +#include "ui/gfx/image/image.h" #include "url/gurl.h" // Per-tab class to handle functionality that is core to the operation of tabs. @@ -36,6 +38,10 @@ void SearchWithLensInNewTab(content::RenderFrameHost* render_frame_host, const GURL& src_url); + // Open the Lens experience for an image. Used for sending the bitmap selected + // via Lens Region Search. + void SearchWithLensInNewTab(gfx::Image image); + // Perform an image search for the image that triggered the context menu. The // |src_url| is passed to the search request and is not used directly to fetch // the image resources. @@ -76,6 +82,9 @@ const gfx::Size& original_size, const std::string& image_extension); + // Posts the bytes and content type to the specified URL. + void PostContentToURL(TemplateURLRef::PostContent post_content, GURL url); + // Create a thumbnail to POST to search engine for the image that triggered // the context menu. The |src_url| is passed to the search request and is // not used directly to fetch the image resources.
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_interactive_uitest.cc similarity index 94% rename from chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc rename to chrome/browser/ui/views/extensions/extensions_menu_view_interactive_uitest.cc index d4c3f78..38c1acf0 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view_interactive_uitest.cc
@@ -49,7 +49,8 @@ using ::testing::ElementsAre; -class ExtensionsMenuViewBrowserTest : public ExtensionsToolbarBrowserTest { +class ExtensionsMenuViewInteractiveUITest + : public ExtensionsToolbarBrowserTest { public: enum class ExtensionRemovalMethod { kDisable, @@ -312,29 +313,29 @@ std::string ui_test_name_; }; -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, InvokeUi_default) { +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, InvokeUi_default) { LoadTestExtension("extensions/uitest/long_name"); LoadTestExtension("extensions/uitest/window_open"); ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, InvisibleWithoutExtension_Disable) { VerifyContainerVisibility(ExtensionRemovalMethod::kDisable, false); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, InvisibleWithoutExtension_Uninstall) { VerifyContainerVisibility(ExtensionRemovalMethod::kUninstall, false); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, InvisibleWithoutExtension_Blocklist) { VerifyContainerVisibility(ExtensionRemovalMethod::kBlocklist, false); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, InvisibleWithoutExtension_Terminate) { // TODO(pbos): Keep the container visible when extensions are terminated // (crash). This lets users find and restart them. Then update this test @@ -352,7 +353,7 @@ #else #define MAYBE_InvokeUi_ReloadPageBubble InvokeUi_ReloadPageBubble #endif -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, MAYBE_InvokeUi_ReloadPageBubble) { ASSERT_TRUE(embedded_test_server()->Start()); extensions::TestExtensionDir test_dir; @@ -395,7 +396,7 @@ ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, ExtensionsMenuButtonHighlight) { LoadTestExtension("extensions/uitest/window_open"); ClickExtensionsMenuButton(); @@ -407,7 +408,7 @@ views::InkDropState::ACTIVATED); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, TriggerPopup) { +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, TriggerPopup) { LoadTestExtension("extensions/simple_with_popup"); ShowUi(""); VerifyUi(); @@ -439,7 +440,7 @@ EXPECT_TRUE(GetVisibleToolbarActionViews().empty()); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, ContextMenuKeepsExtensionPoppedOut) { LoadTestExtension("extensions/simple_with_popup"); ShowUi(""); @@ -479,7 +480,7 @@ visible_icons[0]->view_controller()->GetId()); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, RemoveExtensionShowingPopup) { LoadTestExtension("extensions/simple_with_popup"); ShowUi(""); @@ -505,7 +506,7 @@ } // Test for crbug.com/1099456. -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, RemoveMultipleExtensionsWhileShowingPopup) { auto& id1 = LoadTestExtension("extensions/simple_with_popup")->id(); auto& id2 = LoadTestExtension("extensions/uitest/window_open")->id(); @@ -531,7 +532,7 @@ EXPECT_EQ(nullptr, extensions_container->GetPoppedOutAction()); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, TriggeringExtensionClosesMenu) { LoadTestExtension("extensions/trigger_actions/browser_action"); ShowUi(""); @@ -557,7 +558,7 @@ EXPECT_FALSE(ExtensionsMenuView::IsShowing()); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, CreatesOneMenuItemPerExtension) { LoadTestExtension("extensions/uitest/long_name"); LoadTestExtension("extensions/uitest/window_open"); @@ -575,7 +576,7 @@ #else #define MAYBE_PinningDisabledInIncognito PinningDisabledInIncognito #endif -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, MAYBE_PinningDisabledInIncognito) { LoadTestExtension("extensions/uitest/window_open", true); SetUpIncognitoBrowser(); @@ -602,7 +603,7 @@ DismissUi(); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, PinnedExtensionShowsCorrectContextMenuPinOption) { LoadTestExtension("extensions/simple_with_popup"); @@ -658,7 +659,7 @@ EXPECT_EQ(base::UTF16ToUTF8(visibility_label), "Unpin"); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, UnpinnedExtensionShowsCorrectContextMenuPinOption) { LoadTestExtension("extensions/simple_with_popup"); @@ -688,7 +689,7 @@ EXPECT_EQ(base::UTF16ToUTF8(visibility_label), "Pin"); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, ManageExtensionsOpensExtensionsPage) { // Ensure the menu is visible by adding an extension. LoadTestExtension("extensions/trigger_actions/browser_action"); @@ -712,7 +713,7 @@ // Tests that clicking on the context menu button of an extension item opens the // context menu. -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, ClickingContextMenuButton) { LoadTestExtension("extensions/uitest/window_open"); ClickExtensionsMenuButton(); @@ -735,7 +736,8 @@ EXPECT_TRUE(item_view->IsContextMenuRunningForTesting()); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, InvokeUi_InstallDialog) { +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, + InvokeUi_InstallDialog) { ShowAndVerifyUi(); } @@ -746,7 +748,7 @@ #else #define MAYBE_InvokeUi_UninstallDialog_Accept InvokeUi_UninstallDialog_Accept #endif -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, MAYBE_InvokeUi_UninstallDialog_Accept) { ShowAndVerifyUi(); } @@ -758,12 +760,13 @@ #else #define MAYBE_InvokeUi_UninstallDialog_Cancel InvokeUi_UninstallDialog_Cancel #endif -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, MAYBE_InvokeUi_UninstallDialog_Cancel) { ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, InvocationSourceMetrics) { +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewInteractiveUITest, + InvocationSourceMetrics) { base::HistogramTester histogram_tester; LoadTestExtension("extensions/uitest/extension_with_action_and_command"); ClickExtensionsMenuButton(); @@ -781,11 +784,11 @@ // https://crbug.com/1070305 is fixed. } -class ActivateWithReloadExtensionsMenuBrowserTest - : public ExtensionsMenuViewBrowserTest, +class ActivateWithReloadExtensionsMenuInteractiveUITest + : public ExtensionsMenuViewInteractiveUITest, public ::testing::WithParamInterface<bool> {}; -IN_PROC_BROWSER_TEST_P(ActivateWithReloadExtensionsMenuBrowserTest, +IN_PROC_BROWSER_TEST_P(ActivateWithReloadExtensionsMenuInteractiveUITest, ActivateWithReload) { ASSERT_TRUE(embedded_test_server()->Start()); LoadTestExtension("extensions/blocked_actions/content_scripts"); @@ -836,9 +839,9 @@ } INSTANTIATE_TEST_SUITE_P(AcceptDialog, - ActivateWithReloadExtensionsMenuBrowserTest, + ActivateWithReloadExtensionsMenuInteractiveUITest, testing::Values(true)); INSTANTIATE_TEST_SUITE_P(CancelDialog, - ActivateWithReloadExtensionsMenuBrowserTest, + ActivateWithReloadExtensionsMenuInteractiveUITest, testing::Values(false));
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc index 4819b75..aa302650 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc
@@ -94,7 +94,7 @@ }; // TODO(devlin): There are probably some tests from -// ExtensionsMenuViewBrowserTest that should move here (if they test the +// ExtensionsMenuViewInteractiveUITest that should move here (if they test the // toolbar container more than the menu). // Tests that invocation metrics are properly recorded when triggering
diff --git a/chrome/browser/ui/views/frame/browser_frame_ash.cc b/chrome/browser/ui/views/frame/browser_frame_ash.cc index 91ae945..055ef48b 100644 --- a/chrome/browser/ui/views/frame/browser_frame_ash.cc +++ b/chrome/browser/ui/views/frame/browser_frame_ash.cc
@@ -85,7 +85,8 @@ // For legacy reasons v1 apps (like Secure Shell) are allowed to consume keys // like brightness, volume, etc. Otherwise these keys are handled by the // Ash window manager. - window_state->SetCanConsumeSystemKeys(browser->deprecated_is_app()); + window_state->SetCanConsumeSystemKeys(browser->is_type_app() || + browser->is_type_app_popup()); full_restore::FullRestoreInfo::GetInstance()->OnWidgetInitialized( GetWidget()); @@ -183,10 +184,10 @@ // This is only needed for ash. For lacros, Exo tags the associated // ShellSurface as being of AppType::LACROS. + bool is_app = browser->is_type_app() || browser->is_type_app_popup(); params.init_properties_container.SetProperty( - aura::client::kAppType, - static_cast<int>(browser->deprecated_is_app() ? ash::AppType::CHROME_APP - : ash::AppType::BROWSER)); + aura::client::kAppType, static_cast<int>(is_app ? ash::AppType::CHROME_APP + : ash::AppType::BROWSER)); full_restore::ModifyWidgetParams(restore_id, ¶ms); // Override session restore bounds with Full Restore bounds if they exist.
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc index 77bb5dd..9646ad1 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
@@ -783,7 +783,8 @@ inactive_color = GetFrameColor(BrowserFrameActiveState::kInactive); } else if (browser_view()->GetIsWebAppType()) { active_color = browser_view()->browser()->app_controller()->GetThemeColor(); - } else if (!browser_view()->browser()->deprecated_is_app()) { + } else if (!browser_view()->browser()->is_type_app() && + !browser_view()->browser()->is_type_app_popup()) { // TODO(crbug.com/836128): Remove when System Web Apps flag is removed, as // the above web-app branch will render the theme color. active_color = SK_ColorWHITE;
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc index e33245ef..ca608ac 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
@@ -397,6 +397,7 @@ protected: bool is_page_info_v2_enabled() const { return GetParam(); } + base::test::ScopedFeatureList feature_list_; std::unique_ptr<ScopedTestingLocalState> testing_local_state_; std::unique_ptr<ScopedWebContentsTestHelper> web_contents_helper_; std::unique_ptr<views::ScopedViewsTestHelper> views_helper_; @@ -404,7 +405,6 @@ views::Widget* parent_window_ = nullptr; // Weak. Owned by the NativeWidget. std::unique_ptr<test::PageInfoBubbleViewTestApi> api_; - base::test::ScopedFeatureList feature_list_; }; base::Value ReadJson(base::StringPiece json) {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index 00323df..aa6136814 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -45,6 +45,7 @@ #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/profile_deletion_observer.h" +#include "chrome/test/base/ui_test_utils.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/tracker.h" #include "components/feature_engagement/test/test_tracker.h" @@ -325,26 +326,16 @@ // opened. void OpenProfileFromPicker(const base::FilePath& profile_path, bool open_settings) { - ProfilePickerHandler* handler = web_contents() - ->GetWebUI() - ->GetController() - ->GetAs<ProfilePickerUI>() - ->GetProfilePickerHandlerForTesting(); base::ListValue args; args.Append( base::Value::ToUniquePtrValue(util::FilePathToValue(profile_path))); - handler->HandleLaunchSelectedProfile(open_settings, &args); + profile_picker_handler()->HandleLaunchSelectedProfile(open_settings, &args); } // Simulates a click on "Browse as Guest". void OpenGuestFromPicker() { - ProfilePickerHandler* handler = web_contents() - ->GetWebUI() - ->GetController() - ->GetAs<ProfilePickerUI>() - ->GetProfilePickerHandlerForTesting(); base::ListValue args; - handler->HandleLaunchGuestProfile(&args); + profile_picker_handler()->HandleLaunchGuestProfile(&args); } // Creates a new profile without opening a browser. @@ -367,6 +358,17 @@ return path; } + // Returns profile picker webUI handler. Profile picker must be opened before + // calling this function. + ProfilePickerHandler* profile_picker_handler() { + DCHECK(ProfilePicker::IsOpen()); + return web_contents() + ->GetWebUI() + ->GetController() + ->GetAs<ProfilePickerUI>() + ->GetProfilePickerHandlerForTesting(); + } + private: base::CallbackListSubscription create_services_subscription_; base::test::ScopedFeatureList feature_list_; @@ -893,6 +895,38 @@ EXPECT_FALSE(ProfileSwitchPromoHasBeenShown(new_browser)); } +// Closes the default browser window before creating a new profile in the +// profile picker. +// Regression test for https://crbug.com/1144092. +IN_PROC_BROWSER_TEST_F(ProfilePickerCreationFlowBrowserTest, + CloseBrowserBeforeCreatingNewProfile) { + ASSERT_EQ(1u, BrowserList::GetInstance()->size()); + + // Open the picker. + ProfilePicker::Show(ProfilePicker::EntryPoint::kProfileMenuManageProfiles); + WaitForLayoutWithoutToolbar(); + WaitForLoadStop(web_contents(), GURL("chrome://profile-picker")); + + // Close the browser window. + BrowserList::GetInstance()->CloseAllBrowsersWithProfile(browser()->profile()); + ui_test_utils::WaitForBrowserToClose(browser()); + base::RunLoop().RunUntilIdle(); + ASSERT_EQ(0u, BrowserList::GetInstance()->size()); + + // Imitate creating a new profile through the profile picker. + ProfilePickerHandler* handler = profile_picker_handler(); + base::ListValue args; + args.Append(u"My Profile"); // Profile name. + args.Append(std::make_unique<base::Value>()); // Profile color. + args.Append(0); // Avatar index. + args.Append(false); // Create shortcut. + handler->HandleCreateProfile(&args); + + BrowserAddedWaiter(1u).Wait(); + EXPECT_EQ(1u, BrowserList::GetInstance()->size()); + WaitForPickerClosed(); +} + class ProfilePickerEnterpriseCreationFlowBrowserTest : public ProfilePickerCreationFlowBrowserTest { public: @@ -1355,11 +1389,7 @@ EXPECT_EQ(ProfilePicker::GetSwitchProfilePath(), other_path); // Simulate clicking on the confirm switch button. - ProfilePickerHandler* handler = web_contents() - ->GetWebUI() - ->GetController() - ->GetAs<ProfilePickerUI>() - ->GetProfilePickerHandlerForTesting(); + ProfilePickerHandler* handler = profile_picker_handler(); base::ListValue args; args.Append(base::Value::ToUniquePtrValue(util::FilePathToValue(other_path))); handler->HandleConfirmProfileSwitch(&args); @@ -1408,11 +1438,7 @@ EXPECT_EQ(ProfilePicker::GetSwitchProfilePath(), other_path); // Simulate clicking on the cancel button. - ProfilePickerHandler* handler = web_contents() - ->GetWebUI() - ->GetController() - ->GetAs<ProfilePickerUI>() - ->GetProfilePickerHandlerForTesting(); + ProfilePickerHandler* handler = profile_picker_handler(); base::ListValue args; handler->HandleCancelProfileSwitch(&args);
diff --git a/chrome/browser/ui/web_applications/web_app_guest_session_browsertest_chromeos.cc b/chrome/browser/ui/web_applications/web_app_guest_session_browsertest_chromeos.cc index 72a1774..8539dc3 100644 --- a/chrome/browser/ui/web_applications/web_app_guest_session_browsertest_chromeos.cc +++ b/chrome/browser/ui/web_applications/web_app_guest_session_browsertest_chromeos.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/web_applications/components/web_app_id_constants.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" +#include "chrome/browser/web_applications/test/with_crosapi_param.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/webui_url_constants.h" @@ -21,9 +22,13 @@ #include "ui/base/window_open_disposition.h" #include "url/gurl.h" +using web_app::test::CrosapiParam; +using web_app::test::WithCrosapiParam; + namespace web_app { -class WebAppGuestSessionBrowserTest : public InProcessBrowserTest { +class WebAppGuestSessionBrowserTest : public InProcessBrowserTest, + public WithCrosapiParam { void SetUpCommandLine(base::CommandLine* command_line) override { command_line->AppendSwitch(chromeos::switches::kGuestSession); command_line->AppendSwitch(::switches::kIncognito); @@ -35,7 +40,7 @@ }; // Test that the OS Settings app launches successfully. -IN_PROC_BROWSER_TEST_F(WebAppGuestSessionBrowserTest, LaunchOsSettings) { +IN_PROC_BROWSER_TEST_P(WebAppGuestSessionBrowserTest, LaunchOsSettings) { auto& system_web_app_manager = WebAppProvider::Get(browser()->profile())->system_web_app_manager(); system_web_app_manager.InstallSystemAppsForTesting(); @@ -54,4 +59,10 @@ EXPECT_EQ(GURL(chrome::kChromeUIOSSettingsURL), contents->GetVisibleURL()); } +INSTANTIATE_TEST_SUITE_P(All, + WebAppGuestSessionBrowserTest, + ::testing::Values(CrosapiParam::kDisabled, + CrosapiParam::kEnabled), + WithCrosapiParam::ParamToString); + } // namespace web_app
diff --git a/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc b/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc index 0134ec8..6b048ef 100644 --- a/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc +++ b/chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.cc
@@ -4,12 +4,14 @@ #include "chrome/browser/ui/webui/chromeos/emoji/emoji_page_handler.h" +#include "ash/constants/ash_features.h" #include "base/metrics/histogram_functions.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "base/trace_event/trace_event.h" #include "chrome/browser/ui/webui/chromeos/emoji/emoji_ui.h" +#include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/ime/chromeos/ime_bridge.h" namespace chromeos { @@ -36,6 +38,15 @@ base::UmaHistogramMediumTimes("InputMethod.SystemEmojiPicker.Delay", delay); } +void copyEmojiToClipboard(const std::string& emoji_to_copy) { + if (base::FeatureList::IsEnabled( + chromeos::features::kImeSystemEmojiPickerClipboard)) { + auto clipboard = std::make_unique<ui::ScopedClipboardWriter>( + ui::ClipboardBuffer::kCopyPaste, nullptr); + clipboard->WriteText(base::UTF8ToUTF16(emoji_to_copy)); + } +} + EmojiPageHandler::EmojiPageHandler( mojo::PendingReceiver<emoji_picker::mojom::PageHandler> receiver, content::WebUI* web_ui, @@ -82,6 +93,7 @@ ui::IMEBridge::Get()->GetInputContextHandler()->GetInputMethod(); if (!input_method) { DLOG(WARNING) << "no input_method found"; + copyEmojiToClipboard(emoji_to_insert); return; } @@ -89,12 +101,14 @@ if (!input_client) { DLOG(WARNING) << "no input_client found"; + copyEmojiToClipboard(emoji_to_insert); return; } if (input_client->GetTextInputType() == ui::TextInputType::TEXT_INPUT_TYPE_NONE) { DLOG(WARNING) << "attempt to insert into input_client with type none"; + copyEmojiToClipboard(emoji_to_insert); return; }
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index ec18fe4..18e6dcea 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -52,11 +52,11 @@ #include "chrome/browser/ash/login/users/chrome_user_manager_util.h" #include "chrome/browser/ash/login/wizard_context.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_chromeos.h" +#include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h" #include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/webui/flags/flags_ui_handler.cc b/chrome/browser/ui/webui/flags/flags_ui_handler.cc index 2ecf7770..63814f4bd 100644 --- a/chrome/browser/ui/webui/flags/flags_ui_handler.cc +++ b/chrome/browser/ui/webui/flags/flags_ui_handler.cc
@@ -76,21 +76,22 @@ void FlagsUIHandler::SendExperimentalFeatures() { base::DictionaryValue results; - std::unique_ptr<base::ListValue> supported_features(new base::ListValue); - std::unique_ptr<base::ListValue> unsupported_features(new base::ListValue); + base::Value::ListStorage supported_features; + base::Value::ListStorage unsupported_features; if (deprecated_features_only_) { about_flags::GetFlagFeatureEntriesForDeprecatedPage( - flags_storage_.get(), access_, supported_features.get(), - unsupported_features.get()); + flags_storage_.get(), access_, supported_features, + unsupported_features); } else { about_flags::GetFlagFeatureEntries(flags_storage_.get(), access_, - supported_features.get(), - unsupported_features.get()); + supported_features, + unsupported_features); } - results.Set(flags_ui::kSupportedFeatures, std::move(supported_features)); - results.Set(flags_ui::kUnsupportedFeatures, std::move(unsupported_features)); + results.SetKey(flags_ui::kSupportedFeatures, base::Value(supported_features)); + results.SetKey(flags_ui::kUnsupportedFeatures, + base::Value(unsupported_features)); results.SetBoolean(flags_ui::kNeedsRestart, about_flags::IsRestartNeededToCommitChanges()); results.SetBoolean(flags_ui::kShowOwnerWarning,
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc index 0f10acb..a555955c 100644 --- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc +++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -16,7 +16,6 @@ #include "chrome/browser/lookalikes/lookalike_url_blocking_page.h" #include "chrome/browser/lookalikes/lookalike_url_controller_client.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/safe_browsing/test_safe_browsing_blocking_page_quiet.h" #include "chrome/browser/safe_browsing/ui_manager.h" @@ -28,6 +27,7 @@ #include "components/captive_portal/core/buildflags.h" #include "components/grit/dev_ui_components_resources.h" #include "components/lookalikes/core/lookalike_url_util.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" #include "components/safe_browsing/core/browser/db/database_manager.h" #include "components/security_interstitials/content/bad_clock_blocking_page.h" #include "components/security_interstitials/content/blocked_interception_blocking_page.h"
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.cc b/chrome/browser/ui/webui/management/management_ui_handler.cc index d4aad45..736fbef 100644 --- a/chrome/browser/ui/webui/management/management_ui_handler.cc +++ b/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -49,10 +49,10 @@ #include "chrome/browser/ash/policy/dlp/dlp_rules_manager.h" #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/ash/policy/handlers/minimum_version_policy_handler.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service.h" +#include "chrome/browser/ash/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/cros_settings.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h" -#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h" #include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h" #include "chrome/browser/chromeos/policy/status_collector/status_collector.h" #include "chrome/browser/chromeos/policy/uploading/status_uploader.h"
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc index 091a989b..8da33c38 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -94,9 +94,9 @@ #include "chrome/browser/ash/policy/core/device_cloud_policy_store_chromeos.h" #include "chrome/browser/ash/policy/core/device_local_account_policy_service.h" #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.h" +#include "chrome/browser/ash/policy/off_hours/device_off_hours_controller.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/chromeos/policy/off_hours/device_off_hours_controller.h" #include "chromeos/dbus/util/version_loader.h" #include "components/user_manager/user_manager.h" #else
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.h b/chrome/browser/ui/webui/signin/profile_picker_handler.h index f5d0b7e..a95930b 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.h +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.h
@@ -37,6 +37,8 @@ private: friend class ProfilePickerHandlerTest; friend class ProfilePickerCreationFlowBrowserTest; + FRIEND_TEST_ALL_PREFIXES(ProfilePickerCreationFlowBrowserTest, + CloseBrowserBeforeCreatingNewProfile); FRIEND_TEST_ALL_PREFIXES( ProfilePickerIntegratedEnterpriseCreationFlowBrowserTest, CreateSignedInProfileSigninAlreadyExists_ConfirmSwitch);
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 7777f37d..c596497a 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -201,6 +201,13 @@ "//content/public/browser", "//url", ] + if (is_chromeos_ash) { + sources += [ + "test/with_crosapi_param.cc", + "test/with_crosapi_param.h", + ] + deps += [ "//ash/constants" ] + } } # This test_support library doesn't use extensions.
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host.h b/chrome/browser/web_applications/app_service/web_apps_publisher_host.h index 27733234..638a7b6f 100644 --- a/chrome/browser/web_applications/app_service/web_apps_publisher_host.h +++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host.h
@@ -76,7 +76,6 @@ void SetPermission(const std::string& app_id, apps::mojom::PermissionPtr permission); - void OpenNativeSettings(const std::string& app_id); void SetWindowMode(const std::string& app_id, apps::mojom::WindowMode window_mode); @@ -87,6 +86,7 @@ private: FRIEND_TEST_ALL_PREFIXES(WebAppsPublisherHostBrowserTest, PauseUnpause); + FRIEND_TEST_ALL_PREFIXES(WebAppsPublisherHostBrowserTest, OpenNativeSettings); void OnReady(); @@ -104,6 +104,7 @@ apps::mojom::IconType icon_type, int32_t size_hint_in_dip, LoadIconCallback callback) override; + void OpenNativeSettings(const std::string& app_id) override; // WebAppPublisherHelper::Delegate: void PublishWebApps(std::vector<apps::mojom::AppPtr> apps) override;
diff --git a/chrome/browser/web_applications/test/with_crosapi_param.cc b/chrome/browser/web_applications/test/with_crosapi_param.cc new file mode 100644 index 0000000..b5f5280 --- /dev/null +++ b/chrome/browser/web_applications/test/with_crosapi_param.cc
@@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/web_applications/test/with_crosapi_param.h" + +#include "ash/constants/ash_features.h" +#include "chrome/common/chrome_features.h" + +namespace web_app { +namespace test { + +WithCrosapiParam::WithCrosapiParam() { + if (GetParam() == CrosapiParam::kEnabled) { + scoped_feature_list_.InitWithFeatures( + {chromeos::features::kLacrosSupport, features::kWebAppsCrosapi}, {}); + } else { + scoped_feature_list_.InitWithFeatures({}, {features::kWebAppsCrosapi}); + } +} + +WithCrosapiParam::~WithCrosapiParam() = default; + +// static +std::string WithCrosapiParam::ParamToString( + testing::TestParamInfo<CrosapiParam> param) { + switch (param.param) { + case CrosapiParam::kDisabled: + return "WebAppsCrosapiDisabled"; + case CrosapiParam::kEnabled: + return "WebAppsCrosapiEnabled"; + } +} + +} // namespace test +} // namespace web_app
diff --git a/chrome/browser/web_applications/test/with_crosapi_param.h b/chrome/browser/web_applications/test/with_crosapi_param.h new file mode 100644 index 0000000..0225a6e --- /dev/null +++ b/chrome/browser/web_applications/test/with_crosapi_param.h
@@ -0,0 +1,35 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_WITH_CROSAPI_PARAM_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_TEST_WITH_CROSAPI_PARAM_H_ + +#include <string> + +#include "base/test/scoped_feature_list.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace web_app { +namespace test { + +enum class CrosapiParam { + kDisabled = 0, + kEnabled = 1, +}; + +class WithCrosapiParam : public testing::WithParamInterface<CrosapiParam> { + public: + WithCrosapiParam(); + ~WithCrosapiParam() override; + + static std::string ParamToString(testing::TestParamInfo<CrosapiParam> param); + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +} // namespace test +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_TEST_WITH_CROSAPI_PARAM_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 69568cd..199ffa31 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2867,7 +2867,6 @@ "../browser/ui/views/extensions/extension_install_friction_dialog_view_browsertest.cc", "../browser/ui/views/extensions/extension_installed_bubble_view_browsertest.cc", "../browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc", - "../browser/ui/views/extensions/extensions_menu_view_browsertest.cc", "../browser/ui/views/extensions/extensions_side_panel_controller_browsertest.cc", "../browser/ui/views/extensions/extensions_toolbar_browsertest.cc", "../browser/ui/views/extensions/extensions_toolbar_browsertest.h", @@ -3288,6 +3287,18 @@ "../browser/ash/policy/handlers/restore_on_startup_browsertest_chromeos.cc", "../browser/ash/policy/handlers/site_isolation_flag_handling_browsertest.cc", "../browser/ash/policy/handlers/variations_service_policy_browsertest.cc", + "../browser/ash/policy/login/blocking_login_browsertest.cc", + "../browser/ash/policy/login/device_login_screen_policy_browsertest.cc", + "../browser/ash/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc", + "../browser/ash/policy/login/login_policy_test_base.cc", + "../browser/ash/policy/login/login_policy_test_base.h", + "../browser/ash/policy/login/login_screen_accessibility_policy_browsertest.cc", + "../browser/ash/policy/login/login_screen_default_policy_browsertest.cc", + "../browser/ash/policy/login/signin_profile_extensions_policy_browsertest.cc", + "../browser/ash/policy/login/signin_profile_extensions_policy_test_base.cc", + "../browser/ash/policy/login/signin_profile_extensions_policy_test_base.h", + "../browser/ash/policy/networking/network_policy_application_browsertest.cc", + "../browser/ash/policy/networking/policy_certs_browsertest.cc", "../browser/ash/profiles/profile_helper_browsertest.cc", "../browser/ash/remote_apps/remote_apps_impl_browsertest.cc", "../browser/ash/remote_apps/remote_apps_manager_browsertest.cc", @@ -3351,18 +3362,6 @@ "../browser/chromeos/platform_keys/platform_keys_service_browsertest.cc", "../browser/chromeos/platform_keys/platform_keys_service_test_util.cc", "../browser/chromeos/platform_keys/platform_keys_service_test_util.h", - "../browser/chromeos/policy/login/blocking_login_browsertest.cc", - "../browser/chromeos/policy/login/device_login_screen_policy_browsertest.cc", - "../browser/chromeos/policy/login/force_maximize_on_first_run_chromeos_browsertest.cc", - "../browser/chromeos/policy/login/login_policy_test_base.cc", - "../browser/chromeos/policy/login/login_policy_test_base.h", - "../browser/chromeos/policy/login/login_screen_accessibility_policy_browsertest.cc", - "../browser/chromeos/policy/login/login_screen_default_policy_browsertest.cc", - "../browser/chromeos/policy/login/signin_profile_extensions_policy_browsertest.cc", - "../browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.cc", - "../browser/chromeos/policy/login/signin_profile_extensions_policy_test_base.h", - "../browser/chromeos/policy/networking/network_policy_application_browsertest.cc", - "../browser/chromeos/policy/networking/policy_certs_browsertest.cc", "../browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc", "../browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc", "../browser/chromeos/preferences_chromeos_browsertest.cc", @@ -3586,6 +3585,7 @@ ] deps += [ "//chrome/browser/safe_browsing:metrics_collector", + "//components/safe_browsing/content/browser:safe_browsing_blocking_page", "//components/safe_browsing/core/common/fbs:client_model", ] } @@ -4832,6 +4832,7 @@ "../browser/ui/bookmarks/bookmark_editor_unittest.cc", "../browser/ui/bookmarks/bookmark_ui_utils_desktop_unittest.cc", "../browser/ui/bookmarks/recently_used_folders_combo_model_unittest.cc", + "../browser/ui/browser_navigator_unittest.cc", "../browser/ui/hats/hats_helper_unittest.cc", "../browser/ui/hats/trust_safety_sentiment_service_factory_unittest.cc", "../browser/ui/hats/trust_safety_sentiment_service_unittest.cc", @@ -6801,6 +6802,7 @@ ] deps += [ + "//components/safe_browsing/content/browser:safe_browsing_blocking_page", "//components/safe_browsing/content/common:file_type_policies", "//components/safe_browsing/content/common:file_type_policies_test_support", ] @@ -7550,7 +7552,11 @@ "permissions/permission_request_manager_test_api.h", ] if (is_mac) { - sources += [ "base/in_process_browser_test_mac.mm" ] + sources += [ + "../browser/ui/test/test_browser_dialog_mac.h", + "../browser/ui/test/test_browser_dialog_mac.mm", + "base/in_process_browser_test_mac.mm", + ] } configs += [ "//build/config:precompiled_headers" ] @@ -7822,10 +7828,17 @@ "../browser/ui/signin_view_controller_interactive_uitest.cc", "../browser/ui/startup/invalid_user_data_dir_interactive_uitest.cc", "../browser/ui/startup/startup_browser_creator_interactive_uitest.cc", + "../browser/ui/test/test_browser_dialog.cc", + "../browser/ui/test/test_browser_dialog.h", + "../browser/ui/test/test_browser_ui.cc", + "../browser/ui/test/test_browser_ui.h", "../browser/ui/translate/translate_bubble_test_utils.h", "../browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc", "../browser/ui/views/content_test_utils.cc", "../browser/ui/views/content_test_utils.h", + "../browser/ui/views/extensions/extensions_menu_view_interactive_uitest.cc", + "../browser/ui/views/extensions/extensions_toolbar_browsertest.cc", + "../browser/ui/views/extensions/extensions_toolbar_browsertest.h", "../browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc", "../browser/ui/views/web_dialog_view_browsertest.cc", "../browser/webauth_interactive_uitest.cc", @@ -7951,6 +7964,7 @@ "//ui/base:base_interactive_ui_tests", "//ui/base:test_support", "//ui/base/clipboard:clipboard_test_support", + "//ui/compositor:test_support", "//ui/display:display_manager_test_api", "//ui/display:test_support", "//ui/display/manager",
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index 9bcc649..b5826d5a 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -394,32 +394,25 @@ Status ConfigureHeadlessSession(Session* session, const Capabilities& capabilities) { - if (!session->chrome->GetBrowserInfo()->is_headless) { - // session is not headless - return Status(kOk); - } - if (capabilities.prefs) { + if (session->chrome->GetBrowserInfo()->is_headless) { std::string download_directory; - if (capabilities.prefs->GetString("download.default_directory", - &download_directory)) { + if (capabilities.prefs && + (capabilities.prefs->GetString("download.default_directory", + &download_directory) || + capabilities.prefs->GetStringWithoutPathExpansion( + "download.default_directory", &download_directory))) session->headless_download_directory = std::make_unique<std::string>(download_directory); - } else { - std::string* download_directory_str = - capabilities.prefs->FindStringKey("download.default_directory"); - if (download_directory_str) { - session->headless_download_directory = - std::make_unique<std::string>(*download_directory_str); - } - } - } else { - session->headless_download_directory = std::make_unique<std::string>("."); + else + session->headless_download_directory = std::make_unique<std::string>("."); + WebView* first_view; + session->chrome->GetWebViewById(session->window, &first_view); + Status status = first_view->OverrideDownloadDirectoryIfNeeded( + *session->headless_download_directory); + return status; } - WebView* first_view; - session->chrome->GetWebViewById(session->window, &first_view); - Status status = first_view->OverrideDownloadDirectoryIfNeeded( - *session->headless_download_directory); - return status; + // session is not headless + return Status(kOk); } } // namespace internal
diff --git a/chrome/test/data/webui/chromeos/diagnostics/memory_card_test.js b/chrome/test/data/webui/chromeos/diagnostics/memory_card_test.js index dea8153..3717ca28 100644 --- a/chrome/test/data/webui/chromeos/diagnostics/memory_card_test.js +++ b/chrome/test/data/webui/chromeos/diagnostics/memory_card_test.js
@@ -6,13 +6,13 @@ import {MemoryUsage} from 'chrome://diagnostics/diagnostics_types.js'; import {convertKibToGibDecimalString} from 'chrome://diagnostics/diagnostics_utils.js'; -import {fakeMemoryUsage} from 'chrome://diagnostics/fake_data.js'; +import {fakeMemoryUsage, fakeMemoryUsageLowAvailableMemory} from 'chrome://diagnostics/fake_data.js'; import {FakeSystemDataProvider} from 'chrome://diagnostics/fake_system_data_provider.js'; import {setSystemDataProviderForTesting} from 'chrome://diagnostics/mojo_interface_provider.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js'; -import {flushTasks, isChildVisible} from '../../test_util.m.js'; +import {flushTasks, isChildVisible, isVisible} from '../../test_util.m.js'; import * as dx_utils from './diagnostics_test_utils.js'; @@ -112,4 +112,16 @@ assertFalse(isChildVisible(diagnosticsCard, '.data-points')); }); }); + + test('TestDisabledWhenAvailableMemoryLessThan500MB', () => { + return initializeMemoryCard(fakeMemoryUsageLowAvailableMemory).then(() => { + const routineSectionElement = getRoutineSection(); + assertEquals( + routineSectionElement.additionalMessage, + loadTimeData.getString('notEnoughAvailableMemoryMessage')); + assertTrue(isRunTestsButtonDisabled()); + assertTrue(isVisible(/** @type {!HTMLElement} */ ( + routineSectionElement.$$('#messageIcon')))); + }); + }); }
diff --git a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_browsertest.js b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_browsertest.js index bb8049e..001370a 100644 --- a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_browsertest.js +++ b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_browsertest.js
@@ -22,7 +22,11 @@ /** @override */ get featureList() { - return {enabled: ['chromeos::features::kImeSystemEmojiPicker']}; + return { + enabled: + ['chromeos::features::kImeSystemEmojiPicker,' + + 'chromeos::features::kImeSystemEmojiPickerClipboard'] + }; } }
diff --git a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_test.js b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_test.js index ee8dc9a..66b4369 100644 --- a/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_test.js +++ b/chrome/test/data/webui/chromeos/emoji_picker/emoji_picker_test.js
@@ -11,7 +11,7 @@ import {assert} from 'chrome://resources/js/assert.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {assertFalse, assertGT, assertLT, assertTrue} from '../../chai_assert.js'; +import {assertEquals, assertFalse, assertGT, assertLT, assertTrue} from '../../chai_assert.js'; import {deepQuerySelector, dispatchMouseEvent, timeout, waitForCondition, waitForEvent, waitWithTimeout} from './emoji_picker_test_util.js'; @@ -141,6 +141,31 @@ assertTrue(recentText.includes(String.fromCodePoint(128512))); }); + test( + 'clicking an emoji with no text field should copy it to the clipboard', + async () => { + // Note: this whole test has no text field, so we should always copy to + // the clipboard. + EmojiPickerApiProxyImpl.getInstance().isIncognitoTextField = () => + new Promise((resolve) => resolve({incognito: false})); + // yield to allow emoji-group and emoji buttons to render. + const emojiButton = await waitForCondition( + () => findInEmojiPicker( + '[data-group="0"] > emoji-group', 'emoji-button', 'button')); + emojiButton.click(); + + // wait until emoji exists in recently used section. + const recentlyUsed = await waitForCondition( + () => findInEmojiPicker( + '[data-group=history] > emoji-group', 'emoji-button', + 'button')); + + // check text is correct. + const recentText = recentlyUsed.innerText; + await navigator.clipboard.readText().then( + text => assertEquals(String.fromCodePoint(128512), text)); + }); + test('recently-used should have variants for variant emoji', async () => { EmojiPickerApiProxyImpl.getInstance().isIncognitoTextField = () => new Promise((resolve) => resolve({incognito: false}));
diff --git a/chromecast/net/connectivity_checker_impl.cc b/chromecast/net/connectivity_checker_impl.cc index 676a38a..a5a2002 100644 --- a/chromecast/net/connectivity_checker_impl.cc +++ b/chromecast/net/connectivity_checker_impl.cc
@@ -27,6 +27,7 @@ #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/network_change_manager.mojom.h" +#include "services/network/public/mojom/url_response_head.mojom.h" namespace chromecast {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index f71cb2e..5aa5b6ab 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -773,6 +773,9 @@ <message name="IDS_DIAGNOSTICS_BATTERY_FULL_MESSAGE" desc="The message shown when the battery is full and the charge test can not be run."> To test battery charging rate, let your battery drain for a short period </message> + <message name="IDS_DIAGNOSTICS_NOT_ENOUGH_AVAILABLE_MEMORY" desc="The message shown when the amount of available memory on a device is less than 500 MB and the memory test can not be run."> + You need at least 500 MB free to run a Memory test. To free up space, go to Settings > Storage management. + </message> <message name="IDS_DIAGNOSTICS_BATTERY_HEALTH_LABEL" desc="The label for a battery's health."> Battery health </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_NOT_ENOUGH_AVAILABLE_MEMORY.png.sha1 b/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_NOT_ENOUGH_AVAILABLE_MEMORY.png.sha1 new file mode 100644 index 0000000..d9262fe --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_NOT_ENOUGH_AVAILABLE_MEMORY.png.sha1
@@ -0,0 +1 @@ +eca210c861fe7b37b8b1a0445975d84f7ad05638 \ No newline at end of file
diff --git a/chromeos/components/phonehub/BUILD.gn b/chromeos/components/phonehub/BUILD.gn index 577f8c47..42219c6 100644 --- a/chromeos/components/phonehub/BUILD.gn +++ b/chromeos/components/phonehub/BUILD.gn
@@ -88,6 +88,9 @@ "phone_status_processor.h", "pref_names.cc", "pref_names.h", + "recent_app_click_observer.h", + "recent_apps_interaction_handler.cc", + "recent_apps_interaction_handler.h", "tether_controller.cc", "tether_controller.h", "tether_controller_impl.cc", @@ -149,6 +152,8 @@ "fake_onboarding_ui_tracker.h", "fake_phone_hub_manager.cc", "fake_phone_hub_manager.h", + "fake_recent_apps_interaction_handler.cc", + "fake_recent_apps_interaction_handler.h", "fake_tether_controller.cc", "fake_tether_controller.h", "fake_user_action_recorder.cc", @@ -214,6 +219,7 @@ "onboarding_ui_tracker_impl_unittest.cc", "phone_status_model_unittest.cc", "phone_status_processor_unittest.cc", + "recent_apps_interaction_handler_unittest.cc", "tether_controller_impl_unittest.cc", "user_action_recorder_impl_unittest.cc", ]
diff --git a/chromeos/components/phonehub/fake_phone_hub_manager.cc b/chromeos/components/phonehub/fake_phone_hub_manager.cc index fdab76e..41e4bd1 100644 --- a/chromeos/components/phonehub/fake_phone_hub_manager.cc +++ b/chromeos/components/phonehub/fake_phone_hub_manager.cc
@@ -51,6 +51,13 @@ return &mutable_phone_model_; } +RecentAppsInteractionHandler* +FakePhoneHubManager::GetRecentAppsInteractionHandler() { + return features::IsPhoneHubRecentAppsEnabled() + ? &fake_recent_apps_interaction_handler_ + : nullptr; +} + TetherController* FakePhoneHubManager::GetTetherController() { return &fake_tether_controller_; }
diff --git a/chromeos/components/phonehub/fake_phone_hub_manager.h b/chromeos/components/phonehub/fake_phone_hub_manager.h index 2b929892..2f35079 100644 --- a/chromeos/components/phonehub/fake_phone_hub_manager.h +++ b/chromeos/components/phonehub/fake_phone_hub_manager.h
@@ -14,6 +14,7 @@ #include "chromeos/components/phonehub/fake_notification_interaction_handler.h" #include "chromeos/components/phonehub/fake_notification_manager.h" #include "chromeos/components/phonehub/fake_onboarding_ui_tracker.h" +#include "chromeos/components/phonehub/fake_recent_apps_interaction_handler.h" #include "chromeos/components/phonehub/fake_tether_controller.h" #include "chromeos/components/phonehub/fake_user_action_recorder.h" #include "chromeos/components/phonehub/mutable_phone_model.h" @@ -56,6 +57,10 @@ return &fake_onboarding_ui_tracker_; } + FakeRecentAppsInteractionHandler* fake_recent_apps_interaction_handler() { + return &fake_recent_apps_interaction_handler_; + } + MutablePhoneModel* mutable_phone_model() { return &mutable_phone_model_; } FakeTetherController* fake_tether_controller() { @@ -85,6 +90,7 @@ NotificationManager* GetNotificationManager() override; OnboardingUiTracker* GetOnboardingUiTracker() override; PhoneModel* GetPhoneModel() override; + RecentAppsInteractionHandler* GetRecentAppsInteractionHandler() override; TetherController* GetTetherController() override; ConnectionScheduler* GetConnectionScheduler() override; UserActionRecorder* GetUserActionRecorder() override; @@ -97,6 +103,7 @@ FakeNotificationManager fake_notification_manager_; FakeOnboardingUiTracker fake_onboarding_ui_tracker_; MutablePhoneModel mutable_phone_model_; + FakeRecentAppsInteractionHandler fake_recent_apps_interaction_handler_; FakeTetherController fake_tether_controller_; FakeConnectionScheduler fake_connection_scheduler_; FakeUserActionRecorder fake_user_action_recorder_;
diff --git a/chromeos/components/phonehub/fake_recent_apps_interaction_handler.cc b/chromeos/components/phonehub/fake_recent_apps_interaction_handler.cc new file mode 100644 index 0000000..8d0b701 --- /dev/null +++ b/chromeos/components/phonehub/fake_recent_apps_interaction_handler.cc
@@ -0,0 +1,31 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/phonehub/fake_recent_apps_interaction_handler.h" +#include "chromeos/components/phonehub/notification.h" + +namespace chromeos { +namespace phonehub { + +FakeRecentAppsInteractionHandler::FakeRecentAppsInteractionHandler() = default; + +FakeRecentAppsInteractionHandler::~FakeRecentAppsInteractionHandler() = default; + +void FakeRecentAppsInteractionHandler::NotifyRecentAppClicked( + const Notification::AppMetadata& app_metadata) { + handled_recent_apps_count_++; +} + +void FakeRecentAppsInteractionHandler::AddRecentAppClickObserver( + RecentAppClickObserver* observer) { + recent_app_click_observer_count_++; +} + +void FakeRecentAppsInteractionHandler::RemoveRecentAppClickObserver( + RecentAppClickObserver* observer) { + recent_app_click_observer_count_--; +} + +} // namespace phonehub +} // namespace chromeos
diff --git a/chromeos/components/phonehub/fake_recent_apps_interaction_handler.h b/chromeos/components/phonehub/fake_recent_apps_interaction_handler.h new file mode 100644 index 0000000..95f64d23 --- /dev/null +++ b/chromeos/components/phonehub/fake_recent_apps_interaction_handler.h
@@ -0,0 +1,46 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_PHONEHUB_FAKE_RECENT_APPS_INTERACTION_HANDLER_H_ +#define CHROMEOS_COMPONENTS_PHONEHUB_FAKE_RECENT_APPS_INTERACTION_HANDLER_H_ + +#include <stdint.h> + +#include "chromeos/components/phonehub/notification.h" +#include "chromeos/components/phonehub/recent_apps_interaction_handler.h" + +namespace chromeos { +namespace phonehub { + +class FakeRecentAppsInteractionHandler : public RecentAppsInteractionHandler { + public: + FakeRecentAppsInteractionHandler(); + FakeRecentAppsInteractionHandler(const FakeRecentAppsInteractionHandler&) = + delete; + FakeRecentAppsInteractionHandler* operator=( + const FakeRecentAppsInteractionHandler&) = delete; + ~FakeRecentAppsInteractionHandler() override; + + size_t handled_recent_apps_count() const { + return handled_recent_apps_count_; + } + + size_t recent_app_click_observer_count() const { + return recent_app_click_observer_count_; + } + + void NotifyRecentAppClicked( + const Notification::AppMetadata& app_metadata) override; + void AddRecentAppClickObserver(RecentAppClickObserver* observer) override; + void RemoveRecentAppClickObserver(RecentAppClickObserver* observer) override; + + private: + size_t handled_recent_apps_count_ = 0; + size_t recent_app_click_observer_count_ = 0; +}; + +} // namespace phonehub +} // namespace chromeos + +#endif // CHROMEOS_COMPONENTS_PHONEHUB_FAKE_RECENT_APPS_INTERACTION_HANDLER_H_
diff --git a/chromeos/components/phonehub/phone_hub_manager.h b/chromeos/components/phonehub/phone_hub_manager.h index 6e57d39..6a88dd2e 100644 --- a/chromeos/components/phonehub/phone_hub_manager.h +++ b/chromeos/components/phonehub/phone_hub_manager.h
@@ -19,6 +19,7 @@ class NotificationInteractionHandler; class OnboardingUiTracker; class PhoneModel; +class RecentAppsInteractionHandler; class TetherController; class UserActionRecorder; class BrowserTabsModelProvider; @@ -44,6 +45,7 @@ virtual NotificationManager* GetNotificationManager() = 0; virtual OnboardingUiTracker* GetOnboardingUiTracker() = 0; virtual PhoneModel* GetPhoneModel() = 0; + virtual RecentAppsInteractionHandler* GetRecentAppsInteractionHandler() = 0; virtual TetherController* GetTetherController() = 0; virtual UserActionRecorder* GetUserActionRecorder() = 0;
diff --git a/chromeos/components/phonehub/phone_hub_manager_impl.cc b/chromeos/components/phonehub/phone_hub_manager_impl.cc index befe0d00..87430fb 100644 --- a/chromeos/components/phonehub/phone_hub_manager_impl.cc +++ b/chromeos/components/phonehub/phone_hub_manager_impl.cc
@@ -26,6 +26,7 @@ #include "chromeos/components/phonehub/onboarding_ui_tracker_impl.h" #include "chromeos/components/phonehub/phone_model.h" #include "chromeos/components/phonehub/phone_status_processor.h" +#include "chromeos/components/phonehub/recent_apps_interaction_handler.h" #include "chromeos/components/phonehub/tether_controller_impl.h" #include "chromeos/components/phonehub/user_action_recorder_impl.h" #include "chromeos/dbus/power/power_manager_client.h" @@ -114,6 +115,10 @@ notification_processor_.get(), multidevice_setup_client, phone_model_.get())), + recent_apps_interaction_handler_( + features::IsPhoneHubRecentAppsEnabled() + ? std::make_unique<RecentAppsInteractionHandler>() + : nullptr), tether_controller_( std::make_unique<TetherControllerImpl>(phone_model_.get(), user_action_recorder_.get(), @@ -182,6 +187,11 @@ return phone_model_.get(); } +RecentAppsInteractionHandler* +PhoneHubManagerImpl::GetRecentAppsInteractionHandler() { + return recent_apps_interaction_handler_.get(); +} + TetherController* PhoneHubManagerImpl::GetTetherController() { return tether_controller_.get(); } @@ -190,8 +200,8 @@ return user_action_recorder_.get(); } -// These should be destroyed in the opposite order of how these objects are -// initialized in the constructor. +// NOTE: These should be destroyed in the opposite order of how these objects +// are initialized in the constructor. void PhoneHubManagerImpl::Shutdown() { camera_roll_manager_.reset(); invalid_connection_disconnector_.reset(); @@ -199,6 +209,7 @@ browser_tabs_model_controller_.reset(); browser_tabs_model_provider_.reset(); tether_controller_.reset(); + recent_apps_interaction_handler_.reset(); phone_status_processor_.reset(); notification_processor_.reset(); onboarding_ui_tracker_.reset();
diff --git a/chromeos/components/phonehub/phone_hub_manager_impl.h b/chromeos/components/phonehub/phone_hub_manager_impl.h index 3fded4a8..18e154a 100644 --- a/chromeos/components/phonehub/phone_hub_manager_impl.h +++ b/chromeos/components/phonehub/phone_hub_manager_impl.h
@@ -67,6 +67,7 @@ NotificationManager* GetNotificationManager() override; OnboardingUiTracker* GetOnboardingUiTracker() override; PhoneModel* GetPhoneModel() override; + RecentAppsInteractionHandler* GetRecentAppsInteractionHandler() override; TetherController* GetTetherController() override; UserActionRecorder* GetUserActionRecorder() override; @@ -91,6 +92,8 @@ std::unique_ptr<OnboardingUiTracker> onboarding_ui_tracker_; std::unique_ptr<NotificationProcessor> notification_processor_; std::unique_ptr<PhoneStatusProcessor> phone_status_processor_; + std::unique_ptr<RecentAppsInteractionHandler> + recent_apps_interaction_handler_; std::unique_ptr<TetherController> tether_controller_; std::unique_ptr<BrowserTabsModelProvider> browser_tabs_model_provider_; std::unique_ptr<BrowserTabsModelController> browser_tabs_model_controller_;
diff --git a/chromeos/components/phonehub/recent_app_click_observer.h b/chromeos/components/phonehub/recent_app_click_observer.h new file mode 100644 index 0000000..7e44739 --- /dev/null +++ b/chromeos/components/phonehub/recent_app_click_observer.h
@@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_PHONEHUB_RECENT_APP_CLICK_OBSERVER_H_ +#define CHROMEOS_COMPONENTS_PHONEHUB_RECENT_APP_CLICK_OBSERVER_H_ + +#include "base/observer_list_types.h" +#include "chromeos/components/phonehub/notification.h" + +namespace chromeos { +namespace phonehub { + +// Interface used to listen for a recent app click. +class RecentAppClickObserver : public base::CheckedObserver { + public: + ~RecentAppClickObserver() override = default; + // Called when the user clicks the recent app which has an open + // action in the PhoneHub. + virtual void OnRecentAppClicked( + const Notification::AppMetadata& app_metadata) = 0; +}; + +} // namespace phonehub +} // namespace chromeos + +#endif // CHROMEOS_COMPONENTS_PHONEHUB_RECENT_APP_CLICK_OBSERVER_H_
diff --git a/chromeos/components/phonehub/recent_apps_interaction_handler.cc b/chromeos/components/phonehub/recent_apps_interaction_handler.cc new file mode 100644 index 0000000..245b29cd --- /dev/null +++ b/chromeos/components/phonehub/recent_apps_interaction_handler.cc
@@ -0,0 +1,32 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/phonehub/recent_apps_interaction_handler.h" +#include "chromeos/components/phonehub/notification.h" + +namespace chromeos { +namespace phonehub { + +RecentAppsInteractionHandler::RecentAppsInteractionHandler() = default; + +RecentAppsInteractionHandler::~RecentAppsInteractionHandler() = default; + +void RecentAppsInteractionHandler::AddRecentAppClickObserver( + RecentAppClickObserver* observer) { + observer_list_.AddObserver(observer); +} + +void RecentAppsInteractionHandler::RemoveRecentAppClickObserver( + RecentAppClickObserver* observer) { + observer_list_.RemoveObserver(observer); +} + +void RecentAppsInteractionHandler::NotifyRecentAppClicked( + const Notification::AppMetadata& app_metadata) { + for (auto& observer : observer_list_) + observer.OnRecentAppClicked(app_metadata); +} + +} // namespace phonehub +} // namespace chromeos
diff --git a/chromeos/components/phonehub/recent_apps_interaction_handler.h b/chromeos/components/phonehub/recent_apps_interaction_handler.h new file mode 100644 index 0000000..793a5f7 --- /dev/null +++ b/chromeos/components/phonehub/recent_apps_interaction_handler.h
@@ -0,0 +1,43 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_PHONEHUB_RECENT_APPS_INTERACTION_HANDLER_H_ +#define CHROMEOS_COMPONENTS_PHONEHUB_RECENT_APPS_INTERACTION_HANDLER_H_ + +#include <stdint.h> +#include "base/observer_list.h" +#include "base/observer_list_types.h" +#include "chromeos/components/phonehub/notification.h" +#include "chromeos/components/phonehub/recent_app_click_observer.h" + +namespace chromeos { +namespace phonehub { + +// The handler that exposes APIs to interact with Phone Hub Recent Apps. +// TODO(paulzchen): Implement Eche's RecentAppClickObserver and add/remove +// observer via this handler. +class RecentAppsInteractionHandler { + public: + RecentAppsInteractionHandler(); + RecentAppsInteractionHandler(const RecentAppsInteractionHandler&) = delete; + RecentAppsInteractionHandler* operator=(const RecentAppsInteractionHandler&) = + delete; + virtual ~RecentAppsInteractionHandler(); + + // Called by RecentAppButton to notify the click event. + // TODO(paulzchen): The |PhoneHubRecentAppButton| notify the button be clicked + // and the other SWA can interaction with this event. + virtual void NotifyRecentAppClicked( + const Notification::AppMetadata& app_metadata); + virtual void AddRecentAppClickObserver(RecentAppClickObserver* observer); + virtual void RemoveRecentAppClickObserver(RecentAppClickObserver* observer); + + private: + base::ObserverList<RecentAppClickObserver> observer_list_; +}; + +} // namespace phonehub +} // namespace chromeos + +#endif // CHROMEOS_COMPONENTS_PHONEHUB_RECENT_APPS_INTERACTION_HANDLER_H_
diff --git a/chromeos/components/phonehub/recent_apps_interaction_handler_unittest.cc b/chromeos/components/phonehub/recent_apps_interaction_handler_unittest.cc new file mode 100644 index 0000000..9196ac1d --- /dev/null +++ b/chromeos/components/phonehub/recent_apps_interaction_handler_unittest.cc
@@ -0,0 +1,85 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/phonehub/recent_apps_interaction_handler.h" + +#include <memory> + +#include "chromeos/components/phonehub/notification.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { +namespace phonehub { +namespace { + +class FakeClickHandler : public RecentAppClickObserver { + public: + FakeClickHandler() = default; + ~FakeClickHandler() override = default; + + std::u16string get_visible_app_name() { return visible_app_name; } + + std::string get_package_name() { return package_name; } + + void OnRecentAppClicked( + const Notification::AppMetadata& app_metadata) override { + visible_app_name = app_metadata.visible_app_name; + package_name = app_metadata.package_name; + } + + private: + std::u16string visible_app_name; + std::string package_name; +}; + +} // namespace + +class RecentAppsInteractionHandlerTest : public testing::Test { + protected: + RecentAppsInteractionHandlerTest() = default; + RecentAppsInteractionHandlerTest(const RecentAppsInteractionHandlerTest&) = + delete; + RecentAppsInteractionHandlerTest& operator=( + const RecentAppsInteractionHandlerTest&) = delete; + ~RecentAppsInteractionHandlerTest() override = default; + + // testing::Test: + void SetUp() override { + interaction_handler_ = std::make_unique<RecentAppsInteractionHandler>(); + interaction_handler_->AddRecentAppClickObserver(&fake_click_handler_); + } + + void TearDown() override { + interaction_handler_->RemoveRecentAppClickObserver(&fake_click_handler_); + } + + std::u16string GetVisibleAppName() { + return fake_click_handler_.get_visible_app_name(); + } + + std::string GetPackageName() { + return fake_click_handler_.get_package_name(); + } + + RecentAppsInteractionHandler& handler() { return *interaction_handler_; } + + private: + FakeClickHandler fake_click_handler_; + std::unique_ptr<RecentAppsInteractionHandler> interaction_handler_; +}; + +TEST_F(RecentAppsInteractionHandlerTest, NotifyRecentAppsClickHandler) { + const char16_t expected_app_visible_name[] = u"Fake App"; + const char expected_package_name[] = "com.fakeapp"; + auto expected_app_metadata = Notification::AppMetadata( + expected_app_visible_name, expected_package_name, gfx::Image()); + + handler().NotifyRecentAppClicked(expected_app_metadata); + + EXPECT_EQ(expected_app_visible_name, GetVisibleAppName()); + EXPECT_EQ(expected_package_name, GetPackageName()); +} + +} // namespace phonehub +} // namespace chromeos
diff --git a/chromeos/crosapi/mojom/app_service.mojom b/chromeos/crosapi/mojom/app_service.mojom index 1a59b7a4..d7440c1b 100644 --- a/chromeos/crosapi/mojom/app_service.mojom +++ b/chromeos/crosapi/mojom/app_service.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Next MinVersion: 6 +// Next MinVersion: 7 module crosapi.mojom; @@ -87,4 +87,9 @@ IconKey icon_key, IconType icon_type, int32 size_hint_in_dip) => (IconValue icon_value); + + // Opens the app platform settings page for the app with |app_id|. + // e.g. for web app, it opens the Chrome site settings page for the app. + [MinVersion=6] + OpenNativeSettings@6(string app_id); };
diff --git a/components/arc/compat_mode/arc_resize_lock_manager_unittest.cc b/components/arc/compat_mode/arc_resize_lock_manager_unittest.cc index e5c4653..8811c2c 100644 --- a/components/arc/compat_mode/arc_resize_lock_manager_unittest.cc +++ b/components/arc/compat_mode/arc_resize_lock_manager_unittest.cc
@@ -4,6 +4,7 @@ #include "components/arc/compat_mode/arc_resize_lock_manager.h" +#include <memory> #include <string> #include "ash/constants/app_types.h" @@ -62,9 +63,9 @@ arc_resize_lock_manager_.SetPrefDelegate(pref_delegate()); } - aura::Window* CreateFakeWindow(bool is_arc) { - aura::Window* window = - new aura::Window(nullptr, aura::client::WINDOW_TYPE_NORMAL); + std::unique_ptr<aura::Window> CreateFakeWindow(bool is_arc) { + auto window = std::make_unique<aura::Window>( + nullptr, aura::client::WINDOW_TYPE_NORMAL); if (is_arc) { window->SetProperty(aura::client::kAppType, static_cast<int>(ash::AppType::ARC_APP)); @@ -74,7 +75,7 @@ return window; } - bool IsResizeLockEnabled(aura::Window* window) const { + bool IsResizeLockEnabled(const aura::Window* window) const { return arc_resize_lock_manager_.resize_lock_enabled_windows_.contains( window); } @@ -87,107 +88,107 @@ // Tests that resize lock state is properly sync'ed with the window property. TEST_F(ArcResizeLockManagerTest, TestPropertyChange) { - auto* arc_window = CreateFakeWindow(true); + auto arc_window = CreateFakeWindow(true); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // App id needs to be set to toogle resize lock state. arc_window->SetProperty(ash::kAppIDKey, new std::string("app-id")); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Test EnableResizeLock will be called by the property change. arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZE_LIMITED); - EXPECT_TRUE(IsResizeLockEnabled(arc_window)); + EXPECT_TRUE(IsResizeLockEnabled(arc_window.get())); // Test nothing will be called by the property overwrite with the same value. arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZE_LIMITED); - EXPECT_TRUE(IsResizeLockEnabled(arc_window)); + EXPECT_TRUE(IsResizeLockEnabled(arc_window.get())); // Test DisableResizeLock will be called by the property change. arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZABLE); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Test if enabling/disabling |FULLY_LOCKED| toggles the resize lock state // properly. arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::FULLY_LOCKED); - EXPECT_TRUE(IsResizeLockEnabled(arc_window)); + EXPECT_TRUE(IsResizeLockEnabled(arc_window.get())); arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZABLE); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Test nothing will be called by the property overwrite with the same value. arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZABLE); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Test nothing will be called by the NON-interested property change. arc_window->SetProperty(kNonInterestedPropKey, true); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); } // Test resize lock will not be enabled right after property change but // will be after the app id is set to the non-null value. TEST_F(ArcResizeLockManagerTest, TestPropertyChangeWithDelayedAppId) { - auto* arc_window = CreateFakeWindow(true); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + auto arc_window = CreateFakeWindow(true); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZE_LIMITED); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Should ignore null. arc_window->ClearProperty(ash::kAppIDKey); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Should ignore uninterested property change. arc_window->SetProperty(kNonInterestedPropKey, true); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Should not ignore non-null value. arc_window->SetProperty(ash::kAppIDKey, new std::string("app-id")); - EXPECT_TRUE(IsResizeLockEnabled(arc_window)); + EXPECT_TRUE(IsResizeLockEnabled(arc_window.get())); } // Tests that resize lock will not be enabled if the resize lock type is changed // to RESIZABLE while we're waiting for the valid app id. TEST_F(ArcResizeLockManagerTest, TestPropertyChangeWithDelayedAppIdCancel) { - auto* arc_window = CreateFakeWindow(true); + auto arc_window = CreateFakeWindow(true); std::string app_id = "app-id"; - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZE_LIMITED); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZABLE); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); - arc_window->SetProperty(ash::kAppIDKey, &app_id); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + arc_window->SetProperty(ash::kAppIDKey, app_id); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); } // Test that resize lock will NOT be enabled for non ARC windows. TEST_F(ArcResizeLockManagerTest, TestNonArcWindow) { - auto* non_arc_window = CreateFakeWindow(false); - EXPECT_FALSE(IsResizeLockEnabled(non_arc_window)); + auto non_arc_window = CreateFakeWindow(false); + EXPECT_FALSE(IsResizeLockEnabled(non_arc_window.get())); non_arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZE_LIMITED); - EXPECT_FALSE(IsResizeLockEnabled(non_arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(non_arc_window.get())); non_arc_window->SetProperty(ash::kArcResizeLockTypeKey, ash::ArcResizeLockType::RESIZABLE); - EXPECT_FALSE(IsResizeLockEnabled(non_arc_window)); + EXPECT_FALSE(IsResizeLockEnabled(non_arc_window.get())); } // Test that the ArcResizeLockState is properly handled for the "first-time // launch" app (whose state is ArcResizeLockState::READY). TEST_F(ArcResizeLockManagerTest, ResizeLockStateForFirstTimeLaunch) { - auto* arc_window = CreateFakeWindow(true); + auto arc_window = CreateFakeWindow(true); std::string app_id = "app-id"; - arc_window->SetProperty(ash::kAppIDKey, &app_id); - EXPECT_FALSE(IsResizeLockEnabled(arc_window)); + arc_window->SetProperty(ash::kAppIDKey, app_id); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); // Test for RESIZE_LIMITED. pref_delegate()->SetResizeLockState(app_id, mojom::ArcResizeLockState::READY); @@ -223,19 +224,19 @@ histogram_tester.ExpectTotalCount(initial_state_histogram, 0); // Not record histogram without the app id ready. - auto* resize_locked_window = CreateFakeWindow(true); - auto* non_resize_locked_window = CreateFakeWindow(true); + auto resize_locked_window = CreateFakeWindow(true); + auto non_resize_locked_window = CreateFakeWindow(true); pref_delegate()->SetResizeLockState(app_id_resize_locked, mojom::ArcResizeLockState::ON); histogram_tester.ExpectTotalCount(initial_state_histogram, 0); // Record histogram when the app id is ready. - resize_locked_window->SetProperty(ash::kAppIDKey, &app_id_resize_locked); + resize_locked_window->SetProperty(ash::kAppIDKey, app_id_resize_locked); histogram_tester.ExpectTotalCount(initial_state_histogram, 1); histogram_tester.ExpectBucketCount(initial_state_histogram, mojom::ArcResizeLockState::ON, 1); non_resize_locked_window->SetProperty(ash::kAppIDKey, - &app_id_non_resize_locked); + app_id_non_resize_locked); histogram_tester.ExpectTotalCount(initial_state_histogram, 2); histogram_tester.ExpectBucketCount(initial_state_histogram, mojom::ArcResizeLockState::UNDEFINED, 1); @@ -249,18 +250,19 @@ // Tests that resize shadow type is properly updated according to the resize // lock type. TEST_F(ArcResizeLockManagerTest, TestShadowPropertyChange) { - auto* arc_window = CreateFakeWindow(true); + auto arc_window = CreateFakeWindow(true); arc_window->SetProperty(ash::kAppIDKey, new std::string("app-id")); bool resize_shadow_updated = false; ScopedWindowPropertyObserver observer( - arc_window, base::BindLambdaForTesting( - [&resize_shadow_updated](aura::Window* window, - const void* key, intptr_t old) { - if (key != ash::kResizeShadowTypeKey) - return; - resize_shadow_updated = true; - })); + arc_window.get(), + base::BindLambdaForTesting([&resize_shadow_updated](aura::Window* window, + const void* key, + intptr_t old) { + if (key != ash::kResizeShadowTypeKey) + return; + resize_shadow_updated = true; + })); // Unlocked by default. EXPECT_EQ(arc_window->GetProperty(ash::kResizeShadowTypeKey), @@ -297,4 +299,38 @@ EXPECT_FALSE(resize_shadow_updated); } +// Tests that the manager works properly even when window gets destroyed. +TEST_F(ArcResizeLockManagerTest, TestWindowDestruction) { + // Window gets destroyed just after initialization. + { + auto arc_window = CreateFakeWindow(true); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); + } + + // Window gets destroyed after resize lock property change but before getting + // app id. + { + auto arc_window = CreateFakeWindow(true); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); + arc_window->SetProperty(ash::kArcResizeLockTypeKey, + ash::ArcResizeLockType::RESIZE_LIMITED); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); + } + + // Window gets destroyed after resize locked. + { + auto arc_window = CreateFakeWindow(true); + EXPECT_FALSE(IsResizeLockEnabled(arc_window.get())); + arc_window->SetProperty(ash::kArcResizeLockTypeKey, + ash::ArcResizeLockType::RESIZE_LIMITED); + arc_window->SetProperty(ash::kAppIDKey, std::string("app-id")); + EXPECT_TRUE(IsResizeLockEnabled(arc_window.get())); + + const auto* arc_window_freed_ptr = arc_window.get(); + arc_window.reset(); + // We don't want to hold the freed window ptr. + EXPECT_FALSE(IsResizeLockEnabled(arc_window_freed_ptr)); + } +} + } // namespace arc
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc index 2f65d4184..8d7e3bd8 100644 --- a/components/autofill/content/browser/content_autofill_driver.cc +++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -468,33 +468,37 @@ void ContentAutofillDriver::FormsSeen(const std::vector<FormData>& raw_forms) { std::vector<FormData> forms = raw_forms; for (FormData& form : forms) - SetFrameAndFormMetaData(form); + SetFrameAndFormMetaData(form, nullptr); autofill_router_->FormsSeen(this, forms); } void ContentAutofillDriver::FormSubmitted(const FormData& raw_form, bool known_success, mojom::SubmissionSource source) { - FormData form = GetFormWithFrameAndFormMetaData(raw_form); - autofill_router_->FormSubmitted(this, form, known_success, source); + autofill_router_->FormSubmitted( + this, GetFormWithFrameAndFormMetaData(raw_form), known_success, source); } void ContentAutofillDriver::TextFieldDidChange(const FormData& raw_form, const FormFieldData& raw_field, const gfx::RectF& bounding_box, base::TimeTicks timestamp) { + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, &field); autofill_router_->TextFieldDidChange( - this, GetFormWithFrameAndFormMetaData(raw_form), - GetFieldWithFrameAndFormMetaData(raw_form, raw_field), + this, form, field, TransformBoundingBoxToViewportCoordinates(bounding_box), timestamp); } void ContentAutofillDriver::TextFieldDidScroll(const FormData& raw_form, const FormFieldData& raw_field, const gfx::RectF& bounding_box) { + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, &field); autofill_router_->TextFieldDidScroll( - this, GetFormWithFrameAndFormMetaData(raw_form), - GetFieldWithFrameAndFormMetaData(raw_form, raw_field), + this, form, field, TransformBoundingBoxToViewportCoordinates(bounding_box)); } @@ -502,9 +506,11 @@ const FormData& raw_form, const FormFieldData& raw_field, const gfx::RectF& bounding_box) { + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, &field); autofill_router_->SelectControlDidChange( - this, GetFormWithFrameAndFormMetaData(raw_form), - GetFieldWithFrameAndFormMetaData(raw_form, raw_field), + this, form, field, TransformBoundingBoxToViewportCoordinates(bounding_box)); } @@ -514,9 +520,11 @@ const FormFieldData& raw_field, const gfx::RectF& bounding_box, bool autoselect_first_suggestion) { + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, &field); autofill_router_->QueryFormFieldAutofill( - this, id, GetFormWithFrameAndFormMetaData(raw_form), - GetFieldWithFrameAndFormMetaData(raw_form, raw_field), + this, id, form, field, TransformBoundingBoxToViewportCoordinates(bounding_box), autoselect_first_suggestion); } @@ -532,9 +540,11 @@ void ContentAutofillDriver::FocusOnFormField(const FormData& raw_form, const FormFieldData& raw_field, const gfx::RectF& bounding_box) { + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, &field); autofill_router_->FocusOnFormField( - this, GetFormWithFrameAndFormMetaData(raw_form), - GetFieldWithFrameAndFormMetaData(raw_form, raw_field), + this, form, field, TransformBoundingBoxToViewportCoordinates(bounding_box)); } @@ -562,9 +572,10 @@ const AutofillableData& fill_data, const FormData& raw_form, const FormFieldData& raw_field) { - autofill_router_->FillFormForAssistant( - this, fill_data, GetFormWithFrameAndFormMetaData(raw_form), - GetFieldWithFrameAndFormMetaData(raw_form, raw_field)); + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, &field); + autofill_router_->FillFormForAssistant(this, fill_data, form, field); } void ContentAutofillDriver::DidNavigateFrame( @@ -646,15 +657,8 @@ } void ContentAutofillDriver::SetFrameAndFormMetaData( - const FormData& raw_form, - FormFieldData& field) const { - field.host_frame = - LocalFrameToken(render_frame_host_->GetFrameToken().value()); - field.host_form_id = raw_form.unique_renderer_id; - field.origin = render_frame_host_->GetLastCommittedOrigin(); -} - -void ContentAutofillDriver::SetFrameAndFormMetaData(FormData& form) const { + FormData& form, + FormFieldData* optional_field) const { form.host_frame = LocalFrameToken(render_frame_host_->GetFrameToken().value()); form.url = StripAuthAndParams(render_frame_host_->GetLastCommittedURL()); @@ -663,20 +667,25 @@ else form.main_frame_origin = url::Origin(); - for (FormFieldData& field : form.fields) - SetFrameAndFormMetaData(form, field); -} + // The form signature must not be calculated before setting FormData::url. + FormSignature form_signature = CalculateFormSignature(form); -FormFieldData ContentAutofillDriver::GetFieldWithFrameAndFormMetaData( - const FormData& raw_form, - FormFieldData field) const { - SetFrameAndFormMetaData(raw_form, field); - return field; + auto SetFieldMetaData = [&](FormFieldData& field) { + field.host_frame = form.host_frame; + field.host_form_id = form.unique_renderer_id; + field.origin = render_frame_host_->GetLastCommittedOrigin(); + field.host_form_signature = form_signature; + }; + + for (FormFieldData& field : form.fields) + SetFieldMetaData(field); + if (optional_field) + SetFieldMetaData(*optional_field); } FormData ContentAutofillDriver::GetFormWithFrameAndFormMetaData( FormData form) const { - SetFrameAndFormMetaData(form); + SetFrameAndFormMetaData(form, nullptr); return form; }
diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h index 49f1e81..61890faa 100644 --- a/components/autofill/content/browser/content_autofill_driver.h +++ b/components/autofill/content/browser/content_autofill_driver.h
@@ -360,19 +360,14 @@ private: friend class ContentAutofillDriverTestApi; - // Sets parameters of |form| and |field| that can be extracted from - // |render_frame_host_|. Setting |field|'s meta data also requires the - // enclosing FormData |raw_form|, which does not need to have its own meta - // data set. + // Sets parameters of |form| and |optional_field| that can be extracted from + // |render_frame_host_|. |optional_field| is treated as if it is a field of + // |form|. // // These functions must be called for every FormData and FormFieldData // received from the renderer. - void SetFrameAndFormMetaData(const FormData& raw_form, - FormFieldData& field) const; - void SetFrameAndFormMetaData(FormData& form) const; - FormFieldData GetFieldWithFrameAndFormMetaData(const FormData& raw_form, - FormFieldData field) const - WARN_UNUSED_RESULT; + void SetFrameAndFormMetaData(FormData& form, + FormFieldData* optional_field) const; FormData GetFormWithFrameAndFormMetaData(FormData form) const WARN_UNUSED_RESULT;
diff --git a/components/autofill/content/browser/content_autofill_driver_test_api.h b/components/autofill/content/browser/content_autofill_driver_test_api.h index e30af52..10298db 100644 --- a/components/autofill/content/browser/content_autofill_driver_test_api.h +++ b/components/autofill/content/browser/content_autofill_driver_test_api.h
@@ -23,6 +23,14 @@ return *driver_->autofill_router_; } + void SetFrameAndFormMetaData(FormData& form, FormFieldData* field) const { + driver_->SetFrameAndFormMetaData(form, field); + } + + FormData GetFormWithFrameAndFormMetaData(const FormData& form) const { + return driver_->GetFormWithFrameAndFormMetaData(form); + } + private: // Non-null pointer to wrapped ContentAutofillDriver. ContentAutofillDriver* driver_;
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc index 82845a66..5445047 100644 --- a/components/autofill/content/browser/content_autofill_driver_unittest.cc +++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -17,6 +17,7 @@ #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" +#include "components/autofill/content/browser/content_autofill_driver_test_api.h" #include "components/autofill/content/browser/content_autofill_router.h" #include "components/autofill/core/browser/autofill_external_delegate.h" #include "components/autofill/core/browser/autofill_test_utils.h" @@ -282,33 +283,6 @@ } // namespace -class ContentAutofillDriverTestApi { - public: - explicit ContentAutofillDriverTestApi(ContentAutofillDriver* driver) - : driver_(driver) {} - - void SetFrameAndFormMetaData(const FormData& raw_form, - FormFieldData& field) const { - driver_->SetFrameAndFormMetaData(raw_form, field); - } - - void SetFrameAndFormMetaData(FormData& form) const { - driver_->SetFrameAndFormMetaData(form); - } - - FormFieldData GetFieldWithFrameAndFormMetaData(const FormData& raw_form, - FormFieldData field) const { - return driver_->GetFieldWithFrameAndFormMetaData(raw_form, field); - } - - FormData GetFormWithFrameAndFormMetaData(FormData form) const { - return driver_->GetFormWithFrameAndFormMetaData(form); - } - - private: - ContentAutofillDriver* driver_; -}; - class MockBrowserAutofillManager : public BrowserAutofillManager { public: MockBrowserAutofillManager(AutofillDriver* driver, AutofillClient* client) @@ -457,7 +431,8 @@ form.fields.push_back(FormFieldData()); FormData form2 = ContentAutofillDriverTestApi(driver_.get()) .GetFormWithFrameAndFormMetaData(form); - ContentAutofillDriverTestApi(driver_.get()).SetFrameAndFormMetaData(form); + ContentAutofillDriverTestApi(driver_.get()) + .SetFrameAndFormMetaData(form, nullptr); EXPECT_EQ( form.host_frame, @@ -483,18 +458,25 @@ TEST_P(ContentAutofillDriverTest, SetFrameAndFormMetaDataOfField) { NavigateAndCommit(GURL("https://username:password@hostname/path?query#hash")); + // We test that `SetFrameAndFormMetaData(form, &field) sets the meta data not + // just of |form|'s fields but also of an additional individual |field|. FormData form; - FormFieldData field; - FormFieldData field2 = ContentAutofillDriverTestApi(driver_.get()) - .GetFieldWithFrameAndFormMetaData(form, field); + form.fields.push_back(FormFieldData()); + FormFieldData field = form.fields.back(); + FormSignature signature_without_meta_data = CalculateFormSignature(form); ContentAutofillDriverTestApi(driver_.get()) - .SetFrameAndFormMetaData(form, field); + .SetFrameAndFormMetaData(form, &field); + EXPECT_NE(signature_without_meta_data, CalculateFormSignature(form)); EXPECT_EQ( field.host_frame, LocalFrameToken(web_contents()->GetMainFrame()->GetFrameToken().value())); + EXPECT_EQ(field.host_form_id, form.unique_renderer_id); + EXPECT_EQ(field.host_form_signature, CalculateFormSignature(form)); - EXPECT_EQ(field2.host_frame, field.host_frame); + EXPECT_EQ(field.host_frame, form.fields.front().host_frame); + EXPECT_EQ(field.host_form_id, form.fields.front().host_form_id); + EXPECT_EQ(field.host_form_signature, form.fields.front().host_form_signature); } TEST_P(ContentAutofillDriverTest, FormDataSentToRenderer_FillForm) { @@ -552,7 +534,8 @@ .WillOnce(DoAll(SaveArg<0>(&augmented_forms), Return(false))); driver_->FormsSeen({form}); - ContentAutofillDriverTestApi(driver_.get()).SetFrameAndFormMetaData(form); + ContentAutofillDriverTestApi(driver_.get()) + .SetFrameAndFormMetaData(form, nullptr); ASSERT_EQ(augmented_forms.size(), 1u); EXPECT_TRUE(augmented_forms.front().SameFormAs(form));
diff --git a/components/autofill/content/browser/form_forest.cc b/components/autofill/content/browser/form_forest.cc index 9903a0c5..f14ec28 100644 --- a/components/autofill/content/browser/form_forest.cc +++ b/components/autofill/content/browser/form_forest.cc
@@ -107,6 +107,8 @@ DCHECK(!frame_data || frame_data == GetFrameData(form.frame_token)); if (!frame_data) frame_data = GetFrameData(form.frame_token); + if (!frame_data) + return nullptr; auto it = base::ranges::find(frame_data->child_forms, form.renderer_id, &FormData::unique_renderer_id); return it != frame_data->child_forms.end() ? &*it : nullptr; @@ -470,7 +472,8 @@ form_id, &FormData::global_id); if (renderer_form == renderer_forms.rend()) { const FormData* original_form = mutable_this.GetFormData(form_id); - AFCHECK(original_form, continue); + if (!original_form) + continue; renderer_forms.push_back(*original_form); renderer_form = renderer_forms.rbegin(); renderer_form->fields.clear(); // In case |original_form| is a root form.
diff --git a/components/autofill/content/browser/form_forest_unittest.cc b/components/autofill/content/browser/form_forest_unittest.cc index 62fbf92..30ca4d7 100644 --- a/components/autofill/content/browser/form_forest_unittest.cc +++ b/components/autofill/content/browser/form_forest_unittest.cc
@@ -72,7 +72,9 @@ Field("form_control_type", &FormFieldData::form_control_type, exp.form_control_type), Field("value", &FormFieldData::value, exp.value), - Field("label", &FormFieldData::label, exp.label)); + Field("label", &FormFieldData::label, exp.label), + Field("host_form_signature", &FormFieldData::host_form_signature, + exp.host_form_signature)); } // The relevant attributes are FormData::global_id(), FormData::fields.
diff --git a/components/autofill/content/renderer/form_cache.cc b/components/autofill/content/renderer/form_cache.cc index 52563f7..946ee19 100644 --- a/components/autofill/content/renderer/form_cache.cc +++ b/components/autofill/content/renderer/form_cache.cc
@@ -413,6 +413,8 @@ field.signature, "\nform signature: ", form.signature, + "\nform signature in host form: ", + field.host_form_signature, "\nfield frame token: ", frame_token.ToString(), "\nform renderer id: ",
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc index 4ee34a0..84ed7db 100644 --- a/components/autofill/core/browser/autofill_test_utils.cc +++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -45,8 +45,8 @@ bool operator==(const FormFieldDataPredictions& a, const FormFieldDataPredictions& b) { auto members = [](const FormFieldDataPredictions& p) { - return std::tie(p.signature, p.heuristic_type, p.server_type, - p.overall_type, p.parseable_name, p.section); + return std::tie(p.host_form_signature, p.signature, p.heuristic_type, + p.server_type, p.overall_type, p.parseable_name, p.section); }; return members(a) == members(b); }
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index 6938a0af..e2fc31f9 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -61,6 +61,7 @@ #include "components/autofill/core/common/signatures.h" #include "components/security_state/core/security_state.h" #include "components/version_info/version_info.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "url/origin.h" namespace autofill { @@ -783,14 +784,13 @@ // the original form signature. std::set<FormSignature> processed_forms; for (const auto* form : forms) { - if (processed_forms.find(form->form_signature()) != processed_forms.end()) + if (base::Contains(processed_forms, form->form_signature())) continue; - processed_forms.insert(form->form_signature()); UMA_HISTOGRAM_COUNTS_1000("Autofill.FieldCount", form->field_count()); if (form->IsMalformed()) continue; - form->EncodeFormForQuery(query->add_forms(), queried_form_signatures); + form->EncodeFormForQuery(query, queried_form_signatures, &processed_forms); } return !queried_form_signatures->empty(); @@ -845,6 +845,7 @@ std::map<std::pair<FormSignature, FieldSignature>, std::deque<FieldSuggestion>> field_types; + for (int form_idx = 0; form_idx < std::min(response.form_suggestions_size(), static_cast<int>(queried_form_signatures.size())); @@ -857,35 +858,62 @@ } } + // Retrieves the next prediction for |form| and |field| and pops it. Popping + // is omitted if no other predictions for |form| and |field| are left, so that + // any subsequent fields with the same signature will get the same prediction. + auto GetPrediction = + [&field_types](FormSignature form, + FieldSignature field) -> absl::optional<FieldSuggestion> { + auto it = field_types.find({form, field}); + if (it == field_types.end()) + return absl::nullopt; + DCHECK(!it->second.empty()); + auto current_field = it->second.front(); + if (it->second.size() > 1) + it->second.pop_front(); + return absl::make_optional(std::move(current_field)); + }; + // Copy the field types into the actual form. for (FormStructure* form : forms) { for (auto& field : form->fields_) { - auto it = field_types.find( - {form->form_signature(), field->GetFieldSignature()}); - if (it == field_types.end()) + // Get the field prediction for |form|'s signature and the |field|'s + // host_form_signature. The former takes precedence over the latter. + absl::optional<FieldSuggestion> current_field = + GetPrediction(form->form_signature(), field->GetFieldSignature()); + if (base::FeatureList::IsEnabled(features::kAutofillAcrossIframes) && + field->host_form_signature && + field->host_form_signature != form->form_signature()) { + // Retrieves the alternative prediction even if it is not used so that + // the alternative predictions are popped. + auto alternative_field = GetPrediction(field->host_form_signature, + field->GetFieldSignature()); + if (alternative_field && + (!current_field || + base::ranges::all_of(current_field->predictions(), + [](const auto& prediction) { + return prediction.type() == NO_SERVER_DATA; + }))) { + current_field = *alternative_field; + } + } + if (!current_field) continue; - // Get the next suggestion for this signature. If this is the last - // suggestion, keep it for all subsequent fields with this signature. - DCHECK(!it->second.empty()); - FieldSuggestion current_field = it->second.front(); - if (it->second.size() > 1) - it->second.pop_front(); - ServerFieldType heuristic_type = field->heuristic_type(); if (heuristic_type != UNKNOWN_TYPE) heuristics_detected_fillable_field = true; - field->set_server_predictions({current_field.predictions().begin(), - current_field.predictions().end()}); + field->set_server_predictions({current_field->predictions().begin(), + current_field->predictions().end()}); field->set_may_use_prefilled_placeholder( - current_field.may_use_prefilled_placeholder()); + current_field->may_use_prefilled_placeholder()); if (heuristic_type != field->Type().GetStorableType()) query_response_overrode_heuristics = true; - if (current_field.has_password_requirements()) - field->SetPasswordRequirements(current_field.password_requirements()); + if (current_field->has_password_requirements()) + field->SetPasswordRequirements(current_field->password_requirements()); } AutofillMetrics::LogServerResponseHasDataForForm(base::ranges::any_of( @@ -925,6 +953,8 @@ for (const auto& field : form_structure->fields_) { FormFieldDataPredictions annotated_field; + annotated_field.host_form_signature = + base::NumberToString(field->host_form_signature.value()); annotated_field.signature = field->FieldSignatureAsStr(); annotated_field.heuristic_type = AutofillType(field->heuristic_type()).ToString(); @@ -2007,20 +2037,42 @@ } void FormStructure::EncodeFormForQuery( - AutofillPageQueryRequest::Form* query_form, - std::vector<FormSignature>* queried_form_signatures) const { + AutofillPageQueryRequest* query, + std::vector<FormSignature>* queried_form_signatures, + std::set<FormSignature>* processed_forms) const { DCHECK(!IsMalformed()); + // Adds a request to |query| that contains all (|form|, |field|) for every + // |field| from |fields_| that meets |necessary_condition|. Repeated calls for + // the same |form| have no effect (early return if |processed_forms| contains + // |form|). + auto AddFormIf = [&](FormSignature form, auto necessary_condition) mutable { + if (!processed_forms->insert(form).second) + return; - query_form->set_signature(form_signature().value()); - queried_form_signatures->push_back(form_signature()); + AutofillPageQueryRequest::Form* query_form = query->add_forms(); + query_form->set_signature(form.value()); + queried_form_signatures->push_back(form); - for (const auto& field : fields_) { - if (ShouldSkipField(*field)) - continue; + for (const auto& field : fields_) { + if (ShouldSkipField(*field) || !necessary_condition(field)) + continue; - AutofillPageQueryRequest::Form::Field* added_field = - query_form->add_fields(); - added_field->set_signature(field->GetFieldSignature().value()); + AutofillPageQueryRequest::Form::Field* added_field = + query_form->add_fields(); + added_field->set_signature(field->GetFieldSignature().value()); + } + }; + + AddFormIf(form_signature(), [](auto& f) { return true; }); + + if (base::FeatureList::IsEnabled(features::kAutofillAcrossIframes)) { + for (const auto& field : fields_) { + if (field->host_form_signature) { + AddFormIf(field->host_form_signature, [&](const auto& f) { + return f->host_form_signature == field->host_form_signature; + }); + } + } } } @@ -2588,7 +2640,12 @@ {base::NumberToString(field->GetFieldSignature().value()), " - ", base::NumberToString( - HashFieldSignature(field->GetFieldSignature()))}); + HashFieldSignature(field->GetFieldSignature())), + ", host form signature: ", + base::NumberToString(field->host_form_signature.value()), + " - ", + base::NumberToString( + HashFormSignature(field->host_form_signature))}); buffer << "\n Name: " << field->parseable_name(); auto type = field->Type().ToString(); @@ -2659,7 +2716,12 @@ {base::NumberToString(field->GetFieldSignature().value()), " - ", base::NumberToString( - HashFieldSignature(field->GetFieldSignature()))}); + HashFieldSignature(field->GetFieldSignature())), + ", host form signature: ", + base::NumberToString(field->host_form_signature.value()), + " - ", + base::NumberToString( + HashFormSignature(field->host_form_signature))}); buffer << Tr{} << "Name:" << field->parseable_name(); auto type = field->Type().ToString();
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index 783d2d98..6084cf6 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -510,9 +510,9 @@ // when it considers necessary. void RationalizeFieldTypePredictions(LogManager* log_manager); - void EncodeFormForQuery( - autofill::AutofillPageQueryRequest::Form* query_form, - std::vector<FormSignature>* queried_form_signatures) const; + void EncodeFormForQuery(AutofillPageQueryRequest* query, + std::vector<FormSignature>* queried_form_signatures, + std::set<FormSignature>* processed_forms) const; void EncodeFormForUpload( bool is_raw_metadata_uploading_enabled,
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index fd19f52..d864a080 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -18,6 +18,7 @@ #include "components/autofill/core/browser/autofill_experiments.h" #include "components/autofill/core/browser/autofill_form_test_utils.h" #include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/proto/api_v1.pb.h" #include "components/autofill/core/browser/randomized_encoder.h" #include "components/autofill/core/common/autofill_features.h" @@ -54,9 +55,10 @@ return response_string; } +// Sets |field_type| suggestion for |field_data|'s signature. void AddFieldSuggestionToForm( ::autofill::AutofillQueryResponse_FormSuggestion* form_suggestion, - autofill::FormFieldData field_data, + const autofill::FormFieldData& field_data, ServerFieldType field_type) { auto* field_suggestion = form_suggestion->add_field_suggestions(); field_suggestion->set_field_signature( @@ -2225,7 +2227,17 @@ form_structure->field(5)->heuristic_type()); } -TEST_F(FormStructureTestImpl, EncodeQueryRequest) { +TEST_P(ParameterizedFormStructureTest, EncodeQueryRequest) { + bool autofill_across_iframes = GetParam(); + base::test::ScopedFeatureList scoped_features; + std::vector<base::Feature> enabled; + std::vector<base::Feature> disabled; + (autofill_across_iframes ? &enabled : &disabled) + ->push_back(features::kAutofillAcrossIframes); + scoped_features.InitWithFeatures(enabled, disabled); + + FormSignature form_signature(16692857476255362434UL); + FormData form; form.url = GURL("http://www.foo.com/"); @@ -2235,26 +2247,31 @@ field.label = u"Name on Card"; field.name = u"name_on_card"; field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = form_signature; form.fields.push_back(field); field.label = u"Address"; field.name = u"billing_address"; field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(12345UL); form.fields.push_back(field); field.label = u"Card Number"; field.name = u"card_number"; field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(67890UL); form.fields.push_back(field); field.label = u"Expiration Date"; field.name = u"expiration_month"; field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(12345UL); form.fields.push_back(field); field.label = u"Expiration Year"; field.name = u"expiration_year"; field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(12345UL); form.fields.push_back(field); // Add checkable field. @@ -2264,6 +2281,7 @@ checkable_field.label = u"Checkable1"; checkable_field.name = u"Checkable1"; checkable_field.unique_renderer_id = MakeFieldRendererId(); + checkable_field.host_form_signature = form_signature; form.fields.push_back(checkable_field); FormStructure form_structure(form); @@ -2272,19 +2290,36 @@ forms.push_back(&form_structure); std::vector<FormSignature> expected_signatures; - expected_signatures.push_back(form_structure.form_signature()); + expected_signatures.push_back(FormSignature(form_signature.value())); + if (autofill_across_iframes) { + expected_signatures.push_back(FormSignature(12345UL)); + expected_signatures.push_back(FormSignature(67890UL)); + } // Prepare the expected proto string. AutofillPageQueryRequest query; query.set_client_version(GetProductNameAndVersionForUserAgent()); - AutofillPageQueryRequest::Form* query_form = query.add_forms(); - query_form->set_signature(form_structure.form_signature().value()); - - query_form->add_fields()->set_signature(412125936U); - query_form->add_fields()->set_signature(1917667676U); - query_form->add_fields()->set_signature(2226358947U); - query_form->add_fields()->set_signature(747221617U); - query_form->add_fields()->set_signature(4108155786U); + { + AutofillPageQueryRequest::Form* query_form = query.add_forms(); + query_form->set_signature(form_signature.value()); + query_form->add_fields()->set_signature(412125936U); + query_form->add_fields()->set_signature(1917667676U); + query_form->add_fields()->set_signature(2226358947U); + query_form->add_fields()->set_signature(747221617U); + query_form->add_fields()->set_signature(4108155786U); + if (autofill_across_iframes) { + AutofillPageQueryRequest::Form* query_form = query.add_forms(); + query_form->set_signature(12345UL); + query_form->add_fields()->set_signature(1917667676U); + query_form->add_fields()->set_signature(747221617U); + query_form->add_fields()->set_signature(4108155786U); + } + if (autofill_across_iframes) { + AutofillPageQueryRequest::Form* query_form = query.add_forms(); + query_form->set_signature(67890UL); + query_form->add_fields()->set_signature(2226358947U); + } + } std::string expected_query_string; ASSERT_TRUE(query.SerializeToString(&expected_query_string)); @@ -2316,10 +2351,16 @@ EXPECT_EQ(expected_query_string, encoded_query_string); // Add 5 address fields - this should be still a valid form. + FormSignature form_signature3(2608858059775241169UL); + for (auto& f : form.fields) { + if (f.host_form_signature == form_signature) + f.host_form_signature = form_signature3; + } for (size_t i = 0; i < 5; ++i) { field.label = u"Address"; field.name = u"address"; field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = form_signature3; form.fields.push_back(field); } @@ -2327,19 +2368,19 @@ forms.push_back(&form_structure3); std::vector<FormSignature> expected_signatures3 = expected_signatures2; - expected_signatures3.push_back(form_structure3.form_signature()); + expected_signatures3.push_back(form_signature3); // Add the second form to the expected proto. - query_form = query.add_forms(); - query_form->set_signature(form_structure3.form_signature().value()); - - query_form->add_fields()->set_signature(412125936U); - query_form->add_fields()->set_signature(1917667676U); - query_form->add_fields()->set_signature(2226358947U); - query_form->add_fields()->set_signature(747221617U); - query_form->add_fields()->set_signature(4108155786U); - for (int i = 0; i < 5; ++i) { - query_form->add_fields()->set_signature(509334676U); + { + AutofillPageQueryRequest::Form* query_form = query.add_forms(); + query_form->set_signature(2608858059775241169); + query_form->add_fields()->set_signature(412125936U); + query_form->add_fields()->set_signature(1917667676U); + query_form->add_fields()->set_signature(2226358947U); + query_form->add_fields()->set_signature(747221617U); + query_form->add_fields()->set_signature(4108155786U); + for (int i = 0; i < 5; ++i) + query_form->add_fields()->set_signature(509334676U); } ASSERT_TRUE(query.SerializeToString(&expected_query_string)); @@ -5530,6 +5571,131 @@ EXPECT_EQ(ADDRESS_HOME_CITY, form.field(2)->Type().GetStorableType()); } +// Tests that the signatures of a field's FormFieldData::host_form_signature are +// used as a fallback if the form's signature does not contain useful type +// predictions. +TEST_F(FormStructureTestImpl, ParseApiQueryResponseWithDifferentRendererForms) { + base::test::ScopedFeatureList scoped_features; + scoped_features.InitAndEnableFeature(features::kAutofillAcrossIframes); + + std::vector<ServerFieldType> expected_types; + + // Create a form whose fields have FormFieldData::host_form_signature either + // 12345 or 67890. The first two fields have identical field signatures. + std::vector<FormFieldData> fields; + FormFieldData field; + field.form_control_type = "text"; + + field.name = u"name"; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(12345); + fields.push_back(field); + expected_types.push_back(CREDIT_CARD_NAME_FIRST); + + field.name = u"name"; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(12345); + fields.push_back(field); + expected_types.push_back(CREDIT_CARD_NAME_LAST); + + field.name = u"number"; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(12345); + fields.push_back(field); + expected_types.push_back(CREDIT_CARD_NUMBER); + + field.name = u"exp_month"; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(67890); + fields.push_back(field); + expected_types.push_back(CREDIT_CARD_EXP_MONTH); + + field.name = u"exp_year"; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(67890); + fields.push_back(field); + expected_types.push_back(CREDIT_CARD_EXP_2_DIGIT_YEAR); + + field.name = u"cvc"; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(67890); + fields.push_back(field); + expected_types.push_back(CREDIT_CARD_VERIFICATION_CODE); + + field.name = u""; + field.unique_renderer_id = MakeFieldRendererId(); + field.host_form_signature = FormSignature(67890); + fields.push_back(field); + expected_types.push_back(NO_SERVER_DATA); + + FormData form; + form.fields = fields; + form.url = GURL("http://foo.com"); + + FormStructure form_structure(form); + std::vector<FormStructure*> forms; + forms.push_back(&form_structure); + + ASSERT_GE(fields.size(), 6u); + + // Make serialized API response. + AutofillQueryResponse api_response; + // Response for the form's signature: + // - The predictions for `fields[1]`, `fields[2]`, `fields[5]` are expected to + // be overridden by the FormFieldData::host_form_signature predictions. + // - Since fields 0 and 1 have identical signatures, the client must consider + // the fields' rank in FormData::host_form_signature's predictions + // to obtain the right prediction for `fields[1]`. + // - `fields[6]` has no predictions at all. + std::vector<FormSignature> encoded_signatures = + test::GetEncodedSignatures(forms); + { + auto* form_suggestion = api_response.add_form_suggestions(); + AddFieldSuggestionToForm(form_suggestion, fields[0], expected_types[0]); + AddFieldSuggestionToForm(form_suggestion, fields[1], NO_SERVER_DATA); + AddFieldSuggestionToForm(form_suggestion, fields[2], NO_SERVER_DATA); + AddFieldSuggestionToForm(form_suggestion, fields[3], expected_types[3]); + AddFieldSuggestionToForm(form_suggestion, fields[4], expected_types[4]); + } + // Response for the FormFieldData::host_form_signature 12345. + encoded_signatures.push_back(FormSignature(12345)); + { + auto* form_suggestion = api_response.add_form_suggestions(); + AddFieldSuggestionToForm(form_suggestion, fields[0], NO_SERVER_DATA); + AddFieldSuggestionToForm(form_suggestion, fields[1], expected_types[1]); + AddFieldSuggestionToForm(form_suggestion, fields[2], expected_types[2]); + } + // Response for the FormFieldData::host_form_signature 67890. + encoded_signatures.push_back(FormSignature(67890)); + { + auto* form_suggestion = api_response.add_form_suggestions(); + AddFieldSuggestionToForm(form_suggestion, fields[4], ADDRESS_HOME_CITY); + AddFieldSuggestionToForm(form_suggestion, fields[5], expected_types[5]); + } + + // Serialize API response. + std::string response_string; + std::string encoded_response_string; + ASSERT_TRUE(api_response.SerializeToString(&response_string)); + base::Base64Encode(response_string, &encoded_response_string); + + FormStructure::ParseApiQueryResponse(std::move(encoded_response_string), + forms, encoded_signatures, nullptr, + nullptr); + + // Check expected field types. + ASSERT_GE(forms[0]->field_count(), 6U); + ASSERT_EQ(forms[0]->field(0)->GetFieldSignature(), + forms[0]->field(1)->GetFieldSignature()); + EXPECT_EQ(forms.front()->field(0)->server_type(), expected_types[0]); + EXPECT_EQ(forms.front()->field(1)->server_type(), expected_types[1]); + EXPECT_EQ(forms.front()->field(2)->server_type(), expected_types[2]); + EXPECT_EQ(forms.front()->field(3)->server_type(), expected_types[3]); + EXPECT_EQ(forms.front()->field(4)->server_type(), expected_types[4]); + EXPECT_EQ(forms.front()->field(5)->server_type(), expected_types[5]); + EXPECT_EQ(forms.front()->field(6)->server_type(), expected_types[6]); +} + TEST_F(FormStructureTestImpl, ParseApiQueryResponse) { // Make form 1 data. FormData form;
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index fcf3a73..0040feb 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -109,7 +109,7 @@ s->BindBool(index++, profile.disallow_settings_visible_updates()); } -void AddAutofillProfileDetailsFromStatement(const sql::Statement& s, +void AddAutofillProfileDetailsFromStatement(sql::Statement& s, AutofillProfile* profile) { int index = 1; // 0 is for the guid. profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); @@ -164,7 +164,7 @@ } std::u16string UnencryptedCardFromColumn( - const sql::Statement& s, + sql::Statement& s, int column_index, const AutofillTableEncryptor& encryptor) { std::u16string credit_card_number; @@ -180,7 +180,7 @@ } std::unique_ptr<CreditCard> CreditCardFromStatement( - const sql::Statement& s, + sql::Statement& s, const AutofillTableEncryptor& encryptor) { std::unique_ptr<CreditCard> credit_card(new CreditCard);
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h index 7ade0b2..a4faa3b9 100644 --- a/components/autofill/core/common/form_field_data.h +++ b/components/autofill/core/common/form_field_data.h
@@ -88,8 +88,8 @@ // An identifier of the renderer form that contained this field. // This may be from the browser form that contains this field in the case of a - // frame-transcending form. See ContentAutofillRouter for details on the - // distinction between renderer and browser forms. + // frame-transcending form. See ContentAutofillRouter and internal::FormForest + // for details on the distinction between renderer and browser forms. FormGlobalId renderer_form_id() const { return {host_frame, host_form_id}; } // Returns true if both fields are identical, ignoring value- and @@ -178,6 +178,15 @@ // Unique renderer ID of the enclosing form in the same frame. FormRendererId host_form_id; + // The signature of the field's renderer form, that is, the signature of the + // FormData that contained this field when it was received by the + // AutofillDriver (see ContentAutofillRouter and internal::FormForest + // for details on the distinction between renderer and browser forms). The + // value is only set in ContentAutofillDriver and null on iOS. + // This value is written and read only in the browser for voting of + // cross-frame forms purposes. It is therefore not sent via mojo. + FormSignature host_form_signature; + // The origin of the frame that hosts the field. url::Origin origin;
diff --git a/components/autofill/core/common/form_field_data_predictions.h b/components/autofill/core/common/form_field_data_predictions.h index 548358d7..f0786f5 100644 --- a/components/autofill/core/common/form_field_data_predictions.h +++ b/components/autofill/core/common/form_field_data_predictions.h
@@ -21,6 +21,7 @@ FormFieldDataPredictions& operator=(FormFieldDataPredictions&&); ~FormFieldDataPredictions(); + std::string host_form_signature; std::string signature; std::string heuristic_type; std::string server_type;
diff --git a/components/autofill/core/common/mojom/autofill_types.mojom b/components/autofill/core/common/mojom/autofill_types.mojom index f34034f..8767f22 100644 --- a/components/autofill/core/common/mojom/autofill_types.mojom +++ b/components/autofill/core/common/mojom/autofill_types.mojom
@@ -194,6 +194,7 @@ // autofill::FormFieldDataPredictions struct FormFieldDataPredictions { + string host_form_signature; string signature; string heuristic_type; string server_type;
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc b/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc index 6d89cd2..e26dc5fd 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc
@@ -208,6 +208,8 @@ autofill::FormFieldDataPredictions>:: Read(autofill::mojom::FormFieldDataPredictionsDataView data, autofill::FormFieldDataPredictions* out) { + if (!data.ReadHostFormSignature(&out->host_form_signature)) + return false; if (!data.ReadSignature(&out->signature)) return false; if (!data.ReadHeuristicType(&out->heuristic_type))
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits.h b/components/autofill/core/common/mojom/autofill_types_mojom_traits.h index e12a582..e8297a4 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits.h +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits.h
@@ -324,6 +324,11 @@ template <> struct StructTraits<autofill::mojom::FormFieldDataPredictionsDataView, autofill::FormFieldDataPredictions> { + static const std::string& host_form_signature( + const autofill::FormFieldDataPredictions& r) { + return r.host_form_signature; + } + static const std::string& signature( const autofill::FormFieldDataPredictions& r) { return r.signature;
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc b/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc index 7823a4e..b85a078 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc
@@ -35,8 +35,9 @@ void CreateTestFieldDataPredictions(const std::string& signature, FormFieldDataPredictions* field_predict) { + field_predict->host_form_signature = "TestHostFormSignature"; field_predict->signature = signature; - field_predict->heuristic_type = "TestSignature"; + field_predict->heuristic_type = "TestHeuristicType"; field_predict->server_type = "TestServerType"; field_predict->overall_type = "TestOverallType"; field_predict->parseable_name = "TestParseableName";
diff --git a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc index 6b9f076e..da69cab5 100644 --- a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc +++ b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
@@ -108,7 +108,6 @@ web_contents_ = content::WebContentsTester::CreateTestWebContents( &browser_context_, nullptr); profile_store_ = new password_manager::MockPasswordStore; - ON_CALL(*profile_store_, IsAccountStore()).WillByDefault(Return(false)); ASSERT_TRUE(profile_store_->Init(/*prefs=*/nullptr)); ON_CALL(client_, GetProfilePasswordStore()) @@ -117,7 +116,6 @@ if (base::FeatureList::IsEnabled( password_manager::features::kEnablePasswordsAccountStorage)) { account_store_ = new password_manager::MockPasswordStore; - ON_CALL(*account_store_, IsAccountStore()).WillByDefault(Return(true)); ASSERT_TRUE(account_store_->Init(/*prefs=*/nullptr)); ON_CALL(client_, GetAccountPasswordStore())
diff --git a/components/browser_sync/active_devices_provider_impl.cc b/components/browser_sync/active_devices_provider_impl.cc index 7b22998..9a84391 100644 --- a/components/browser_sync/active_devices_provider_impl.cc +++ b/components/browser_sync/active_devices_provider_impl.cc
@@ -11,6 +11,7 @@ #include "base/metrics/field_trial_params.h" #include "components/browser_sync/active_devices_provider_impl.h" #include "components/browser_sync/browser_sync_switches.h" +#include "components/sync/base/model_type.h" namespace browser_sync { @@ -28,32 +29,32 @@ device_info_tracker_->RemoveObserver(this); } -size_t ActiveDevicesProviderImpl::CountActiveDevicesIfAvailable() { +syncer::ActiveDevicesInvalidationInfo +ActiveDevicesProviderImpl::CalculateInvalidationInfo( + const std::string& local_cache_guid) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return GetActiveDevices().size(); -} - -std::vector<std::string> -ActiveDevicesProviderImpl::CollectFCMRegistrationTokensForInvalidations( - const std::string& local_cache_guid) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - std::vector<std::string> fcm_registration_tokens; - if (!base::FeatureList::IsEnabled( - switches::kSyncUseFCMRegistrationTokensList)) { - return fcm_registration_tokens; + const std::vector<std::unique_ptr<syncer::DeviceInfo>> active_devices = + GetActiveDevices(); + if (active_devices.empty()) { + // This may happen if the engine is not initialized yet. + return syncer::ActiveDevicesInvalidationInfo::CreateUninitialized(); } - for (const std::unique_ptr<syncer::DeviceInfo>& device : GetActiveDevices()) { + std::vector<std::string> fcm_registration_tokens; + syncer::ModelTypeSet interested_data_types; + + for (const std::unique_ptr<syncer::DeviceInfo>& device : active_devices) { if (!local_cache_guid.empty() && device->guid() == local_cache_guid) { continue; } - if (device->fcm_registration_token().empty()) { - continue; - } - fcm_registration_tokens.push_back(device->fcm_registration_token()); + interested_data_types.PutAll(device->interested_data_types()); + if (!device->fcm_registration_token().empty() && + base::FeatureList::IsEnabled( + switches::kSyncUseFCMRegistrationTokensList)) { + fcm_registration_tokens.push_back(device->fcm_registration_token()); + } } // Do not send tokens if the list of active devices is huge. This is similar @@ -63,10 +64,11 @@ if (fcm_registration_tokens.size() > static_cast<size_t>( switches::kSyncFCMRegistrationTokensListMaxSize.Get())) { - return std::vector<std::string>(); + fcm_registration_tokens.clear(); } - return fcm_registration_tokens; + return syncer::ActiveDevicesInvalidationInfo::Create( + std::move(fcm_registration_tokens), interested_data_types); } void ActiveDevicesProviderImpl::SetActiveDevicesChangedCallback(
diff --git a/components/browser_sync/active_devices_provider_impl.h b/components/browser_sync/active_devices_provider_impl.h index 5bca0e5d..ace586bd 100644 --- a/components/browser_sync/active_devices_provider_impl.h +++ b/components/browser_sync/active_devices_provider_impl.h
@@ -28,10 +28,8 @@ ~ActiveDevicesProviderImpl() override; // syncer::ActiveDevicesProvider implementation. - size_t CountActiveDevicesIfAvailable() override; - - std::vector<std::string> CollectFCMRegistrationTokensForInvalidations( - const std::string& local_cache_guid) override; + syncer::ActiveDevicesInvalidationInfo CalculateInvalidationInfo( + const std::string& local_cache_guid) const override; void SetActiveDevicesChangedCallback( ActiveDevicesChangedCallback callback) override;
diff --git a/components/browser_sync/active_devices_provider_impl_unittest.cc b/components/browser_sync/active_devices_provider_impl_unittest.cc index 5a3b546a..7692c671 100644 --- a/components/browser_sync/active_devices_provider_impl_unittest.cc +++ b/components/browser_sync/active_devices_provider_impl_unittest.cc
@@ -14,14 +14,19 @@ #include "base/test/simple_test_clock.h" #include "base/time/time.h" #include "components/browser_sync/browser_sync_switches.h" +#include "components/sync/base/model_type.h" +#include "components/sync/engine/active_devices_invalidation_info.h" #include "components/sync/protocol/sync_enums.pb.h" #include "components/sync_device_info/device_info_util.h" #include "components/sync_device_info/fake_device_info_tracker.h" #include "testing/gtest/include/gtest/gtest.h" +using syncer::ActiveDevicesInvalidationInfo; using syncer::DeviceInfo; using syncer::FakeDeviceInfoTracker; +using syncer::ModelTypeSet; using testing::IsEmpty; +using testing::SizeIs; using testing::UnorderedElementsAre; namespace browser_sync { @@ -32,6 +37,7 @@ std::unique_ptr<DeviceInfo> CreateFakeDeviceInfo( const std::string& name, const std::string& fcm_registration_token, + const ModelTypeSet& interested_data_types, base::Time last_updated_timestamp) { return std::make_unique<syncer::DeviceInfo>( base::GUID::GenerateRandomV4().AsLowercaseString(), name, @@ -41,8 +47,11 @@ base::TimeDelta::FromMinutes(kPulseIntervalMinutes), /*send_tab_to_self_receiving_enabled=*/false, /*sharing_info=*/absl::nullopt, /*paask_info=*/absl::nullopt, - fcm_registration_token, - /*interested_data_types=*/syncer::ModelTypeSet()); + fcm_registration_token, interested_data_types); +} + +ModelTypeSet DefaultInterestedDataTypes() { + return Difference(syncer::ProtocolTypes(), syncer::CommitOnlyTypes()); } class ActiveDevicesProviderImplTest : public testing::Test { @@ -54,8 +63,10 @@ void AddDevice(const std::string& name, const std::string& fcm_registration_token, + const ModelTypeSet& interested_data_types, base::Time last_updated_timestamp) { device_list_.push_back(CreateFakeDeviceInfo(name, fcm_registration_token, + interested_data_types, last_updated_timestamp)); fake_device_info_tracker_.Add(device_list_.back().get()); } @@ -68,25 +79,61 @@ }; TEST_F(ActiveDevicesProviderImplTest, ShouldFilterInactiveDevices) { - AddDevice("device_recent", /*fcm_registration_token=*/"", - clock_.Now() - base::TimeDelta::FromMinutes(1)); - - // Should be considered as active device due to margin even though the device - // is outside the pulse interval. AddDevice( - "device_pulse_interval", - /*fcm_registration_token=*/"", + "local_device_pulse_interval", + /*fcm_registration_token=*/"", DefaultInterestedDataTypes(), clock_.Now() - base::TimeDelta::FromMinutes(kPulseIntervalMinutes + 1)); // Very old device. AddDevice("device_inactive", /*fcm_registration_token=*/"", + DefaultInterestedDataTypes(), clock_.Now() - base::TimeDelta::FromDays(100)); - EXPECT_EQ(2u, active_devices_provider_.CountActiveDevicesIfAvailable()); + // The local device should be considered active due to margin even though the + // device is outside the pulse interval. This is not a single client because + // the device waits to receive self-invalidations (because it has not + // specified a |local_cache_guid|). + const ActiveDevicesInvalidationInfo result_no_guid = + active_devices_provider_.CalculateInvalidationInfo( + /*local_cache_guid=*/std::string()); + EXPECT_FALSE(result_no_guid.IsSingleClientForTypes({syncer::BOOKMARKS})); + EXPECT_THAT(result_no_guid.fcm_registration_tokens(), IsEmpty()); + + // Should ignore the local device and ignore the old device even if it's + // interested in bookmarks. + ASSERT_THAT(device_list_, SizeIs(2)); + const ActiveDevicesInvalidationInfo result_local_guid = + active_devices_provider_.CalculateInvalidationInfo( + device_list_.front()->guid()); + EXPECT_TRUE(result_local_guid.IsSingleClientForTypes({syncer::BOOKMARKS})); +} + +TEST_F(ActiveDevicesProviderImplTest, ShouldReturnIfSingleDeviceByDataType) { + AddDevice("local_device", /*fcm_registration_token=*/"", + DefaultInterestedDataTypes(), clock_.Now()); + AddDevice("remote_device", /*fcm_registration_token=*/"", + Difference(DefaultInterestedDataTypes(), {syncer::SESSIONS}), + clock_.Now()); + + // Remote device has disabled sessions data type and current device should be + // considered as the only client. + const ActiveDevicesInvalidationInfo result_local_guid = + active_devices_provider_.CalculateInvalidationInfo( + device_list_.front()->guid()); + EXPECT_TRUE(result_local_guid.IsSingleClientForTypes({syncer::SESSIONS})); + EXPECT_FALSE(result_local_guid.IsSingleClientForTypes({syncer::BOOKMARKS})); } TEST_F(ActiveDevicesProviderImplTest, ShouldReturnZeroDevices) { - EXPECT_EQ(0u, active_devices_provider_.CountActiveDevicesIfAvailable()); + const ActiveDevicesInvalidationInfo result = + active_devices_provider_.CalculateInvalidationInfo( + /*local_cache_guid=*/std::string()); + + // If there are no devices at all (including the local device), that means we + // just don't have the device information yet, so we should *not* consider + // this a single-client situation. + EXPECT_THAT(result.fcm_registration_tokens(), IsEmpty()); + EXPECT_FALSE(result.IsSingleClientForTypes({syncer::BOOKMARKS})); } TEST_F(ActiveDevicesProviderImplTest, ShouldInvokeCallback) { @@ -101,24 +148,27 @@ } TEST_F(ActiveDevicesProviderImplTest, ShouldReturnActiveFCMRegistrationTokens) { - AddDevice("device_1", "fcm_token_1", + AddDevice("device_1", "fcm_token_1", DefaultInterestedDataTypes(), clock_.Now() - base::TimeDelta::FromMinutes(1)); - AddDevice("device_2", "fcm_token_2", + AddDevice("device_2", "fcm_token_2", DefaultInterestedDataTypes(), clock_.Now() - base::TimeDelta::FromMinutes(1)); - AddDevice("device_inactive", "fcm_token_3", + AddDevice("device_inactive", "fcm_token_3", DefaultInterestedDataTypes(), clock_.Now() - base::TimeDelta::FromDays(100)); ASSERT_EQ(3u, device_list_.size()); - EXPECT_THAT( - active_devices_provider_.CollectFCMRegistrationTokensForInvalidations( - "other_guid"), - UnorderedElementsAre(device_list_[0]->fcm_registration_token(), - device_list_[1]->fcm_registration_token())); - EXPECT_THAT( - active_devices_provider_.CollectFCMRegistrationTokensForInvalidations( - device_list_[0]->guid()), - UnorderedElementsAre(device_list_[1]->fcm_registration_token())); + const ActiveDevicesInvalidationInfo result_no_guid = + active_devices_provider_.CalculateInvalidationInfo( + /*local_cache_guid=*/std::string()); + EXPECT_THAT(result_no_guid.fcm_registration_tokens(), + UnorderedElementsAre(device_list_[0]->fcm_registration_token(), + device_list_[1]->fcm_registration_token())); + + const ActiveDevicesInvalidationInfo result_local_guid = + active_devices_provider_.CalculateInvalidationInfo( + device_list_[0]->guid()); + EXPECT_THAT(result_local_guid.fcm_registration_tokens(), + UnorderedElementsAre(device_list_[1]->fcm_registration_token())); } TEST_F(ActiveDevicesProviderImplTest, ShouldReturnEmptyListWhenTooManyDevices) { @@ -129,14 +179,23 @@ for (size_t i = 0; i < kActiveDevicesNumber; ++i) { const std::string device_name = "device_" + base::NumberToString(i); const std::string fcm_token = "fcm_token_" + device_name; - AddDevice(device_name, fcm_token, + AddDevice(device_name, fcm_token, DefaultInterestedDataTypes(), clock_.Now() - base::TimeDelta::FromMinutes(1)); } - EXPECT_THAT( - active_devices_provider_.CollectFCMRegistrationTokensForInvalidations( - "guid"), - IsEmpty()); + EXPECT_THAT(active_devices_provider_ + .CalculateInvalidationInfo(/*local_cache_guid=*/std::string()) + .fcm_registration_tokens(), + IsEmpty()); + + // Double check that all other devices will result in an empty FCM + // registration token list. + AddDevice("extra_device", "extra_token", DefaultInterestedDataTypes(), + clock_.Now()); + EXPECT_THAT(active_devices_provider_ + .CalculateInvalidationInfo(/*local_cache_guid=*/std::string()) + .fcm_registration_tokens(), + IsEmpty()); } } // namespace
diff --git a/components/browser_sync/browser_sync_switches.cc b/components/browser_sync/browser_sync_switches.cc index 4ba5ded..34430f9 100644 --- a/components/browser_sync/browser_sync_switches.cc +++ b/components/browser_sync/browser_sync_switches.cc
@@ -26,6 +26,17 @@ "SyncUseSessionsUnregisterDelay", base::FEATURE_DISABLED_BY_DEFAULT}; #endif // defined(OS_ANDROID) +// Enables providing the list of FCM registration tokens in the commit request. +const base::Feature kSyncUseFCMRegistrationTokensList{ + "SyncUseFCMRegistrationTokensList", base::FEATURE_ENABLED_BY_DEFAULT}; + +// Max size of FCM registration tokens list. If the number of active devices +// having FCM registration tokens is higher, then the resulting list will be +// empty meaning unknown FCM registration tokens. +const base::FeatureParam<int> kSyncFCMRegistrationTokensListMaxSize{ + &kSyncUseFCMRegistrationTokensList, "SyncFCMRegistrationTokensListMaxSize", + 5}; + // Enables filtering out inactive devices which haven't sent DeviceInfo update // recently (depending on the device's pulse_interval and an additional margin). const base::Feature kSyncFilterOutInactiveDevicesForSingleClient{ @@ -38,15 +49,4 @@ &kSyncFilterOutInactiveDevicesForSingleClient, "SyncActiveDeviceMargin", base::TimeDelta::FromMinutes(30)}; -// Enables providing the list of FCM registration tokens in the commit request. -const base::Feature kSyncUseFCMRegistrationTokensList{ - "SyncUseFCMRegistrationTokensList", base::FEATURE_ENABLED_BY_DEFAULT}; - -// Max size of FCM registration tokens list. If the number of active devices -// having FCM registration tokens is higher, then the resulting list will be -// empty meaning unknown FCM registration tokens. -const base::FeatureParam<int> kSyncFCMRegistrationTokensListMaxSize{ - &kSyncUseFCMRegistrationTokensList, "SyncFCMRegistrationTokensListMaxSize", - 5}; - } // namespace switches
diff --git a/components/browser_sync/browser_sync_switches.h b/components/browser_sync/browser_sync_switches.h index 7baea7fc..ef0a538 100644 --- a/components/browser_sync/browser_sync_switches.h +++ b/components/browser_sync/browser_sync_switches.h
@@ -19,10 +19,11 @@ extern const base::Feature kSyncUseSessionsUnregisterDelay; #endif -extern const base::Feature kSyncFilterOutInactiveDevicesForSingleClient; -extern const base::FeatureParam<base::TimeDelta> kSyncActiveDeviceMargin; +// Sync invalidation switches. extern const base::Feature kSyncUseFCMRegistrationTokensList; extern const base::FeatureParam<int> kSyncFCMRegistrationTokensListMaxSize; +extern const base::Feature kSyncFilterOutInactiveDevicesForSingleClient; +extern const base::FeatureParam<base::TimeDelta> kSyncActiveDeviceMargin; } // namespace switches
diff --git a/components/browser_ui/site_settings/android/BUILD.gn b/components/browser_ui/site_settings/android/BUILD.gn index b6bf225..2215eea6 100644 --- a/components/browser_ui/site_settings/android/BUILD.gn +++ b/components/browser_ui/site_settings/android/BUILD.gn
@@ -78,7 +78,6 @@ deps = [ ":java_resources", "//base:base_java", - "//build/android:build_config_java", "//components/browser_ui/settings/android:java", "//components/browser_ui/widget/android:java", "//components/content_settings/android:content_settings_enums_java",
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java index 8e1aa82c2..f4c6d5a 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ChosenObjectSettings.java
@@ -20,7 +20,7 @@ import androidx.preference.PreferenceScreen; import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; -import org.chromium.build.BuildConfig; +import org.chromium.base.annotations.RemovableInRelease; import org.chromium.components.browser_ui.settings.ChromeImageViewPreference; import org.chromium.components.browser_ui.settings.ManagedPreferencesUtils; @@ -82,12 +82,11 @@ * returns the same value. This must be true because this activity is displaying permissions * for a single object. Each instance varies only in which site it represents. */ + @RemovableInRelease private void checkObjectConsistency() { - if (BuildConfig.ENABLE_ASSERTS) { - String exampleObject = mObjectInfos.get(0).getObject(); - for (ChosenObjectInfo info : mObjectInfos) { - assert info.getObject().equals(exampleObject); - } + String exampleObject = mObjectInfos.get(0).getObject(); + for (ChosenObjectInfo info : mObjectInfos) { + assert info.getObject().equals(exampleObject); } }
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd index 9b93aff..67cb598 100644 --- a/components/browser_ui/strings/android/browser_ui_strings.grd +++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -456,6 +456,18 @@ <message name="IDS_PAGE_INFO_HISTORY_FORGET" desc="Label used in the Page Info dialog for clearing history information"> Forget this site </message> + <message name="IDS_PAGE_INFO_HISTORY_LAST_VISIT_TODAY" desc="Summary string for page info history row. The site was last visited today."> + Last visited today + </message> + <message name="IDS_PAGE_INFO_HISTORY_LAST_VISIT_YESTERDAY" desc="Summary string for page info history row. The site was last visited yesterday."> + Last visited yesterday + </message> + <message name="IDS_PAGE_INFO_HISTORY_LAST_VISIT_DAYS" desc="Summary string for page info history row. The site was last visited NUM_DAYS days ago."> + Last visited <ph name="NUM_DAYS">%1$s<ex>2</ex></ph> days ago + </message> + <message name="IDS_PAGE_INFO_HISTORY_LAST_VISIT_DATE" desc="Summary string for page info history row. The site was last visited on a particular date."> + Last visited <ph name="DATE">%1$s<ex>Apr 4, 2021</ex></ph> + </message> <message name="IDS_PAGE_INFO_PERMISSIONS_TITLE" desc="Label used in the Page Info dialog above the permissions list."> Permissions </message>
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_DATE.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_DATE.png.sha1 new file mode 100644 index 0000000..20fb282b --- /dev/null +++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_DATE.png.sha1
@@ -0,0 +1 @@ +288903c23150885b7e7085c3fa3454d02a3508e5 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_DAYS.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_DAYS.png.sha1 new file mode 100644 index 0000000..5c53731 --- /dev/null +++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_DAYS.png.sha1
@@ -0,0 +1 @@ +9ace122490da7b607c23545f82fa0f84d0849c80 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_TODAY.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_TODAY.png.sha1 new file mode 100644 index 0000000..da6f26f8 --- /dev/null +++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_TODAY.png.sha1
@@ -0,0 +1 @@ +91aec60b9b657765f500812015c4307f78bd3303 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_YESTERDAY.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_YESTERDAY.png.sha1 new file mode 100644 index 0000000..fc0f128 --- /dev/null +++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_HISTORY_LAST_VISIT_YESTERDAY.png.sha1
@@ -0,0 +1 @@ +62b9bfece25da049b09ce72d1f24f01e71678da6 \ No newline at end of file
diff --git a/components/exo/OWNERS b/components/exo/OWNERS index af708f9..5aecd661 100644 --- a/components/exo/OWNERS +++ b/components/exo/OWNERS
@@ -1,7 +1,6 @@ oshima@chromium.org # For Input (keyboard, mouse, touch, data_device) -mukai@chromium.org yhanada@chromium.org # Not working on chromium anymore, but kept just in case we need his review.
diff --git a/components/exo/wayland/protocol/aura-shell.xml b/components/exo/wayland/protocol/aura-shell.xml index 8fa380b..310c111f 100644 --- a/components/exo/wayland/protocol/aura-shell.xml +++ b/components/exo/wayland/protocol/aura-shell.xml
@@ -24,7 +24,7 @@ DEALINGS IN THE SOFTWARE. </copyright> - <interface name="zaura_shell" version="20"> + <interface name="zaura_shell" version="21"> <description summary="aura_shell"> The global interface exposing aura shell capabilities is used to instantiate an interface extension for a wl_surface object. @@ -95,7 +95,7 @@ </event> </interface> - <interface name="zaura_surface" version="20"> + <interface name="zaura_surface" version="21"> <description summary="aura shell interface to a wl_surface"> An additional interface to a wl_surface object, which allows the client to access aura shell specific functionality for surface. @@ -372,6 +372,26 @@ <arg name="height" type="int"/> </request> + <!-- Version 21 additions --> + <enum name="occlusion_state"> + <description summary="surface occlusion state"> + Describes the occlusion state of a surface. + </description> + <entry name="unknown" value="0" summary="The surface's occlusion state isn't tracked"/> + <entry name="visible" value="1" summary="The surface is visible"/> + <entry name="occluded" value="2" summary="The surface is occluded"/> + <entry name="hidden" value="3" summary="The surface is not visible"/> + </enum> + + <event name="occlusion_state_changed" since="21"> + <description summary="Notify the client that the occlusion state changed"> + Notifies the client that the occlusion state of a window has changed. Clients + will only receive these messages if they previously request occlusion tracking + via set_occlusion_tracking for a particular surface. + </description> + <arg name="mode" type="uint" enum="occlusion_state"/> + </event> + </interface> <interface name="zaura_output" version="6">
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc index fe86d908..c2508fa 100644 --- a/components/exo/wayland/zaura_shell.cc +++ b/components/exo/wayland/zaura_shell.cc
@@ -86,6 +86,21 @@ } } +zaura_surface_occlusion_state WaylandOcclusionState( + const aura::Window::OcclusionState occlusion_state) { + switch (occlusion_state) { + case aura::Window::OcclusionState::UNKNOWN: + return ZAURA_SURFACE_OCCLUSION_STATE_UNKNOWN; + case aura::Window::OcclusionState::VISIBLE: + return ZAURA_SURFACE_OCCLUSION_STATE_VISIBLE; + case aura::Window::OcclusionState::OCCLUDED: + return ZAURA_SURFACE_OCCLUSION_STATE_OCCLUDED; + case aura::Window::OcclusionState::HIDDEN: + return ZAURA_SURFACE_OCCLUSION_STATE_HIDDEN; + } + return ZAURA_SURFACE_OCCLUSION_STATE_UNKNOWN; +} + void aura_surface_set_frame(wl_client* client, wl_resource* resource, uint32_t type) { @@ -390,8 +405,8 @@ if (!surface_ || !surface_->IsTrackingOcclusion()) return; auto* window = surface_->window(); - ComputeAndSendOcclusionFraction(window->GetOcclusionState(), - window->occluded_region_in_root()); + ComputeAndSendOcclusion(window->GetOcclusionState(), + window->occluded_region_in_root()); } void AuraSurface::OnFrameLockingChanged(Surface* surface, bool lock) { @@ -441,8 +456,8 @@ if (occlusion_tracker->HasIgnoredAnimatingWindows()) { const auto& occlusion_data = occlusion_tracker->ComputeTargetOcclusionForWindow(window); - ComputeAndSendOcclusionFraction(occlusion_data.occlusion_state, - occlusion_data.occluded_region); + ComputeAndSendOcclusion(occlusion_data.occlusion_state, + occlusion_data.occluded_region); } } @@ -457,20 +472,30 @@ wl_client_flush(wl_resource_get_client(resource_)); } -void AuraSurface::ComputeAndSendOcclusionFraction( +void AuraSurface::SendOcclusionState( + const aura::Window::OcclusionState occlusion_state) { + if (wl_resource_get_version(resource_) < 21) + return; + zaura_surface_send_occlusion_state_changed( + resource_, WaylandOcclusionState(occlusion_state)); + wl_client_flush(wl_resource_get_client(resource_)); +} + +void AuraSurface::ComputeAndSendOcclusion( const aura::Window::OcclusionState occlusion_state, const SkRegion& occluded_region) { + SendOcclusionState(occlusion_state); + #if BUILDFLAG(IS_CHROMEOS_ASH) // Should re-write in locked case - we don't want to trigger PIP upon // locking the screen. - // TODO(afakhry): We may also want to have special behaviour here for virtual - // desktops. if (ash::Shell::Get()->session_controller()->IsScreenLocked()) { SendOcclusionFraction(0.0f); return; } #endif // BUILDFLAG(IS_CHROMEOS_ASH) + // Send the occlusion fraction. auto* window = surface_->window(); float fraction_occluded = 0.0f; switch (occlusion_state) {
diff --git a/components/exo/wayland/zaura_shell.h b/components/exo/wayland/zaura_shell.h index fa69a692..e4d22ce 100644 --- a/components/exo/wayland/zaura_shell.h +++ b/components/exo/wayland/zaura_shell.h
@@ -18,7 +18,7 @@ namespace exo { namespace wayland { -constexpr uint32_t kZAuraShellVersion = 20; +constexpr uint32_t kZAuraShellVersion = 21; // Adds bindings to the Aura Shell. Normally this implies Ash on ChromeOS // builds. On non-ChromeOS builds the protocol provides access to Aura windowing @@ -71,12 +71,14 @@ protected: virtual void SendOcclusionFraction(float occlusion_fraction); + virtual void SendOcclusionState( + const aura::Window::OcclusionState occlusion_state); private: Surface* surface_; wl_resource* const resource_; - void ComputeAndSendOcclusionFraction( + void ComputeAndSendOcclusion( const aura::Window::OcclusionState occlusion_state, const SkRegion& occluded_region);
diff --git a/components/exo/wayland/zaura_shell_unittest.cc b/components/exo/wayland/zaura_shell_unittest.cc index f599994..ad99a07 100644 --- a/components/exo/wayland/zaura_shell_unittest.cc +++ b/components/exo/wayland/zaura_shell_unittest.cc
@@ -46,6 +46,9 @@ float last_sent_occlusion_fraction() const { return last_sent_occlusion_fraction_; } + aura::Window::OcclusionState last_sent_occlusion_state() const { + return last_sent_occlusion_state_; + } int num_occlusion_updates() const { return num_occlusion_updates_; } protected: @@ -54,8 +57,15 @@ num_occlusion_updates_++; } + void SendOcclusionState( + const aura::Window::OcclusionState occlusion_state) override { + last_sent_occlusion_state_ = occlusion_state; + } + private: float last_sent_occlusion_fraction_ = -1.0f; + aura::Window::OcclusionState last_sent_occlusion_state_ = + aura::Window::OcclusionState::UNKNOWN; int num_occlusion_updates_ = 0; DISALLOW_COPY_AND_ASSIGN(TestAuraSurface); @@ -183,6 +193,8 @@ surface().OnWindowOcclusionChanged(); EXPECT_EQ(-1.0f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::UNKNOWN, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(0, aura_surface().num_occlusion_updates()); EXPECT_FALSE(surface().IsTrackingOcclusion()); @@ -191,6 +203,8 @@ surface().Commit(); EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(1, aura_surface().num_occlusion_updates()); EXPECT_TRUE(surface().IsTrackingOcclusion()); } @@ -199,6 +213,8 @@ LosingActivationWithNoAnimatingWindowsSendsCorrectOcclusionFraction) { surface().Commit(); EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(1, aura_surface().num_occlusion_updates()); ::wm::ActivateWindow(parent_widget().GetNativeWindow()); @@ -209,6 +225,8 @@ widget->Show(); EXPECT_EQ(0.2f, occlusion_fraction_on_activation_loss()); EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(2, aura_surface().num_occlusion_updates()); } @@ -216,6 +234,8 @@ LosingActivationWithAnimatingWindowsSendsTargetOcclusionFraction) { surface().Commit(); EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(1, aura_surface().num_occlusion_updates()); ::wm::ActivateWindow(parent_widget().GetNativeWindow()); @@ -245,6 +265,8 @@ widget->Show(); EXPECT_EQ(0.2f, occlusion_fraction_on_activation_loss()); EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(2, aura_surface().num_occlusion_updates()); // Explicitly stop animation because threaded animation may have started @@ -258,6 +280,8 @@ // Expect the occlusion tracker to send an update after the animation // finishes. EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(3, aura_surface().num_occlusion_updates()); } @@ -265,6 +289,8 @@ LosingActivationByTriggeringTheLockScreenDoesNotSendOccludedFraction) { surface().Commit(); EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); EXPECT_EQ(1, aura_surface().num_occlusion_updates()); ::wm::ActivateWindow(parent_widget().GetNativeWindow()); @@ -293,6 +319,8 @@ ash::window_util::GetActiveWindow()); EXPECT_EQ(0.0f, occlusion_fraction_on_activation_loss()); EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); } TEST_F(ZAuraSurfaceTest, OcclusionIncludesOffScreenArea) { @@ -310,6 +338,8 @@ surface().OnWindowOcclusionChanged(); EXPECT_EQ(0.75f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); } TEST_F(ZAuraSurfaceTest, ZeroSizeWindowSendsZeroOcclusionFraction) { @@ -318,6 +348,8 @@ surface().Commit(); surface().OnWindowOcclusionChanged(); EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction()); + EXPECT_EQ(aura::Window::OcclusionState::VISIBLE, + aura_surface().last_sent_occlusion_state()); } TEST_F(ZAuraSurfaceTest, CanSetFullscreenModeToPlain) {
diff --git a/components/favicon/core/favicon_database.cc b/components/favicon/core/favicon_database.cc index fda4982..f074a55 100644 --- a/components/favicon/core/favicon_database.cc +++ b/components/favicon/core/favicon_database.cc
@@ -103,8 +103,8 @@ const int kCompatibleVersionNumber = 8; const int kDeprecatedVersionNumber = 6; // and earlier. -void FillIconMapping(const sql::Statement& statement, - const GURL& page_url, +void FillIconMapping(const GURL& page_url, + sql::Statement& statement, IconMapping* icon_mapping) { icon_mapping->mapping_id = statement.ColumnInt64(0); icon_mapping->icon_id = statement.ColumnInt64(1); @@ -241,7 +241,7 @@ IconMapping* icon_mapping) { if (!statement_.Step()) return false; - FillIconMapping(statement_, GURL(statement_.ColumnString(4)), icon_mapping); + FillIconMapping(GURL(statement_.ColumnString(4)), statement_, icon_mapping); return true; } @@ -778,7 +778,7 @@ return result; IconMapping icon_mapping; - FillIconMapping(statement, page_url, &icon_mapping); + FillIconMapping(page_url, statement, &icon_mapping); mapping_data->push_back(icon_mapping); } return result;
diff --git a/components/feedback/feedback_data.h b/components/feedback/feedback_data.h index e654a83a..4828d82 100644 --- a/components/feedback/feedback_data.h +++ b/components/feedback/feedback_data.h
@@ -49,6 +49,10 @@ void SendReport(); // Getters + const std::string& attached_filename() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return attached_filename_; + } const std::string& attached_file_uuid() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return attached_file_uuid_; @@ -57,6 +61,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return screenshot_uuid_; } + int trace_id() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return trace_id_; + } bool from_assistant() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return from_assistant_;
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc index 5fb6993..60a71c8 100644 --- a/components/flags_ui/flags_state.cc +++ b/components/flags_ui/flags_state.cc
@@ -58,10 +58,10 @@ // Adds a |StringValue| to |list| for each platform where |bitmask| indicates // whether the entry is available on that platform. -void AddOsStrings(unsigned bitmask, base::ListValue* list) { - for (size_t i = 0; i < base::size(kBitsToOs); ++i) { - if (bitmask & kBitsToOs[i].bit) - list->AppendString(kBitsToOs[i].name); +void AddOsStrings(unsigned bitmask, base::Value* list) { + for (const auto& entry : kBitsToOs) { + if (bitmask & entry.bit) + list->Append(entry.name); } } @@ -120,23 +120,22 @@ } // Returns the Value representing the choice data in the specified entry. -std::unique_ptr<base::Value> CreateOptionsData( - const FeatureEntry& entry, - const std::set<std::string>& enabled_entries) { +base::Value CreateOptionsData(const FeatureEntry& entry, + const std::set<std::string>& enabled_entries) { DCHECK(entry.type == FeatureEntry::MULTI_VALUE || entry.type == FeatureEntry::ENABLE_DISABLE_VALUE || entry.type == FeatureEntry::FEATURE_VALUE || entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE); - auto result = std::make_unique<base::ListValue>(); + base::Value result(base::Value::Type::LIST); for (int i = 0; i < entry.NumOptions(); ++i) { - auto value = std::make_unique<base::DictionaryValue>(); + base::Value value(base::Value::Type::DICTIONARY); const std::string name = entry.NameForOption(i); - value->SetString("internal_name", name); - value->SetString("description", entry.DescriptionForOption(i)); - value->SetBoolean("selected", enabled_entries.count(name) > 0); - result->Append(std::move(value)); + value.SetStringKey("internal_name", name); + value.SetStringKey("description", entry.DescriptionForOption(i)); + value.SetBoolKey("selected", enabled_entries.count(name) > 0); + result.Append(std::move(value)); } - return std::move(result); + return result; } // Registers variation parameters specified by |feature_variation_params| for @@ -557,8 +556,8 @@ void FlagsState::GetFlagFeatureEntries( FlagsStorage* flags_storage, FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries, + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries, base::RepeatingCallback<bool(const FeatureEntry&)> skip_feature_entry) { DCHECK(flags_storage); std::set<std::string> enabled_entries; @@ -570,31 +569,31 @@ if (skip_feature_entry.Run(entry)) continue; - std::unique_ptr<base::DictionaryValue> data(new base::DictionaryValue()); - data->SetString("internal_name", entry.internal_name); - data->SetString("name", base::StringPiece(entry.visible_name)); - data->SetString("description", - base::StringPiece(entry.visible_description)); + base::Value data(base::Value::Type::DICTIONARY); + data.SetStringKey("internal_name", entry.internal_name); + data.SetStringKey("name", base::StringPiece(entry.visible_name)); + data.SetStringKey("description", + base::StringPiece(entry.visible_description)); - base::ListValue supported_platforms; + base::Value supported_platforms(base::Value::Type::LIST); AddOsStrings(entry.supported_platforms, &supported_platforms); - data->SetKey("supported_platforms", std::move(supported_platforms)); + data.SetKey("supported_platforms", std::move(supported_platforms)); // True if the switch is not currently passed. bool is_default_value = IsDefaultValue(entry, enabled_entries); - data->SetBoolean("is_default", is_default_value); + data.SetBoolKey("is_default", is_default_value); switch (entry.type) { case FeatureEntry::SINGLE_VALUE: case FeatureEntry::SINGLE_DISABLE_VALUE: - data->SetBoolean( + data.SetBoolKey( "enabled", (!is_default_value && entry.type == FeatureEntry::SINGLE_VALUE) || (is_default_value && entry.type == FeatureEntry::SINGLE_DISABLE_VALUE)); break; case FeatureEntry::ORIGIN_LIST_VALUE: - data->SetBoolean("enabled", !is_default_value); - data->SetString( + data.SetBoolKey("enabled", !is_default_value); + data.SetStringKey( "origin_list_value", GetCombinedOriginListValue(*flags_storage, entry.internal_name, entry.switches.command_line_switch)); @@ -603,8 +602,7 @@ case FeatureEntry::ENABLE_DISABLE_VALUE: case FeatureEntry::FEATURE_VALUE: case FeatureEntry::FEATURE_WITH_PARAMS_VALUE: - data->SetKey("options", base::Value::FromUniquePtrValue( - CreateOptionsData(entry, enabled_entries))); + data.SetKey("options", CreateOptionsData(entry, enabled_entries)); break; } @@ -617,9 +615,9 @@ #endif if (supported) - supported_entries->Append(std::move(data)); + supported_entries.push_back(std::move(data)); else - unsupported_entries->Append(std::move(data)); + unsupported_entries.push_back(std::move(data)); } }
diff --git a/components/flags_ui/flags_state.h b/components/flags_ui/flags_state.h index de21ee52..610ff779 100644 --- a/components/flags_ui/flags_state.h +++ b/components/flags_ui/flags_state.h
@@ -17,10 +17,7 @@ #include "base/containers/span.h" #include "base/feature_list.h" #include "base/macros.h" - -namespace base { -class ListValue; -} +#include "base/values.h" namespace flags_ui { @@ -151,8 +148,8 @@ void GetFlagFeatureEntries( FlagsStorage* flags_storage, FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries, + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries, base::RepeatingCallback<bool(const FeatureEntry&)> skip_feature_entry); // Returns the value for the current platform. This is one of the values
diff --git a/components/flags_ui/flags_state_unittest.cc b/components/flags_ui/flags_state_unittest.cc index de642a2..fb47b6f 100644 --- a/components/flags_ui/flags_state_unittest.cc +++ b/components/flags_ui/flags_state_unittest.cc
@@ -244,16 +244,13 @@ flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags1, true); flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags2, true); - const base::ListValue* entries_list = - prefs_.GetList(prefs::kAboutFlagsEntries); + const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries); ASSERT_TRUE(entries_list != nullptr); - ASSERT_EQ(2u, entries_list->GetSize()); + ASSERT_EQ(2u, entries_list->GetList().size()); - std::string s0; - ASSERT_TRUE(entries_list->GetString(0, &s0)); - std::string s1; - ASSERT_TRUE(entries_list->GetString(1, &s1)); + std::string s0 = entries_list->GetList()[0].GetString(); + std::string s1 = entries_list->GetList()[1].GetString(); EXPECT_TRUE(s0 == kFlags1 || s1 == kFlags1); EXPECT_TRUE(s0 == kFlags2 || s1 == kFlags2); @@ -263,8 +260,8 @@ entries_list = prefs_.GetList(prefs::kAboutFlagsEntries); ASSERT_TRUE(entries_list != nullptr); - ASSERT_EQ(1u, entries_list->GetSize()); - ASSERT_TRUE(entries_list->GetString(0, &s0)); + ASSERT_EQ(1u, entries_list->GetList().size()); + s0 = entries_list->GetList()[0].GetString(); EXPECT_TRUE(s0 == kFlags1); } @@ -272,15 +269,14 @@ // Add two entries, check the pref exists. flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags1, true); flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags2, true); - const base::ListValue* entries_list = - prefs_.GetList(prefs::kAboutFlagsEntries); + const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries); ASSERT_TRUE(entries_list != nullptr); // Remove both, the pref should have been removed completely. flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags1, false); flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags2, false); entries_list = prefs_.GetList(prefs::kAboutFlagsEntries); - EXPECT_TRUE(entries_list == nullptr || entries_list->GetSize() == 0); + EXPECT_TRUE(entries_list == nullptr || entries_list->GetList().size() == 0); } TEST_F(FlagsStateTest, ConvertFlagsToSwitches) { @@ -551,15 +547,12 @@ EXPECT_FALSE(command_line.HasSwitch(kSwitch3)); // FeatureEntry 3 should show still be persisted in preferences though. - const base::ListValue* entries_list = - prefs_.GetList(prefs::kAboutFlagsEntries); + const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries); ASSERT_TRUE(entries_list); - EXPECT_EQ(2U, entries_list->GetSize()); - std::string s0; - ASSERT_TRUE(entries_list->GetString(0, &s0)); + EXPECT_EQ(2U, entries_list->GetList().size()); + std::string s0 = entries_list->GetList()[0].GetString(); EXPECT_EQ(kFlags1, s0); - std::string s1; - ASSERT_TRUE(entries_list->GetString(1, &s1)); + std::string s1 = entries_list->GetList()[1].GetString(); EXPECT_EQ(kFlags3, s1); } @@ -606,15 +599,12 @@ #endif // And it should persist. - const base::ListValue* entries_list = - prefs_.GetList(prefs::kAboutFlagsEntries); + const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries); ASSERT_TRUE(entries_list); - EXPECT_EQ(2U, entries_list->GetSize()); - std::string s0; - ASSERT_TRUE(entries_list->GetString(0, &s0)); + EXPECT_EQ(2U, entries_list->GetList().size()); + std::string s0 = entries_list->GetList()[0].GetString(); EXPECT_EQ(kFlags1, s0); - std::string s1; - ASSERT_TRUE(entries_list->GetString(1, &s1)); + std::string s1 = entries_list->GetList()[1].GetString(); EXPECT_EQ(kFlags2, s1); } @@ -819,16 +809,17 @@ } TEST_F(FlagsStateTest, GetFlagFeatureEntries) { - base::ListValue supported_entries; - base::ListValue unsupported_entries; + base::Value::ListStorage supported_entries; + base::Value::ListStorage unsupported_entries; flags_state_->GetFlagFeatureEntries(&flags_storage_, kGeneralAccessFlagsOnly, - &supported_entries, &unsupported_entries, + supported_entries, unsupported_entries, base::BindRepeating(&SkipFeatureEntry)); // All |kEntries| except for |kFlags3| should be supported. - EXPECT_EQ(11u, supported_entries.GetSize()); - EXPECT_EQ(1u, unsupported_entries.GetSize()); - EXPECT_EQ(base::size(kEntries), - supported_entries.GetSize() + unsupported_entries.GetSize()); + auto supported_count = supported_entries.size(); + auto unsupported_count = unsupported_entries.size(); + EXPECT_EQ(11u, supported_count); + EXPECT_EQ(1u, unsupported_count); + EXPECT_EQ(base::size(kEntries), supported_count + unsupported_count); } } // namespace flags_ui
diff --git a/components/flags_ui/pref_service_flags_storage.cc b/components/flags_ui/pref_service_flags_storage.cc index 82dd60c7..a7eda822 100644 --- a/components/flags_ui/pref_service_flags_storage.cc +++ b/components/flags_ui/pref_service_flags_storage.cc
@@ -22,7 +22,7 @@ PrefServiceFlagsStorage::~PrefServiceFlagsStorage() {} std::set<std::string> PrefServiceFlagsStorage::GetFlags() const { - const base::ListValue* enabled_experiments = + const base::Value* enabled_experiments = prefs_->GetList(prefs::kAboutFlagsEntries); std::set<std::string> flags; for (const auto& entry : enabled_experiments->GetList()) { @@ -38,24 +38,25 @@ bool PrefServiceFlagsStorage::SetFlags(const std::set<std::string>& flags) { ListPrefUpdate update(prefs_, prefs::kAboutFlagsEntries); - base::ListValue* experiments_list = update.Get(); + base::Value* experiments_list = update.Get(); + DCHECK(experiments_list->is_list()); experiments_list->ClearList(); - for (const auto& item : flags) { - experiments_list->AppendString(item); - } + for (const auto& flag : flags) + experiments_list->Append(flag); return true; } std::string PrefServiceFlagsStorage::GetOriginListFlag( const std::string& internal_entry_name) const { - const base::DictionaryValue* origin_lists = + const base::Value* origin_lists = prefs_->GetDictionary(prefs::kAboutFlagsOriginLists); if (!origin_lists) return std::string(); - const base::Value* value = origin_lists->FindKey(internal_entry_name); - return value ? value->GetString() : std::string(); + if (const std::string* s = origin_lists->FindStringKey(internal_entry_name)) + return *s; + return std::string(); } void PrefServiceFlagsStorage::SetOriginListFlag(
diff --git a/components/history/core/browser/url_database.cc b/components/history/core/browser/url_database.cc index 4e02e88..afb3701 100644 --- a/components/history/core/browser/url_database.cc +++ b/components/history/core/browser/url_database.cc
@@ -48,7 +48,7 @@ // Convenience to fill a URLRow. Must be in sync with the fields in // kURLRowFields. -void URLDatabase::FillURLRow(const sql::Statement& s, URLRow* i) { +void URLDatabase::FillURLRow(sql::Statement& s, URLRow* i) { DCHECK(i); i->set_id(s.ColumnInt64(0)); i->set_url(GURL(s.ColumnString(1)));
diff --git a/components/history/core/browser/url_database.h b/components/history/core/browser/url_database.h index 827b1ec..4c4ff99 100644 --- a/components/history/core/browser/url_database.h +++ b/components/history/core/browser/url_database.h
@@ -293,7 +293,7 @@ // Convenience to fill a URLRow. Must be in sync with the fields in // kHistoryURLRowFields. - static void FillURLRow(const sql::Statement& s, URLRow* i); + static void FillURLRow(sql::Statement& s, URLRow* i); // Returns the database for the functions in this interface. The descendant of // this class implements these functions to return its objects.
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc index 5874b6d..8762a31af 100644 --- a/components/history/core/browser/visit_annotations_database.cc +++ b/components/history/core/browser/visit_annotations_database.cc
@@ -142,8 +142,7 @@ // Convenience to construct a `AnnotatedVisitRow`. Assumes the visit values are // bound starting at index 0. -AnnotatedVisitRow StatementToAnnotatedVisitRow( - const sql::Statement& statement) { +AnnotatedVisitRow StatementToAnnotatedVisitRow(sql::Statement& statement) { return {statement.ColumnInt64(0), ConstructContextAnnotationsWithFlags( statement.ColumnInt64(1),
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc index 5d42dd1..2c4aba0d 100644 --- a/components/history/core/browser/visit_database.cc +++ b/components/history/core/browser/visit_database.cc
@@ -126,8 +126,7 @@ // Must be in sync with HISTORY_VISIT_ROW_FIELDS. // static -void VisitDatabase::FillVisitRow(const sql::Statement& statement, - VisitRow* visit) { +void VisitDatabase::FillVisitRow(sql::Statement& statement, VisitRow* visit) { visit->visit_id = statement.ColumnInt64(0); visit->url_id = statement.ColumnInt64(1); visit->visit_time = base::Time::FromInternalValue(statement.ColumnInt64(2));
diff --git a/components/history/core/browser/visit_database.h b/components/history/core/browser/visit_database.h index 42485f4..e251d9c2 100644 --- a/components/history/core/browser/visit_database.h +++ b/components/history/core/browser/visit_database.h
@@ -229,7 +229,7 @@ // Convenience to fill a VisitRow. Assumes the visit values are bound starting // at index 0. - static void FillVisitRow(const sql::Statement& statement, VisitRow* visit); + static void FillVisitRow(sql::Statement& statement, VisitRow* visit); // Convenience to fill a VisitVector. Assumes that statement.step() // hasn't happened yet.
diff --git a/components/lens/lens_features.cc b/components/lens/lens_features.cc index 4c9f5554..0429f9b 100644 --- a/components/lens/lens_features.cc +++ b/components/lens/lens_features.cc
@@ -25,18 +25,39 @@ const base::FeatureParam<bool> kRegionSearchUseMenuItemAltText3{ &kLensRegionSearch, "use-menu-item-alt-text-3", false}; -constexpr base::FeatureParam<int> kMaxPixels{&kLensStandalone, - "dimensions-max-pixels", 1000}; +constexpr base::FeatureParam<int> kMaxPixelsForRegionSearch{ + &kLensRegionSearch, "dimensions-max-pixels", 1000}; -constexpr base::FeatureParam<std::string> kHomepageURL{ +constexpr base::FeatureParam<int> kMaxAreaForRegionSearch{ + &kLensRegionSearch, "dimensions-max-area", 1000000}; + +constexpr base::FeatureParam<int> kMaxPixelsForImageSearch{ + &kLensStandalone, "dimensions-max-pixels", 1000}; + +constexpr base::FeatureParam<std::string> kHomepageURLForImageSearch{ &kLensStandalone, "lens-homepage-url", "https://lens.google.com/"}; -int GetMaxPixels() { - return kMaxPixels.Get(); +constexpr base::FeatureParam<std::string> kHomepageURLForRegionSearch{ + &kLensRegionSearch, "lens-homepage-url", "https://lens.google.com/"}; + +int GetMaxPixelsForRegionSearch() { + return kMaxPixelsForRegionSearch.Get(); } -std::string GetHomepageURL() { - return kHomepageURL.Get(); +int GetMaxAreaForRegionSearch() { + return kMaxAreaForRegionSearch.Get(); +} + +int GetMaxPixelsForImageSearch() { + return kMaxPixelsForImageSearch.Get(); +} + +std::string GetHomepageURLForImageSearch() { + return kHomepageURLForImageSearch.Get(); +} + +std::string GetHomepageURLForRegionSearch() { + return kHomepageURLForRegionSearch.Get(); } } // namespace features
diff --git a/components/lens/lens_features.h b/components/lens/lens_features.h index 52d80d7..c895112 100644 --- a/components/lens/lens_features.h +++ b/components/lens/lens_features.h
@@ -27,11 +27,21 @@ // Enables alternate option 3 for the Region Search context menu item text. extern const base::FeatureParam<bool> kRegionSearchUseMenuItemAltText3; +// Returns the max pixel width/height for the image to be sent to Lens via +// region search. The images are sent at 1x as PNGs. +extern int GetMaxPixelsForRegionSearch(); + +// Returns the max area for the image to be sent to Lens via region search. +extern int GetMaxAreaForRegionSearch(); + // Returns the max pixel width/height for the image to be sent to Lens. -extern int GetMaxPixels(); +extern int GetMaxPixelsForImageSearch(); // The URL for the Lens home page. -extern std::string GetHomepageURL(); +extern std::string GetHomepageURLForImageSearch(); + +// The URL for the Lens home page as defined by Lens Region Search feature. +extern std::string GetHomepageURLForRegionSearch(); } // namespace features } // namespace lens
diff --git a/components/offline_pages/core/background/request_queue_store.cc b/components/offline_pages/core/background/request_queue_store.cc index 68f58de1..bfad3cfe 100644 --- a/components/offline_pages/core/background/request_queue_store.cc +++ b/components/offline_pages/core/background/request_queue_store.cc
@@ -217,7 +217,7 @@ // Create a save page request from the first row of an SQL result. The result // must have the exact columns from the |REQUEST_QUEUE_FIELDS| macro. std::unique_ptr<SavePageRequest> MakeSavePageRequest( - const sql::Statement& statement) { + sql::Statement& statement) { const int64_t id = statement.ColumnInt64(0); const base::Time creation_time = store_utils::FromDatabaseTime(statement.ColumnInt64(1));
diff --git a/components/offline_pages/core/model/get_pages_task.cc b/components/offline_pages/core/model/get_pages_task.cc index 340a427..b3d3327 100644 --- a/components/offline_pages/core/model/get_pages_task.cc +++ b/components/offline_pages/core/model/get_pages_task.cc
@@ -34,13 +34,13 @@ "file_path,title,original_url,request_origin,digest," \ "snippet,attribution" -ClientId OfflinePageClientId(const sql::Statement& statement) { +ClientId OfflinePageClientId(sql::Statement& statement) { return ClientId(statement.ColumnString(7), statement.ColumnString(8)); } // Create an offline page item from a SQL result. // Expects the order of columns as defined by OFFLINE_PAGE_PROJECTION macro. -OfflinePageItem MakeOfflinePageItem(const sql::Statement& statement) { +OfflinePageItem MakeOfflinePageItem(sql::Statement& statement) { OfflinePageItem item; item.offline_id = statement.ColumnInt64(0); item.creation_time = store_utils::FromDatabaseTime(statement.ColumnInt64(1));
diff --git a/components/offline_pages/core/prefetch/store/prefetch_store_test_util.cc b/components/offline_pages/core/prefetch/store/prefetch_store_test_util.cc index 3fd64fe6..7883830c 100644 --- a/components/offline_pages/core/prefetch/store/prefetch_store_test_util.cc +++ b/components/offline_pages/core/prefetch/store/prefetch_store_test_util.cc
@@ -102,7 +102,7 @@ // Populates the PrefetchItem with the data from the current row of the passed // in statement following the natural column ordering. -absl::optional<PrefetchItem> ReadPrefetchItem(const sql::Statement& statement) { +absl::optional<PrefetchItem> ReadPrefetchItem(sql::Statement& statement) { PrefetchItem item; DCHECK_EQ(23, statement.ColumnCount());
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index d85e774..1a93b65 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -173,6 +173,14 @@ if (PageLoadTracker* tracker = GetPageLoadTracker(rfh)) tracker->RenderFrameDeleted(rfh); + content::GlobalRenderFrameHostId rfh_id = rfh->GetGlobalId(); + auto new_end_it = std::remove_if(queued_memory_updates_.begin(), + queued_memory_updates_.end(), + [rfh_id](const MemoryUpdate& update) { + return update.routing_id == rfh_id; + }); + queued_memory_updates_.erase(new_end_it, queued_memory_updates_.end()); + // PageLoadTracker and smoothness data can be associated only with a main // frame. if (rfh->GetParent()) @@ -566,13 +574,8 @@ } if (navigation_handle->HasCommitted()) { - if (navigation_handle->IsInPrerenderedMainFrame()) { - HandleCommittedNavigationForPrerendering( - navigation_handle, std::move(navigation_handle_tracker)); - } else { - HandleCommittedNavigationForTrackedLoad( - navigation_handle, std::move(navigation_handle_tracker)); - } + HandleCommittedNavigationForTrackedLoad( + navigation_handle, std::move(navigation_handle_tracker)); } else { HandleFailedNavigationForTrackedLoad(navigation_handle, std::move(navigation_handle_tracker)); @@ -610,12 +613,18 @@ void MetricsWebContentsObserver::HandleCommittedNavigationForTrackedLoad( content::NavigationHandle* navigation_handle, std::unique_ptr<PageLoadTracker> tracker) { - committed_load_ = std::move(tracker); - committed_load_->Commit(navigation_handle); - DCHECK(committed_load_->did_commit()); + PageLoadTracker* raw_tracker = tracker.get(); + if (navigation_handle->IsInPrerenderedMainFrame()) { + inactive_pages_.emplace(navigation_handle->GetRenderFrameHost(), + std::move(tracker)); + } else { + committed_load_ = std::move(tracker); + } + raw_tracker->Commit(navigation_handle); + DCHECK(raw_tracker->did_commit()); for (auto& observer : testing_observers_) - observer.OnCommit(committed_load_.get()); + observer.OnCommit(raw_tracker); auto* render_frame_host = navigation_handle->GetRenderFrameHost(); const bool is_main_frame = @@ -623,29 +632,27 @@ if (is_main_frame) { auto it = ukm_smoothness_data_.find(render_frame_host); if (it != ukm_smoothness_data_.end()) { - committed_load_->metrics_update_dispatcher() - ->SetUpSharedMemoryForSmoothness(render_frame_host, - std::move(it->second)); + raw_tracker->metrics_update_dispatcher()->SetUpSharedMemoryForSmoothness( + render_frame_host, std::move(it->second)); ukm_smoothness_data_.erase(it); } } - // Clear memory update queue, sending each queued update now that we have - // a `committed_load_`. - while (!queued_memory_updates_.empty()) { - committed_load_->OnV8MemoryChanged(queued_memory_updates_.front()); - queued_memory_updates_.pop(); + // Send queued memory updates for the tracker. + content::GlobalRenderFrameHostId rfh_id = render_frame_host->GetGlobalId(); + auto first_update_for_rfh = std::partition( + queued_memory_updates_.begin(), queued_memory_updates_.end(), + [rfh_id](const MemoryUpdate& update) { + return update.routing_id != rfh_id; + }); + if (first_update_for_rfh != queued_memory_updates_.end()) { + raw_tracker->OnV8MemoryChanged(std::vector<MemoryUpdate>( + first_update_for_rfh, queued_memory_updates_.end())); + queued_memory_updates_.erase(first_update_for_rfh, + queued_memory_updates_.end()); } } -void MetricsWebContentsObserver::HandleCommittedNavigationForPrerendering( - content::NavigationHandle* navigation_handle, - std::unique_ptr<PageLoadTracker> tracker) { - tracker->Commit(navigation_handle); - inactive_pages_.emplace(navigation_handle->GetRenderFrameHost(), - std::move(tracker)); -} - void MetricsWebContentsObserver::MaybeStorePageLoadTrackerForBackForwardCache( content::NavigationHandle* next_navigation_handle, std::unique_ptr<PageLoadTracker> previously_committed_load) { @@ -1095,18 +1102,28 @@ void MetricsWebContentsObserver::OnV8MemoryChanged( const std::vector<MemoryUpdate>& memory_updates) { - // TODO(crbug.com/1190112): Support MPArch. - if (committed_load_) { - committed_load_->OnV8MemoryChanged(memory_updates); - } else { - // If the load hasn't committed yet, then memory updates can't be sent - // at this time, but will still need to be sent later. Queue the updates - // in case `committed_load_` is null due to the navigation having not yet - // completed, in which case the queued updates will be sent when - // HandleCommittedNavigationForTrackedLoad is called. Otherwise, they will - // be ignored and destructed when the MWCO is destructed. - queued_memory_updates_.push(memory_updates); + std::map<PageLoadTracker*, std::vector<MemoryUpdate>> per_tracker_updates; + for (const MemoryUpdate& update : memory_updates) { + content::RenderFrameHost* rfh = + content::RenderFrameHost::FromID(update.routing_id); + if (!rfh) + continue; + PageLoadTracker* tracker = GetPageLoadTracker(rfh); + if (tracker) { + per_tracker_updates[tracker].push_back(update); + } else { + // If the load hasn't committed yet, then memory updates can't be sent + // at this time, but will still need to be sent later. Queue the updates + // in case `tracker` is null due to the navigation having not yet + // completed, in which case the queued updates will be sent when + // HandleCommittedNavigationForTrackedLoad is called. Otherwise, they + // will be ignored and cleared when `rfh` is deleted. + queued_memory_updates_.push_back(update); + } } + + for (const auto& map_pair : per_tracker_updates) + map_pair.first->OnV8MemoryChanged(map_pair.second); } PageLoadTracker* MetricsWebContentsObserver::GetPageLoadTracker(
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h index f3259e6..20277da 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.h +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h
@@ -7,7 +7,6 @@ #include <map> #include <memory> -#include <queue> #include <set> #include <vector> @@ -329,10 +328,11 @@ // Direct usage of this is discouraged. Use GetPageLoadTracker() instead. std::unique_ptr<PageLoadTracker> committed_load_; - // Memory updates that are accumulated while there is no `committed_load_`. - // Will be sent in HandleCommittedNavigationForTrackedLoad, unless the - // render process is gone and/or web contents is destroyed. - std::queue<std::vector<MemoryUpdate>> queued_memory_updates_; + // Memory updates that are accumulated while there is no PageLoadTracker + // associated with RenderFrameHost. Will be sent in + // HandleCommittedNavigationForTrackedLoad, unless the RenderFrameHost is + // deleted and/or web contents is destroyed. + std::vector<MemoryUpdate> queued_memory_updates_; // This is currently set only for the main frame of each page associated with // the WebContents.
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc index 47991d1f..be9ba134 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
@@ -145,9 +145,13 @@ mojom::InputTimingPtr(base::in_place), blink::MobileFriendliness()); } + virtual std::unique_ptr<TestMetricsWebContentsObserverEmbedder> + CreateEmbedder() { + return std::make_unique<TestMetricsWebContentsObserverEmbedder>(); + } + void AttachObserver() { - auto embedder_interface = - std::make_unique<TestMetricsWebContentsObserverEmbedder>(); + auto embedder_interface = CreateEmbedder(); embedder_interface_ = embedder_interface.get(); MetricsWebContentsObserver* observer = MetricsWebContentsObserver::CreateForWebContents( @@ -1639,4 +1643,99 @@ ASSERT_EQ(2, CountCompleteTimingReported()); } +class MetricsWebContentsObserverNonPrimaryPageTest + : public MetricsWebContentsObserverBackForwardCacheTest { + public: + class MetricsObserver : public PageLoadMetricsObserver { + public: + explicit MetricsObserver( + MetricsWebContentsObserverNonPrimaryPageTest* owner) + : owner_(owner) {} + + ObservePolicy OnCommit(content::NavigationHandle* handle, + ukm::SourceId source_id) override { + committed_url_ = handle->GetURL(); + return CONTINUE_OBSERVING; + } + + ObservePolicy OnEnterBackForwardCache( + const mojom::PageLoadTiming& timing) override { + return CONTINUE_OBSERVING; + } + + void OnV8MemoryChanged( + const std::vector<MemoryUpdate>& memory_updates) override { + owner_->OnV8MemoryChanged(committed_url_, memory_updates); + } + + private: + MetricsWebContentsObserverNonPrimaryPageTest* owner_; + GURL committed_url_; + }; + + class Embedder : public TestMetricsWebContentsObserverEmbedder { + public: + explicit Embedder(MetricsWebContentsObserverNonPrimaryPageTest* owner) + : owner_(owner) {} + + void RegisterObservers(PageLoadTracker* tracker) override { + TestMetricsWebContentsObserverEmbedder::RegisterObservers(tracker); + tracker->AddObserver(std::make_unique<MetricsObserver>(owner_)); + } + + private: + MetricsWebContentsObserverNonPrimaryPageTest* owner_; + }; + + std::unique_ptr<TestMetricsWebContentsObserverEmbedder> CreateEmbedder() + override { + return std::make_unique<Embedder>(this); + } + + void OnV8MemoryChanged(const GURL& url, + const std::vector<MemoryUpdate>& memory_updates) { + std::vector<MemoryUpdate>& updates_for_url = observed_memory_updates_[url]; + updates_for_url.insert(updates_for_url.end(), memory_updates.begin(), + memory_updates.end()); + } + + protected: + std::map<GURL, std::vector<MemoryUpdate>> observed_memory_updates_; +}; + +TEST_F(MetricsWebContentsObserverNonPrimaryPageTest, MemoryUpdates) { + // Go to the URL1. + content::NavigationSimulator::NavigateAndCommitFromBrowser( + web_contents(), GURL(kDefaultTestUrl)); + ASSERT_EQ(main_rfh()->GetLastCommittedURL().spec(), GURL(kDefaultTestUrl)); + content::GlobalRenderFrameHostId rfh1_id = main_rfh()->GetGlobalId(); + + ASSERT_EQ(0, CountCompleteTimingReported()); + EXPECT_EQ(0, CountOnBackForwardCacheEntered()); + EXPECT_EQ(1, tracker_committed_count()); + + // Go to the URL2. + content::NavigationSimulator::NavigateAndCommitFromBrowser( + web_contents(), GURL(kDefaultTestUrl2)); + ASSERT_EQ(main_rfh()->GetLastCommittedURL().spec(), GURL(kDefaultTestUrl2)); + content::GlobalRenderFrameHostId rfh2_id = main_rfh()->GetGlobalId(); + + ASSERT_EQ(1, CountCompleteTimingReported()); + EXPECT_EQ(1, CountOnBackForwardCacheEntered()); + EXPECT_EQ(2, tracker_committed_count()); + + std::vector<MemoryUpdate> memory_updates = {{rfh1_id, 100}, {rfh2_id, 200}}; + observer()->OnV8MemoryChanged(memory_updates); + + // Verify that memory updates are observed both in primary URL2 and + // non-primary URL1. + ASSERT_EQ(2u, observed_memory_updates_.size()); + ASSERT_EQ(1u, observed_memory_updates_[GURL(kDefaultTestUrl)].size()); + EXPECT_EQ(100, + observed_memory_updates_[GURL(kDefaultTestUrl)][0].delta_bytes); + ASSERT_EQ(1u, observed_memory_updates_[GURL(kDefaultTestUrl2)].size()); + EXPECT_EQ(200, + observed_memory_updates_[GURL(kDefaultTestUrl2)][0].delta_bytes); +} + } // namespace page_load_metrics
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc index 3453aaa..da060e22 100644 --- a/components/password_manager/core/browser/login_database.cc +++ b/components/password_manager/core/browser/login_database.cc
@@ -641,7 +641,7 @@ #if defined(OS_MAC) // Fills |form| with necessary data required to be removed from the database // and returns it. -PasswordForm GetFormForRemoval(const sql::Statement& statement) { +PasswordForm GetFormForRemoval(sql::Statement& statement) { PasswordForm form; form.url = GURL(statement.ColumnString(COLUMN_ORIGIN_URL)); form.username_element = statement.ColumnString16(COLUMN_USERNAME_ELEMENT); @@ -1474,7 +1474,7 @@ } LoginDatabase::EncryptionResult LoginDatabase::InitPasswordFormFromStatement( - const sql::Statement& s, + sql::Statement& s, bool decrypt_and_fill_password_value, int* primary_key, PasswordForm* form) const {
diff --git a/components/password_manager/core/browser/login_database.h b/components/password_manager/core/browser/login_database.h index 2de9177fd..8108f17 100644 --- a/components/password_manager/core/browser/login_database.h +++ b/components/password_manager/core/browser/login_database.h
@@ -283,7 +283,7 @@ // |decrypt_and_fill_password_value| is set to false, it always returns // ENCRYPTION_RESULT_SUCCESS. EncryptionResult InitPasswordFormFromStatement( - const sql::Statement& s, + sql::Statement& s, bool decrypt_and_fill_password_value, int* primary_key, PasswordForm* form) const WARN_UNUSED_RESULT;
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc index 1cb17f05..c1634b9f 100644 --- a/components/password_manager/core/browser/login_database_unittest.cc +++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -120,18 +120,18 @@ }; template <class T> -T GetFirstColumn(const sql::Statement& s) { +T GetFirstColumn(sql::Statement& s) { static_assert(must_be_specialized<T>::is_specialized, "Implement a specialization."); } template <> -int64_t GetFirstColumn(const sql::Statement& s) { +int64_t GetFirstColumn(sql::Statement& s) { return s.ColumnInt64(0); } template <> -std::string GetFirstColumn(const sql::Statement& s) { +std::string GetFirstColumn(sql::Statement& s) { return s.ColumnString(0); }
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h index 1c81c289..6c0567dd 100644 --- a/components/password_manager/core/browser/mock_password_store.h +++ b/components/password_manager/core/browser/mock_password_store.h
@@ -50,6 +50,10 @@ (const PasswordForm&, const PasswordForm&), (override)); MOCK_METHOD(void, + RemoveLoginsCreatedBetween, + (base::Time, base::Time, base::OnceCallback<void(bool)>), + (override)); + MOCK_METHOD(void, ReportMetrics, (const std::string&, bool, bool), (override)); @@ -57,28 +61,6 @@ ReportMetricsImpl, (const std::string&, bool, BulkCheckDone), (override)); - MOCK_METHOD(PasswordStoreChangeList, - AddLoginImpl, - (const PasswordForm&, AddLoginError* error), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - UpdateLoginImpl, - (const PasswordForm&, UpdateLoginError* error), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - RemoveLoginImpl, - (const PasswordForm&), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - RemoveLoginsByURLAndTimeImpl, - (const base::RepeatingCallback<bool(const GURL&)>&, - base::Time, - base::Time), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - RemoveLoginsCreatedBetweenImpl, - (base::Time, base::Time), - (override)); MOCK_METHOD(bool, RemoveStatisticsByOriginAndTimeImpl, (const base::RepeatingCallback<bool(const GURL&)>&, @@ -97,21 +79,6 @@ FillMatchingLoginsByPassword, (const std::u16string&), (override)); - MOCK_METHOD(DatabaseCleanupResult, DeleteUndecryptableLogins, (), (override)); - void SetUnsyncedCredentialsDeletionNotifier( - std::unique_ptr<UnsyncedCredentialsDeletionNotifier> deletion_notifier) - override { - NOTIMPLEMENTED(); - } - MOCK_METHOD(void, - NotifyLoginsChanged, - (const PasswordStoreChangeList&), - (override)); - void NotifyDeletionsHaveSynced(bool) override { NOTIMPLEMENTED(); } - void NotifyUnsyncedCredentialsWillBeDeleted( - std::vector<PasswordForm>) override { - NOTIMPLEMENTED(); - } MOCK_METHOD(std::vector<InteractionsStats>, GetSiteStatsImpl, (const GURL& origin_domain), @@ -151,55 +118,14 @@ GetAllLoginsWithAffiliationAndBrandingInformation, (PasswordStoreConsumer*), (override)); + void SetUnsyncedCredentialsDeletionNotifier( + std::unique_ptr<UnsyncedCredentialsDeletionNotifier> deletion_notifier) + override { + NOTIMPLEMENTED(); + } MOCK_METHOD(bool, IsAbleToSavePasswords, (), (override, const)); - // TODO(crbug.bom/1226042): Remove this after PasswordStore no longer - // inherits PasswordStoreSync. - MOCK_METHOD(PasswordStoreChangeList, - AddLoginSync, - (const PasswordForm&, AddLoginError*), - (override)); - MOCK_METHOD(bool, - AddInsecureCredentialsSync, - (base::span<const InsecureCredential>), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - UpdateLoginSync, - (const PasswordForm&, UpdateLoginError*), - (override)); - MOCK_METHOD(bool, - UpdateInsecureCredentialsSync, - (const PasswordForm&, base::span<const InsecureCredential>), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - RemoveLoginSync, - (const PasswordForm& form), - (override)); - MOCK_METHOD(bool, BeginTransaction, ()); - MOCK_METHOD(void, RollbackTransaction, (), (override)); - MOCK_METHOD(bool, CommitTransaction, (), (override)); - MOCK_METHOD(FormRetrievalResult, - ReadAllLogins, - (PrimaryKeyToFormMap*), - (override)); - MOCK_METHOD(std::vector<InsecureCredential>, - ReadSecurityIssues, - (FormPrimaryKey), - (override)); - MOCK_METHOD(PasswordStoreChangeList, - RemoveLoginByPrimaryKeySync, - (FormPrimaryKey), - (override)); - MOCK_METHOD(PasswordStoreSync::MetadataStore*, - GetMetadataStore, - (), - (override)); - MOCK_METHOD(bool, IsAccountStore, (), (override, const)); - MOCK_METHOD(bool, DeleteAndRecreateDatabaseFile, (), (override)); - - PasswordStoreSync* GetSyncInterface() { return this; } - protected: ~MockPasswordStore() override;
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc index dba3371..34111b9 100644 --- a/components/password_manager/core/browser/password_form_manager.cc +++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -719,7 +719,7 @@ if (IsUsernameFirstFlowFeatureEnabled() && parsed_submitted_form_->username_value.empty() && - UsePossibleUsername(possible_username)) { + UsePossibleUsernameToBuildCredential(possible_username)) { parsed_submitted_form_->username_value = possible_username->value; metrics_recorder_->set_possible_username_used(true); // PasswordManager does not upload votes for fields that have no names or @@ -992,7 +992,7 @@ ->ComputePasswordAccountStorageUsageLevel()); } -bool PasswordFormManager::UsePossibleUsername( +bool PasswordFormManager::UsePossibleUsernameToBuildCredential( const PossibleUsernameData* possible_username) { if (!possible_username) { LogUsingPossibleUsername(client_, /*is_used*/ false, "Null"); @@ -1000,11 +1000,23 @@ } // The username form and password forms signon realms must be the same. - if (GetSignonRealm(observed_form()->url) != possible_username->signon_realm) { + if (parsed_submitted_form_->signon_realm != possible_username->signon_realm) { LogUsingPossibleUsername(client_, /*is_used*/ false, "Different domains"); return false; } + if (possible_username->value.empty()) { + LogUsingPossibleUsername(client_, /*is_used*/ false, + "Empty possible username value"); + return false; + } + + if (IsPossibleUsernameStale(*possible_username)) { + LogUsingPossibleUsername(client_, /*is_used*/ false, + "Possible username data expired"); + return false; + } + // The username candidate field should not be in |observed_form()|, otherwise // that is a task of FormParser to choose it from |observed_form()|. if (possible_username->driver_id == driver_id_) { @@ -1016,59 +1028,17 @@ } } - // Check whether server predictions have a definite answer. + // Check if there is a server prediction. const PasswordFieldPrediction* field_prediction = FindFieldPrediction( possible_username->form_predictions, possible_username->renderer_id); - if (field_prediction) { - if (field_prediction->type == SINGLE_USERNAME) { - LogUsingPossibleUsername(client_, /*is_used*/ true, "Server predictions"); - return true; - } - if (field_prediction->type == NOT_USERNAME) { - LogUsingPossibleUsername(client_, /*is_used*/ false, - "Server predictions"); - return false; - } + if (field_prediction && field_prediction->type == SINGLE_USERNAME) { + LogUsingPossibleUsername(client_, /*is_used*/ true, "Server predictions"); + return true; + } else { + LogUsingPossibleUsername(client_, /*is_used*/ false, + "No server predictions"); + return false; } - -#if defined(OS_ANDROID) - // Do not trust local heuristics on Android. - // TODO(https://crbug.com/1051914): Make local heuristics more reliable. - return false; -#else - // Check whether it is already learned from previous user actions whether - // |possible_username| corresponds to the valid username form. - const FieldInfoManager* field_info_manager = client_->GetFieldInfoManager(); - if (field_info_manager && field_prediction) { - auto form_signature = possible_username->form_predictions->form_signature; - auto field_signature = field_prediction->signature; - autofill::ServerFieldType type = - field_info_manager->GetFieldType(form_signature, field_signature); - if (type == SINGLE_USERNAME) { - LogUsingPossibleUsername(client_, /*is_used*/ true, "Local prediction"); - return true; - } - if (type == NOT_USERNAME) { - LogUsingPossibleUsername(client_, /*is_used*/ false, "Local prediction"); - return false; - } - } - - // TODO(crbug.com/959776): This currently only considers a possible username - // valid if a credential with the same username already exists for the same - // site. This is too conservative, and we should allow any possible username - // that matches a credential on any site in the user's password store. - std::vector<std::u16string> usernames; - usernames.reserve(GetBestMatches().size()); - base::ranges::transform(GetBestMatches(), std::back_inserter(usernames), - &PasswordForm::username_value); - - bool is_possible_username_valid = IsPossibleUsernameValid( - *possible_username, parsed_submitted_form_->signon_realm, usernames); - LogUsingPossibleUsername(client_, /*is_used*/ is_possible_username_valid, - "Local heuristics"); - return is_possible_username_valid; -#endif // defined(OS_ANDROID) } void PasswordFormManager::UpdatePredictionsForObservedForm(
diff --git a/components/password_manager/core/browser/password_form_manager.h b/components/password_manager/core/browser/password_form_manager.h index c5d03dd..4f054052 100644 --- a/components/password_manager/core/browser/password_form_manager.h +++ b/components/password_manager/core/browser/password_form_manager.h
@@ -313,9 +313,10 @@ // Returns whether |possible_username| should be used for offering the // username to save on username first flow. The decision is based on server - // predictions, data from FieldInfoManager and whether |possible_username| - // looks valid. - bool UsePossibleUsername(const PossibleUsernameData* possible_username); + // predictions, and whether |possible_username| has a non empty value and is + // not expired yet. + bool UsePossibleUsernameToBuildCredential( + const PossibleUsernameData* possible_username); // Updates the predictions stored in |parser_| with predictions relevant for // |observed_form_or_digest_|.
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc index afaad5fa8..a0e0ab9 100644 --- a/components/password_manager/core/browser/password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -2123,19 +2123,21 @@ #endif // defined(OS_IOS) -// Tests that username is taken during username first flow. -TEST_P(PasswordFormManagerTest, UsernameFirstFlow) { +// Tests provisional saving of credentials during username first flow. +TEST_P(PasswordFormManagerTest, UsernameFirstFlowProvisionalSave) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); CreateFormManager(observed_form_only_password_fields_); SetNonFederatedAndNotifyFetchCompleted({&saved_match_}); + + // Create possible username data. + constexpr autofill::FieldRendererId kUsernameFieldRendererId(101); const std::u16string username_field_name = u"username_field"; const std::u16string possible_username = u"test@example.com"; PossibleUsernameData possible_username_data( - saved_match_.signon_realm, autofill::FieldRendererId(2), - username_field_name, possible_username, base::Time::Now(), - 0 /* driver_id */); + saved_match_.signon_realm, kUsernameFieldRendererId, username_field_name, + possible_username, base::Time::Now(), 0 /* driver_id */); FormData submitted_form = observed_form_only_password_fields_; submitted_form.fields[0].value = u"strongpassword"; @@ -2143,16 +2145,22 @@ ASSERT_TRUE(form_manager_->ProvisionallySave(submitted_form, &driver_, &possible_username_data)); -#if !defined(OS_ANDROID) - // Check that a username is chosen from |possible_username_data|. - EXPECT_EQ(possible_username, - form_manager_->GetPendingCredentials().username_value); -#else - // Local heuristics on Android for username first flow are not supported, so - // the username should not be taken from the username form. + // Without server predictions the username should not be taken from the + // single username form. EXPECT_EQ(saved_match_.username_value, form_manager_->GetPendingCredentials().username_value); -#endif // !defined(OS_ANDROID) + + // Create form predictions and set them to |possible_username_data|. + constexpr autofill::FormSignature kUsernameFormSignature(1000); + possible_username_data.form_predictions = MakeSingleUsernamePredictions( + kUsernameFormSignature, kUsernameFieldRendererId); + + ASSERT_TRUE(form_manager_->ProvisionallySave(submitted_form, &driver_, + &possible_username_data)); + + // Check that a username is chosen from |possible_username_data| now. + EXPECT_EQ(possible_username, + form_manager_->GetPendingCredentials().username_value); } // Tests that username is not taken when a possible username is not valid. @@ -2162,12 +2170,18 @@ CreateFormManager(observed_form_only_password_fields_); fetcher_->NotifyFetchCompleted(); + + // Create possible username data. + constexpr autofill::FieldRendererId kUsernameFieldRendererId(101); const std::u16string username_field_name = u"username_field"; std::u16string possible_username = u"possible_username"; PossibleUsernameData possible_username_data( - "https://another.domain.com", autofill::FieldRendererId(2u), + "https://another.domain.com", kUsernameFieldRendererId, username_field_name, possible_username, base::Time::Now(), 0 /* driver_id */); + constexpr autofill::FormSignature kUsernameFormSignature(1000); + possible_username_data.form_predictions = MakeSingleUsernamePredictions( + kUsernameFormSignature, kUsernameFieldRendererId); FormData submitted_form = observed_form_only_password_fields_; submitted_form.fields[0].value = u"strongpassword"; @@ -2180,9 +2194,9 @@ EXPECT_TRUE(form_manager_->GetPendingCredentials().username_value.empty()); } -// Tests that username is taken during username first flow both on password -// saving and updating. -TEST_P(PasswordFormManagerTest, UsernameFirstFlowVotes) { +// Tests that username is taken and votes are uploaded during username first +// flow both on password saving and updating. +TEST_P(PasswordFormManagerTest, UsernameFirstFlow) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); @@ -2194,14 +2208,13 @@ SetNonFederatedAndNotifyFetchCompleted({&saved_match_}); } + // Create possible username data. const std::u16string possible_username = u"possible_username"; constexpr autofill::FieldRendererId kUsernameFieldRendererId(101); const std::u16string field_name = u"username_field"; PossibleUsernameData possible_username_data( saved_match_.signon_realm, kUsernameFieldRendererId, field_name, possible_username, base::Time::Now(), 0 /* driver_id */); - - // Create form predictions and set them to |possible_username_data|. constexpr autofill::FormSignature kUsernameFormSignature(1000); possible_username_data.form_predictions = MakeSingleUsernamePredictions( kUsernameFormSignature, kUsernameFieldRendererId); @@ -2273,11 +2286,11 @@ CreateFormManager(observed_form_only_password_fields_); fetcher_->NotifyFetchCompleted(); + + // Create possible username data. PossibleUsernameData possible_username_data( saved_match_.signon_realm, kUsernameFieldRendererId, kUsernameFieldName, kPossibleUsername, base::Time::Now(), 0 /* driver_id */); - - // Create form predictions and set them to |possible_username_data|. FormPredictions predictions; predictions.form_signature = kUsernameFormSignature; predictions.fields.push_back({ @@ -2321,14 +2334,14 @@ CreateFormManager(observed_form_only_password_fields_); fetcher_->NotifyFetchCompleted(); + + // Create possible username data. const std::u16string possible_username = u"possible_username"; constexpr autofill::FieldRendererId kUsernameFieldRendererId(101); const std::u16string field_name = u""; PossibleUsernameData possible_username_data( saved_match_.signon_realm, kUsernameFieldRendererId, field_name, possible_username, base::Time::Now(), 0 /* driver_id */); - - // Create form predictions and set them to |possible_username_data|. constexpr autofill::FormSignature kUsernameFormSignature(1000); possible_username_data.form_predictions = MakeSingleUsernamePredictions( kUsernameFormSignature, kUsernameFieldRendererId); @@ -2447,65 +2460,6 @@ EXPECT_FALSE(form_manager_->HasLikelyChangePasswordFormSubmitted()); } -#if !defined(OS_ANDROID) -// Tests that data from FieldInfoManager is taken into consideration for -// offering username on username first flow. -// Local heuristics on Android for username first flow is not supported. -TEST_P(PasswordFormManagerTest, PossibleUsernameFieldManager) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); - - const std::u16string username_field_name = u"username_field"; - const std::u16string possible_username = u"possible_username"; - PossibleUsernameData possible_username_data( - saved_match_.signon_realm, autofill::FieldRendererId(102u), - username_field_name, possible_username, base::Time::Now(), - 0 /* driver_id */); - - FormData submitted_form = observed_form_only_password_fields_; - submitted_form.fields[0].value = u"strongpassword"; - - for (ServerFieldType prediction : {SINGLE_USERNAME, NOT_USERNAME}) { - SCOPED_TRACE(testing::Message("prediction=") << prediction); - - constexpr autofill::FormSignature kFormSignature(1234); - constexpr autofill::FieldSignature kFieldSignature(12); - FormPredictions form_predictions; - form_predictions.form_signature = kFormSignature; - // Simulate that the server knows nothing about username field. - form_predictions.fields.push_back( - {.renderer_id = possible_username_data.renderer_id, - .signature = kFieldSignature, - .type = autofill::UNKNOWN_TYPE}); - possible_username_data.form_predictions = form_predictions; - - MockFieldInfoManager mock_field_manager; - EXPECT_CALL(client_, GetFieldInfoManager()) - .WillOnce(Return(&mock_field_manager)); - EXPECT_CALL(mock_field_manager, - GetFieldType(kFormSignature, kFieldSignature)) - .WillOnce(Return(prediction)); - - CreateFormManager(observed_form_only_password_fields_); - fetcher_->NotifyFetchCompleted(); - - ASSERT_TRUE(form_manager_->ProvisionallySave(submitted_form, &driver_, - &possible_username_data)); - - if (prediction == SINGLE_USERNAME) { - // Check that a username is chosen from |possible_username_data|. - EXPECT_EQ(possible_username, - form_manager_->GetPendingCredentials().username_value); - } else { - // Check that a username is not chosen from |possible_username_data|. - EXPECT_TRUE( - form_manager_->GetPendingCredentials().username_value.empty()); - } - Mock::VerifyAndClearExpectations(&client_); - } -} -#endif // !defined(OS_ANDROID) - // Tests that the a form with the username field but without a password field is // not provisionally saved. TEST_P(PasswordFormManagerTest, ProvisinallySavedOnSingleUsernameForm) { @@ -3010,7 +2964,6 @@ form_manager_->Save(); } -#if !defined(OS_ANDROID) // Tests that username is taken during username first flow. // Local heuristics on Android for username first flow is not supported. TEST_F(PasswordFormManagerTestWithMockedSaver, UsernameFirstFlow) { @@ -3018,12 +2971,18 @@ feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); CreateFormManager(observed_form_only_password_fields_); SetNonFederatedAndNotifyFetchCompleted({&saved_match_}); + + // Create possible username data. const std::u16string username_field_name = u"username_field"; const std::u16string possible_username = u"test@example.org"; + constexpr autofill::FieldRendererId kUsernameFieldRendererId(101); PossibleUsernameData possible_username_data( - saved_match_.signon_realm, autofill::FieldRendererId(2u), - username_field_name, possible_username, base::Time::Now(), - 0 /* driver_id */); + saved_match_.signon_realm, kUsernameFieldRendererId, username_field_name, + possible_username, base::Time::Now(), 0 /* driver_id */); + constexpr autofill::FormSignature kUsernameFormSignature(1000); + possible_username_data.form_predictions = MakeSingleUsernamePredictions( + kUsernameFormSignature, kUsernameFieldRendererId); + FormData submitted_form = observed_form_only_password_fields_; submitted_form.fields[0].value = u"strongpassword"; // Check that a username is chosen from |possible_username_data|. @@ -3033,7 +2992,6 @@ ASSERT_TRUE(form_manager_->ProvisionallySave(submitted_form, &driver_, &possible_username_data)); } -#endif // !defined(OS_ANDROID) // Tests that username is not taken when a possible username is not valid. TEST_F(PasswordFormManagerTestWithMockedSaver, @@ -3042,12 +3000,19 @@ feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); CreateFormManager(observed_form_only_password_fields_); fetcher_->NotifyFetchCompleted(); + + // Create possible username data. + constexpr autofill::FieldRendererId kUsernameFieldRendererId(101); std::u16string username_field_name = u"username_field"; std::u16string possible_username = u"possible_username"; PossibleUsernameData possible_username_data( - "https://another.domain.com", autofill::FieldRendererId(2u), + "https://another.domain.com", kUsernameFieldRendererId, username_field_name, possible_username, base::Time::Now(), 0 /* driver_id */); + constexpr autofill::FormSignature kUsernameFormSignature(1000); + possible_username_data.form_predictions = MakeSingleUsernamePredictions( + kUsernameFormSignature, kUsernameFieldRendererId); + FormData submitted_form = observed_form_only_password_fields_; submitted_form.fields[0].value = u"strongpassword"; PasswordForm parsed_submitted_form;
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 0e04b40..936580c 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -3493,64 +3493,118 @@ EXPECT_EQ(password_field_id, form_generation_data.new_password_renderer_id); } -// Checks that username is saved on username first flow. -TEST_P(PasswordManagerTest, UsernameFirstFlow) { +// Checks that username is suggested in the save prompt and saved on username +// first flow if SINGLE_USERNAME server prediction is available. +TEST_P(PasswordManagerTest, UsernameFirstFlowSavingWithServerPredictions) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); + + PasswordForm saved_form(MakeSavedForm()); EXPECT_CALL(*store_, GetLogins(_, _)) - .WillRepeatedly( - WithArg<1>(InvokeConsumer(store_.get(), MakeSavedForm()))); + .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), saved_form))); - PasswordForm form(MakeSimpleFormWithOnlyPasswordField()); - // Simulate the user typed a username in username form. - const std::u16string username = u"googleuser@gmail.com"; - EXPECT_CALL(driver_, GetLastCommittedURL()).WillOnce(ReturnRef(form.url)); - manager()->OnUserModifiedNonPasswordField(&driver_, FieldRendererId(1001), - u"username", username /* value */); + PasswordForm username_form(MakeSimpleFormWithOnlyUsernameField()); + // Simulate the user typed a previously not saved username in the username + // form. + const std::u16string username = u"newusername@gmail.com"; + ASSERT_TRUE(saved_form.username_value != username); + EXPECT_CALL(driver_, GetLastCommittedURL()) + .WillOnce(ReturnRef(username_form.url)); + manager()->OnUserModifiedNonPasswordField( + &driver_, username_form.form_data.fields[0].unique_renderer_id, + u"username", username /* value */); - // Simulate that a form which contains only 1 field which is password is added + // Setup a server prediction for the single username field. + FormStructure form_structure(username_form.form_data); + FieldPrediction prediction; + prediction.set_type(SINGLE_USERNAME); + form_structure.field(0)->set_server_predictions({prediction}); + manager()->ProcessAutofillPredictions(&driver_, {&form_structure}); + + PasswordForm password_form(MakeSimpleFormWithOnlyPasswordField()); + // Simulate that a form which contains only 1 password field is added // to the page. - manager()->OnPasswordFormsParsed(&driver_, {form.form_data} /* observed */); + manager()->OnPasswordFormsParsed(&driver_, + {password_form.form_data} /* observed */); - EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) + EXPECT_CALL(client_, IsSavingAndFillingEnabled(password_form.url)) .WillRepeatedly(Return(true)); - // Simulate that the user typed password and submitted the password form. - const std::u16string password = u"uniquepassword"; - form.form_data.fields[0].value = password; - OnPasswordFormSubmitted(form.form_data); + // Simulate that the user typed a password and submitted the password form. + const std::u16string password = u"newpassword"; + password_form.form_data.fields[0].value = password; + OnPasswordFormSubmitted(password_form.form_data); - std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save; + // Simulate successful submission and expect a save prompt. + std::unique_ptr<PasswordFormManagerForUI> form_manager; EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)) - .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save))); - - // Simulates successful submission. + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager))); manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, true); + ASSERT_TRUE(form_manager); - ASSERT_TRUE(form_manager_to_save); -#if !defined(OS_ANDROID) + // Simulate accepting the prompt and expect saving the new credential. EXPECT_CALL(*store_, AddLogin(AllOf(Field(&PasswordForm::username_value, username), Field(&PasswordForm::password_value, password)))); -#else - // Local heuristics on Android for username first flow are not supported, so - // the username should not be taken from the username form. Furthermore, since - // there is no change to the already saved username, this should trigger an - // update flow, rather than a save flow. + form_manager->Save(); +} + +// Checks that possible single username value is not suggested in the save +// prompt if SINGLE_USERNAME server prediction is not available. +TEST_P(PasswordManagerTest, UsernameFirstFlowSavingWithoutServerPredictions) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kUsernameFirstFlow); + + PasswordForm saved_form(MakeSavedForm()); + EXPECT_CALL(*store_, GetLogins(_, _)) + .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), saved_form))); + + PasswordForm username_form(MakeSimpleFormWithOnlyUsernameField()); + // Simulate the user typed a previously not saved username in username form. + const std::u16string username = u"newusername@gmail.com"; + ASSERT_TRUE(saved_form.username_value != username); + EXPECT_CALL(driver_, GetLastCommittedURL()) + .WillOnce(ReturnRef(username_form.url)); + manager()->OnUserModifiedNonPasswordField( + &driver_, username_form.form_data.fields[0].unique_renderer_id, + u"username", username /* value */); + + PasswordForm password_form(MakeSimpleFormWithOnlyPasswordField()); + // Simulate that a form which contains only 1 field which is password is added + // to the page. + manager()->OnPasswordFormsParsed(&driver_, + {password_form.form_data} /* observed */); + + EXPECT_CALL(client_, IsSavingAndFillingEnabled(password_form.url)) + .WillRepeatedly(Return(true)); + + // Simulate that the user typed previously not saved password and submitted + // the password form. + const std::u16string password = u"newpassword"; + ASSERT_TRUE(saved_form.password_value != password); + password_form.form_data.fields[0].value = password; + OnPasswordFormSubmitted(password_form.form_data); + + // Simulate successful submission and expect an update prompt. + std::unique_ptr<PasswordFormManagerForUI> form_manager; + EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)) + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager))); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, true); + ASSERT_TRUE(form_manager); + + // Simulate accepting the prompt and expect updating the credential. EXPECT_CALL( *store_, UpdateLogin(AllOf( Field(&PasswordForm::username_value, MakeSavedForm().username_value), Field(&PasswordForm::password_value, password)))); -#endif // defined(OS_ANDROID) - // Simulate saving the form, as if the info bar was accepted. - form_manager_to_save->Save(); + form_manager->Save(); } #if !defined(OS_IOS) // Checks that username is filled on username first flow based on server and // local predictions. -TEST_P(PasswordManagerTest, UsernameFirstFlowFillingServerAndLocalPredictions) { +TEST_P(PasswordManagerTest, UsernameFirstFlowFilling) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(features::kUsernameFirstFlowFilling); EXPECT_CALL(*store_, GetLogins(_, _))
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index 3de21af3..9900ee7a 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -10,6 +10,7 @@ #include <string> #include <utility> +#include "base/barrier_closure.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/containers/contains.h" @@ -68,6 +69,64 @@ return forms; } +// Helper function which invokes |notifying_callback| and |completion_callback| +// when changes are received. +void InvokeCallbackOnChanges( + base::OnceCallback<void(const PasswordStoreChangeList& changes)> + notifying_callback, + base::OnceCallback<void(bool)> completion_callback, + const PasswordStoreChangeList& changes) { + DCHECK(notifying_callback); + std::move(notifying_callback).Run(changes); + if (completion_callback) + std::move(completion_callback).Run(!changes.empty()); +} + +// Helper object which aggregates results from multiple operations and invokes +// completion callback when all the operations are finished. +class OperationHandler { + public: + static OperationHandler* CreateOperationHandler() { + return new OperationHandler(); + } + + void AwaitOperation( + base::OnceCallback<void(PasswordStoreChangeListReply)> operation) { + std::move(operation).Run( + base::BindOnce(&OperationHandler::OnPasswordStoreChangesReceived, + base::Unretained(this))); + operations_++; + } + + // After |InvokeOnCompletion| was called the object shouldn't be used. + void InvokeOnCompletion(PasswordStoreChangeListReply callback) { + DCHECK_NE(0, operations_); + changes_received_ = base::BarrierClosure( + operations_, base::BindOnce(&OperationHandler::OnAllOperationsFinished, + base::Owned(this), std::move(callback))); + } + + private: + OperationHandler() = default; + + void OnPasswordStoreChangesReceived(const PasswordStoreChangeList& changes) { + operations_--; + changes_.insert(changes_.end(), changes.begin(), changes.end()); + if (changes_received_) + changes_received_.Run(); + } + + void OnAllOperationsFinished(PasswordStoreChangeListReply callback) { + std::move(callback).Run(changes_); + } + + PasswordStoreChangeList changes_; + + base::RepeatingClosure changes_received_; + + int operations_ = 0; +}; + } // namespace PasswordStore::PasswordStore() = default; @@ -86,6 +145,8 @@ TRACE_EVENT_NESTABLE_ASYNC_BEGIN0( "passwords", "PasswordStore::InitOnBackgroundSequence", this); backend_->InitBackend( + base::BindRepeating(&PasswordStore::NotifyLoginsChangedOnMainSequence, + this), std::move(sync_enabled_or_disabled_cb), base::BindOnce(&PasswordStore::OnInitCompleted, this)); } @@ -100,25 +161,37 @@ void PasswordStore::AddLogin(const PasswordForm& form) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - ScheduleTask(base::BindOnce(&PasswordStore::AddLoginInternal, this, form)); + backend_->AddLoginAsync( + form, + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this)); } void PasswordStore::UpdateLogin(const PasswordForm& form) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - ScheduleTask(base::BindOnce(&PasswordStore::UpdateLoginInternal, this, form)); + backend_->UpdateLoginAsync( + form, + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this)); } void PasswordStore::UpdateLoginWithPrimaryKey( const PasswordForm& new_form, const PasswordForm& old_primary_key) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - ScheduleTask(base::BindOnce(&PasswordStore::UpdateLoginWithPrimaryKeyInternal, - this, new_form, old_primary_key)); + OperationHandler* handler = OperationHandler::CreateOperationHandler(); + handler->AwaitOperation( + base::BindOnce(&PasswordStoreBackend::RemoveLoginAsync, + base::Unretained(backend_), old_primary_key)); + handler->AwaitOperation(base::BindOnce(&PasswordStoreBackend::AddLoginAsync, + base::Unretained(backend_), new_form)); + handler->InvokeOnCompletion( + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this)); } void PasswordStore::RemoveLogin(const PasswordForm& form) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - ScheduleTask(base::BindOnce(&PasswordStore::RemoveLoginInternal, this, form)); + backend_->RemoveLoginAsync( + form, + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this)); } void PasswordStore::RemoveLoginsByURLAndTime( @@ -128,12 +201,10 @@ base::OnceClosure completion, base::OnceCallback<void(bool)> sync_completion) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - // TODO(crbug.com/1226042): Pass NotifyLoginsChanged as a callback since - // PasswordStoreImpl won't call PasswordStore::NotifyLoginsChanged directly - // after it inherits PasswordStoreSync. backend_->RemoveLoginsByURLAndTimeAsync( - base::NullCallback(), url_filter, delete_begin, delete_end, - std::move(completion), std::move(sync_completion)); + url_filter, delete_begin, delete_end, std::move(sync_completion), + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this) + .Then(std::move(completion))); } void PasswordStore::RemoveLoginsCreatedBetween( @@ -141,9 +212,12 @@ base::Time delete_end, base::OnceCallback<void(bool)> completion) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - ScheduleTask( - base::BindOnce(&PasswordStore::RemoveLoginsCreatedBetweenInternal, this, - delete_begin, delete_end, std::move(completion))); + auto callback = + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this); + backend_->RemoveLoginsCreatedBetweenAsync( + delete_begin, delete_end, + base::BindOnce(&InvokeCallbackOnChanges, std::move(callback), + std::move(completion))); } void PasswordStore::DisableAutoSignInForOrigins( @@ -159,8 +233,10 @@ void PasswordStore::Unblocklist(const PasswordFormDigest& form_digest, base::OnceClosure completion) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); - ScheduleTask(base::BindOnce(&PasswordStore::UnblocklistInternal, this, - form_digest, std::move(completion))); + backend_->FillMatchingLoginsAsync( + base::BindOnce(&PasswordStore::UnblocklistInternal, this, + std::move(completion)), + {form_digest}); } void PasswordStore::GetLogins(const PasswordFormDigest& form, @@ -400,21 +476,14 @@ {base::MayBlock(), base::TaskPriority::USER_VISIBLE}); } -void PasswordStore::NotifyLoginsChanged( - const PasswordStoreChangeList& changes) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - if (!changes.empty()) { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this, - changes)); - } -} - void PasswordStore::InvokeAndNotifyAboutInsecureCredentialsChange( base::OnceCallback<PasswordStoreChangeList()> callback) { DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - NotifyLoginsChanged(std::move(callback).Run()); + PasswordStoreChangeList changes = std::move(callback).Run(); + main_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this, + changes)); } void PasswordStore::OnInitCompleted(bool success) { @@ -479,84 +548,6 @@ consumer->GetWeakPtr(), base::RetainedRef(this))); } -void PasswordStore::AddLoginInternal(const PasswordForm& form) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("passwords", "PasswordStore::AddLoginInternal"); - BeginTransaction(); - PasswordStoreChangeList changes = AddLoginImpl(form); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. - CommitTransaction(); -} - -void PasswordStore::UpdateLoginInternal(const PasswordForm& form) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("passwords", "PasswordStore::UpdateLoginInternal"); - BeginTransaction(); - PasswordStoreChangeList changes = UpdateLoginImpl(form); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. - CommitTransaction(); -} - -void PasswordStore::RemoveLoginInternal(const PasswordForm& form) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("passwords", "PasswordStore::RemoveLoginInternal"); - BeginTransaction(); - PasswordStoreChangeList changes = RemoveLoginImpl(form); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. - CommitTransaction(); -} - -void PasswordStore::UpdateLoginWithPrimaryKeyInternal( - const PasswordForm& new_form, - const PasswordForm& old_primary_key) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("passwords", "PasswordStore::UpdateLoginWithPrimaryKeyInternal"); - BeginTransaction(); - PasswordStoreChangeList all_changes = RemoveLoginImpl(old_primary_key); - PasswordStoreChangeList changes = AddLoginImpl(new_form); - all_changes.insert(all_changes.end(), changes.begin(), changes.end()); - NotifyLoginsChanged(all_changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. - CommitTransaction(); -} - -void PasswordStore::RemoveLoginsCreatedBetweenInternal( - base::Time delete_begin, - base::Time delete_end, - base::OnceCallback<void(bool)> completion) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("passwords", - "PasswordStore::RemoveLoginsCreatedBetweenInternal"); - BeginTransaction(); - PasswordStoreChangeList changes = - RemoveLoginsCreatedBetweenImpl(delete_begin, delete_end); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. - CommitTransaction(); - if (completion) { - main_task_runner_->PostTask( - FROM_HERE, base::BindOnce(std::move(completion), !changes.empty())); - } -} - void PasswordStore::RemoveStatisticsByOriginAndTimeInternal( const base::RepeatingCallback<bool(const GURL&)>& origin_filter, base::Time delete_begin, @@ -581,20 +572,39 @@ main_task_runner_->PostTask(FROM_HERE, std::move(completion)); } -void PasswordStore::UnblocklistInternal(const PasswordFormDigest& form_digest, - base::OnceClosure completion) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); +void PasswordStore::UnblocklistInternal( + base::OnceClosure completion, + std::vector<std::unique_ptr<PasswordForm>> forms) { + DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); TRACE_EVENT0("passwords", "PasswordStore::UnblocklistInternal"); - std::vector<std::unique_ptr<PasswordForm>> all_matches = - GetLoginsImpl(form_digest); - for (auto& form : all_matches) { + std::vector<PasswordForm> forms_to_remove; + for (auto& form : forms) { // Ignore PSL matches for blocked entries. if (form->blocked_by_user && !form->is_public_suffix_match) - RemoveLoginInternal(*form); + forms_to_remove.push_back(std::move(*form)); } + + if (forms_to_remove.empty()) { + if (completion) + std::move(completion).Run(); + return; + } + + OperationHandler* handler = OperationHandler::CreateOperationHandler(); + + for (const auto& form : forms_to_remove) { + handler->AwaitOperation( + base::BindOnce(&PasswordStoreBackend::RemoveLoginAsync, + base::Unretained(backend_), form)); + } + + auto notify_callback = + base::BindOnce(&PasswordStore::NotifyLoginsChangedOnMainSequence, this); if (completion) - main_task_runner_->PostTask(FROM_HERE, std::move(completion)); + notify_callback = std::move(notify_callback).Then(std::move(completion)); + + handler->InvokeOnCompletion(std::move(notify_callback)); } void PasswordStore::RemoveFieldInfoByTimeInternal( @@ -676,116 +686,4 @@ return nullptr; } -void PasswordStore::FindAndUpdateAffiliatedWebLogins( - const PasswordForm& added_or_updated_android_form) { - if (!affiliated_match_helper_) - return; - affiliated_match_helper_->GetAffiliatedWebRealms( - PasswordFormDigest(added_or_updated_android_form), - base::BindOnce(&PasswordStore::ScheduleUpdateAffiliatedWebLoginsImpl, - this, added_or_updated_android_form)); -} - -void PasswordStore::ScheduleFindAndUpdateAffiliatedWebLogins( - const PasswordForm& added_or_updated_android_form) { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&PasswordStore::FindAndUpdateAffiliatedWebLogins, this, - added_or_updated_android_form)); -} - -void PasswordStore::UpdateAffiliatedWebLoginsImpl( - const PasswordForm& updated_android_form, - const std::vector<std::string>& affiliated_web_realms) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - BeginTransaction(); - PasswordStoreChangeList all_changes; - for (const std::string& affiliated_web_realm : affiliated_web_realms) { - std::vector<std::unique_ptr<PasswordForm>> web_logins(FillMatchingLogins( - {PasswordForm::Scheme::kHtml, affiliated_web_realm, GURL()})); - for (auto& web_login : web_logins) { - // Do not update HTTP logins, logins saved under insecure conditions, and - // non-HTML login forms; PSL matches; logins with a different username; - // and logins with the same password (to avoid generating no-op updates). - if (!AffiliatedMatchHelper::IsValidWebCredential( - PasswordFormDigest(*web_login)) || - web_login->is_public_suffix_match || - web_login->username_value != updated_android_form.username_value || - web_login->password_value == updated_android_form.password_value) - continue; - - // If the |web_login| was updated in the same or a later chunk of Sync - // changes, assume that it is more recent and do not update it. Note that - // this check is far from perfect conflict resolution and mostly prevents - // long-dormant Sync clients doing damage when they wake up in the face - // of the following list of changes: - // - // Time Source Change - // ==== ====== ====== - // #1 Android android_login.password_value = "A" - // #2 Client A web_login.password_value = "A" (propagation) - // #3 Client A web_login.password_value = "B" (manual overwrite) - // - // When long-dormant Sync client B wakes up, it will only get a distilled - // subset of not-yet-obsoleted changes {1, 3}. In this case, client B must - // not propagate password "A" to |web_login|. This is prevented as change - // #3 will arrive either in the same/later chunk of sync changes, so the - // |date_synced| of |web_login| value will be greater or equal. - // - // Note that this solution has several shortcomings: - // - // (1) It will not prevent local changes to |web_login| from being - // overwritten if they were made shortly after start-up, before - // Sync changes are applied. This should be tolerable. - // - // (2) It assumes that all Sync clients are fully capable of propagating - // changes to web credentials on their own. If client C runs an - // older version of Chrome and updates the password for |web_login| - // around the time when the |android_login| is updated, the updated - // password will not be propagated by client B to |web_login| when - // it wakes up, regardless of the temporal order of the original - // changes, as client B will see both credentials having the same - // |data_synced|. - // - // (2a) Above could be mitigated by looking not only at |data_synced|, - // but also at the actual order of Sync changes. - // - // (2b) However, (2a) is still not workable, as a Sync change is made - // when any attribute of the credential is updated, not only the - // password. Hence it is not possible for client B to distinguish - // between two following two event orders: - // - // #1 Android android_login.password_value = "A" - // #2 Client C web_login.password_value = "B" (manual overwrite) - // #3 Android android_login.random_attribute = "..." - // - // #1 Client C web_login.password_value = "B" (manual overwrite) - // #2 Android android_login.password_value = "A" - // - // And so it must assume that it is unsafe to update |web_login|. - if (web_login->date_synced >= updated_android_form.date_synced) - continue; - - web_login->password_value = updated_android_form.password_value; - - PasswordStoreChangeList changes = UpdateLoginImpl(*web_login); - all_changes.insert(all_changes.end(), changes.begin(), changes.end()); - } - } - NotifyLoginsChanged(all_changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. - CommitTransaction(); -} - -void PasswordStore::ScheduleUpdateAffiliatedWebLoginsImpl( - const PasswordForm& updated_android_form, - const std::vector<std::string>& affiliated_web_realms) { - ScheduleTask(base::BindOnce(&PasswordStore::UpdateAffiliatedWebLoginsImpl, - this, updated_android_form, - affiliated_web_realms)); -} - } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index c8bc56c6..1691ad6 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -57,9 +57,7 @@ // from the UI thread. // PasswordStoreSync is a hidden base class because only PasswordSyncBridge // needs to access these methods. -// TODO(crbug.com/1217071): Move PasswordStoreSync to local backend. -class PasswordStore : protected PasswordStoreSync, - public PasswordStoreInterface, +class PasswordStore : public PasswordStoreInterface, protected SmartBubbleStatsStore { public: // Used to notify that unsynced credentials are about to be deleted. @@ -229,17 +227,6 @@ bool custom_passphrase_sync_enabled, BulkCheckDone bulk_check_done) = 0; - // Synchronous implementation to remove the given logins. - virtual PasswordStoreChangeList RemoveLoginsByURLAndTimeImpl( - const base::RepeatingCallback<bool(const GURL&)>& url_filter, - base::Time delete_begin, - base::Time delete_end) = 0; - - // Synchronous implementation to remove the given logins. - virtual PasswordStoreChangeList RemoveLoginsCreatedBetweenImpl( - base::Time delete_begin, - base::Time delete_end) = 0; - // Synchronous implementation to remove the statistics. virtual bool RemoveStatisticsByOriginAndTimeImpl( const base::RepeatingCallback<bool(const GURL&)>& origin_filter, @@ -250,21 +237,6 @@ virtual PasswordStoreChangeList DisableAutoSignInForOriginsImpl( const base::RepeatingCallback<bool(const GURL&)>& origin_filter) = 0; - // Synchronous implementation provided by subclasses to add the given login. - virtual PasswordStoreChangeList AddLoginImpl( - const PasswordForm& form, - AddLoginError* error = nullptr) = 0; - - // Synchronous implementation provided by subclasses to update the given - // login. - virtual PasswordStoreChangeList UpdateLoginImpl( - const PasswordForm& form, - UpdateLoginError* error = nullptr) = 0; - - // Synchronous implementation provided by subclasses to remove the given - // login. - virtual PasswordStoreChangeList RemoveLoginImpl(const PasswordForm& form) = 0; - // Finds and returns all PasswordForms with the same signon_realm as |form|, // or with a signon_realm that is a PSL-match to that of |form|. virtual std::vector<std::unique_ptr<PasswordForm>> FillMatchingLogins( @@ -312,10 +284,6 @@ virtual base::WeakPtr<syncer::ModelTypeControllerDelegate> GetSyncControllerDelegateOnBackgroundSequence() = 0; - // Called by *Internal() methods once the underlying data-modifying operation - // has been performed. - void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override; - // Invokes callback and notifies observers if there was a change to the list // of insecure passwords. It also informs Sync about the updated password // forms to sync up the changes about insecure credentials. @@ -382,17 +350,12 @@ InsecureCredentialsTask task); // The following methods notify observers that the password store may have - // been modified via NotifyLoginsChanged(). Note that there is no guarantee - // that the called method will actually modify the password store data. - void AddLoginInternal(const PasswordForm& form); - void UpdateLoginInternal(const PasswordForm& form); - void RemoveLoginInternal(const PasswordForm& form); - void UpdateLoginWithPrimaryKeyInternal(const PasswordForm& new_form, - const PasswordForm& old_primary_key); - void RemoveLoginsCreatedBetweenInternal( - base::Time delete_begin, - base::Time delete_end, - base::OnceCallback<void(bool)> completion); + // been modified via NotifyLoginsChangedOnMainSequence(). Note that there is + // no guarantee that the called method will actually modify the password store + // data. + void UnblocklistInternal(base::OnceClosure completion, + std::vector<std::unique_ptr<PasswordForm>> forms); + void RemoveStatisticsByOriginAndTimeInternal( const base::RepeatingCallback<bool(const GURL&)>& origin_filter, base::Time delete_begin, @@ -401,8 +364,6 @@ void DisableAutoSignInForOriginsInternal( const base::RepeatingCallback<bool(const GURL&)>& origin_filter, base::OnceClosure completion); - void UnblocklistInternal(const PasswordFormDigest& form_digest, - base::OnceClosure completion); PasswordStoreChangeList RemoveCompromisedCredentialsByUrlAndTimeInternal( const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time remove_begin, @@ -451,32 +412,6 @@ // background sequence. std::unique_ptr<PasswordForm> GetLoginImpl(const PasswordForm& primary_key); - // Called when a password is added or updated for an Android application, and - // triggers finding web sites affiliated with the Android application and - // propagating the new password to credentials for those web sites, if any. - // Called on the main sequence. - void FindAndUpdateAffiliatedWebLogins( - const PasswordForm& added_or_updated_android_form); - - // Posts FindAndUpdateAffiliatedWebLogins() to the main sequence. Should be - // called from the background sequence. - void ScheduleFindAndUpdateAffiliatedWebLogins( - const PasswordForm& added_or_updated_android_form); - - // Called when a password is added or updated for an Android application, and - // propagates these changes to credentials stored for |affiliated_web_realms| - // under the same username, if there are any. Called on the background - // sequence. - void UpdateAffiliatedWebLoginsImpl( - const PasswordForm& updated_android_form, - const std::vector<std::string>& affiliated_web_realms); - - // Schedules UpdateAffiliatedWebLoginsImpl() to run on the background - // sequence. Should be called from the main sequence. - void ScheduleUpdateAffiliatedWebLoginsImpl( - const PasswordForm& updated_android_form, - const std::vector<std::string>& affiliated_web_realms); - // TaskRunner for tasks that run on the main sequence (usually the UI thread). scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
diff --git a/components/password_manager/core/browser/password_store_backend.h b/components/password_manager/core/browser/password_store_backend.h index 2a41ddbb..f6e8c4e 100644 --- a/components/password_manager/core/browser/password_store_backend.h +++ b/components/password_manager/core/browser/password_store_backend.h
@@ -18,6 +18,8 @@ using LoginsResult = std::vector<std::unique_ptr<PasswordForm>>; using LoginsReply = base::OnceCallback<void(LoginsResult)>; +using PasswordStoreChangeListReply = + base::OnceCallback<void(const PasswordStoreChangeList&)>; // The backend is used by the `PasswordStore` to interact with the storage in a // platform-dependent way (e.g. on Desktop, it calls a local database while on @@ -28,8 +30,8 @@ public: using OptionalLoginsReply = base::OnceCallback<void(absl::optional<LoginsResult>)>; - using OptionalStoreChangeListReply = - base::OnceCallback<void(absl::optional<PasswordStoreChangeList>)>; + using RemoteChangesReceived = + base::RepeatingCallback<void(const PasswordStoreChangeList&)>; PasswordStoreBackend() = default; PasswordStoreBackend(const PasswordStoreBackend&) = delete; @@ -40,7 +42,8 @@ // TODO(crbug.bom/1226042): Rename this to Init after PasswordStoreImpl no // longer inherits PasswordStore. - virtual void InitBackend(base::RepeatingClosure sync_enabled_or_disabled_cb, + virtual void InitBackend(RemoteChangesReceived remote_form_changes_received, + base::RepeatingClosure sync_enabled_or_disabled_cb, base::OnceCallback<void(bool)> completion) = 0; // Returns the complete list of PasswordForms (regardless of their blocklist @@ -67,33 +70,30 @@ // TODO(crbug.com/1217071): Delete corresponding Impl method from // PasswordStore and the async method on backend_ instead. - virtual void AddLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) = 0; - virtual void UpdateLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) = 0; - virtual void RemoveLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) = 0; + virtual void AddLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) = 0; + virtual void UpdateLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) = 0; + virtual void RemoveLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) = 0; virtual void RemoveLoginsByURLAndTimeAsync( - OptionalStoreChangeListReply callback, const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, - base::OnceCallback<void(bool)> sync_completion) = 0; + base::OnceCallback<void(bool)> sync_completion, + PasswordStoreChangeListReply callback) = 0; virtual void RemoveLoginsCreatedBetweenAsync( - OptionalStoreChangeListReply callback, base::Time delete_begin, - base::Time delete_end) {} + base::Time delete_end, + PasswordStoreChangeListReply callback) = 0; virtual void DisableAutoSignInForOriginsAsync( - OptionalStoreChangeListReply callback, + PasswordStoreChangeListReply callback, const base::RepeatingCallback<bool(const GURL&)>& origin_filter) {} virtual void FillMatchingLoginsByPasswordAsync( LoginsReply callback, const std::u16string& plain_text_password) {} - virtual void FillAutofillableLoginsAsync( - OptionalStoreChangeListReply callback) {} - virtual void FillBlocklistLoginsAsync(OptionalStoreChangeListReply callback) { - } + virtual void FillAutofillableLoginsAsync(LoginsReply callback) {} + virtual void FillBlocklistLoginsAsync(LoginsReply callback) {} }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_impl.cc b/components/password_manager/core/browser/password_store_impl.cc index f2a79d11..e02f50d 100644 --- a/components/password_manager/core/browser/password_store_impl.cc +++ b/components/password_manager/core/browser/password_store_impl.cc
@@ -67,74 +67,6 @@ bulk_check_done); } -PasswordStoreChangeList PasswordStoreImpl::AddLoginImpl( - const PasswordForm& form, - AddLoginError* error) { - DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); - if (!login_db_) { - if (error) { - *error = AddLoginError::kDbNotAvailable; - } - return PasswordStoreChangeList(); - } - return login_db_->AddLogin(form, error); -} - -PasswordStoreChangeList PasswordStoreImpl::UpdateLoginImpl( - const PasswordForm& form, - UpdateLoginError* error) { - DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); - if (!login_db_) { - if (error) { - *error = UpdateLoginError::kDbNotAvailable; - } - return PasswordStoreChangeList(); - } - return login_db_->UpdateLogin(form, error); -} - -PasswordStoreChangeList PasswordStoreImpl::RemoveLoginImpl( - const PasswordForm& form) { - DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); - PasswordStoreChangeList changes; - if (login_db_ && login_db_->RemoveLogin(form, &changes)) { - return changes; - } - return PasswordStoreChangeList(); -} - -PasswordStoreChangeList PasswordStoreImpl::RemoveLoginsByURLAndTimeImpl( - const base::RepeatingCallback<bool(const GURL&)>& url_filter, - base::Time delete_begin, - base::Time delete_end) { - PrimaryKeyToFormMap key_to_form_map; - PasswordStoreChangeList changes; - if (login_db_ && login_db_->GetLoginsCreatedBetween(delete_begin, delete_end, - &key_to_form_map)) { - for (const auto& pair : key_to_form_map) { - PasswordForm* form = pair.second.get(); - PasswordStoreChangeList remove_changes; - if (url_filter.Run(form->url) && - login_db_->RemoveLogin(*form, &remove_changes)) { - std::move(remove_changes.begin(), remove_changes.end(), - std::back_inserter(changes)); - } - } - } - return changes; -} - -PasswordStoreChangeList PasswordStoreImpl::RemoveLoginsCreatedBetweenImpl( - base::Time delete_begin, - base::Time delete_end) { - PasswordStoreChangeList changes; - if (!login_db_ || !login_db_->RemoveLoginsCreatedBetween( - delete_begin, delete_end, &changes)) { - return PasswordStoreChangeList(); - } - return changes; -} - PasswordStoreChangeList PasswordStoreImpl::DisableAutoSignInForOriginsImpl( const base::RepeatingCallback<bool(const GURL&)>& origin_filter) { PrimaryKeyToFormMap key_to_form_map; @@ -231,8 +163,13 @@ return {}; } - return BuildPasswordChangeListForInsecureCredentialsUpdate( - std::move(key_to_form_map)); + PasswordStoreChangeList changes = + BuildPasswordChangeListForInsecureCredentialsUpdate( + std::move(key_to_form_map)); + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + + return changes; } PasswordStoreChangeList PasswordStoreImpl::RemoveInsecureCredentialsImpl( @@ -252,8 +189,13 @@ return {}; } - return BuildPasswordChangeListForInsecureCredentialsUpdate( - std::move(key_to_form_map)); + PasswordStoreChangeList changes = + BuildPasswordChangeListForInsecureCredentialsUpdate( + std::move(key_to_form_map)); + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + + return changes; } std::vector<InsecureCredential> @@ -317,7 +259,13 @@ PasswordStoreChangeList PasswordStoreImpl::AddLoginSync( const PasswordForm& form, AddLoginError* error) { - return AddLoginImpl(form, error); + if (!login_db_) { + if (error) { + *error = AddLoginError::kDbNotAvailable; + } + return PasswordStoreChangeList(); + } + return login_db_->AddLogin(form, error); } bool PasswordStoreImpl::AddInsecureCredentialsSync( @@ -330,7 +278,13 @@ PasswordStoreChangeList PasswordStoreImpl::UpdateLoginSync( const PasswordForm& form, UpdateLoginError* error) { - return UpdateLoginImpl(form, error); + if (!login_db_) { + if (error) { + *error = UpdateLoginError::kDbNotAvailable; + } + return PasswordStoreChangeList(); + } + return login_db_->UpdateLogin(form, error); } bool PasswordStoreImpl::UpdateInsecureCredentialsSync( @@ -343,14 +297,18 @@ PasswordStoreChangeList PasswordStoreImpl::RemoveLoginSync( const PasswordForm& form) { - return RemoveLoginImpl(form); + PasswordStoreChangeList changes; + if (login_db_ && login_db_->RemoveLogin(form, &changes)) { + return changes; + } + return PasswordStoreChangeList(); } void PasswordStoreImpl::NotifyLoginsChanged( const PasswordStoreChangeList& changes) { - PasswordStore::NotifyLoginsChanged(changes); - if (sync_bridge_ && !changes.empty()) - sync_bridge_->ActOnPasswordStoreChanges(changes); + main_task_runner()->PostTask( + FROM_HERE, + base::BindOnce(remote_forms_changes_received_callback_, changes)); } void PasswordStoreImpl::NotifyDeletionsHaveSynced(bool success) { @@ -437,22 +395,27 @@ } void PasswordStoreImpl::InitBackend( + RemoteChangesReceived remote_form_changes_received, base::RepeatingClosure sync_enabled_or_disabled_cb, base::OnceCallback<void(bool)> completion) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&PasswordStoreImpl::InitOnBackgroundSequence, this, + std::move(remote_form_changes_received), std::move(sync_enabled_or_disabled_cb)), std::move(completion)); } void PasswordStoreImpl::GetAllLoginsAsync(LoginsReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&PasswordStoreImpl::GetAllLoginsInternal, this), std::move(callback)); } void PasswordStoreImpl::GetAutofillableLoginsAsync(LoginsReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&PasswordStoreImpl::GetAutofillableLoginsInternal, this), @@ -462,6 +425,7 @@ void PasswordStoreImpl::FillMatchingLoginsAsync( LoginsReply callback, const std::vector<PasswordFormDigest>& forms) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); if (forms.empty()) { std::move(callback).Run({}); return; @@ -474,50 +438,70 @@ std::move(callback)); } -void PasswordStoreImpl::AddLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) { +void PasswordStoreImpl::AddLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&PasswordStoreImpl::AddLoginInternal, this, form), std::move(callback)); } -void PasswordStoreImpl::UpdateLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) { +void PasswordStoreImpl::UpdateLoginAsync( + const PasswordForm& form, + PasswordStoreChangeListReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&PasswordStoreImpl::UpdateLoginInternal, this, form), std::move(callback)); } -void PasswordStoreImpl::RemoveLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) { +void PasswordStoreImpl::RemoveLoginAsync( + const PasswordForm& form, + PasswordStoreChangeListReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&PasswordStoreImpl::RemoveLoginInternal, this, form), std::move(callback)); } +void PasswordStoreImpl::RemoveLoginsCreatedBetweenAsync( + base::Time delete_begin, + base::Time delete_end, + PasswordStoreChangeListReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); + background_task_runner()->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce(&PasswordStoreImpl::RemoveLoginsCreatedBetweenInternal, + this, delete_begin, delete_end), + std::move(callback)); +} + void PasswordStoreImpl::RemoveLoginsByURLAndTimeAsync( - OptionalStoreChangeListReply callback, const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, - base::OnceCallback<void(bool)> sync_completion) { - // TODO(crbug.com/1226042): Use PostTaskAndReplyWithResult instead of - // PostTask. - background_task_runner()->PostTask( + base::OnceCallback<void(bool)> sync_completion, + PasswordStoreChangeListReply callback) { + DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); + background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, - base::BindOnce( - IgnoreResult(&PasswordStoreImpl::RemoveLoginsByURLAndTimeInternal), - this, url_filter, delete_begin, delete_end, std::move(completion), - std::move(sync_completion))); + base::BindOnce(&PasswordStoreImpl::RemoveLoginsByURLAndTimeInternal, this, + url_filter, delete_begin, delete_end, + std::move(sync_completion)), + std::move(callback)); } bool PasswordStoreImpl::InitOnBackgroundSequence( + RemoteChangesReceived remote_form_changes_received, base::RepeatingClosure sync_enabled_or_disabled_cb) { DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); + + remote_forms_changes_received_callback_ = + std::move(remote_form_changes_received); + DCHECK(login_db_); bool success = true; if (!login_db_->Init()) { @@ -532,13 +516,10 @@ &PasswordStoreImpl::NotifyDeletionsHaveSynced, base::Unretained(this))); } - // TODO(crbug.com/1226042): Remove static_cast when PasswordStoreImpl inherits - // PasswordStoreSync directly. - sync_bridge_ = std::make_unique<PasswordSyncBridge>( + sync_bridge_ = base::WrapUnique(new PasswordSyncBridge( std::make_unique<syncer::ClientTagBasedModelTypeProcessor>( syncer::PASSWORDS, base::DoNothing()), - /*password_store_sync=*/static_cast<PasswordStoreSync*>(this), - sync_enabled_or_disabled_cb); + /*password_store_sync=*/this, sync_enabled_or_disabled_cb)); return success; } @@ -547,6 +528,7 @@ DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); login_db_.reset(); sync_bridge_.reset(); + remote_forms_changes_received_callback_.Reset(); } LoginsResult PasswordStoreImpl::GetAllLoginsInternal() { @@ -592,11 +574,12 @@ DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); BeginTransaction(); PasswordStoreChangeList changes = AddLoginSync(form, /*error=*/nullptr); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, + // CommitTransaction() must be called after ActOnPasswordStoreChanges(), + // because sync codebase needs to update metadata atomically together with the + // login data. CommitTransaction(); return changes; } @@ -606,11 +589,12 @@ DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); BeginTransaction(); PasswordStoreChangeList changes = UpdateLoginSync(form, /*error=*/nullptr); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, + // CommitTransaction() must be called after ActOnPasswordStoreChanges(), + // because sync codebase needs to update metadata atomically together with the + // login data. CommitTransaction(); return changes; } @@ -620,11 +604,31 @@ DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); BeginTransaction(); PasswordStoreChangeList changes = RemoveLoginSync(form); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, + // CommitTransaction() must be called after ActOnPasswordStoreChanges(), + // because sync codebase needs to update metadata atomically together with the + // login data. + CommitTransaction(); + return changes; +} + +PasswordStoreChangeList PasswordStoreImpl::RemoveLoginsCreatedBetweenInternal( + base::Time delete_begin, + base::Time delete_end) { + DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); + BeginTransaction(); + PasswordStoreChangeList changes; + if (login_db_ && login_db_->RemoveLoginsCreatedBetween( + delete_begin, delete_end, &changes)) { + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + } + // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, + // CommitTransaction() must be called after ActOnPasswordStoreChanges(), + // because sync codebase needs to update metadata atomically together with the + // login data. CommitTransaction(); return changes; } @@ -633,21 +637,30 @@ const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, base::OnceCallback<void(bool)> sync_completion) { BeginTransaction(); - PasswordStoreChangeList changes = - RemoveLoginsByURLAndTimeImpl(url_filter, delete_begin, delete_end); - NotifyLoginsChanged(changes); - // Sync metadata get updated in NotifyLoginsChanged(). Therefore, - // CommitTransaction() must be called after NotifyLoginsChanged(), because - // sync codebase needs to update metadata atomically together with the login - // data. + PrimaryKeyToFormMap key_to_form_map; + PasswordStoreChangeList changes; + if (login_db_ && login_db_->GetLoginsCreatedBetween(delete_begin, delete_end, + &key_to_form_map)) { + for (const auto& pair : key_to_form_map) { + PasswordForm* form = pair.second.get(); + PasswordStoreChangeList remove_changes; + if (url_filter.Run(form->url) && + login_db_->RemoveLogin(*form, &remove_changes)) { + std::move(remove_changes.begin(), remove_changes.end(), + std::back_inserter(changes)); + } + } + } + if (sync_bridge_ && !changes.empty()) + sync_bridge_->ActOnPasswordStoreChanges(changes); + // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, + // CommitTransaction() must be called after ActOnPasswordStoreChanges(), + // because sync codebase needs to update metadata atomically together with the + // login data. CommitTransaction(); - if (completion) - main_task_runner()->PostTask(FROM_HERE, std::move(completion)); - if (sync_completion) { deletions_have_synced_callbacks_.push_back(std::move(sync_completion)); // Start a timeout for sync, or restart it if it was already running.
diff --git a/components/password_manager/core/browser/password_store_impl.h b/components/password_manager/core/browser/password_store_impl.h index 4d52f00..db9e277 100644 --- a/components/password_manager/core/browser/password_store_impl.h +++ b/components/password_manager/core/browser/password_store_impl.h
@@ -20,9 +20,9 @@ // Simple password store implementation that delegates everything to // the LoginDatabase. -// TODO(crbug.com/1217071): Currently, only implicitly inherits from protected -// PasswordStoreSync but should be explicit. -class PasswordStoreImpl : public PasswordStore, public PasswordStoreBackend { +class PasswordStoreImpl : protected PasswordStoreSync, + public PasswordStore, + public PasswordStoreBackend { public: // The |login_db| must not have been Init()-ed yet. It will be initialized in // a deferred manner on the background sequence. @@ -43,18 +43,6 @@ void ReportMetricsImpl(const std::string& sync_username, bool custom_passphrase_sync_enabled, BulkCheckDone bulk_check_done) override; - PasswordStoreChangeList AddLoginImpl(const PasswordForm& form, - AddLoginError* error) override; - PasswordStoreChangeList UpdateLoginImpl(const PasswordForm& form, - UpdateLoginError* error) override; - PasswordStoreChangeList RemoveLoginImpl(const PasswordForm& form) override; - PasswordStoreChangeList RemoveLoginsByURLAndTimeImpl( - const base::RepeatingCallback<bool(const GURL&)>& url_filter, - base::Time delete_begin, - base::Time delete_end) override; - PasswordStoreChangeList RemoveLoginsCreatedBetweenImpl( - base::Time delete_begin, - base::Time delete_end) override; PasswordStoreChangeList DisableAutoSignInForOriginsImpl( const base::RepeatingCallback<bool(const GURL&)>& origin_filter) override; bool RemoveStatisticsByOriginAndTimeImpl( @@ -124,29 +112,34 @@ FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, UpdateInsecureCredentialsSync); // Implements PasswordStoreBackend interface. - void InitBackend(base::RepeatingClosure sync_enabled_or_disabled_cb, + void InitBackend(RemoteChangesReceived remote_form_changes_received, + base::RepeatingClosure sync_enabled_or_disabled_cb, base::OnceCallback<void(bool)> completion) override; void GetAllLoginsAsync(LoginsReply callback) override; void GetAutofillableLoginsAsync(LoginsReply callback) override; void FillMatchingLoginsAsync( LoginsReply callback, const std::vector<PasswordFormDigest>& forms) override; - void AddLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) override; - void UpdateLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) override; - void RemoveLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) override; + void AddLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) override; + void UpdateLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) override; + void RemoveLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) override; + void RemoveLoginsCreatedBetweenAsync( + base::Time delete_begin, + base::Time delete_end, + PasswordStoreChangeListReply callback) override; void RemoveLoginsByURLAndTimeAsync( - OptionalStoreChangeListReply callback, const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, - base::OnceCallback<void(bool)> sync_completion) override; + base::OnceCallback<void(bool)> sync_completion, + PasswordStoreChangeListReply callback) override; // Opens |login_db_| and creates |sync_bridge_| on the background sequence. bool InitOnBackgroundSequence( + RemoteChangesReceived remote_form_changes_received, base::RepeatingClosure sync_enabled_or_disabled_cb); // Resets |login_db_| and |sync_bridge_| on the background sequence. @@ -165,11 +158,13 @@ PasswordStoreChangeList AddLoginInternal(const PasswordForm& form); PasswordStoreChangeList UpdateLoginInternal(const PasswordForm& form); PasswordStoreChangeList RemoveLoginInternal(const PasswordForm& form); + PasswordStoreChangeList RemoveLoginsCreatedBetweenInternal( + base::Time delete_begin, + base::Time delete_end); PasswordStoreChangeList RemoveLoginsByURLAndTimeInternal( const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, base::OnceCallback<void(bool)> sync_completion); // The login SQL database. The LoginDatabase instance is received via the @@ -180,6 +175,11 @@ std::unique_ptr<PasswordSyncBridge> sync_bridge_; + // Whenever 'sync_bridge_'receive remote changes this callback is used to + // notify PasswordStore observers about them. Called on a main sequence from + // the 'NotifyLoginsChanged'. + RemoteChangesReceived remote_forms_changes_received_callback_; + std::unique_ptr<UnsyncedCredentialsDeletionNotifier> deletion_notifier_; // A list of callbacks that should be run once all pending deletions have been
diff --git a/components/password_manager/core/browser/password_store_impl_unittest.cc b/components/password_manager/core/browser/password_store_impl_unittest.cc index 97e1242..c0189fb6 100644 --- a/components/password_manager/core/browser/password_store_impl_unittest.cc +++ b/components/password_manager/core/browser/password_store_impl_unittest.cc
@@ -34,16 +34,11 @@ class MockPasswordStoreBackendTester { public: - MOCK_METHOD(void, ChangeReceived, (PasswordStoreChangeList)); + MOCK_METHOD(void, HandleChanges, (const PasswordStoreChangeList&)); MOCK_METHOD(void, LoginsReceivedConstRef, (const std::vector<std::unique_ptr<PasswordForm>>&)); - void HandleChanges(absl::optional<PasswordStoreChangeList> changes) { - ASSERT_TRUE(changes.has_value()); - ChangeReceived(changes.value()); - } - void HandleLogins(std::vector<std::unique_ptr<PasswordForm>> results) { LoginsReceivedConstRef(results); } @@ -145,7 +140,7 @@ // Build the expected forms vector and add the forms to the store. std::vector<std::unique_ptr<PasswordForm>> expected_forms; expected_forms.push_back(FillPasswordFormWithData(form_data)); - backend->AddLoginAsync(base::DoNothing(), *expected_forms.back()); + backend->AddLoginAsync(*expected_forms.back(), base::DoNothing()); testing::StrictMock<MockPasswordStoreBackendTester> tester; // We expect to get the same data back, even though it's not all ASCII. @@ -169,11 +164,10 @@ PasswordStoreChange(PasswordStoreChange::ADD, form); testing::StrictMock<MockPasswordStoreBackendTester> tester; - EXPECT_CALL(tester, ChangeReceived(ElementsAre(add_change))); + EXPECT_CALL(tester, HandleChanges(ElementsAre(add_change))); backend->AddLoginAsync( - base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, - base::Unretained(&tester)), - form); + form, base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, + base::Unretained(&tester))); RunUntilIdle(); } @@ -181,7 +175,7 @@ PasswordStoreBackend* backend = Initialize(); PasswordForm form = *FillPasswordFormWithData(CreateTestPasswordFormData()); - backend->AddLoginAsync(base::DoNothing(), form); + backend->AddLoginAsync(form, base::DoNothing()); RunUntilIdle(); form.password_value = u"a different password"; @@ -189,11 +183,10 @@ PasswordStoreChange(PasswordStoreChange::UPDATE, form); testing::StrictMock<MockPasswordStoreBackendTester> tester; - EXPECT_CALL(tester, ChangeReceived(ElementsAre(update_change))); + EXPECT_CALL(tester, HandleChanges(ElementsAre(update_change))); backend->UpdateLoginAsync( - base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, - base::Unretained(&tester)), - form); + form, base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, + base::Unretained(&tester))); RunUntilIdle(); } @@ -201,18 +194,17 @@ PasswordStoreBackend* backend = Initialize(); PasswordForm form = *FillPasswordFormWithData(CreateTestPasswordFormData()); - backend->AddLoginAsync(base::DoNothing(), form); + backend->AddLoginAsync(form, base::DoNothing()); RunUntilIdle(); PasswordStoreChange remove_change = PasswordStoreChange(PasswordStoreChange::REMOVE, form); testing::StrictMock<MockPasswordStoreBackendTester> tester; - EXPECT_CALL(tester, ChangeReceived(ElementsAre(remove_change))); + EXPECT_CALL(tester, HandleChanges(ElementsAre(remove_change))); backend->RemoveLoginAsync( - base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, - base::Unretained(&tester)), - form); + form, base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, + base::Unretained(&tester))); RunUntilIdle(); } @@ -235,21 +227,20 @@ blocked_form->action = GURL("http://foo.example.com/action"); blocked_form->blocked_by_user = true; - base::RepeatingCallback<void(absl::optional<PasswordStoreChangeList>)> - handle_changes = - base::BindRepeating(&MockPasswordStoreBackendTester::HandleChanges, - base::Unretained(&tester)); + base::RepeatingCallback<void(const PasswordStoreChangeList&)> handle_changes = + base::BindRepeating(&MockPasswordStoreBackendTester::HandleChanges, + base::Unretained(&tester)); base::RepeatingCallback<void(LoginsResult)> handle_logins = base::BindRepeating(&MockPasswordStoreBackendTester::HandleLogins, base::Unretained(&tester)); - EXPECT_CALL(tester, ChangeReceived(IsEmpty())); - bad_backend->AddLoginAsync(handle_changes, *form); + EXPECT_CALL(tester, HandleChanges(IsEmpty())); + bad_backend->AddLoginAsync(*form, handle_changes); RunUntilIdle(); testing::Mock::VerifyAndClearExpectations(&tester); - EXPECT_CALL(tester, ChangeReceived(IsEmpty())); - bad_backend->AddLoginAsync(handle_changes, *blocked_form); + EXPECT_CALL(tester, HandleChanges(IsEmpty())); + bad_backend->AddLoginAsync(*blocked_form, handle_changes); RunUntilIdle(); testing::Mock::VerifyAndClearExpectations(&tester); @@ -270,8 +261,8 @@ RunUntilIdle(); testing::Mock::VerifyAndClearExpectations(&tester); - EXPECT_CALL(tester, ChangeReceived(IsEmpty())); - bad_backend->RemoveLoginAsync(handle_changes, *form); + EXPECT_CALL(tester, HandleChanges(IsEmpty())); + bad_backend->RemoveLoginAsync(*form, handle_changes); RunUntilIdle(); }
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index b27d6dbc..a47f10ae 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -1149,7 +1149,6 @@ base::RunLoop run_loop; PasswordFormDigest observed_form_digest = { PasswordForm::Scheme::kHtml, kTestWebRealm1, GURL(kTestWebOrigin1)}; - store->Unblocklist(observed_form_digest, run_loop.QuitClosure()); run_loop.Run(); testing::Mock::VerifyAndClearExpectations(&mock_observer); @@ -1550,6 +1549,27 @@ store->ShutdownOnUIThread(); } +TEST_F(PasswordStoreTest, TestUnblockListEmptyStore) { + scoped_refptr<PasswordStoreWithMockedMetadataStore> store = + CreatePasswordStoreWithMockedMetaData(); + store->Init(nullptr); + WaitForPasswordStore(); + + MockPasswordStoreObserver observer; + store->AddObserver(&observer); + + PasswordFormDigest digest = {PasswordForm::Scheme::kHtml, kTestWebRealm1, + GURL(kTestWebOrigin1)}; + + base::RunLoop run_loop; + EXPECT_CALL(observer, OnLoginsChanged).Times(0); + store->Unblocklist(digest, run_loop.QuitClosure()); + run_loop.Run(); + + store->RemoveObserver(&observer); + store->ShutdownOnUIThread(); +} + // Collection of origin-related testcases common to all platform-specific // stores. class PasswordStoreOriginTest : public PasswordStoreTest {
diff --git a/components/password_manager/core/browser/possible_username_data.cc b/components/password_manager/core/browser/possible_username_data.cc index 03466be..25dff93 100644 --- a/components/password_manager/core/browser/possible_username_data.cc +++ b/components/password_manager/core/browser/possible_username_data.cc
@@ -32,30 +32,9 @@ default; PossibleUsernameData::~PossibleUsernameData() = default; -bool IsPossibleUsernameValid( - const PossibleUsernameData& possible_username, - const std::string& submitted_signon_realm, - const std::vector<std::u16string>& possible_usernames) { - if (submitted_signon_realm != possible_username.signon_realm) - return false; - - // The goal is to avoid false positives in considering which strings might be - // username. In the initial version of the username first flow it is better to - // be conservative in that. This check only allows usernames that match - // existing usernames after canonicalization. - - // This line is a workaround to pass the method to overloaded base::Contains - // as a projection that will be moved and applied to all container methods. - std::u16string (*Canonicalize)(base::StringPiece16) = &CanonicalizeUsername; - std::u16string canonicalized_username = Canonicalize(possible_username.value); - if (canonicalized_username.empty() || - !base::Contains(possible_usernames, canonicalized_username, - Canonicalize)) { - return false; - } - - return base::Time::Now() - possible_username.last_change <= - kMaxDelayBetweenTypingUsernameAndSubmission; +bool IsPossibleUsernameStale(const PossibleUsernameData& possible_username) { + return base::Time::Now() - possible_username.last_change > + kPossibleUsernameExpirationTimeout; } } // namespace password_manager
diff --git a/components/password_manager/core/browser/possible_username_data.h b/components/password_manager/core/browser/possible_username_data.h index 40fa2e5..61a6ecb 100644 --- a/components/password_manager/core/browser/possible_username_data.h +++ b/components/password_manager/core/browser/possible_username_data.h
@@ -17,8 +17,8 @@ // The maximum time between the user typed in a text field and subsequent // submission of the password form, such that the typed value is considered to -// be possible to be username. -constexpr auto kMaxDelayBetweenTypingUsernameAndSubmission = +// be a possible username. +constexpr auto kPossibleUsernameExpirationTimeout = base::TimeDelta::FromMinutes(1); // Contains information that the user typed in a text field. It might be the @@ -47,16 +47,9 @@ absl::optional<FormPredictions> form_predictions; }; -// Checks that |possible_username| might represent an username: -// 1.|possible_username.signon_realm| == |submitted_signon_realm| -// 2.|possible_username.value| is contained in |possible_usernames| after -// canonicalization. -// 3.|possible_username.value.last_change| was not more than -// |kMaxDelayBetweenTypingUsernameAndSubmission| ago. -bool IsPossibleUsernameValid( - const PossibleUsernameData& possible_username, - const std::string& submitted_signon_realm, - const std::vector<std::u16string>& possible_usernames); +// Returns whether |possible_username| was last edited too far in the past and +// should not be considered as a possible single username. +bool IsPossibleUsernameStale(const PossibleUsernameData& possible_username); } // namespace password_manager
diff --git a/components/password_manager/core/browser/possible_username_data_unittest.cc b/components/password_manager/core/browser/possible_username_data_unittest.cc index ffae391..db005fe 100644 --- a/components/password_manager/core/browser/possible_username_data_unittest.cc +++ b/components/password_manager/core/browser/possible_username_data_unittest.cc
@@ -31,60 +31,20 @@ 10 /* driver_id */}; }; -TEST_F(IsPossibleUsernameValidTest, Valid) { - EXPECT_TRUE(IsPossibleUsernameValid( - possible_username_data_, possible_username_data_.signon_realm, {kUser})); -} +// Check that if more than |kPossibleUsernameExpirationTimeout| time has +// passed since the last change of |possible_username_data_|, then it is stale. +TEST_F(IsPossibleUsernameValidTest, IsPossibleUsernameStale) { + EXPECT_FALSE(IsPossibleUsernameStale(possible_username_data_)); -// Check that if time delta between last change and submission is more than 60 -// seconds, than data is invalid. -TEST_F(IsPossibleUsernameValidTest, TimeDeltaBeforeLastChangeAndSubmission) { - task_environment_.FastForwardBy(kMaxDelayBetweenTypingUsernameAndSubmission); - EXPECT_TRUE(IsPossibleUsernameValid( - possible_username_data_, possible_username_data_.signon_realm, {kUser})); - task_environment_.FastForwardBy(TimeDelta::FromSeconds(1)); - EXPECT_FALSE(IsPossibleUsernameValid( - possible_username_data_, possible_username_data_.signon_realm, {kUser})); -} + // Fast forward for a little less than expiration time, but not + // exactly to not flake the test. + task_environment_.FastForwardBy(kPossibleUsernameExpirationTimeout - + TimeDelta::FromSeconds(3)); + EXPECT_FALSE(IsPossibleUsernameStale(possible_username_data_)); -TEST_F(IsPossibleUsernameValidTest, SignonRealm) { - EXPECT_FALSE(IsPossibleUsernameValid(possible_username_data_, - "https://m.example.com/", {kUser})); - - EXPECT_FALSE(IsPossibleUsernameValid(possible_username_data_, - "https://google.com/", {kUser})); -} - -TEST_F(IsPossibleUsernameValidTest, PossibleUsernameValue) { - // Different capitalization is okay. - EXPECT_TRUE(IsPossibleUsernameValid(possible_username_data_, - possible_username_data_.signon_realm, - {u"USER"})); - // Different email hosts are okay. - EXPECT_TRUE(IsPossibleUsernameValid(possible_username_data_, - possible_username_data_.signon_realm, - {u"user@gmail.com"})); - - // Other usernames are okay. - EXPECT_TRUE(IsPossibleUsernameValid(possible_username_data_, - possible_username_data_.signon_realm, - {kUser, u"alice"})); - - // No usernames are not okay. - EXPECT_FALSE(IsPossibleUsernameValid( - possible_username_data_, possible_username_data_.signon_realm, {})); - - // Completely different usernames are not okay. - EXPECT_FALSE(IsPossibleUsernameValid(possible_username_data_, - possible_username_data_.signon_realm, - {u"alice", u"bob"})); - - // Empty usernames are not okay, even if credentials with empty usernames - // exist. - possible_username_data_.value = u""; - EXPECT_FALSE(IsPossibleUsernameValid(possible_username_data_, - possible_username_data_.signon_realm, - {u"alice", u""})); + // Fast forward more until the data becomes stale. + task_environment_.FastForwardBy(TimeDelta::FromSeconds(5)); + EXPECT_TRUE(IsPossibleUsernameStale(possible_username_data_)); } } // namespace
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index af37fd1..d043402 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -168,6 +168,9 @@ password.federation_origin = url::Origin::Create(GURL(password_data.federation_url())); password.date_synced = sync_time; + password.password_issues = + base::flat_map<password_manager::InsecureType, + password_manager::InsecurityMetadata>(); return password; }
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc index 22ec549..da76794 100644 --- a/components/password_manager/core/browser/test_password_store.cc +++ b/components/password_manager/core/browser/test_password_store.cc
@@ -151,6 +151,7 @@ } void TestPasswordStore::InitBackend( + RemoteChangesReceived remote_form_changes_received, base::RepeatingClosure sync_enabled_or_disabled_cb, base::OnceCallback<void(bool)> completion) { main_task_runner()->PostTask(FROM_HERE, @@ -183,108 +184,48 @@ std::move(callback)); } -void TestPasswordStore::AddLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) { +void TestPasswordStore::AddLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) { background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&TestPasswordStore::AddLoginImpl, base::Unretained(this), - form, /*error=*/nullptr), + form), std::move(callback)); } -void TestPasswordStore::UpdateLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) { +void TestPasswordStore::UpdateLoginAsync( + const PasswordForm& form, + PasswordStoreChangeListReply callback) { background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&TestPasswordStore::UpdateLoginImpl, - base::Unretained(this), form, /*error=*/nullptr), + base::Unretained(this), form), std::move(callback)); } -void TestPasswordStore::RemoveLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) { +void TestPasswordStore::RemoveLoginAsync( + const PasswordForm& form, + PasswordStoreChangeListReply callback) { background_task_runner()->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&TestPasswordStore::RemoveLoginImpl, base::Unretained(this), form), std::move(callback)); } - -void TestPasswordStore::RemoveLoginsByURLAndTimeAsync( - OptionalStoreChangeListReply callback, - const base::RepeatingCallback<bool(const GURL&)>& url_filter, +void TestPasswordStore::RemoveLoginsCreatedBetweenAsync( base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, - base::OnceCallback<void(bool)> sync_completion) { + PasswordStoreChangeListReply callback) { NOTIMPLEMENTED(); } -PasswordStoreChangeList TestPasswordStore::AddLoginImpl( - const PasswordForm& form, - AddLoginError* error) { - if (error) - *error = AddLoginError::kNone; - - PasswordStoreChangeList changes; - auto& passwords_for_signon_realm = stored_passwords_[form.signon_realm]; - auto iter = std::find_if( - passwords_for_signon_realm.begin(), passwords_for_signon_realm.end(), - [&form](const auto& password) { - return ArePasswordFormUniqueKeysEqual(form, password); - }); - - if (iter != passwords_for_signon_realm.end()) { - changes.emplace_back(PasswordStoreChange::REMOVE, *iter); - changes.emplace_back(PasswordStoreChange::ADD, form); - *iter = form; - iter->in_store = IsAccountStore() ? PasswordForm::Store::kAccountStore - : PasswordForm::Store::kProfileStore; - return changes; - } - - changes.emplace_back(PasswordStoreChange::ADD, form); - passwords_for_signon_realm.push_back(form); - passwords_for_signon_realm.back().in_store = - IsAccountStore() ? PasswordForm::Store::kAccountStore - : PasswordForm::Store::kProfileStore; - return changes; -} - -PasswordStoreChangeList TestPasswordStore::UpdateLoginImpl( - const PasswordForm& form, - UpdateLoginError* error) { - if (error) - *error = UpdateLoginError::kNone; - - PasswordStoreChangeList changes; - std::vector<PasswordForm>& forms = stored_passwords_[form.signon_realm]; - for (auto& stored_form : forms) { - if (ArePasswordFormUniqueKeysEqual(form, stored_form)) { - stored_form = form; - stored_form.in_store = IsAccountStore() - ? PasswordForm::Store::kAccountStore - : PasswordForm::Store::kProfileStore; - changes.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form)); - } - } - return changes; -} - -PasswordStoreChangeList TestPasswordStore::RemoveLoginImpl( - const PasswordForm& form) { - PasswordStoreChangeList changes; - std::vector<PasswordForm>& forms = stored_passwords_[form.signon_realm]; - auto it = forms.begin(); - while (it != forms.end()) { - if (ArePasswordFormUniqueKeysEqual(form, *it)) { - it = forms.erase(it); - changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form)); - } else { - ++it; - } - } - return changes; +void TestPasswordStore::RemoveLoginsByURLAndTimeAsync( + const base::RepeatingCallback<bool(const GURL&)>& url_filter, + base::Time delete_begin, + base::Time delete_end, + base::OnceCallback<void(bool)> sync_completion, + PasswordStoreChangeListReply callback) { + NOTIMPLEMENTED(); } std::vector<std::unique_ptr<PasswordForm>> @@ -330,10 +271,6 @@ return matched_forms; } -DatabaseCleanupResult TestPasswordStore::DeleteUndecryptableLogins() { - return DatabaseCleanupResult::kSuccess; -} - std::vector<InteractionsStats> TestPasswordStore::GetSiteStatsImpl( const GURL& origin_domain) { return std::vector<InteractionsStats>(); @@ -345,21 +282,6 @@ NOTIMPLEMENTED(); } -PasswordStoreChangeList TestPasswordStore::RemoveLoginsByURLAndTimeImpl( - const base::RepeatingCallback<bool(const GURL&)>& url_filter, - base::Time begin, - base::Time end) { - NOTIMPLEMENTED(); - return PasswordStoreChangeList(); -} - -PasswordStoreChangeList TestPasswordStore::RemoveLoginsCreatedBetweenImpl( - base::Time begin, - base::Time end) { - NOTIMPLEMENTED(); - return PasswordStoreChangeList(); -} - PasswordStoreChangeList TestPasswordStore::DisableAutoSignInForOriginsImpl( const base::RepeatingCallback<bool(const GURL&)>& origin_filter) { NOTIMPLEMENTED(); @@ -462,99 +384,10 @@ NOTIMPLEMENTED(); } -PasswordStoreChangeList TestPasswordStore::AddLoginSync( - const PasswordForm& form, - AddLoginError* error) { - NOTIMPLEMENTED(); - return {}; -} - -bool TestPasswordStore::AddInsecureCredentialsSync( - base::span<const InsecureCredential> credentials) { - NOTIMPLEMENTED(); - return true; -} - -PasswordStoreChangeList TestPasswordStore::UpdateLoginSync( - const PasswordForm& form, - UpdateLoginError* error) { - NOTIMPLEMENTED(); - return {}; -} - -bool TestPasswordStore::UpdateInsecureCredentialsSync( - const PasswordForm& form, - base::span<const InsecureCredential> credentials) { - NOTIMPLEMENTED(); - return true; -} - -PasswordStoreChangeList TestPasswordStore::RemoveLoginSync( - const PasswordForm& form) { - NOTIMPLEMENTED(); - return {}; -} - -void TestPasswordStore::NotifyDeletionsHaveSynced(bool success) { - NOTIMPLEMENTED(); -} - -void TestPasswordStore::NotifyUnsyncedCredentialsWillBeDeleted( - std::vector<PasswordForm> unsynced_credentials) { - NOTIMPLEMENTED(); -} - -bool TestPasswordStore::BeginTransaction() { - return true; -} - -void TestPasswordStore::RollbackTransaction() { - NOTIMPLEMENTED(); -} - -bool TestPasswordStore::CommitTransaction() { - return true; -} - -FormRetrievalResult TestPasswordStore::ReadAllLogins( - PrimaryKeyToFormMap* key_to_form_map) { - if (stored_passwords_.empty()) { - key_to_form_map->clear(); - return FormRetrievalResult::kSuccess; - } - // This currently can't be implemented properly, since TestPasswordStore - // doesn't have primary keys. Right now no tests actually depend on it, so - // just leave it not implemented. - NOTIMPLEMENTED(); - return FormRetrievalResult::kDbError; -} - -std::vector<InsecureCredential> TestPasswordStore::ReadSecurityIssues( - FormPrimaryKey parent_key) { - NOTIMPLEMENTED(); - return std::vector<InsecureCredential>(); -} - -PasswordStoreChangeList TestPasswordStore::RemoveLoginByPrimaryKeySync( - FormPrimaryKey primary_key) { - NOTIMPLEMENTED(); - return PasswordStoreChangeList(); -} - -PasswordStoreSync::MetadataStore* TestPasswordStore::GetMetadataStore() { - return metadata_store_.get(); -} - bool TestPasswordStore::IsAccountStore() const { return is_account_store_.value(); } -bool TestPasswordStore::DeleteAndRecreateDatabaseFile() { - stored_passwords_.clear(); - metadata_store_->DeleteAllSyncMetadata(); - return true; -} - LoginsResult TestPasswordStore::GetAllLoginsInternal() { LoginsResult forms; for (const auto& elements : stored_passwords_) { @@ -589,4 +422,63 @@ return results; } +PasswordStoreChangeList TestPasswordStore::AddLoginImpl( + const PasswordForm& form) { + PasswordStoreChangeList changes; + auto& passwords_for_signon_realm = stored_passwords_[form.signon_realm]; + auto iter = std::find_if( + passwords_for_signon_realm.begin(), passwords_for_signon_realm.end(), + [&form](const auto& password) { + return ArePasswordFormUniqueKeysEqual(form, password); + }); + + if (iter != passwords_for_signon_realm.end()) { + changes.emplace_back(PasswordStoreChange::REMOVE, *iter); + changes.emplace_back(PasswordStoreChange::ADD, form); + *iter = form; + iter->in_store = IsAccountStore() ? PasswordForm::Store::kAccountStore + : PasswordForm::Store::kProfileStore; + return changes; + } + + changes.emplace_back(PasswordStoreChange::ADD, form); + passwords_for_signon_realm.push_back(form); + passwords_for_signon_realm.back().in_store = + IsAccountStore() ? PasswordForm::Store::kAccountStore + : PasswordForm::Store::kProfileStore; + return changes; +} + +PasswordStoreChangeList TestPasswordStore::UpdateLoginImpl( + const PasswordForm& form) { + PasswordStoreChangeList changes; + std::vector<PasswordForm>& forms = stored_passwords_[form.signon_realm]; + for (auto& stored_form : forms) { + if (ArePasswordFormUniqueKeysEqual(form, stored_form)) { + stored_form = form; + stored_form.in_store = IsAccountStore() + ? PasswordForm::Store::kAccountStore + : PasswordForm::Store::kProfileStore; + changes.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form)); + } + } + return changes; +} + +PasswordStoreChangeList TestPasswordStore::RemoveLoginImpl( + const PasswordForm& form) { + PasswordStoreChangeList changes; + std::vector<PasswordForm>& forms = stored_passwords_[form.signon_realm]; + auto it = forms.begin(); + while (it != forms.end()) { + if (ArePasswordFormUniqueKeysEqual(form, *it)) { + it = forms.erase(it); + changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form)); + } else { + ++it; + } + } + return changes; +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h index 2b73922..33811ba 100644 --- a/components/password_manager/core/browser/test_password_store.h +++ b/components/password_manager/core/browser/test_password_store.h
@@ -76,6 +76,8 @@ int fill_matching_logins_calls() const { return fill_matching_logins_calls_; } + bool IsAccountStore() const; + protected: ~TestPasswordStore() override; @@ -83,37 +85,36 @@ const override; // PasswordStoreBackend interface - void InitBackend(base::RepeatingClosure sync_enabled_or_disabled_cb, + void InitBackend(RemoteChangesReceived remote_form_changes_received, + base::RepeatingClosure sync_enabled_or_disabled_cb, base::OnceCallback<void(bool)> completion) override; void GetAllLoginsAsync(LoginsReply callback) override; void GetAutofillableLoginsAsync(LoginsReply callback) override; void FillMatchingLoginsAsync( LoginsReply callback, const std::vector<PasswordFormDigest>& forms) override; - void AddLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) override; - void UpdateLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) override; - void RemoveLoginAsync(OptionalStoreChangeListReply callback, - const PasswordForm& form) override; + void AddLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) override; + void UpdateLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) override; + void RemoveLoginAsync(const PasswordForm& form, + PasswordStoreChangeListReply callback) override; + void RemoveLoginsCreatedBetweenAsync( + base::Time delete_begin, + base::Time delete_end, + PasswordStoreChangeListReply callback) override; void RemoveLoginsByURLAndTimeAsync( - OptionalStoreChangeListReply callback, const base::RepeatingCallback<bool(const GURL&)>& url_filter, base::Time delete_begin, base::Time delete_end, - base::OnceClosure completion, - base::OnceCallback<void(bool)> sync_completion) override; + base::OnceCallback<void(bool)> sync_completion, + PasswordStoreChangeListReply callback) override; + // PasswordStore interface - PasswordStoreChangeList AddLoginImpl(const PasswordForm& form, - AddLoginError* error) override; - PasswordStoreChangeList UpdateLoginImpl(const PasswordForm& form, - UpdateLoginError* error) override; - PasswordStoreChangeList RemoveLoginImpl(const PasswordForm& form) override; std::vector<std::unique_ptr<PasswordForm>> FillMatchingLogins( const PasswordFormDigest& form) override; std::vector<std::unique_ptr<PasswordForm>> FillMatchingLoginsByPassword( const std::u16string& plain_text_password) override; - DatabaseCleanupResult DeleteUndecryptableLogins() override; std::vector<InteractionsStats> GetSiteStatsImpl( const GURL& origin_domain) override; @@ -121,13 +122,6 @@ void ReportMetricsImpl(const std::string& sync_username, bool custom_passphrase_sync_enabled, BulkCheckDone bulk_check_done) override; - PasswordStoreChangeList RemoveLoginsByURLAndTimeImpl( - const base::RepeatingCallback<bool(const GURL&)>& url_filter, - base::Time begin, - base::Time end) override; - PasswordStoreChangeList RemoveLoginsCreatedBetweenImpl( - base::Time begin, - base::Time end) override; PasswordStoreChangeList DisableAutoSignInForOriginsImpl( const base::RepeatingCallback<bool(const GURL&)>& origin_filter) override; bool RemoveStatisticsByOriginAndTimeImpl( @@ -152,40 +146,14 @@ void SetUnsyncedCredentialsDeletionNotifier( std::unique_ptr<UnsyncedCredentialsDeletionNotifier> deletion_notifier) override; - // PasswordStoreSync interface. - // TODO(crbug.bom/1226042): Remove this after PasswordStore no longer - // inherits PasswordStoreSync. - PasswordStoreChangeList AddLoginSync(const PasswordForm& form, - AddLoginError* error) override; - bool AddInsecureCredentialsSync( - base::span<const InsecureCredential> credentials) override; - PasswordStoreChangeList UpdateLoginSync(const PasswordForm& form, - UpdateLoginError* error) override; - bool UpdateInsecureCredentialsSync( - const PasswordForm& form, - base::span<const InsecureCredential> credentials) override; - PasswordStoreChangeList RemoveLoginSync(const PasswordForm& form) override; - void NotifyDeletionsHaveSynced(bool success) override; - void NotifyUnsyncedCredentialsWillBeDeleted( - std::vector<PasswordForm> unsynced_credentials) override; - bool BeginTransaction() override; - void RollbackTransaction() override; - bool CommitTransaction() override; - FormRetrievalResult ReadAllLogins( - PrimaryKeyToFormMap* key_to_form_map) override; - std::vector<InsecureCredential> ReadSecurityIssues( - FormPrimaryKey parent_key) override; - PasswordStoreChangeList RemoveLoginByPrimaryKeySync( - FormPrimaryKey primary_key) override; - PasswordStoreSync::MetadataStore* GetMetadataStore() override; - bool IsAccountStore() const override; - bool DeleteAndRecreateDatabaseFile() override; - private: LoginsResult GetAllLoginsInternal(); LoginsResult GetAutofillableLoginsInternal(); LoginsResult FillMatchingLoginsBulk( const std::vector<PasswordFormDigest>& forms); + PasswordStoreChangeList AddLoginImpl(const PasswordForm& form); + PasswordStoreChangeList UpdateLoginImpl(const PasswordForm& form); + PasswordStoreChangeList RemoveLoginImpl(const PasswordForm& form); const password_manager::IsAccountStore is_account_store_;
diff --git a/components/payments/content/secure_payment_confirmation_app_unittest.cc b/components/payments/content/secure_payment_confirmation_app_unittest.cc index b71f2003..d756878 100644 --- a/components/payments/content/secure_payment_confirmation_app_unittest.cc +++ b/components/payments/content/secure_payment_confirmation_app_unittest.cc
@@ -10,10 +10,12 @@ #include "base/base64.h" #include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "components/payments/content/payment_request_spec.h" #include "components/payments/core/method_strings.h" #include "components/webauthn/core/browser/internal_authenticator.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_features.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_utils.h" @@ -109,14 +111,19 @@ const std::string& stringified_details, const PayerData& payer_data) override { EXPECT_EQ(method_name, methods::kSecurePaymentConfirmation); - EXPECT_EQ( - stringified_details, - "{\"appid_extension\":false,\"challenge\":\"{\\\"merchantData\\\":{" - "\\\"merchantOrigin\\\":\\\"https://" - "merchant.example\\\",\\\"total\\\":{\\\"currency\\\":\\\"USD\\\"," - "\\\"value\\\":\\\"1.25\\\"}},\\\"networkData\\\":\\\"aaaa\\\"}\"," - "\"echo_appid_extension\":false,\"echo_prf\":false,\"info\":{},\"prf_" - "not_evaluated\":false,\"prf_results\":{},\"signature\":\"\"}"); + if (base::FeatureList::IsEnabled( + features::kSecurePaymentConfirmationAPIV2)) { + EXPECT_EQ(stringified_details, "{}"); + } else { + EXPECT_EQ( + stringified_details, + "{\"appid_extension\":false,\"challenge\":\"{\\\"merchantData\\\":{" + "\\\"merchantOrigin\\\":\\\"https://" + "merchant.example\\\",\\\"total\\\":{\\\"currency\\\":\\\"USD\\\"," + "\\\"value\\\":\\\"1.25\\\"}},\\\"networkData\\\":\\\"aaaa\\\"}\"," + "\"echo_appid_extension\":false,\"echo_prf\":false,\"info\":{},\"prf_" + "not_evaluated\":false,\"prf_results\":{},\"signature\":\"\"}"); + } EXPECT_EQ(payer_data.payer_name, ""); EXPECT_EQ(payer_data.payer_email, ""); EXPECT_EQ(payer_data.payer_phone, ""); @@ -160,17 +167,23 @@ EXPECT_CALL(*mock_authenticator, SetEffectiveOrigin(Eq(url::Origin::Create( GURL("https://effective_rp.example"))))); - // This is the SHA-256 hash of the serialized JSON string: - // {"merchantData":{"merchantOrigin":"https://merchant.example","total": - // {"currency":"USD","value":"1.25"}},"networkData":"aaaa"} - // - // To update the test expectation, open - // //components/test/data/payments/secure_payment_confirmation_debut.html in a - // browser and follow the instructions. - std::vector<uint8_t> expected_bytes = { - 240, 123, 37, 51, 16, 34, 244, 220, 166, 179, 139, - 85, 229, 152, 242, 133, 88, 44, 222, 133, 49, 97, - 146, 20, 207, 119, 43, 142, 171, 239, 125, 250}; + std::vector<uint8_t> expected_bytes; + if (base::FeatureList::IsEnabled(features::kSecurePaymentConfirmationAPIV2)) { + expected_bytes = std::vector<uint8_t>(network_data_bytes_.begin(), + network_data_bytes_.end()); + } else { + // This is the SHA-256 hash of the serialized JSON string: + // {"merchantData":{"merchantOrigin":"https://merchant.example","total": + // {"currency":"USD","value":"1.25"}},"networkData":"aaaa"} + // + // To update the test expectation, open + // components/test/data/payments/secure_payment_confirmation_debug.html in + // a browser and follow the instructions. + expected_bytes = {240, 123, 37, 51, 16, 34, 244, 220, 166, 179, 139, + 85, 229, 152, 242, 133, 88, 44, 222, 133, 49, 97, + 146, 20, 207, 119, 43, 142, 171, 239, 125, 250}; + } + EXPECT_CALL(*mock_authenticator, VerifyChallenge(Eq(expected_bytes))); app.InvokePaymentApp(/*delegate=*/weak_ptr_factory_.GetWeakPtr()); EXPECT_TRUE(on_instrument_details_ready_called_);
diff --git a/components/performance_manager/v8_memory/v8_detailed_memory_unittest.cc b/components/performance_manager/v8_memory/v8_detailed_memory_unittest.cc index 996b52c9..5bad429b 100644 --- a/components/performance_manager/v8_memory/v8_detailed_memory_unittest.cc +++ b/components/performance_manager/v8_memory/v8_detailed_memory_unittest.cc
@@ -20,9 +20,9 @@ #include "base/test/bind.h" #include "base/test/gmock_callback_support.h" #include "base/test/gtest_util.h" +#include "base/test/scoped_run_loop_timeout.h" #include "base/test/test_timeouts.h" #include "base/time/time.h" -#include "base/timer/timer.h" #include "build/build_config.h" #include "components/performance_manager/graph/frame_node_impl.h" #include "components/performance_manager/graph/page_node_impl.h" @@ -162,7 +162,31 @@ using V8DetailedMemoryDecoratorDeathTest = V8DetailedMemoryDecoratorTest; -using V8DetailedMemoryRequestAnySeqTest = V8MemoryPerformanceManagerTestHarness; +// TODO(crbug.com/1212792): +// V8DetailedMemoryRequestAnySeqTest.SingleProcessRequest is sometimes timing +// out on Windows without any logs to diagnose why. This adds a shorter timeout +// around the test harness setup and teardown functions so we can tell if any +// of them are the slow step. Remove this once the cause is found. +class V8DetailedMemoryRequestAnySeqTest + : public V8MemoryPerformanceManagerTestHarness { + public: + using Super = V8MemoryPerformanceManagerTestHarness; + + V8DetailedMemoryRequestAnySeqTest() = default; + ~V8DetailedMemoryRequestAnySeqTest() override = default; + + void SetUp() override { + base::test::ScopedRunLoopTimeout timeout(FROM_HERE, + TestTimeouts::action_timeout()); + Super::SetUp(); + } + + void TearDown() override { + base::test::ScopedRunLoopTimeout timeout(FROM_HERE, + TestTimeouts::action_timeout()); + Super::TearDown(); + } +}; TEST_F(V8DetailedMemoryDecoratorTest, InstantiateOnEmptyGraph) { V8DetailedMemoryRequest memory_request(kMinTimeBetweenRequests, graph()); @@ -1690,14 +1714,16 @@ run_loop2.Run(); } -// TODO(crbug.com/1203439) Sometimes timing out on Windows. -#if defined(OS_WIN) -#define MAYBE_SingleProcessRequest DISABLED_SingleProcessRequest -#else -#define MAYBE_SingleProcessRequest SingleProcessRequest -#endif -TEST_F(V8DetailedMemoryRequestAnySeqTest, MAYBE_SingleProcessRequest) { - CreateCrossProcessChildFrame(); +TEST_F(V8DetailedMemoryRequestAnySeqTest, SingleProcessRequest) { + { + // TODO(crbug.com/1212792): This test is sometimes timing out on Windows + // without any logs to diagnose why. This puts a shorter timeout around + // the NavigationSimulator in CreateCrossProcessChildFrame so we can tell + // if this is the slow step. Remove this once the cause is found. + base::test::ScopedRunLoopTimeout navigation_timeout( + FROM_HERE, TestTimeouts::action_timeout()); + CreateCrossProcessChildFrame(); + } V8DetailedMemoryProcessData expected_process_data1; expected_process_data1.set_shared_v8_bytes_used(1U); @@ -1738,6 +1764,13 @@ MockV8DetailedMemoryObserverAnySeq single_process_observer; single_process_request.AddObserver(&single_process_observer); + // TODO(crbug.com/1212792): This test is sometimes timing out on Windows + // without any logs to diagnose why. This puts a shorter timeout around the + // RunLoop below so we can tell if this is the slow step. Remove this once + // the cause is found. + base::test::ScopedRunLoopTimeout timeout(FROM_HERE, + TestTimeouts::action_timeout()); + // When a measurement is available the all process observer should be invoked // for both processes, and the single process observer only for process 1. base::RunLoop run_loop; @@ -1756,13 +1789,6 @@ expected_process_data1, _)) .WillOnce(base::test::RunClosure(barrier)); - // If all measurements don't arrive in a reasonable period, cancel the - // run loop. This ensures the test will fail with errors from the unfulfilled - // EXPECT_CALL statements, as expected, instead of timing out. - base::OneShotTimer timeout; - timeout.Start(FROM_HERE, TestTimeouts::action_timeout(), - run_loop.QuitClosure()); - // Now execute all the above tasks. run_loop.Run(); Mock::VerifyAndClearExpectations(&mock_reporter1);
diff --git a/components/safe_browsing/content/browser/BUILD.gn b/components/safe_browsing/content/browser/BUILD.gn index c3801a6..8b26dace 100644 --- a/components/safe_browsing/content/browser/BUILD.gn +++ b/components/safe_browsing/content/browser/BUILD.gn
@@ -24,6 +24,35 @@ ] } +# NOTE: This target is separated from :browser as +# //components/safe_browsing/content/browser/triggers, which this depends on, depends +# on :browser. +# TODO(crbug.com/1216341): Consider folding all of three these together into +# :browser, along with the other browser process code in +# //components/safe_browsing/content. +if (safe_browsing_mode > 0) { + source_set("safe_browsing_blocking_page") { + sources = [ + "safe_browsing_blocking_page.cc", + "safe_browsing_blocking_page.h", + "safe_browsing_blocking_page_factory.h", + ] + + deps = [ + ":browser", + "//base", + "//components/prefs", + "//components/safe_browsing/content/browser/triggers", + "//components/safe_browsing/core/common", + "//components/safe_browsing/core/common:safe_browsing_prefs", + "//components/security_interstitials/content:security_interstitial_page", + "//components/security_interstitials/core", + "//components/security_interstitials/core:unsafe_resource", + "//content/public/browser", + ] + } +} + source_set("browser") { sources = [ "base_blocking_page.cc",
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/components/safe_browsing/content/browser/safe_browsing_blocking_page.cc similarity index 97% rename from chrome/browser/safe_browsing/safe_browsing_blocking_page.cc rename to components/safe_browsing/content/browser/safe_browsing_blocking_page.cc index 50236636..54acad9 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc +++ b/components/safe_browsing/content/browser/safe_browsing_blocking_page.cc
@@ -4,7 +4,7 @@ // // Implementation of the SafeBrowsingBlockingPage class. -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" #include <memory> @@ -126,8 +126,7 @@ } } -SafeBrowsingBlockingPage::~SafeBrowsingBlockingPage() { -} +SafeBrowsingBlockingPage::~SafeBrowsingBlockingPage() {} security_interstitials::SecurityInterstitialPage::TypeID SafeBrowsingBlockingPage::GetTypeForTesting() {
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h b/components/safe_browsing/content/browser/safe_browsing_blocking_page.h similarity index 95% rename from chrome/browser/safe_browsing/safe_browsing_blocking_page.h rename to components/safe_browsing/content/browser/safe_browsing_blocking_page.h index ee53e03..cd6da82 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h +++ b/components/safe_browsing/content/browser/safe_browsing_blocking_page.h
@@ -25,8 +25,8 @@ // decides to proceed in the first interstitial, we display all queued unsafe // resources in a new interstitial. -#ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ -#define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ +#ifndef COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_BLOCKING_PAGE_H_ +#define COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_BLOCKING_PAGE_H_ #include <map> #include <vector> @@ -127,6 +127,7 @@ // The threat source that triggers the blocking page. ThreatSource threat_source_; + private: history::HistoryService* history_service_ = nullptr; SafeBrowsingNavigationObserverManager* navigation_observer_manager_ = nullptr; @@ -138,4 +139,4 @@ } // namespace safe_browsing -#endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_H_ +#endif // COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_BLOCKING_PAGE_H_
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h b/components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h similarity index 68% rename from chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h rename to components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h index c514a12f..bedd4b7 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_factory.h +++ b/components/safe_browsing/content/browser/safe_browsing_blocking_page_factory.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ -#define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ +#ifndef COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ +#define COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ -#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" +#include "components/safe_browsing/content/browser/safe_browsing_blocking_page.h" class GURL; @@ -32,4 +32,4 @@ } // namespace safe_browsing -#endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_ +#endif // COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_BLOCKING_PAGE_FACTORY_H_
diff --git a/components/search_engines/keyword_table.cc b/components/search_engines/keyword_table.cc index 097582a..35f4a1e 100644 --- a/components/search_engines/keyword_table.cc +++ b/components/search_engines/keyword_table.cc
@@ -454,7 +454,7 @@ } // static -bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s, +bool KeywordTable::GetKeywordDataFromStatement(sql::Statement& s, TemplateURLData* data) { DCHECK(data);
diff --git a/components/search_engines/keyword_table.h b/components/search_engines/keyword_table.h index 7891e0d..94855eb 100644 --- a/components/search_engines/keyword_table.h +++ b/components/search_engines/keyword_table.h
@@ -144,7 +144,7 @@ // Fills |data| with the data in |s|. Returns false if we couldn't fill // |data| for some reason, e.g. |s| tried to set one of the fields to an // illegal value. - static bool GetKeywordDataFromStatement(const sql::Statement& s, + static bool GetKeywordDataFromStatement(sql::Statement& s, TemplateURLData* data); // Adds a new keyword, updating the id field on success.
diff --git a/components/search_engines/search_terms_data.cc b/components/search_engines/search_terms_data.cc index f9a5e797..52eca74 100644 --- a/components/search_engines/search_terms_data.cc +++ b/components/search_engines/search_terms_data.cc
@@ -20,8 +20,12 @@ std::string SearchTermsData::GoogleBaseSearchByImageURLValue() const { const std::string kGoogleHomepageURLPath = std::string("searchbyimage/"); + // If both LensStandalone and LensRegionSearch features are enabled, + // LensStandalone parameters will take precedence even if the values differ. if (base::FeatureList::IsEnabled(lens::features::kLensStandalone)) { - return lens::features::GetHomepageURL(); + return lens::features::GetHomepageURLForImageSearch(); + } else if (base::FeatureList::IsEnabled(lens::features::kLensRegionSearch)) { + return lens::features::GetHomepageURLForRegionSearch(); } return google_util::kGoogleHomepageURL + kGoogleHomepageURLPath; }
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc index e8878cc..d34fda06 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -83,43 +83,6 @@ } // namespace -RenderFrameReceiverSet::RenderFrameReceiverSet( - content::WebContents* web_contents, - ContentSubresourceFilterThrottleManager* throttle_manager) - : content::WebContentsObserver(web_contents), - throttle_manager_(throttle_manager) {} - -RenderFrameReceiverSet::~RenderFrameReceiverSet() = default; - -void RenderFrameReceiverSet::Bind( - content::RenderFrameHost* frame_host, - mojo::PendingAssociatedReceiver<mojom::SubresourceFilterHost> - pending_receiver) { - mojo::ReceiverId id = - receiver_.Add(throttle_manager_, std::move(pending_receiver), frame_host); - bool newly_inserted = - frame_to_receivers_map_ - .insert(std::pair<content::RenderFrameHost*, mojo::ReceiverId>( - frame_host, id)) - .second; - - // We should only ever have one binding per RenderFrame. - CHECK(newly_inserted); -} - -void RenderFrameReceiverSet::RenderFrameDeleted( - content::RenderFrameHost* frame_host) { - auto it = frame_to_receivers_map_.find(frame_host); - if (it != frame_to_receivers_map_.end()) { - receiver_.Remove(it->second); - frame_to_receivers_map_.erase(it); - } -} - -content::RenderFrameHost* RenderFrameReceiverSet::GetCurrentTargetFrame() { - return receiver_.current_context(); -} - const char ContentSubresourceFilterThrottleManager:: kContentSubresourceFilterThrottleManagerWebContentsUserDataKey[] = "content_subresource_filter_throttle_manager";
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h index ec9774d..31c27ec 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
@@ -22,8 +22,8 @@ #include "components/subresource_filter/content/common/subresource_filter_utils.h" #include "components/subresource_filter/core/common/activation_decision.h" #include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" +#include "content/public/browser/render_frame_host_receiver_set.h" #include "content/public/browser/web_contents_observer.h" -#include "content/public/browser/web_contents_receiver_set.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/frame/frame_ad_evidence.h" @@ -70,45 +70,6 @@ kMaxValue = kForcedActivationEnabled }; -// Wraps an AssociatedReceiverSet to provide automatic cleanup when a -// RenderFrameHost is removed. -// TODO(bokan, csharrison): Expose this functionality to others if it is -// broadly desirable. -class RenderFrameReceiverSet : public content::WebContentsObserver { - public: - RenderFrameReceiverSet( - content::WebContents* web_contents, - ContentSubresourceFilterThrottleManager* throttle_manager); - ~RenderFrameReceiverSet() override; - - RenderFrameReceiverSet(const RenderFrameReceiverSet&) = delete; - RenderFrameReceiverSet& operator=(const RenderFrameReceiverSet&) = delete; - - void Bind(content::RenderFrameHost* frame_host, - mojo::PendingAssociatedReceiver<mojom::SubresourceFilterHost> - pending_receiver); - - content::RenderFrameHost* GetCurrentTargetFrame(); - - // content::WebContentsObserver: - void RenderFrameDeleted(content::RenderFrameHost* frame_host) override; - - private: - // Receiver set for each frame in the page. Note, bindings are reused across - // navigations that are same-site since the RenderFrameHost is reused in that - // case. - mojo::AssociatedReceiverSet<mojom::SubresourceFilterHost, - content::RenderFrameHost*> - receiver_; - - // Track which RenderFrameHosts are in the |receiver_| set so that we can - // remove them when a RenderFrameHost is removed. - std::map<content::RenderFrameHost*, mojo::ReceiverId> frame_to_receivers_map_; - - // Must outlive this class. - ContentSubresourceFilterThrottleManager* throttle_manager_; -}; - // The ContentSubresourceFilterThrottleManager manages NavigationThrottles in // order to calculate frame activation states and subframe navigation filtering, // within a given WebContents. It contains a mapping of all activated @@ -362,7 +323,7 @@ std::map<int, LoadPolicy> navigation_load_policies_; // Receiver set for all RenderFrames in the WebContents. - RenderFrameReceiverSet receiver_; + content::RenderFrameHostReceiverSet<mojom::SubresourceFilterHost> receiver_; base::ScopedObservation<SubresourceFilterObserverManager, SubresourceFilterObserver>
diff --git a/components/sync/driver/active_devices_provider.h b/components/sync/driver/active_devices_provider.h index 992342b..bd2b0d5 100644 --- a/components/sync/driver/active_devices_provider.h +++ b/components/sync/driver/active_devices_provider.h
@@ -6,9 +6,9 @@ #define COMPONENTS_SYNC_DRIVER_ACTIVE_DEVICES_PROVIDER_H_ #include <string> -#include <vector> #include "base/callback.h" +#include "components/sync/engine/active_devices_invalidation_info.h" namespace syncer { @@ -21,15 +21,10 @@ virtual ~ActiveDevicesProvider() = default; - // Returns number of active devices or 0 if number of active devices is not - // known yet (e.g. data types are not configured). - virtual size_t CountActiveDevicesIfAvailable() = 0; - - // Returns a list with all remote FCM registration tokens known to the current - // device. If |local_cache_guid| is not empty, then the corresponding device - // will be filtered out. - virtual std::vector<std::string> CollectFCMRegistrationTokensForInvalidations( - const std::string& local_cache_guid) = 0; + // Prepare information for the following sync cycles about invalidations on + // other devices. + virtual ActiveDevicesInvalidationInfo CalculateInvalidationInfo( + const std::string& local_cache_guid) const = 0; // The |callback| will be called on each change in device infos. It might be // called multiple times with the same number of active devices. The
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc index 536aeb7..4a89f7b 100644 --- a/components/sync/driver/glue/sync_engine_backend.cc +++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -487,15 +487,9 @@ } void SyncEngineBackend::DoOnActiveDevicesChanged( - size_t active_devices, - std::vector<std::string> fcm_registration_tokens) { - // If |active_devices| is 0, then current client doesn't know if there are any - // other devices. It's safer to consider that there are some other active - // devices. - const bool single_client = active_devices == 1; - sync_manager_->UpdateSingleClientStatus(single_client); - sync_manager_->UpdateActiveDeviceFCMRegistrationTokens( - std::move(fcm_registration_tokens)); + ActiveDevicesInvalidationInfo active_devices_invalidation_info) { + sync_manager_->UpdateActiveDevicesInvalidationInfo( + std::move(active_devices_invalidation_info)); } void SyncEngineBackend::GetNigoriNodeForDebugging(AllNodesCallback callback) {
diff --git a/components/sync/driver/glue/sync_engine_backend.h b/components/sync/driver/glue/sync_engine_backend.h index e3e4e41..556f2b9 100644 --- a/components/sync/driver/glue/sync_engine_backend.h +++ b/components/sync/driver/glue/sync_engine_backend.h
@@ -17,6 +17,7 @@ #include "components/invalidation/public/invalidation.h" #include "components/invalidation/public/invalidator_state.h" #include "components/invalidation/public/topic_invalidation_map.h" +#include "components/sync/driver/active_devices_provider.h" #include "components/sync/engine/cancelation_signal.h" #include "components/sync/engine/model_type_configurer.h" #include "components/sync/engine/shutdown_reason.h" @@ -163,8 +164,7 @@ // tokens for all known active devices (if available and excluding the local // device if reflections are disabled). void DoOnActiveDevicesChanged( - size_t active_devices, - std::vector<std::string> fcm_registration_tokens); + ActiveDevicesInvalidationInfo active_devices_invalidation_info); private: friend class base::RefCountedThreadSafe<SyncEngineBackend>;
diff --git a/components/sync/driver/glue/sync_engine_impl.cc b/components/sync/driver/glue/sync_engine_impl.cc index 8b6ef2c..b545370 100644 --- a/components/sync/driver/glue/sync_engine_impl.cc +++ b/components/sync/driver/glue/sync_engine_impl.cc
@@ -639,10 +639,8 @@ sync_task_runner_->PostTask( FROM_HERE, base::BindOnce(&SyncEngineBackend::DoOnActiveDevicesChanged, backend_, - active_devices_provider_->CountActiveDevicesIfAvailable(), - active_devices_provider_ - ->CollectFCMRegistrationTokensForInvalidations( - local_cache_guid))); + active_devices_provider_->CalculateInvalidationInfo( + local_cache_guid))); } void SyncEngineImpl::UpdateLastSyncedTime() {
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc index 2fce1cd..9bd1fa3 100644 --- a/components/sync/driver/glue/sync_engine_impl_unittest.cc +++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -46,7 +46,9 @@ #include "testing/gtest/include/gtest/gtest.h" using testing::_; +using testing::ByMove; using testing::NiceMock; +using testing::Return; namespace syncer { @@ -157,15 +159,14 @@ MockActiveDevicesProvider() = default; ~MockActiveDevicesProvider() override = default; - MOCK_METHOD(size_t, CountActiveDevicesIfAvailable, (), (override)); MOCK_METHOD(void, SetActiveDevicesChangedCallback, (ActiveDevicesProvider::ActiveDevicesChangedCallback), (override)); - MOCK_METHOD(std::vector<std::string>, - CollectFCMRegistrationTokensForInvalidations, + MOCK_METHOD(ActiveDevicesInvalidationInfo, + CalculateInvalidationInfo, (const std::string&), - (override)); + (const override)); }; std::unique_ptr<HttpPostProviderFactory> CreateHttpBridgeFactory() { @@ -189,9 +190,14 @@ auto sync_task_runner = base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::BLOCK_SHUTDOWN}); + auto mock_active_devices_provider = + std::make_unique<NiceMock<MockActiveDevicesProvider>>(); + ON_CALL(*mock_active_devices_provider.get(), CalculateInvalidationInfo) + .WillByDefault(Return( + ByMove(ActiveDevicesInvalidationInfo::CreateUninitialized()))); backend_ = std::make_unique<SyncEngineImpl>( "dummyDebugName", &invalidator_, GetSyncInvalidationsService(), - std::make_unique<NiceMock<MockActiveDevicesProvider>>(), + std::move(mock_active_devices_provider), std::make_unique<SyncTransportDataPrefs>(&pref_service_), temp_dir_.GetPath().Append(base::FilePath(kTestSyncDir)), sync_task_runner, sync_transport_data_cleared_cb_.Get());
diff --git a/components/sync/engine/BUILD.gn b/components/sync/engine/BUILD.gn index 7cfb366..d922890 100644 --- a/components/sync/engine/BUILD.gn +++ b/components/sync/engine/BUILD.gn
@@ -4,6 +4,8 @@ static_library("engine") { sources = [ + "active_devices_invalidation_info.cc", + "active_devices_invalidation_info.h", "backoff_delay_provider.cc", "backoff_delay_provider.h", "bookmark_update_preprocessing.cc",
diff --git a/components/sync/engine/active_devices_invalidation_info.cc b/components/sync/engine/active_devices_invalidation_info.cc new file mode 100644 index 0000000..3ffa6fb2 --- /dev/null +++ b/components/sync/engine/active_devices_invalidation_info.cc
@@ -0,0 +1,48 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync/engine/active_devices_invalidation_info.h" + +#include <utility> + +#include "components/sync/engine/sync_engine_switches.h" + +namespace syncer { + +// static +ActiveDevicesInvalidationInfo +ActiveDevicesInvalidationInfo::CreateUninitialized() { + return ActiveDevicesInvalidationInfo(/*initialized=*/false); +} + +// static +ActiveDevicesInvalidationInfo ActiveDevicesInvalidationInfo::Create( + std::vector<std::string> fcm_registration_tokens, + ModelTypeSet interested_data_types) { + ActiveDevicesInvalidationInfo result(/*initialized=*/true); + result.fcm_registration_tokens_ = std::move(fcm_registration_tokens); + result.interested_data_types_ = interested_data_types; + return result; +} + +ActiveDevicesInvalidationInfo::ActiveDevicesInvalidationInfo(bool initialized) + : initialized_(initialized) {} + +ActiveDevicesInvalidationInfo::~ActiveDevicesInvalidationInfo() = default; + +ActiveDevicesInvalidationInfo::ActiveDevicesInvalidationInfo( + ActiveDevicesInvalidationInfo&&) = default; +ActiveDevicesInvalidationInfo& ActiveDevicesInvalidationInfo::operator=( + ActiveDevicesInvalidationInfo&&) = default; + +bool ActiveDevicesInvalidationInfo::IsSingleClientForTypes( + const ModelTypeSet& types) const { + if (!initialized_) { + return false; + } + + return Intersection(types, interested_data_types_).Empty(); +} + +} // namespace syncer
diff --git a/components/sync/engine/active_devices_invalidation_info.h b/components/sync/engine/active_devices_invalidation_info.h new file mode 100644 index 0000000..bc71a363 --- /dev/null +++ b/components/sync/engine/active_devices_invalidation_info.h
@@ -0,0 +1,58 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_ENGINE_ACTIVE_DEVICES_INVALIDATION_INFO_H_ +#define COMPONENTS_SYNC_ENGINE_ACTIVE_DEVICES_INVALIDATION_INFO_H_ + +#include <string> +#include <vector> + +#include "components/sync/base/model_type.h" + +namespace syncer { + +// This class keeps information about known active devices' invalidation fields. +// It's used for invalidations-related fields in a commit messages. +class ActiveDevicesInvalidationInfo { + public: + // Uninitialized object represents the case when sync engine is not + // initialized and there is no information about other devices. + static ActiveDevicesInvalidationInfo CreateUninitialized(); + + // Creates and initializes the object with all collected + // |fcm_registration_tokens| and |interested_data_types| from all other + // devices (and the local device if the client waits for self-invalidations). + static ActiveDevicesInvalidationInfo Create( + std::vector<std::string> fcm_registration_tokens, + ModelTypeSet interested_data_types); + + ~ActiveDevicesInvalidationInfo(); + + ActiveDevicesInvalidationInfo(ActiveDevicesInvalidationInfo&&); + ActiveDevicesInvalidationInfo& operator=(ActiveDevicesInvalidationInfo&&); + + // Returns true if there are no other devices interested in invalidations for + // the given |types|. Otherwise returns false (and in case when it's unknown, + // e.g. while DeviceInfo is not initialized). When reflections are enabled, + // returns false even if current client is the only one. + bool IsSingleClientForTypes(const ModelTypeSet& types) const; + + // Returns a list with all remote FCM registration tokens known to the current + // device. The list may contain the local device's token if a reflection + // should be sent from the server. + const std::vector<std::string>& fcm_registration_tokens() const { + return fcm_registration_tokens_; + } + + private: + explicit ActiveDevicesInvalidationInfo(bool initialized); + + bool initialized_ = false; + std::vector<std::string> fcm_registration_tokens_; + ModelTypeSet interested_data_types_; +}; + +} // namespace syncer + +#endif // COMPONENTS_SYNC_ENGINE_ACTIVE_DEVICES_INVALIDATION_INFO_H_
diff --git a/components/sync/engine/commit.cc b/components/sync/engine/commit.cc index fc7f933..ad90064 100644 --- a/components/sync/engine/commit.cc +++ b/components/sync/engine/commit.cc
@@ -12,6 +12,7 @@ #include "base/rand_util.h" #include "base/trace_event/trace_event.h" #include "components/sync/base/data_type_histogram.h" +#include "components/sync/engine/active_devices_invalidation_info.h" #include "components/sync/engine/commit_processor.h" #include "components/sync/engine/commit_util.h" #include "components/sync/engine/cycle/sync_cycle.h" @@ -92,8 +93,7 @@ const std::string& account_name, const std::string& cache_guid, bool cookie_jar_mismatch, - bool single_client, - const std::vector<std::string>& fcm_registration_tokens, + const ActiveDevicesInvalidationInfo& active_devices_invalidation_info, CommitProcessor* commit_processor, ExtensionsActivity* extensions_activity) { // Gather per-type contributions. @@ -124,10 +124,18 @@ } } + ModelTypeSet contributed_data_types; + for (const auto& contribution : contributions) { + contributed_data_types.Put(contribution.first); + } + // Set the client config params. commit_util::AddClientConfigParamsToMessage( - enabled_types, cookie_jar_mismatch, single_client, - fcm_registration_tokens, commit_message); + enabled_types, cookie_jar_mismatch, + active_devices_invalidation_info.IsSingleClientForTypes( + contributed_data_types), + active_devices_invalidation_info.fcm_registration_tokens(), + commit_message); // Finally, serialize all our contributions. for (const auto& contribution : contributions) {
diff --git a/components/sync/engine/commit.h b/components/sync/engine/commit.h index 8e9ac84..5440769c 100644 --- a/components/sync/engine/commit.h +++ b/components/sync/engine/commit.h
@@ -22,6 +22,7 @@ namespace syncer { +class ActiveDevicesInvalidationInfo; class CommitProcessor; class StatusController; class SyncCycle; @@ -52,8 +53,7 @@ const std::string& account_name, const std::string& cache_guid, bool cookie_jar_mismatch, - bool single_client, - const std::vector<std::string>& fcm_registration_tokens, + const ActiveDevicesInvalidationInfo& active_devices_invalidation_info, CommitProcessor* commit_processor, ExtensionsActivity* extensions_activity);
diff --git a/components/sync/engine/cycle/sync_cycle_context.cc b/components/sync/engine/cycle/sync_cycle_context.cc index c3958ab..9ad9966 100644 --- a/components/sync/engine/cycle/sync_cycle_context.cc +++ b/components/sync/engine/cycle/sync_cycle_context.cc
@@ -30,7 +30,8 @@ model_type_registry_(model_type_registry), invalidator_client_id_(invalidator_client_id), cookie_jar_mismatch_(false), - single_client_(false), + active_devices_invalidation_info_( + ActiveDevicesInvalidationInfo::CreateUninitialized()), poll_interval_(poll_interval) { DCHECK(!poll_interval.is_zero()); std::vector<SyncEngineEventListener*>::const_iterator it; @@ -38,7 +39,7 @@ listeners_.AddObserver(*it); } -SyncCycleContext::~SyncCycleContext() {} +SyncCycleContext::~SyncCycleContext() = default; ModelTypeSet SyncCycleContext::GetEnabledTypes() const { return model_type_registry_->GetEnabledTypes();
diff --git a/components/sync/engine/cycle/sync_cycle_context.h b/components/sync/engine/cycle/sync_cycle_context.h index a27a2b9..67f2efe 100644 --- a/components/sync/engine/cycle/sync_cycle_context.h +++ b/components/sync/engine/cycle/sync_cycle_context.h
@@ -14,6 +14,7 @@ #include "base/macros.h" #include "base/observer_list.h" #include "base/time/time.h" +#include "components/sync/engine/active_devices_invalidation_info.h" #include "components/sync/engine/cycle/debug_info_getter.h" #include "components/sync/engine/model_type_registry.h" #include "components/sync/engine/sync_engine_event_listener.h" @@ -113,22 +114,20 @@ cookie_jar_mismatch_ = cookie_jar_mismatch; } - bool single_client() const { return single_client_; } - void set_single_client(bool single_client) { single_client_ = single_client; } - base::TimeDelta poll_interval() const { return poll_interval_; } void set_poll_interval(base::TimeDelta interval) { DCHECK(!interval.is_zero()); poll_interval_ = interval; } - const std::vector<std::string>& active_device_fcm_registration_tokens() - const { - return active_device_fcm_registration_tokens_; + const ActiveDevicesInvalidationInfo& active_devices_invalidation_info() { + return active_devices_invalidation_info_; } - void set_active_device_fcm_registration_tokens( - std::vector<std::string> fcm_registration_tokens) { - active_device_fcm_registration_tokens_ = std::move(fcm_registration_tokens); + + void set_active_devices_invalidation_info( + ActiveDevicesInvalidationInfo active_devices_invalidation_info) { + active_devices_invalidation_info_ = + std::move(active_devices_invalidation_info); } private: @@ -176,11 +175,7 @@ // mismatch implies all of them are different from the chrome account. bool cookie_jar_mismatch_; - // If there are no other known active devices. - bool single_client_; - - // A list of FCM registration tokens to send invalidations. - std::vector<std::string> active_device_fcm_registration_tokens_; + ActiveDevicesInvalidationInfo active_devices_invalidation_info_; base::TimeDelta poll_interval_;
diff --git a/components/sync/engine/sync_manager.h b/components/sync/engine/sync_manager.h index f8fcd3d..98f4bbeb 100644 --- a/components/sync/engine/sync_manager.h +++ b/components/sync/engine/sync_manager.h
@@ -19,6 +19,7 @@ #include "components/sync/base/invalidation_interface.h" #include "components/sync/base/model_type.h" #include "components/sync/base/weak_handle.h" +#include "components/sync/engine/active_devices_invalidation_info.h" #include "components/sync/engine/configure_reason.h" #include "components/sync/engine/connection_status.h" #include "components/sync/engine/engine_components_factory.h" @@ -221,12 +222,9 @@ // Updates invalidation client id. virtual void UpdateInvalidationClientId(const std::string& client_id) = 0; - // Notifies SyncManager that there are no other known active devices. - virtual void UpdateSingleClientStatus(bool single_client) = 0; - - // Updates the list of known active device FCM registration tokens. - virtual void UpdateActiveDeviceFCMRegistrationTokens( - std::vector<std::string> fcm_registration_tokens) = 0; + // Updates the invalidation information from known active devices. + virtual void UpdateActiveDevicesInvalidationInfo( + ActiveDevicesInvalidationInfo active_devices_invalidation_info) = 0; }; } // namespace syncer
diff --git a/components/sync/engine/sync_manager_impl.cc b/components/sync/engine/sync_manager_impl.cc index 4d03691..83ae6e4 100644 --- a/components/sync/engine/sync_manager_impl.cc +++ b/components/sync/engine/sync_manager_impl.cc
@@ -508,14 +508,10 @@ cycle_context_->set_invalidator_client_id(client_id); } -void SyncManagerImpl::UpdateSingleClientStatus(bool single_client) { - cycle_context_->set_single_client(single_client); -} - -void SyncManagerImpl::UpdateActiveDeviceFCMRegistrationTokens( - std::vector<std::string> fcm_registration_tokens) { - cycle_context_->set_active_device_fcm_registration_tokens( - std::move(fcm_registration_tokens)); +void SyncManagerImpl::UpdateActiveDevicesInvalidationInfo( + ActiveDevicesInvalidationInfo active_devices_invalidation_info) { + cycle_context_->set_active_devices_invalidation_info( + std::move(active_devices_invalidation_info)); } } // namespace syncer
diff --git a/components/sync/engine/sync_manager_impl.h b/components/sync/engine/sync_manager_impl.h index 6a76bac5..60bb38e 100644 --- a/components/sync/engine/sync_manager_impl.h +++ b/components/sync/engine/sync_manager_impl.h
@@ -81,9 +81,8 @@ override; void OnCookieJarChanged(bool account_mismatch) override; void UpdateInvalidationClientId(const std::string& client_id) override; - void UpdateSingleClientStatus(bool single_client) override; - void UpdateActiveDeviceFCMRegistrationTokens( - std::vector<std::string> fcm_registration_tokens) override; + void UpdateActiveDevicesInvalidationInfo( + ActiveDevicesInvalidationInfo active_devices_invalidation_info) override; // SyncEncryptionHandler::Observer implementation. void OnPassphraseRequired(
diff --git a/components/sync/engine/syncer.cc b/components/sync/engine/syncer.cc index 5b69ac0..4b8ae11 100644 --- a/components/sync/engine/syncer.cc +++ b/components/sync/engine/syncer.cc
@@ -150,9 +150,8 @@ cycle->context()->max_commit_batch_size(), cycle->context()->account_name(), cycle->context()->cache_guid(), cycle->context()->cookie_jar_mismatch(), - cycle->context()->single_client(), - cycle->context()->active_device_fcm_registration_tokens(), - &commit_processor, cycle->context()->extensions_activity())); + cycle->context()->active_devices_invalidation_info(), &commit_processor, + cycle->context()->extensions_activity())); if (!commit) { break; }
diff --git a/components/sync/protocol/sync.proto b/components/sync/protocol/sync.proto index 745522f..f6013ac 100644 --- a/components/sync/protocol/sync.proto +++ b/components/sync/protocol/sync.proto
@@ -450,10 +450,10 @@ // mismatch implies all of them are different from the chrome account. optional bool cookie_jar_mismatch = 3; - // Indicates that the client is not aware of any other active clients for the - // user. This flag shows that it is not necessary to send invalidations for - // the committed data. The client is considered active if it's DeviceInfo has - // updated recent enough. + // Indicates that the client is not aware of any other active clients + // interested in the committed data types. This flag shows that it is not + // necessary to send invalidations for the committed data. A client is + // considered active if it's DeviceInfo has updated recent enough. optional bool single_client = 4; // A list of FCM registration tokens which are obtained from other clients.
diff --git a/components/sync/test/engine/fake_sync_manager.cc b/components/sync/test/engine/fake_sync_manager.cc index d2007b57..0696e562 100644 --- a/components/sync/test/engine/fake_sync_manager.cc +++ b/components/sync/test/engine/fake_sync_manager.cc
@@ -190,12 +190,8 @@ NOTIMPLEMENTED(); } -void FakeSyncManager::UpdateSingleClientStatus(bool single_client) { - // Do nothing. -} - -void FakeSyncManager::UpdateActiveDeviceFCMRegistrationTokens( - std::vector<std::string> fcm_registration_tokens) { +void FakeSyncManager::UpdateActiveDevicesInvalidationInfo( + ActiveDevicesInvalidationInfo active_devices_invalidation_info) { // Do nothing. }
diff --git a/components/sync/test/engine/fake_sync_manager.h b/components/sync/test/engine/fake_sync_manager.h index 26b72d0..56f4decb 100644 --- a/components/sync/test/engine/fake_sync_manager.h +++ b/components/sync/test/engine/fake_sync_manager.h
@@ -97,9 +97,8 @@ void RefreshTypes(ModelTypeSet types) override; void OnCookieJarChanged(bool account_mismatch) override; void UpdateInvalidationClientId(const std::string&) override; - void UpdateSingleClientStatus(bool single_client) override; - void UpdateActiveDeviceFCMRegistrationTokens( - std::vector<std::string> fcm_registration_tokens) override; + void UpdateActiveDevicesInvalidationInfo( + ActiveDevicesInvalidationInfo active_devices_invalidation_info) override; private: scoped_refptr<base::SequencedTaskRunner> sync_task_runner_;
diff --git a/components/test/data/payments/iframe_receiver.js b/components/test/data/payments/iframe_receiver.js index efa105d..cb371bdb 100644 --- a/components/test/data/payments/iframe_receiver.js +++ b/components/test/data/payments/iframe_receiver.js
@@ -28,6 +28,11 @@ credentialIds: [Uint8Array.from(atob(credentialId), (b) => b.charCodeAt(0))], networkData: new TextEncoder().encode('hello world'), + challenge: new TextEncoder().encode('hello world'), + instrument: { + displayName: 'Hello World', + icon: window.location.origin + '/icon.png', + }, timeout: 6000, }}], {total: {label: 'TEST', amount: {currency: 'USD', value: '0.01'}}});
diff --git a/components/test/data/payments/secure_payment_confirmation.js b/components/test/data/payments/secure_payment_confirmation.js index d26b805..9bb749d 100644 --- a/components/test/data/payments/secure_payment_confirmation.js +++ b/components/test/data/payments/secure_payment_confirmation.js
@@ -20,6 +20,11 @@ (credentialIdentifier ? atob(credentialIdentifier) : 'cred'), (c) => c.charCodeAt(0))], networkData: Uint8Array.from('network_data', (c) => c.charCodeAt(0)), + challenge: Uint8Array.from('network_data', (c) => c.charCodeAt(0)), + instrument: { + displayName: 'display_name_for_instrument', + icon: window.location.origin + '/icon.png', + }, timeout: 60000, fallbackUrl: 'https://fallback.example/url', }}];
diff --git a/components/url_formatter/android/javatests/src/org/chromium/components/url_formatter/UrlFormatterUnitTest.java b/components/url_formatter/android/javatests/src/org/chromium/components/url_formatter/UrlFormatterUnitTest.java index 3040b326..02a0ef8 100644 --- a/components/url_formatter/android/javatests/src/org/chromium/components/url_formatter/UrlFormatterUnitTest.java +++ b/components/url_formatter/android/javatests/src/org/chromium/components/url_formatter/UrlFormatterUnitTest.java
@@ -59,6 +59,20 @@ @Test @SmallTest + public void testFormatUrlForDisplayOmitSchemeOmitTrivialSubdomains() { + Function<String, String> f = + UrlFormatter::formatUrlForDisplayOmitSchemeOmitTrivialSubdomains; + + assertEquals("google.com/path", f.apply("http://user:pass@google.com/path")); + assertEquals("chrome://version", f.apply("chrome://version")); + assertEquals("äää.de", f.apply("https://äää.de")); + assertEquals("xn--4caaa.com", f.apply("https://äää.com")); + assertEquals("مثال.إختبار", f.apply("https://xn--mgbh0fb.xn--kgbechtv/")); + assertEquals("example.com/ test", f.apply("http://user:password@example.com/%20test")); + } + + @Test + @SmallTest public void testFormatUrlForDisplayOmitSchemePathAndTrivialSubdomains() { Function<GURL, String> f = UrlFormatter::formatUrlForDisplayOmitSchemePathAndTrivialSubdomains;
diff --git a/components/url_formatter/url_formatter_android.cc b/components/url_formatter/url_formatter_android.cc index 53fab60..1376a17 100644 --- a/components/url_formatter/url_formatter_android.cc +++ b/components/url_formatter/url_formatter_android.cc
@@ -110,8 +110,12 @@ JNIEnv* env, const JavaParamRef<jstring>& url) { return base::android::ConvertUTF16ToJavaString( - env, url_formatter::FormatUrlForDisplayOmitSchemePathAndTrivialSubdomains( - JNI_UrlFormatter_ConvertJavaStringToGURL(env, url))); + env, url_formatter::FormatUrl( + JNI_UrlFormatter_ConvertJavaStringToGURL(env, url), + url_formatter::kFormatUrlOmitDefaults | + url_formatter::kFormatUrlOmitHTTPS | + url_formatter::kFormatUrlOmitTrivialSubdomains, + net::UnescapeRule::SPACES, nullptr, nullptr, nullptr)); } static ScopedJavaLocalRef<jstring>
diff --git a/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc b/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc index 34e5e9d..dbdc8f5 100644 --- a/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc +++ b/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc
@@ -36,8 +36,7 @@ // Normalizes value to a float in [0, 1]. Use to convert a fuzzed // uint32 into a percentage. float Normalize(uint32_t x) { - return static_cast<float>(x) / - static_cast<float>(std::numeric_limits<uint32_t>::max()); + return static_cast<float>(x) / std::numeric_limits<uint32_t>::max(); } gfx::Size GetSizeFromProtobuf(const proto::Size& proto_size) {
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm b/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm index 3f5fc85..9322d03 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm +++ b/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm
@@ -488,4 +488,13 @@ {"button.AXPerformAction(AXPress)"}, R"~~()~~"); } +IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest, + Script_SetAttribute) { + TestScript(R"~~(data:text/html, + <textarea id="textarea">Text</textarea>)~~", + {"textarea.AXSelectedTextMarkerRange = " + "textarea.AXTextMarkerRangeForUIElement(textarea)"}, + ""); +} + } // namespace content
diff --git a/content/browser/accessibility/accessibility_tree_formatter_utils_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_utils_mac.mm index 53bd0ba..1bc15f16 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_utils_mac.mm +++ b/content/browser/accessibility/accessibility_tree_formatter_utils_mac.mm
@@ -88,40 +88,51 @@ // the property node refers to a DOM id or line index of an accessible object. // If the property node doesn't provide a target then use the default one // (if any). - id target = node; - auto* current_node = &property_node; - if (property_node.IsTarget()) { - if (storage_) { - auto storage_iterator = storage_->find(property_node.name_or_value); - if (storage_iterator != storage_->end()) { - target = storage_iterator->second; - if (!target) { - LOG(ERROR) << "Stored " << property_node.name_or_value - << " target is null "; - return OptionalNSObject::Error(); - } - } - } - if (!target) { - target = line_indexer->NodeBy(property_node.name_or_value); + id target = nil; + + // Case 1: try to get a target from the storage. + if (storage_) { + auto storage_iterator = storage_->find(property_node.name_or_value); + if (storage_iterator != storage_->end()) { + target = storage_iterator->second; if (!target) { - LOG(ERROR) << "No target in " << property_node.ToString(); + LOG(ERROR) << "Stored " << property_node.name_or_value + << " target is null."; return OptionalNSObject::Error(); } } - current_node = property_node.next.get(); } + // Case 2: try to get target from the tree indexer. + if (!target) + target = line_indexer->NodeBy(property_node.name_or_value); - // No target indicates the property_node is a scalar value or an AX object. - // Nothing to invoke. + // Case 3: no target either indicates an error or the property node is a + // scalar value and thus nothing to invoke or, if default target is given, + // then the target is deemed (|node| is null) and we should use the default + // target. if (!target) { - return OptionalNSObject::NotApplicable(); + if (property_node.IsTarget()) + return OptionalNSObject::Error(); + + if (!node) + return OptionalNSObject::NotApplicable(); } + // If target is deemed, then start from the given property node. Otherwise the + // given property node is a target, and its next property node is a + // method/property to invoke. + auto* current_node = &property_node; + if (target) { + current_node = property_node.next.get(); + } else { + target = node; + } + + // Invoke the call chain. while (current_node) { auto target_optional = InvokeFor(target, *current_node); if (!target_optional.IsNotNil()) { - LOG(ERROR) << "Null result of " << current_node->ToString(); + LOG(ERROR) << "Null result of " << current_node->ToFlatString(); return target_optional; } target = *target_optional; @@ -147,7 +158,7 @@ if ([target isKindOfClass:[NSArray class]]) return InvokeForArray(target, property_node); - LOG(ERROR) << "Unexpected target type for " << property_node.ToString(); + LOG(ERROR) << "Unexpected target type for " << property_node.ToFlatString(); return OptionalNSObject::Error(); } @@ -170,6 +181,16 @@ // Attributes. for (NSString* attribute : AttributeNamesOf(target)) { if (property_node.IsMatching(base::SysNSStringToUTF8(attribute))) { + // Setter + if (property_node.rvalue) { + OptionalNSObject rvalue = Invoke(*property_node.rvalue); + if (rvalue.IsNotNil()) { + SetAttributeValueOf(target, attribute, *rvalue); + return OptionalNSObject::NotApplicable(); + } + return rvalue; + } + // Getter return OptionalNSObject::NotNullOrNotApplicable( AttributeValueOf(target, attribute)); } @@ -314,7 +335,8 @@ "AXPreviousWordStartTextMarkerForTextMarker") { // TextMarker return OptionalNSObject::NotNilOrError(PropertyNodeToTextMarker(arg_node)); } - if (property_name == "AXStringForTextMarkerRange") { // TextMarkerRange + if (property_name == "AXSelectedTextMarkerRangeAttribute" || + property_name == "AXStringForTextMarkerRange") { // TextMarkerRange return OptionalNSObject::NotNilOrError( PropertyNodeToTextMarkerRange(arg_node)); }
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc index 046da54..9b6cc5c 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -334,7 +334,7 @@ // Keep track of the total time accessibility is enabled, and the time // it was previously disabled. - if (accessibility_enabled_time_.is_null()) { + if (previous_mode.is_mode_off()) { base::TimeTicks now = ui::EventTimeForNow(); accessibility_enabled_time_ = now; if (!accessibility_disabled_time_.is_null()) {
diff --git a/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc b/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc index 88cf749e..cf54cd7 100644 --- a/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc
@@ -78,7 +78,9 @@ run_until); actual_contents = pair.first.GetString(); for (auto event : pair.second) { - actual_contents += event + '\n'; + if (base::StartsWith(event, wait_for)) { + actual_contents += event + '\n'; + } } } @@ -103,6 +105,18 @@ RunTest(html_file, "accessibility/mac/action"); } + void RunMacSelectionTest(const base::FilePath::CharType* file_path) { + base::FilePath test_path = + GetTestFilePath("accessibility", "mac/selection"); + { + base::ScopedAllowBlockingForTesting allow_blocking; + ASSERT_TRUE(base::PathExists(test_path)) << test_path.LossyDisplayName(); + } + base::FilePath html_file = test_path.Append(base::FilePath(file_path)); + + RunTest(html_file, "accessibility/mac/selection"); + } + void RunMacTextMarkerTest(const base::FilePath::CharType* file_path) { base::FilePath test_path = GetTestFilePath("accessibility", "mac/textmarker"); @@ -144,6 +158,10 @@ RunMacActionTest(FILE_PATH_LITERAL("ax-press-button.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AXSelectAllTextarea) { + RunMacSelectionTest(FILE_PATH_LITERAL("ax-selectall-textarea.html")); +} + IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AXNextWordEndTextMarkerForTextMarker) { RunMacTextMarkerTest(
diff --git a/content/browser/appcache/appcache_database.cc b/content/browser/appcache/appcache_database.cc index e24c51f4..6293d8e 100644 --- a/content/browser/appcache/appcache_database.cc +++ b/content/browser/appcache/appcache_database.cc
@@ -991,8 +991,8 @@ return statement.Succeeded(); } -void AppCacheDatabase::ReadGroupRecord( - const sql::Statement& statement, GroupRecord* record) { +void AppCacheDatabase::ReadGroupRecord(sql::Statement& statement, + GroupRecord* record) { record->group_id = statement.ColumnInt64(0); record->origin = url::Origin::Create(GURL(statement.ColumnString(1))); record->manifest_url = GURL(statement.ColumnString(2)); @@ -1015,8 +1015,8 @@ base::Time::FromInternalValue(statement.ColumnInt64(7)); } -void AppCacheDatabase::ReadCacheRecord( - const sql::Statement& statement, CacheRecord* record) { +void AppCacheDatabase::ReadCacheRecord(sql::Statement& statement, + CacheRecord* record) { record->cache_id = statement.ColumnInt64(0); record->group_id = statement.ColumnInt64(1); record->online_wildcard = statement.ColumnBool(2); @@ -1030,8 +1030,8 @@ base::Time::FromInternalValue(statement.ColumnInt64(8)); } -void AppCacheDatabase::ReadEntryRecord( - const sql::Statement& statement, EntryRecord* record) { +void AppCacheDatabase::ReadEntryRecord(sql::Statement& statement, + EntryRecord* record) { record->cache_id = statement.ColumnInt64(0); record->url = GURL(statement.ColumnString(1)); record->flags = statement.ColumnInt(2); @@ -1056,8 +1056,8 @@ } } -void AppCacheDatabase::ReadNamespaceRecord( - const sql::Statement* statement, NamespaceRecord* record) { +void AppCacheDatabase::ReadNamespaceRecord(sql::Statement* statement, + NamespaceRecord* record) { record->cache_id = statement->ColumnInt64(0); record->origin = url::Origin::Create(GURL(statement->ColumnString(1))); record->namespace_.type = @@ -1071,7 +1071,7 @@ base::Time::FromInternalValue(statement->ColumnInt64(5)); } -void AppCacheDatabase::ReadOnlineSafeListRecord(const sql::Statement& statement, +void AppCacheDatabase::ReadOnlineSafeListRecord(sql::Statement& statement, OnlineSafeListRecord* record) { record->cache_id = statement.ColumnInt64(0); record->namespace_url = GURL(statement.ColumnString(1));
diff --git a/content/browser/appcache/appcache_database.h b/content/browser/appcache/appcache_database.h index 2ff711d6..f3072d9 100644 --- a/content/browser/appcache/appcache_database.h +++ b/content/browser/appcache/appcache_database.h
@@ -229,16 +229,15 @@ std::set<int64_t>* ids_set); // Record retrieval helpers - void ReadGroupRecord(const sql::Statement& statement, GroupRecord* record); - void ReadCacheRecord(const sql::Statement& statement, CacheRecord* record); - void ReadEntryRecord(const sql::Statement& statement, EntryRecord* record); + void ReadGroupRecord(sql::Statement& statement, GroupRecord* record); + void ReadCacheRecord(sql::Statement& statement, CacheRecord* record); + void ReadEntryRecord(sql::Statement& statement, EntryRecord* record); void ReadNamespaceRecords( sql::Statement* statement, NamespaceRecordVector* intercepts, NamespaceRecordVector* fallbacks); - void ReadNamespaceRecord( - const sql::Statement* statement, NamespaceRecord* record); - void ReadOnlineSafeListRecord(const sql::Statement& statement, + void ReadNamespaceRecord(sql::Statement* statement, NamespaceRecord* record); + void ReadOnlineSafeListRecord(sql::Statement& statement, OnlineSafeListRecord* record); // Database creation
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index 7c9e3d7..bb98355 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -25,6 +25,7 @@ #include "base/time/time.h" #include "base/trace_event/trace_log.h" #include "build/build_config.h" +#include "build/chromecast_buildflags.h" #include "build/chromeos_buildflags.h" #include "components/network_session_configurator/common/network_switches.h" #include "components/ukm/test_ukm_recorder.h" @@ -11831,8 +11832,8 @@ protected: void SetUpCommandLine(base::CommandLine* command_line) override { EnableFeatureAndSetParams(features::kBackForwardCache, "", ""); - EnableFeatureAndSetParams( - features::kCacheControlNoStoreEnterBackForwardCache, "", ""); + EnableFeatureAndSetParams(kCacheControlNoStoreEnterBackForwardCache, "", + ""); BackForwardCacheBrowserTest::SetUpCommandLine(command_line); } }; @@ -11876,12 +11877,20 @@ {}, {}, FROM_HERE); } +#if BUILDFLAG(IS_CHROMECAST) +#define MAYBE_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScript \ + DISABLED_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScript +#else +#define MAYBE_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScript \ + PagesWithCacheControlNoStoreCookieModifiedThroughJavaScript +#endif + // Test that a page with cache-control:no-store enters bfcache with the flag on, // and if a cookie is modified while it is in bfcache via JavaScript, gets // evicted with cookie modified marked. IN_PROC_BROWSER_TEST_F( BackForwardCacheBrowserTestAllowCacheControlNoStore, - PagesWithCacheControlNoStoreCookieModifiedThroughJavaScript) { + MAYBE_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScript) { net::test_server::ControllableHttpResponse response(embedded_test_server(), "/main_document"); net::test_server::ControllableHttpResponse response2(embedded_test_server(), @@ -11933,12 +11942,22 @@ {}, {}, {}, FROM_HERE); } +// Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182 +#if BUILDFLAG(IS_CHROMECAST) +#define MAYBE_PagesWithCacheControlNoStoreCookieModifiedBackTwice \ + DISABLED_PagesWithCacheControlNoStoreCookieModifiedBackTwice +#else +#define MAYBE_PagesWithCacheControlNoStoreCookieModifiedBackTwice \ + PagesWithCacheControlNoStoreCookieModifiedBackTwice +#endif + // Test that a page with cache-control:no-store enters bfcache with the flag on, // and if a cookie is modified, it gets evicted with cookie changed, but if // navigated away again and navigated back, it gets evicted without cookie // change marked. -IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTestAllowCacheControlNoStore, - PagesWithCacheControlNoStoreCookieModifiedBackTwice) { +IN_PROC_BROWSER_TEST_F( + BackForwardCacheBrowserTestAllowCacheControlNoStore, + MAYBE_PagesWithCacheControlNoStoreCookieModifiedBackTwice) { net::test_server::ControllableHttpResponse response(embedded_test_server(), "/main_document"); net::test_server::ControllableHttpResponse response2(embedded_test_server(), @@ -12009,12 +12028,21 @@ {}, {}, FROM_HERE); } +// Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182 +#if BUILDFLAG(IS_CHROMECAST) +#define MAYBE_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScriptOnDifferentDomain \ + DISABLED_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScriptOnDifferentDomain +#else +#define MAYBE_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScriptOnDifferentDomain \ + PagesWithCacheControlNoStoreCookieModifiedThroughJavaScriptOnDifferentDomain +#endif + // Test that a page with cache-control:no-store enters bfcache with the flag on, // and even if a cookie is modified on a different domain than the entry, the // entry is not marked as cookie modified. IN_PROC_BROWSER_TEST_F( BackForwardCacheBrowserTestAllowCacheControlNoStore, - PagesWithCacheControlNoStoreCookieModifiedThroughJavaScriptOnDifferentDomain) { + MAYBE_PagesWithCacheControlNoStoreCookieModifiedThroughJavaScriptOnDifferentDomain) { net::test_server::ControllableHttpResponse response(embedded_test_server(), "/main_document"); net::test_server::ControllableHttpResponse response2(embedded_test_server(), @@ -12091,11 +12119,21 @@ "The server speaks HTTP!"; } // namespace +// Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182 +#if BUILDFLAG(IS_CHROMECAST) +#define MAYBE_PagesWithCacheControlNoStoreSetFromResponseHeader \ + DISABLED_PagesWithCacheControlNoStoreSetFromResponseHeader +#else +#define MAYBE_PagesWithCacheControlNoStoreSetFromResponseHeader \ + PagesWithCacheControlNoStoreSetFromResponseHeader +#endif + // Test that a page with cache-control:no-store enters bfcache with the flag on, // and if a cookie is modified while it is in bfcache via response header, gets // evicted with cookie modified marked. -IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTestAllowCacheControlNoStore, - PagesWithCacheControlNoStoreSetFromResponseHeader) { +IN_PROC_BROWSER_TEST_F( + BackForwardCacheBrowserTestAllowCacheControlNoStore, + MAYBE_PagesWithCacheControlNoStoreSetFromResponseHeader) { net::test_server::ControllableHttpResponse response(embedded_test_server(), "/main_document"); net::test_server::ControllableHttpResponse response2(embedded_test_server(), @@ -12145,12 +12183,21 @@ {}, {}, {}, FROM_HERE); } +// Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182 +#if BUILDFLAG(IS_CHROMECAST) +#define MAYBE_PagesWithCacheControlNoStoreSetFromResponseHeaderHTTPOnlyCookie \ + DISABLED_PagesWithCacheControlNoStoreSetFromResponseHeaderHTTPOnlyCookie +#else +#define MAYBE_PagesWithCacheControlNoStoreSetFromResponseHeaderHTTPOnlyCookie \ + PagesWithCacheControlNoStoreSetFromResponseHeaderHTTPOnlyCookie +#endif + // Test that a page with cache-control:no-store enters bfcache with the flag on, // and if HTTPOnly cookie is modified while it is in bfcache, gets evicted with // HTTPOnly cookie modified marked. IN_PROC_BROWSER_TEST_F( BackForwardCacheBrowserTestAllowCacheControlNoStore, - PagesWithCacheControlNoStoreSetFromResponseHeaderHTTPOnlyCookie) { + MAYBE_PagesWithCacheControlNoStoreSetFromResponseHeaderHTTPOnlyCookie) { // HTTPOnly cookie can be only set over HTTPS. CreateHttpsServer(); net::test_server::ControllableHttpResponse response(https_server(), @@ -12204,13 +12251,22 @@ {}, {}, {}, FROM_HERE); } +// Disabled due to flakiness on Cast Audio Linux https://crbug.com/1229182 +#if BUILDFLAG(IS_CHROMECAST) +#define MAYBE_PagesWithCacheControlNoStoreHTTPOnlyCookieModifiedBackTwice \ + DISABLED_PagesWithCacheControlNoStoreHTTPOnlyCookieModifiedBackTwice +#else +#define MAYBE_PagesWithCacheControlNoStoreHTTPOnlyCookieModifiedBackTwice \ + PagesWithCacheControlNoStoreHTTPOnlyCookieModifiedBackTwice +#endif + // Test that a page with cache-control:no-store enters bfcache with the flag on, // and if a HTTPOnly cookie is modified, it gets evicted with cookie changed, // but if navigated away again and navigated back, it gets evicted without // HTTPOnly cookie change marked. IN_PROC_BROWSER_TEST_F( BackForwardCacheBrowserTestAllowCacheControlNoStore, - PagesWithCacheControlNoStoreHTTPOnlyCookieModifiedBackTwice) { + MAYBE_PagesWithCacheControlNoStoreHTTPOnlyCookieModifiedBackTwice) { CreateHttpsServer(); net::test_server::ControllableHttpResponse response(https_server(), "/main_document"); @@ -12286,8 +12342,8 @@ protected: void SetUpCommandLine(base::CommandLine* command_line) override { EnableFeatureAndSetParams(features::kBackForwardCache, "", ""); - EnableFeatureAndSetParams( - features::kCacheControlNoStoreEnterBackForwardCache, "", ""); + EnableFeatureAndSetParams(kCacheControlNoStoreEnterBackForwardCache, "", + ""); EnableFeatureAndSetParams( kCacheControlNoStoreRestoreFromBackForwardCacheUnlessCookieChange, "", "");
diff --git a/content/browser/bluetooth/bluetooth_device_scanning_prompt_browsertest.cc b/content/browser/bluetooth/bluetooth_device_scanning_prompt_browsertest.cc deleted file mode 100644 index e82593f..0000000 --- a/content/browser/bluetooth/bluetooth_device_scanning_prompt_browsertest.cc +++ /dev/null
@@ -1,316 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/bluetooth/bluetooth_device_scanning_prompt_controller.h" - -#include "base/bind.h" -#include "base/callback.h" -#include "base/command_line.h" -#include "base/run_loop.h" -#include "content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h" -#include "content/public/browser/bluetooth_delegate.h" -#include "content/public/common/content_client.h" -#include "content/public/common/content_switches.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/browser_test_utils.h" -#include "content/public/test/content_browser_test.h" -#include "content/public/test/content_browser_test_utils.h" -#include "content/public/test/prerender_test_util.h" -#include "content/shell/browser/shell.h" -#include "content/test/test_web_contents.h" -#include "device/bluetooth/test/mock_bluetooth_adapter.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h" -#include "url/gurl.h" - -using testing::_; -using testing::Mock; -using testing::Return; - -namespace content { - -namespace { -using PromptEventCallback = - base::OnceCallback<void(BluetoothScanningPrompt::Event)>; - -class FakeBluetoothScanningPrompt : public BluetoothScanningPrompt { - public: - explicit FakeBluetoothScanningPrompt( - PromptEventCallback prompt_event_callback) - : prompt_event_callback_(std::move(prompt_event_callback)) {} - ~FakeBluetoothScanningPrompt() override = default; - - FakeBluetoothScanningPrompt(const FakeBluetoothScanningPrompt&) = delete; - FakeBluetoothScanningPrompt& operator=(const FakeBluetoothScanningPrompt&) = - delete; - - void RunPromptEventCallback(Event event) { - ASSERT_TRUE(prompt_event_callback_); - std::move(prompt_event_callback_).Run(event); - } - - private: - PromptEventCallback prompt_event_callback_; -}; - -class FakeBluetoothAdapter : public device::MockBluetoothAdapter { - public: - FakeBluetoothAdapter() = default; - - FakeBluetoothAdapter(const FakeBluetoothAdapter&) = delete; - FakeBluetoothAdapter& operator=(const FakeBluetoothAdapter&) = delete; - - // device::BluetoothAdapter: - void StartScanWithFilter( - std::unique_ptr<device::BluetoothDiscoveryFilter> discovery_filter, - DiscoverySessionResultCallback callback) override { - std::move(callback).Run( - /*is_error=*/false, - device::UMABluetoothDiscoverySessionOutcome::SUCCESS); - } - void StopScan(DiscoverySessionResultCallback callback) override { - std::move(callback).Run( - /*is_error=*/true, - device::UMABluetoothDiscoverySessionOutcome::UNKNOWN); - } - - private: - ~FakeBluetoothAdapter() override = default; -}; - -class TestBluetoothDelegate : public BluetoothDelegate { - public: - TestBluetoothDelegate() = default; - ~TestBluetoothDelegate() override = default; - TestBluetoothDelegate(const TestBluetoothDelegate&) = delete; - TestBluetoothDelegate& operator=(const TestBluetoothDelegate&) = delete; - - // BluetoothDelegate: - std::unique_ptr<BluetoothChooser> RunBluetoothChooser( - RenderFrameHost* frame, - const BluetoothChooser::EventHandler& event_handler) override { - return nullptr; - } - std::unique_ptr<BluetoothScanningPrompt> ShowBluetoothScanningPrompt( - RenderFrameHost* frame, - const BluetoothScanningPrompt::EventHandler& event_handler) override { - showed_bluetooth_scanning_prompt_ = true; - DCHECK_EQ(frame->GetLifecycleState(), - RenderFrameHost::LifecycleState::kActive); - if (quit_on_scanning_prompt_) - std::move(quit_on_scanning_prompt_).Run(); - auto prompt = - std::make_unique<FakeBluetoothScanningPrompt>(std::move(event_handler)); - prompt_ = prompt.get(); - return std::move(prompt); - } - blink::WebBluetoothDeviceId GetWebBluetoothDeviceId( - RenderFrameHost* frame, - const std::string& device_address) override { - return blink::WebBluetoothDeviceId(); - } - std::string GetDeviceAddress(RenderFrameHost* frame, - const blink::WebBluetoothDeviceId&) override { - return std::string(); - } - blink::WebBluetoothDeviceId AddScannedDevice( - RenderFrameHost* frame, - const std::string& device_address) override { - return blink::WebBluetoothDeviceId(); - } - blink::WebBluetoothDeviceId GrantServiceAccessPermission( - RenderFrameHost* frame, - const device::BluetoothDevice* device, - const blink::mojom::WebBluetoothRequestDeviceOptions* options) override { - return blink::WebBluetoothDeviceId(); - } - bool HasDevicePermission( - RenderFrameHost* frame, - const blink::WebBluetoothDeviceId& device_id) override { - return false; - } - bool IsAllowedToAccessService(RenderFrameHost* frame, - const blink::WebBluetoothDeviceId& device_id, - const device::BluetoothUUID& service) override { - return false; - } - bool IsAllowedToAccessAtLeastOneService( - RenderFrameHost* frame, - const blink::WebBluetoothDeviceId& device_id) override { - return false; - } - bool IsAllowedToAccessManufacturerData( - RenderFrameHost* frame, - const blink::WebBluetoothDeviceId& device_id, - const uint16_t manufacturer_code) override { - return false; - } - std::vector<blink::mojom::WebBluetoothDevicePtr> GetPermittedDevices( - RenderFrameHost* frame) override { - return {}; - } - - void AddFramePermissionObserver(FramePermissionObserver* observer) override {} - void RemoveFramePermissionObserver( - FramePermissionObserver* observer) override {} - - void WaitForShowBluetoothScanningPrompt() { - if (showed_bluetooth_scanning_prompt_) - return; - base::RunLoop run_loop; - quit_on_scanning_prompt_ = run_loop.QuitClosure(); - run_loop.Run(); - } - void RunBluetoothScanningPromptEventCallback( - BluetoothScanningPrompt::Event event) { - ASSERT_TRUE(prompt_); - prompt_->RunPromptEventCallback(event); - } - - bool showed_bluetooth_scanning_prompt() { - return showed_bluetooth_scanning_prompt_; - } - - void reset_showed_bluetooth_scanning_prompt() { - showed_bluetooth_scanning_prompt_ = false; - } - - private: - FakeBluetoothScanningPrompt* prompt_ = nullptr; - base::OnceClosure quit_on_scanning_prompt_; - bool showed_bluetooth_scanning_prompt_ = false; -}; - -class TestContentBrowserClient : public ContentBrowserClient { - public: - TestContentBrowserClient() = default; - ~TestContentBrowserClient() override = default; - TestContentBrowserClient(const TestContentBrowserClient&) = delete; - TestContentBrowserClient& operator=(const TestContentBrowserClient&) = delete; - - TestBluetoothDelegate* bluetooth_delegate() { return &bluetooth_delegate_; } - - protected: - // ChromeContentBrowserClient: - BluetoothDelegate* GetBluetoothDelegate() override { - return &bluetooth_delegate_; - } - - private: - TestBluetoothDelegate bluetooth_delegate_; -}; - -} // namespace - -class BluetoothDeviceChooserControllerBrowserTest : public ContentBrowserTest { - public: - BluetoothDeviceChooserControllerBrowserTest() - : prerender_helper_(base::BindRepeating( - &BluetoothDeviceChooserControllerBrowserTest::GetWebContents, - base::Unretained(this))) {} - ~BluetoothDeviceChooserControllerBrowserTest() override = default; - - void SetUpOnMainThread() override { - prerender_helper_.SetUpOnMainThread(embedded_test_server()); - ASSERT_TRUE(test_server_handle_ = - embedded_test_server()->StartAndReturnHandle()); - - // Hook up the test bluetooth delegate. - old_browser_client_ = SetBrowserClientForTesting(&browser_client_); - SetFakeBlueboothAdapter(); - } - - void SetUpCommandLine(base::CommandLine* command_line) override { - // Sets up the blink runtime feature for accessing to navigator.bluetooth. - command_line->AppendSwitch( - switches::kEnableExperimentalWebPlatformFeatures); - } - - void SetFakeBlueboothAdapter() { - adapter_ = new FakeBluetoothAdapter(); - EXPECT_CALL(*adapter_, IsPresent()).WillRepeatedly(Return(true)); - BluetoothAdapterFactoryWrapper::Get().SetBluetoothAdapterForTesting( - adapter_); - } - - WebContents* GetWebContents() { return shell()->web_contents(); } - TestBluetoothDelegate* GetBluetoothDelegate() { - return browser_client_.bluetooth_delegate(); - } - - test::PrerenderTestHelper* prerender_helper() { return &prerender_helper_; } - FakeBluetoothAdapter* adapter() { return adapter_.get(); } - - private: - test::PrerenderTestHelper prerender_helper_; - net::test_server::EmbeddedTestServerHandle test_server_handle_; - scoped_refptr<FakeBluetoothAdapter> adapter_; - TestContentBrowserClient browser_client_; - ContentBrowserClient* old_browser_client_ = nullptr; -}; - -// Tests that the scanning prompt is not shown in the prerendering. -IN_PROC_BROWSER_TEST_F(BluetoothDeviceChooserControllerBrowserTest, - NoShowBluetoothScanningPromptInPrerendering) { - GURL url = embedded_test_server()->GetURL("/hello.html"); - EXPECT_TRUE(NavigateToURL(shell(), url)); - - EXPECT_CALL(*adapter(), AddObserver(_)); - ASSERT_TRUE(content::ExecJs(GetWebContents()->GetMainFrame(), R"( - var requestLEScanPromise = navigator.bluetooth.requestLEScan({ - acceptAllAdvertisements: true}); - )")); - // Waits for ShowBluetoothScanningPrompt(). - GetBluetoothDelegate()->WaitForShowBluetoothScanningPrompt(); - // It should show the scanning prompt. - EXPECT_TRUE(GetBluetoothDelegate()->showed_bluetooth_scanning_prompt()); - GetBluetoothDelegate()->reset_showed_bluetooth_scanning_prompt(); - - // Posts a task to simulate a prompt event during a call to - // RequestScanningStart(). - GetBluetoothDelegate()->RunBluetoothScanningPromptEventCallback( - BluetoothScanningPrompt::Event::kAllow); - - // Loads a page in the prerender. - auto prerender_url = embedded_test_server()->GetURL("/empty.html"); - // The prerendering doesn't affect the current scanning. - int host_id = prerender_helper()->AddPrerender(prerender_url); - content::test::PrerenderHostObserver host_observer(*GetWebContents(), - host_id); - RenderFrameHost* prerendered_frame_host = - prerender_helper()->GetPrerenderedMainFrameHost(host_id); - - // Runs JS asynchronously since Mojo calls is deferred on the prerendering. - prerendered_frame_host->ExecuteJavaScriptWithUserGestureForTests( - u"var requestLEScanPromise = navigator.bluetooth.requestLEScan({" - u"acceptAllAdvertisements: true});"); - // The prerendering doesn't show the bluetoothscanning prompt. - EXPECT_FALSE(GetBluetoothDelegate()->showed_bluetooth_scanning_prompt()); - - // Loading a new primary page removes observer and stops scanning. - EXPECT_CALL(*adapter(), RemoveObserver(_)); - - // Navigates the primary page to the URL. - prerender_helper()->NavigatePrimaryPage(prerender_url); - // The page should be activated from the prerendering. - EXPECT_TRUE(host_observer.was_activated()); - // Sets BlueboothAdapter for the new primary page since the previous - // adapter is released by BluetoothAdapterFactoryWrapper::ReleaseAdapter(). - BluetoothAdapterFactoryWrapper::Get().SetBluetoothAdapterForTesting( - adapter()); - - EXPECT_CALL(*adapter(), AddObserver(_)); - // Waits for ShowBluetoothScanningPrompt() since the page is activated. - GetBluetoothDelegate()->WaitForShowBluetoothScanningPrompt(); - // It should show the scanning prompt. - EXPECT_TRUE(GetBluetoothDelegate()->showed_bluetooth_scanning_prompt()); - // Post a task to simulate a prompt event during a call to - // RequestScanningStart(). - GetBluetoothDelegate()->RunBluetoothScanningPromptEventCallback( - BluetoothScanningPrompt::Event::kAllow); - EXPECT_CALL(*adapter(), RemoveObserver(_)); -} - -} // namespace content
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.h b/content/browser/bluetooth/web_bluetooth_service_impl.h index a81552a..f36f8f1 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.h +++ b/content/browser/bluetooth/web_bluetooth_service_impl.h
@@ -123,6 +123,9 @@ BluetoothScanningPermissionRevokedWhenFocusIsLost); FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplTest, ReadCharacteristicValueErrorWithValueIgnored); + FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplBrowserTest, + NoShowBluetoothScanningPromptInPrerendering); + friend class FrameConnectedBluetoothDevicesTest; friend class WebBluetoothServiceImplTest; using PrimaryServicesRequestCallback =
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc new file mode 100644 index 0000000..4d53122 --- /dev/null +++ b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
@@ -0,0 +1,494 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/bluetooth/web_bluetooth_service_impl.h" + +#include "base/bind.h" +#include "base/callback.h" +#include "base/command_line.h" +#include "base/run_loop.h" +#include "content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h" +#include "content/browser/renderer_host/render_frame_host_impl.h" +#include "content/public/browser/bluetooth_delegate.h" +#include "content/public/common/content_client.h" +#include "content/public/common/content_switches.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_browser_test.h" +#include "content/public/test/content_browser_test_utils.h" +#include "content/public/test/prerender_test_util.h" +#include "content/shell/browser/shell.h" +#include "content/test/test_web_contents.h" +#include "device/bluetooth/public/cpp/bluetooth_uuid.h" +#include "device/bluetooth/test/mock_bluetooth_adapter.h" +#include "device/bluetooth/test/mock_bluetooth_device.h" +#include "device/bluetooth/test/mock_bluetooth_gatt_service.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h" +#include "url/gurl.h" + +using testing::_; +using testing::Mock; +using testing::Return; + +namespace content { + +namespace { +constexpr char kDeviceAddress[] = "00:00:00:00:00:00"; +constexpr char kHeartRateUUIDString[] = "0000180d-0000-1000-8000-00805f9b34fb"; + +using PromptEventCallback = + base::OnceCallback<void(BluetoothScanningPrompt::Event)>; + +class FakeBluetoothScanningPrompt : public BluetoothScanningPrompt { + public: + explicit FakeBluetoothScanningPrompt( + PromptEventCallback prompt_event_callback) + : prompt_event_callback_(std::move(prompt_event_callback)) {} + ~FakeBluetoothScanningPrompt() override = default; + + FakeBluetoothScanningPrompt(const FakeBluetoothScanningPrompt&) = delete; + FakeBluetoothScanningPrompt& operator=(const FakeBluetoothScanningPrompt&) = + delete; + + void RunPromptEventCallback(Event event) { + ASSERT_TRUE(prompt_event_callback_); + std::move(prompt_event_callback_).Run(event); + } + + private: + PromptEventCallback prompt_event_callback_; +}; + +class FakeBluetoothAdapter : public device::MockBluetoothAdapter { + public: + FakeBluetoothAdapter() = default; + + FakeBluetoothAdapter(const FakeBluetoothAdapter&) = delete; + FakeBluetoothAdapter& operator=(const FakeBluetoothAdapter&) = delete; + + // device::BluetoothAdapter: + device::BluetoothAdapter::ConstDeviceList GetDevices() const override { + device::BluetoothAdapter::ConstDeviceList devices; + for (const auto& it : mock_devices_) + devices.push_back(it.get()); + return devices; + } + + device::BluetoothDevice* GetDevice(const std::string& address) override { + device::MockBluetoothAdapter::GetDevice(address); + for (const auto& it : mock_devices_) { + if (it->GetAddress() == address) + return it.get(); + } + return nullptr; + } + + void StartScanWithFilter( + std::unique_ptr<device::BluetoothDiscoveryFilter> discovery_filter, + DiscoverySessionResultCallback callback) override { + std::move(callback).Run( + /*is_error=*/false, + device::UMABluetoothDiscoverySessionOutcome::SUCCESS); + } + void StopScan(DiscoverySessionResultCallback callback) override { + std::move(callback).Run( + /*is_error=*/false, + device::UMABluetoothDiscoverySessionOutcome::SUCCESS); + } + + private: + ~FakeBluetoothAdapter() override = default; +}; + +class FakeBluetoothChooser : public content::BluetoothChooser { + public: + FakeBluetoothChooser(content::BluetoothChooser::EventHandler event_handler, + const std::string& device_to_select) + : event_handler_(event_handler), device_to_select_(device_to_select) {} + FakeBluetoothChooser(const FakeBluetoothChooser&) = delete; + FakeBluetoothChooser& operator=(const FakeBluetoothChooser&) = delete; + ~FakeBluetoothChooser() override = default; + + // content::BluetoothChooser implementation: + void AddOrUpdateDevice(const std::string& device_id, + bool should_update_name, + const std::u16string& device_name, + bool is_gatt_connected, + bool is_paired, + int signal_strength_level) override { + // Select the added device if its device ID matches |device_to_select_|. + if (device_to_select_ == device_id) + event_handler_.Run(content::BluetoothChooserEvent::SELECTED, device_id); + } + + private: + content::BluetoothChooser::EventHandler event_handler_; + std::string device_to_select_; +}; + +class TestBluetoothDelegate : public BluetoothDelegate { + public: + TestBluetoothDelegate() = default; + ~TestBluetoothDelegate() override = default; + TestBluetoothDelegate(const TestBluetoothDelegate&) = delete; + TestBluetoothDelegate& operator=(const TestBluetoothDelegate&) = delete; + + void SetDeviceToSelect(const std::string& device_address) { + device_to_select_ = device_address; + } + + // BluetoothDelegate: + std::unique_ptr<BluetoothChooser> RunBluetoothChooser( + RenderFrameHost* frame, + const BluetoothChooser::EventHandler& event_handler) override { + return std::make_unique<FakeBluetoothChooser>(event_handler, + device_to_select_); + } + std::unique_ptr<BluetoothScanningPrompt> ShowBluetoothScanningPrompt( + RenderFrameHost* frame, + const BluetoothScanningPrompt::EventHandler& event_handler) override { + showed_bluetooth_scanning_prompt_ = true; + DCHECK_EQ(frame->GetLifecycleState(), + RenderFrameHost::LifecycleState::kActive); + if (quit_on_scanning_prompt_) + std::move(quit_on_scanning_prompt_).Run(); + auto prompt = + std::make_unique<FakeBluetoothScanningPrompt>(std::move(event_handler)); + prompt_ = prompt.get(); + return std::move(prompt); + } + blink::WebBluetoothDeviceId GetWebBluetoothDeviceId( + RenderFrameHost* frame, + const std::string& device_address) override { + return blink::WebBluetoothDeviceId(); + } + std::string GetDeviceAddress(RenderFrameHost* frame, + const blink::WebBluetoothDeviceId&) override { + return std::string(); + } + blink::WebBluetoothDeviceId AddScannedDevice( + RenderFrameHost* frame, + const std::string& device_address) override { + return blink::WebBluetoothDeviceId(); + } + blink::WebBluetoothDeviceId GrantServiceAccessPermission( + RenderFrameHost* frame, + const device::BluetoothDevice* device, + const blink::mojom::WebBluetoothRequestDeviceOptions* options) override { + return blink::WebBluetoothDeviceId(); + } + bool HasDevicePermission( + RenderFrameHost* frame, + const blink::WebBluetoothDeviceId& device_id) override { + return false; + } + bool IsAllowedToAccessService(RenderFrameHost* frame, + const blink::WebBluetoothDeviceId& device_id, + const device::BluetoothUUID& service) override { + return false; + } + bool IsAllowedToAccessAtLeastOneService( + RenderFrameHost* frame, + const blink::WebBluetoothDeviceId& device_id) override { + return false; + } + bool IsAllowedToAccessManufacturerData( + RenderFrameHost* frame, + const blink::WebBluetoothDeviceId& device_id, + const uint16_t manufacturer_code) override { + return false; + } + std::vector<blink::mojom::WebBluetoothDevicePtr> GetPermittedDevices( + RenderFrameHost* frame) override { + return {}; + } + + void AddFramePermissionObserver(FramePermissionObserver* observer) override {} + void RemoveFramePermissionObserver( + FramePermissionObserver* observer) override {} + + void WaitForShowBluetoothScanningPrompt() { + if (showed_bluetooth_scanning_prompt_) + return; + base::RunLoop run_loop; + quit_on_scanning_prompt_ = run_loop.QuitClosure(); + run_loop.Run(); + } + void RunBluetoothScanningPromptEventCallback( + BluetoothScanningPrompt::Event event) { + ASSERT_TRUE(prompt_); + prompt_->RunPromptEventCallback(event); + } + + bool showed_bluetooth_scanning_prompt() { + return showed_bluetooth_scanning_prompt_; + } + + void reset_showed_bluetooth_scanning_prompt() { + showed_bluetooth_scanning_prompt_ = false; + } + + private: + std::string device_to_select_; + FakeBluetoothScanningPrompt* prompt_ = nullptr; + base::OnceClosure quit_on_scanning_prompt_; + bool showed_bluetooth_scanning_prompt_ = false; +}; + +class TestContentBrowserClient : public ContentBrowserClient { + public: + TestContentBrowserClient() = default; + ~TestContentBrowserClient() override = default; + TestContentBrowserClient(const TestContentBrowserClient&) = delete; + TestContentBrowserClient& operator=(const TestContentBrowserClient&) = delete; + + TestBluetoothDelegate* bluetooth_delegate() { return &bluetooth_delegate_; } + + protected: + // ChromeContentBrowserClient: + BluetoothDelegate* GetBluetoothDelegate() override { + return &bluetooth_delegate_; + } + + private: + TestBluetoothDelegate bluetooth_delegate_; +}; + +} // namespace + +class WebBluetoothServiceImplBrowserTest : public ContentBrowserTest { + public: + WebBluetoothServiceImplBrowserTest() + : prerender_helper_(base::BindRepeating( + &WebBluetoothServiceImplBrowserTest::GetWebContents, + base::Unretained(this))) {} + ~WebBluetoothServiceImplBrowserTest() override = default; + + void SetUpOnMainThread() override { + prerender_helper_.SetUpOnMainThread(embedded_test_server()); + ASSERT_TRUE(test_server_handle_ = + embedded_test_server()->StartAndReturnHandle()); + + // Hook up the test bluetooth delegate. + old_browser_client_ = SetBrowserClientForTesting(&browser_client_); + SetFakeBlueboothAdapter(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + // Sets up the blink runtime feature for accessing to navigator.bluetooth. + command_line->AppendSwitch( + switches::kEnableExperimentalWebPlatformFeatures); + } + + void SetFakeBlueboothAdapter() { + adapter_ = new FakeBluetoothAdapter(); + EXPECT_CALL(*adapter_, IsPresent()).WillRepeatedly(Return(true)); + BluetoothAdapterFactoryWrapper::Get().SetBluetoothAdapterForTesting( + adapter_); + } + + void AddFakeDevice(const std::string& device_address) { + const device::BluetoothUUID kHeartRateUUID(kHeartRateUUIDString); + auto fake_device = + std::make_unique<testing::NiceMock<device::MockBluetoothDevice>>( + adapter_.get(), /*bluetooth_class=*/0u, + /*name=*/"Test Device", device_address, + /*paired=*/true, + /*connected=*/true); + fake_device->AddUUID(kHeartRateUUID); + fake_device->AddMockService( + std::make_unique<testing::NiceMock<device::MockBluetoothGattService>>( + fake_device.get(), kHeartRateUUIDString, kHeartRateUUID, + /*is_primary=*/true)); + adapter_->AddMockDevice(std::move(fake_device)); + } + + void SetDeviceToSelect(const std::string& device_address) { + browser_client_.bluetooth_delegate()->SetDeviceToSelect(device_address); + } + + WebContents* GetWebContents() { return shell()->web_contents(); } + TestBluetoothDelegate* GetBluetoothDelegate() { + return browser_client_.bluetooth_delegate(); + } + + test::PrerenderTestHelper* prerender_helper() { return &prerender_helper_; } + FakeBluetoothAdapter* adapter() { return adapter_.get(); } + + private: + test::PrerenderTestHelper prerender_helper_; + net::test_server::EmbeddedTestServerHandle test_server_handle_; + scoped_refptr<FakeBluetoothAdapter> adapter_; + TestContentBrowserClient browser_client_; + ContentBrowserClient* old_browser_client_ = nullptr; +}; + +// Tests that the scanning prompt is not shown in the prerendering. It also +// ensures that ScanningClient is not created in the prerendering. +IN_PROC_BROWSER_TEST_F(WebBluetoothServiceImplBrowserTest, + NoShowBluetoothScanningPromptInPrerendering) { + GURL url = embedded_test_server()->GetURL("/hello.html"); + EXPECT_TRUE(NavigateToURL(shell(), url)); + + EXPECT_CALL(*adapter(), AddObserver(_)); + ASSERT_TRUE(content::ExecJs(GetWebContents()->GetMainFrame(), R"( + var requestLEScanPromise = navigator.bluetooth.requestLEScan({ + acceptAllAdvertisements: true}); + )")); + // Waits for ShowBluetoothScanningPrompt(). + GetBluetoothDelegate()->WaitForShowBluetoothScanningPrompt(); + // It should show the scanning prompt. + EXPECT_TRUE(GetBluetoothDelegate()->showed_bluetooth_scanning_prompt()); + + WebBluetoothServiceImpl* service_for_main_frame = + static_cast<RenderFrameHostImpl*>(GetWebContents()->GetMainFrame()) + ->GetWebBluetoothServiceForTesting(); + // ScanningClient with the main frame is created. + EXPECT_EQ(service_for_main_frame->scanning_clients_.size(), 1u); + + GetBluetoothDelegate()->reset_showed_bluetooth_scanning_prompt(); + + // Posts a task to simulate a prompt event during a call to + // RequestScanningStart(). + GetBluetoothDelegate()->RunBluetoothScanningPromptEventCallback( + BluetoothScanningPrompt::Event::kAllow); + + // Loads a page in the prerender. + auto prerender_url = embedded_test_server()->GetURL("/empty.html"); + // The prerendering doesn't affect the current scanning. + int host_id = prerender_helper()->AddPrerender(prerender_url); + content::test::PrerenderHostObserver host_observer(*GetWebContents(), + host_id); + RenderFrameHost* prerendered_frame_host = + prerender_helper()->GetPrerenderedMainFrameHost(host_id); + + // Runs JS asynchronously since Mojo calls is deferred on the prerendering. + content::ExecuteScriptAsync(prerendered_frame_host, R"( + var requestLEScanPromise = navigator.bluetooth.requestLEScan({ + acceptAllAdvertisements: true}); + )"); + // The prerendering doesn't show the bluetoothscanning prompt. + EXPECT_FALSE(GetBluetoothDelegate()->showed_bluetooth_scanning_prompt()); + // ScanningClient is not created in the prerendering. + EXPECT_EQ(service_for_main_frame->scanning_clients_.size(), 1u); + + // Loading a new primary page removes observer and stops scanning. + EXPECT_CALL(*adapter(), RemoveObserver(_)); + + // Navigates the primary page to the URL. + prerender_helper()->NavigatePrimaryPage(prerender_url); + // The page should be activated from the prerendering. + EXPECT_TRUE(host_observer.was_activated()); + // Sets BluetoothAdapter for the new primary page since the previous + // adapter is released by BluetoothAdapterFactoryWrapper::ReleaseAdapter(). + BluetoothAdapterFactoryWrapper::Get().SetBluetoothAdapterForTesting( + adapter()); + + EXPECT_CALL(*adapter(), AddObserver(_)); + // Waits for ShowBluetoothScanningPrompt() since the page is activated. + GetBluetoothDelegate()->WaitForShowBluetoothScanningPrompt(); + // It should show the scanning prompt. + EXPECT_TRUE(GetBluetoothDelegate()->showed_bluetooth_scanning_prompt()); + + WebBluetoothServiceImpl* service_for_activated_frame = + static_cast<RenderFrameHostImpl*>(GetWebContents()->GetMainFrame()) + ->GetWebBluetoothServiceForTesting(); + // ScanningClient is created after the prerendering activation. + EXPECT_EQ(service_for_activated_frame->scanning_clients_.size(), 1u); + + // Post a task to simulate a prompt event during a call to + // RequestScanningStart(). + GetBluetoothDelegate()->RunBluetoothScanningPromptEventCallback( + BluetoothScanningPrompt::Event::kAllow); + EXPECT_CALL(*adapter(), RemoveObserver(_)); +} + +// Tests that navigator.bluetooth.requestDevice() is deferred in the +// prerendering and works after the prerendering activation. +IN_PROC_BROWSER_TEST_F(WebBluetoothServiceImplBrowserTest, + RequestDeviceInPrerendering) { + GURL url = embedded_test_server()->GetURL("/hello.html"); + EXPECT_TRUE(NavigateToURL(shell(), url)); + + // Setup the fake device. + AddFakeDevice(kDeviceAddress); + SetDeviceToSelect(kDeviceAddress); + + EXPECT_CALL(*adapter(), AddObserver(_)); + EXPECT_CALL(*adapter(), GetDevice(kDeviceAddress)); + + EXPECT_EQ("", content::EvalJs(GetWebContents(), R"( + (async() => { + try { + let device = await navigator.bluetooth.requestDevice({ + filters: [{name: 'Test Device', services: ['heart_rate']}]}); + return ""; + } catch(e) { + return `${e.name}: ${e.message}`; + } + })() + )")); + + // WebBluetoothService is created for the main frame. + EXPECT_NE(static_cast<content::RenderFrameHostImpl*>( + GetWebContents()->GetMainFrame()) + ->GetWebBluetoothServiceForTesting(), + nullptr); + + // Loads a page in the prerender. + auto prerender_url = embedded_test_server()->GetURL("/empty.html"); + int host_id = prerender_helper()->AddPrerender(prerender_url); + content::test::PrerenderHostObserver host_observer(*GetWebContents(), + host_id); + content::RenderFrameHost* prerendered_frame_host = + prerender_helper()->GetPrerenderedMainFrameHost(host_id); + + // Runs JS asynchronously since mojom::WebBluetoothService::RequestDevice() is + // deferred on the prerendering. + EXPECT_TRUE(content::ExecJs(prerendered_frame_host, R"( + var requestDevicePromise = (async() => { + try { + let device = await navigator.bluetooth.requestDevice({ + filters: [{name: 'Test Device', services: ['heart_rate']}]}); + return ""; + } catch(e) { + return `${e.name}: ${e.message}`; + } + })(); + )")); + + // WebBluetoothService is not created for `prerendered_frame_host`. + ASSERT_EQ(static_cast<content::RenderFrameHostImpl*>(prerendered_frame_host) + ->web_bluetooth_services_.size(), + 0u); + + // Loading a new primary page removes observer. + EXPECT_CALL(*adapter(), RemoveObserver(_)); + + // Navigates the primary page to the URL. + prerender_helper()->NavigatePrimaryPage(prerender_url); + // The page should be activated from the prerendering. + EXPECT_TRUE(host_observer.was_activated()); + + // Sets BluetoothAdapter for the new primary page since the previous + // adapter is released by BluetoothAdapterFactoryWrapper::ReleaseAdapter(). + BluetoothAdapterFactoryWrapper::Get().SetBluetoothAdapterForTesting( + adapter()); + EXPECT_CALL(*adapter(), AddObserver(_)); + EXPECT_CALL(*adapter(), GetDevice(kDeviceAddress)); + + EXPECT_EQ("", + content::EvalJs(prerendered_frame_host, "requestDevicePromise")); + + // WebBluetoothService is created for the activated page. + EXPECT_NE(static_cast<content::RenderFrameHostImpl*>(prerendered_frame_host) + ->GetWebBluetoothServiceForTesting(), + nullptr); + + EXPECT_CALL(*adapter(), RemoveObserver(_)); +} + +} // namespace content
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 8371e0a7..78584d9 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -333,7 +333,8 @@ content::RenderFrameHost* host, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver) { static_cast<RenderProcessHostImpl*>(host->GetProcess()) - ->BindNativeIOHost(host->GetLastCommittedOrigin(), std::move(receiver)); + ->BindNativeIOHost(static_cast<RenderFrameHostImpl*>(host)->storage_key(), + std::move(receiver)); } void BindSharedWorkerConnector( @@ -1076,6 +1077,8 @@ map->Add<blink::mojom::IDBFactory>(BindWorkerReceiverForStorageKey( &RenderProcessHostImpl::BindIndexedDB, host)); + map->Add<blink::mojom::NativeIOHost>(BindWorkerReceiverForStorageKey( + &RenderProcessHostImpl::BindNativeIOHost, host)); } void PopulateBinderMapWithContext( @@ -1090,8 +1093,6 @@ &RenderProcessHostImpl::BindFileSystemManager, host)); map->Add<blink::mojom::FileSystemAccessManager>(BindWorkerReceiverForOrigin( &RenderProcessHostImpl::BindFileSystemAccessManager, host)); - map->Add<blink::mojom::NativeIOHost>(BindWorkerReceiverForOrigin( - &RenderProcessHostImpl::BindNativeIOHost, host)); map->Add<blink::mojom::BucketManagerHost>(BindWorkerReceiverForOrigin( &RenderProcessHostImpl::BindBucketManagerHost, host)); @@ -1166,6 +1167,8 @@ &RenderProcessHostImpl::BindVideoDecodePerfHistory, host)); map->Add<blink::mojom::IDBFactory>(BindWorkerReceiverForStorageKey( &RenderProcessHostImpl::BindIndexedDB, host)); + map->Add<blink::mojom::NativeIOHost>(BindWorkerReceiverForStorageKey( + &RenderProcessHostImpl::BindNativeIOHost, host)); } void PopulateBinderMapWithContext( @@ -1180,8 +1183,6 @@ &RenderProcessHostImpl::CreatePermissionService, host)); map->Add<blink::mojom::FileSystemAccessManager>(BindWorkerReceiverForOrigin( &RenderProcessHostImpl::BindFileSystemAccessManager, host)); - map->Add<blink::mojom::NativeIOHost>(BindWorkerReceiverForOrigin( - &RenderProcessHostImpl::BindNativeIOHost, host)); map->Add<blink::mojom::WebSocketConnector>(BindWorkerReceiverForOrigin( &RenderProcessHostImpl::CreateWebSocketConnector, host)); map->Add<blink::mojom::BucketManagerHost>(BindWorkerReceiverForOrigin( @@ -1284,8 +1285,6 @@ map->Add<blink::mojom::FileSystemAccessManager>( BindServiceWorkerReceiverForOrigin( &RenderProcessHostImpl::BindFileSystemAccessManager, host)); - map->Add<blink::mojom::NativeIOHost>(BindServiceWorkerReceiverForOrigin( - &RenderProcessHostImpl::BindNativeIOHost, host)); map->Add<blink::mojom::WebSocketConnector>(BindServiceWorkerReceiverForOrigin( &RenderProcessHostImpl::CreateWebSocketConnector, host)); map->Add<network::mojom::RestrictedCookieManager>( @@ -1296,6 +1295,8 @@ &RenderProcessHostImpl::BindBucketManagerHost, host)); // render process host binders taking a storage key + map->Add<blink::mojom::NativeIOHost>(BindServiceWorkerReceiverForStorageKey( + &RenderProcessHostImpl::BindNativeIOHost, host)); map->Add<blink::mojom::IDBFactory>(BindServiceWorkerReceiverForStorageKey( &RenderProcessHostImpl::BindIndexedDB, host));
diff --git a/content/browser/native_io/native_io_context_impl.cc b/content/browser/native_io/native_io_context_impl.cc index 095beab9..f5797a1 100644 --- a/content/browser/native_io/native_io_context_impl.cc +++ b/content/browser/native_io/native_io_context_impl.cc
@@ -43,7 +43,7 @@ } void NativeIOContextImpl::BindReceiver( - const url::Origin& origin, + const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if DCHECK_IS_ON() @@ -52,7 +52,7 @@ content::GetIOThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(&NativeIOContextImpl::BindReceiverOnIOThread, - scoped_refptr<NativeIOContextImpl>(this), origin, + scoped_refptr<NativeIOContextImpl>(this), storage_key, std::move(receiver), mojo::GetBadMessageCallback())); } @@ -121,13 +121,12 @@ } void NativeIOContextImpl::BindReceiverOnIOThread( - const url::Origin& origin, + const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver, mojo::ReportBadMessageCallback bad_message_callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - native_io_manager_->BindReceiver(blink::StorageKey(origin), - std::move(receiver), + native_io_manager_->BindReceiver(storage_key, std::move(receiver), std::move(bad_message_callback)); }
diff --git a/content/browser/native_io/native_io_context_impl.h b/content/browser/native_io/native_io_context_impl.h index 0d727436ed..10ee58f 100644 --- a/content/browser/native_io/native_io_context_impl.h +++ b/content/browser/native_io/native_io_context_impl.h
@@ -48,7 +48,7 @@ // Binds `receiver` to the NativeIOHost serving `origin`. // // Must be called on the UI thread. - void BindReceiver(const url::Origin& origin, + void BindReceiver(const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver); // Deletes all data stored for storage key `storage_key`. @@ -76,7 +76,7 @@ scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy); void BindReceiverOnIOThread( - const url::Origin& origin, + const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver, mojo::ReportBadMessageCallback bad_message_callback);
diff --git a/content/browser/permissions/permission_service_context.cc b/content/browser/permissions/permission_service_context.cc index 52d9f72..76958897 100644 --- a/content/browser/permissions/permission_service_context.cc +++ b/content/browser/permissions/permission_service_context.cc
@@ -62,13 +62,17 @@ PermissionServiceContext::PermissionServiceContext( RenderFrameHost* render_frame_host) - : render_frame_host_(render_frame_host), render_process_host_(nullptr) {} + : render_frame_host_(render_frame_host), render_process_host_(nullptr) { + render_frame_host->GetProcess()->AddObserver(this); +} PermissionServiceContext::PermissionServiceContext( RenderProcessHost* render_process_host) : render_frame_host_(nullptr), render_process_host_(render_process_host) {} PermissionServiceContext::~PermissionServiceContext() { + if (render_frame_host_) + render_frame_host_->GetProcess()->RemoveObserver(this); } void PermissionServiceContext::CreateService( @@ -142,4 +146,14 @@ : GURL(); } +void PermissionServiceContext::RenderProcessHostDestroyed( + RenderProcessHost* host) { + DCHECK(host == render_frame_host_->GetProcess()); + subscriptions_.clear(); + // RenderProcessHostImpl will always outlive 'this', but it gets cleaned up + // earlier so we need to listen to this event so we can do our clean up as + // well. + host->RemoveObserver(this); +} + } // namespace content
diff --git a/content/browser/permissions/permission_service_context.h b/content/browser/permissions/permission_service_context.h index c2ef1db..704c026 100644 --- a/content/browser/permissions/permission_service_context.h +++ b/content/browser/permissions/permission_service_context.h
@@ -12,6 +12,7 @@ #include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_type.h" #include "content/public/browser/render_document_host_user_data.h" +#include "content/public/browser/render_process_host_observer.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/unique_receiver_set.h" @@ -38,7 +39,8 @@ // created via the RenderDocumentHostUserData static factories, as these // instances are deleted when a new document is commited. class CONTENT_EXPORT PermissionServiceContext - : public RenderDocumentHostUserData<PermissionServiceContext> { + : public RenderDocumentHostUserData<PermissionServiceContext>, + public RenderProcessHostObserver { public: explicit PermissionServiceContext(RenderProcessHost* render_process_host); PermissionServiceContext(const PermissionServiceContext&) = delete; @@ -72,6 +74,9 @@ return render_process_host_; } + // RenderProcessHostObserver: + void RenderProcessHostDestroyed(RenderProcessHost* host) override; + private: class PermissionSubscription; friend class RenderDocumentHostUserData<PermissionServiceContext>;
diff --git a/content/browser/prerender/prerender_origin_trial_browsertest.cc b/content/browser/prerender/prerender_origin_trial_browsertest.cc index 1c4b7d0..0118be3 100644 --- a/content/browser/prerender/prerender_origin_trial_browsertest.cc +++ b/content/browser/prerender/prerender_origin_trial_browsertest.cc
@@ -270,7 +270,7 @@ // | disabled | enabled | default | // ---------------|-----------|-----------|-----------| // | disabled | false | false | false | -// REF | enabled | false | true | IsAndroid | +// REF | enabled | false | true | false | // | default | false | true | false | IN_PROC_BROWSER_TEST_P(PrerenderOriginTrialBrowserTest, WithoutTrialToken) { LoadPageWithoutTrialToken(); @@ -286,17 +286,7 @@ } break; case FeatureEnabledType::kDefault: - // Currently blink::features::kPrerender2 is default-enabled only on - // Android. -#ifdef OS_ANDROID - if (testing::get<1>(GetParam()) == BlinkFeatureEnabledType::kEnabled) { - CheckFeatureEnabled(true); - } else { - CheckFeatureDisabled(); - } -#else // OS_ANDROID CheckFeatureDisabled(); -#endif // OS_ANDROID break; } } @@ -308,9 +298,9 @@ // | blink::features::kPrerender2 | // | disabled | enabled | default | // ---------------|-----------|-----------|-----------| -// | disabled | false | IsAndroid | IsAndroid | -// REF | enabled | false | true | IsAndroid | -// | default | false | true | IsAndroid | +// | disabled | false | IsAndroid | false | +// REF | enabled | false | true | false | +// | default | false | true | false | IN_PROC_BROWSER_TEST_P(PrerenderOriginTrialBrowserTest, WithTrialToken) { LoadPageWithTrialToken(); switch (testing::get<0>(GetParam())) { @@ -330,16 +320,7 @@ } break; case FeatureEnabledType::kDefault: - // Currently Origin Trial for Prerender2 is available only on Android. -#ifdef OS_ANDROID - if (testing::get<1>(GetParam()) == BlinkFeatureEnabledType::kEnabled) { - CheckFeatureEnabled(true); - } else { - CheckFeatureEnabled(false); - } -#else // OS_ANDROID CheckFeatureDisabled(); -#endif // OS_ANDROID break; } }
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc index e79ecb8..3b364eb 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.cc +++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -1158,7 +1158,7 @@ return false; return base::FeatureList::IsEnabled( - features::kCacheControlNoStoreEnterBackForwardCache); + kCacheControlNoStoreEnterBackForwardCache); } bool BackForwardCacheImpl::AllowRestoringPagesWithCacheControlNoStore() {
diff --git a/content/browser/renderer_host/back_forward_cache_impl.h b/content/browser/renderer_host/back_forward_cache_impl.h index 7c6448b6..60401ae 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.h +++ b/content/browser/renderer_host/back_forward_cache_impl.h
@@ -53,6 +53,12 @@ constexpr base::Feature kBackForwardCacheNoTimeEviction{ "BackForwardCacheNoTimeEviction", base::FEATURE_DISABLED_BY_DEFAULT}; +// Allows pages with cache-control:no-store to enter the back/forward cache. +// TODO(crbug.com/1228611): Enable this feature. +const base::Feature kCacheControlNoStoreEnterBackForwardCache{ + "CacheControlNoStoreEnterBackForwardCache", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Restore pages with cache-control:no-store from back/forward cache if there is // no cookie change while the page is in cache. // TODO(crbug.com/1228611): Enable this feature.
diff --git a/content/browser/renderer_host/input/scroll_latency_browsertest.cc b/content/browser/renderer_host/input/scroll_latency_browsertest.cc index 04c2b7c..6792c7b 100644 --- a/content/browser/renderer_host/input/scroll_latency_browsertest.cc +++ b/content/browser/renderer_host/input/scroll_latency_browsertest.cc
@@ -208,14 +208,22 @@ DISALLOW_COPY_AND_ASSIGN(ScrollLatencyBrowserTest); }; +// Disabled due to flakiness https://crbug.com/1163246. +#if defined(OS_LINUX) || defined(OS_WIN) +#define MAYBE_MultipleWheelScroll DISABLED_MultipleWheelScroll +#else +#define MAYBE_MultipleWheelScroll MultipleWheelScroll +#endif + // Perform a smooth wheel scroll, and verify that our end-to-end wheel latency // metrics are recorded. See crbug.com/599910 for details. -IN_PROC_BROWSER_TEST_F(ScrollLatencyBrowserTest, MultipleWheelScroll) { +IN_PROC_BROWSER_TEST_F(ScrollLatencyBrowserTest, MAYBE_MultipleWheelScroll) { LoadURL(); RunMultipleWheelScroll(); } -#if !defined(NDEBUG) && defined(OS_LINUX) +// Disabled due to flakiness https://crbug.com/1163246. +#if defined(OS_LINUX) || defined(OS_WIN) #define MAYBE_MultipleWheelScrollOnMain DISABLED_MultipleWheelScrollOnMain #else #define MAYBE_MultipleWheelScrollOnMain MultipleWheelScrollOnMain
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc index 7592dd9..7cae071 100644 --- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -2237,21 +2237,23 @@ EXPECT_EQ(url404, root->current_frame_host()->last_history_url_in_renderer()); } +// Tests various cases of replacements caused by error pages. IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, ErrorPageReplacement) { NavigationController& controller = shell()->web_contents()->GetController(); - GURL error_url = embedded_test_server()->GetURL("/close-socket"); GetIOThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(&net::URLRequestFailedJob::AddUrlHandler)); - EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL))); + GURL url1 = embedded_test_server()->GetURL("/title1.html"); + EXPECT_TRUE(NavigateToURL(shell(), url1)); EXPECT_EQ(1, controller.GetEntryCount()); FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) ->GetFrameTree() ->root(); - // Navigate to a page that fails to load. It must result in an error page, the - // NEW_ENTRY navigation type, and an addition to the history list. + // 1) Navigate to a page that fails to load. It must result in an error page, + // the NEW_ENTRY navigation type, and an addition to the history list. + GURL error_url = embedded_test_server()->GetURL("/close-socket"); { FrameNavigateParamsCapturer capturer(root); NavigateFrameToURL(root, error_url); @@ -2262,9 +2264,11 @@ EXPECT_EQ(2, controller.GetEntryCount()); } - // Navigate again to the page that fails to load. It results in an error page, - // the NEW_ENTRY navigation type with replacement, and no addition to the - // history list. + // 2) Navigate again to the same URL. It results in an error page, the + // NEW_ENTRY navigation type, does replacement, and no addition to the + // history list. The navigation initially got converted into a reload by the + // browser but since it failed and doesn't have a valid PageState, it does + // replacement instead. { FrameNavigateParamsCapturer capturer(root); NavigateFrameToURL(root, error_url); @@ -2276,30 +2280,65 @@ EXPECT_EQ(2, controller.GetEntryCount()); } - // Make a new entry ... - EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL))); - EXPECT_EQ(3, controller.GetEntryCount()); - - // ... and replace it with a failed load. + // 3) Navigate to a different URL (|url2|) that fails to load. It adds a new + // entry. + GURL url2 = embedded_test_server()->GetURL("/title2.html"); { + // Set up an URLLoaderInterceptor which will cause the next navigation to + // fail. + auto url_loader_interceptor = std::make_unique<URLLoaderInterceptor>( + base::BindRepeating([](URLLoaderInterceptor::RequestParams* params) { + network::URLLoaderCompletionStatus status; + status.error_code = net::ERR_NOT_IMPLEMENTED; + params->client->OnComplete(status); + return true; + })); + FrameNavigateParamsCapturer capturer(root); - RendererLocationReplace(shell(), error_url); + NavigateFrameToURL(root, url2); capturer.Wait(); EXPECT_EQ(NAVIGATION_TYPE_NEW_ENTRY, capturer.navigation_type()); - EXPECT_TRUE(capturer.did_replace_entry()); + EXPECT_FALSE(capturer.did_replace_entry()); NavigationEntry* entry = controller.GetLastCommittedEntry(); EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType()); EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); } - // Make a new web ui page to force a process swap ... - GURL web_ui_page(std::string(kChromeUIScheme) + "://" + - std::string(kChromeUIGpuHost)); - EXPECT_TRUE(NavigateToURL(shell(), web_ui_page)); + // 4) Go back to the previous error page. Since this still results in an error + // page, it's classified as EXISTING_ENTRY, like a normal history navigation. + { + FrameNavigateParamsCapturer capturer(root); + controller.GoBack(); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_EXISTING_ENTRY, capturer.navigation_type()); + EXPECT_FALSE(capturer.did_replace_entry()); + NavigationEntry* entry = controller.GetLastCommittedEntry(); + EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType()); + EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); + } + + // 5) Go forward to |url2|. This navigation will succeed, and since the final + // SiteInstance is different from the history entry's (due to error page + // isolation), it will be classified as NEW_ENTRY with replacement. + { + FrameNavigateParamsCapturer capturer(root); + controller.GoForward(); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_NEW_ENTRY, capturer.navigation_type()); + EXPECT_TRUE(capturer.did_replace_entry()); + NavigationEntry* entry = controller.GetLastCommittedEntry(); + EXPECT_NE(PAGE_TYPE_ERROR, entry->GetPageType()); + EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); + } + + // 6) Make a new entry ... + EXPECT_TRUE(NavigateToURL(shell(), url1)); EXPECT_EQ(4, controller.GetEntryCount()); - // ... and replace it with a failed load. (It is NEW_ENTRY for the reason - // noted above.) + // 7) ... and replace it with a failed load. { FrameNavigateParamsCapturer capturer(root); RendererLocationReplace(shell(), error_url); @@ -2310,6 +2349,143 @@ EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType()); EXPECT_EQ(4, controller.GetEntryCount()); } + + // 8) Make a new web ui page to force a process swap ... + GURL web_ui_page(std::string(kChromeUIScheme) + "://" + + std::string(kChromeUIGpuHost)); + EXPECT_TRUE(NavigateToURL(shell(), web_ui_page)); + EXPECT_EQ(5, controller.GetEntryCount()); + + // 9) ... and replace it with a failed load. (It is NEW_ENTRY for the reason + // noted above.) + { + FrameNavigateParamsCapturer capturer(root); + RendererLocationReplace(shell(), error_url); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_NEW_ENTRY, capturer.navigation_type()); + EXPECT_TRUE(capturer.did_replace_entry()); + NavigationEntry* entry = controller.GetLastCommittedEntry(); + EXPECT_EQ(PAGE_TYPE_ERROR, entry->GetPageType()); + EXPECT_EQ(5, controller.GetEntryCount()); + } +} + +// Tests various cases of replacements caused by error pages on subframes. +IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, + ErrorPageReplacementSubframe) { + NavigationController& controller = shell()->web_contents()->GetController(); + // Navigate to a page with an iframe. + GURL main_frame_url = embedded_test_server()->GetURL( + "/navigation_controller/page_with_data_iframe.html"); + EXPECT_TRUE(NavigateToURL(shell(), main_frame_url)); + EXPECT_EQ(1, controller.GetEntryCount()); + + GURL error_url = embedded_test_server()->GetURL("/close-socket"); + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&net::URLRequestFailedJob::AddUrlHandler)); + + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root(); + + // 1) Navigate the subframe to a page that fails to load. It must result in an + // error page, the NEW_SUBFRAME navigation type, and an addition to the + // history list. + { + FrameNavigateParamsCapturer capturer(root->child_at(0)); + NavigateFrameToURL(root->child_at(0), error_url); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.navigation_type()); + EXPECT_EQ(2, controller.GetEntryCount()); + } + + // 2) Navigate the subframe again to the same URL. It results in an error + // page, the AUTO_SUBFRAME navigation type, does replacement, and no addition + // to the history list. This is because the navigation got converted into a + // reload and doesn't have a valid PageState, but since it fails, + // it does replacement instead of reload. + { + FrameNavigateParamsCapturer capturer(root->child_at(0)); + NavigateFrameToURL(root->child_at(0), error_url); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_AUTO_SUBFRAME, capturer.navigation_type()); + EXPECT_TRUE(capturer.did_replace_entry()); + EXPECT_EQ(2, controller.GetEntryCount()); + } + + // 3) Navigate the subframe to a different URL (|url2|) that fails to load. It + // adds a new entry. + GURL url2 = embedded_test_server()->GetURL("/title1.html"); + { + // Set up an URLLoaderInterceptor which will cause the next navigation to + // fail. + auto url_loader_interceptor = std::make_unique<URLLoaderInterceptor>( + base::BindRepeating([](URLLoaderInterceptor::RequestParams* params) { + network::URLLoaderCompletionStatus status; + status.error_code = net::ERR_NOT_IMPLEMENTED; + params->client->OnComplete(status); + return true; + })); + + FrameNavigateParamsCapturer capturer(root->child_at(0)); + NavigateFrameToURL(root->child_at(0), url2); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.navigation_type()); + EXPECT_FALSE(capturer.did_replace_entry()); + EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); + } + + // 4) Go back to the previous error page on the subframe. Since this still + // results in an error page, it's classified as AUTO_SUBFRAME and won't do + // replacement, like a normal subframe history navigation. + { + FrameNavigateParamsCapturer capturer(root->child_at(0)); + controller.GoBack(); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_AUTO_SUBFRAME, capturer.navigation_type()); + EXPECT_FALSE(capturer.did_replace_entry()); + EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); + } + + // 5) Go forward to |url2|. This navigation will succeed, and since the final + // SiteInstance is the same as the entry, it will be classified as + // AUTO_SUBFRAME and won't do replacement, like a normal subframe history + // navigation. Note this is different from the main frame case, where the + // navigation will do a replacement instead, because the SiteInstance would be + // different due to error page isolation on main frames. + { + FrameNavigateParamsCapturer capturer(root->child_at(0)); + controller.GoForward(); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_AUTO_SUBFRAME, capturer.navigation_type()); + EXPECT_FALSE(capturer.did_replace_entry()); + EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); + } + + // 6) Navigate the subframe to the same URL but fail to load again. It will + // be classified as AUTO_SUBFRAME and do replacement. + { + // Set up an URLLoaderInterceptor which will cause the next navigation to + // fail. + auto url_loader_interceptor = std::make_unique<URLLoaderInterceptor>( + base::BindRepeating([](URLLoaderInterceptor::RequestParams* params) { + network::URLLoaderCompletionStatus status; + status.error_code = net::ERR_NOT_IMPLEMENTED; + params->client->OnComplete(status); + return true; + })); + + FrameNavigateParamsCapturer capturer(root->child_at(0)); + NavigateFrameToURL(root->child_at(0), url2); + capturer.Wait(); + EXPECT_EQ(NAVIGATION_TYPE_AUTO_SUBFRAME, capturer.navigation_type()); + EXPECT_TRUE(capturer.did_replace_entry()); + EXPECT_EQ(3, controller.GetEntryCount()); + EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); + } } // Various tests for navigation type classifications. TODO(avi): It's rather @@ -2884,17 +3060,16 @@ })); { - // Navigate to the same URL (browser-initiated), but this time we hit a + // Navigate to the same URL (renderer-initiated), but this time we hit a // network error and end up in an error page. This will result in - // replacement. + // replacement as it's a same-url navigation. FrameNavigateParamsCapturer capturer(root); - EXPECT_FALSE(NavigateToURL(shell(), url1)); + EXPECT_FALSE(NavigateToURLFromRenderer(shell(), url1)); capturer.Wait(); // We're classifying this as NEW_ENTRY. EXPECT_EQ(NAVIGATION_TYPE_NEW_ENTRY, capturer.navigation_type()); - // The navigation replaced the previously committed entry with a new entry - // because the navigation resulted in an error page. + // The navigation replaced the previously committed entry. EXPECT_TRUE(capturer.did_replace_entry()); EXPECT_NE(previous_entry, controller.GetLastCommittedEntry()); EXPECT_EQ(1, controller.GetEntryCount()); @@ -2903,8 +3078,8 @@ } { - // Navigate to the same URL (through reload), and hit a network error - // again. This will reload the previous entry. + // Navigate to the same URL (through explicit reload), and hit a network + // error again. This will reload the previous entry. FrameNavigateParamsCapturer capturer(root); shell()->Reload(); capturer.Wait(); @@ -2921,22 +3096,24 @@ { // Navigate to the same URL (browser-initiated), and hit a network error - // again. This will result in replacement. + // again. The navigation initially got converted into a reload by the + // browser but since it failed and doesn't have a valid PageState, it does + // replacement instead. FrameNavigateParamsCapturer capturer(root); EXPECT_FALSE(NavigateToURL(shell(), url1)); capturer.Wait(); // We're classifying this as NEW_ENTRY. EXPECT_EQ(NAVIGATION_TYPE_NEW_ENTRY, capturer.navigation_type()); - // The navigation replaced the previously committed entry with a new entry - // because the navigation resulted in an error page. + // The navigation replaced the previously committed entry. EXPECT_TRUE(capturer.did_replace_entry()); EXPECT_NE(previous_entry, controller.GetLastCommittedEntry()); EXPECT_EQ(1, controller.GetEntryCount()); - url_loader_interceptor.reset(); previous_entry = controller.GetLastCommittedEntry(); } + // Stop failing future navigations. + url_loader_interceptor.reset(); { // Navigate successfully to the same URL (browser-initiated) after a failed
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 6719470..275239e 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -2415,6 +2415,10 @@ FRIEND_TEST_ALL_PREFIXES(RenderDocumentHostUserDataTest, CheckInPendingDeletionState); FRIEND_TEST_ALL_PREFIXES(WebContentsImplBrowserTest, FrozenAndUnfrozenIPC); + FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplBrowserTest, + NoShowBluetoothScanningPromptInPrerendering); + FRIEND_TEST_ALL_PREFIXES(WebBluetoothServiceImplBrowserTest, + RequestDeviceInPrerendering); class DroppedInterfaceRequestLogger; class SubresourceLoaderFactoriesConfig;
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 3f92d148..c861067 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2213,14 +2213,14 @@ } void RenderProcessHostImpl::BindNativeIOHost( - const url::Origin& origin, + const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); auto* storage_partition = static_cast<StoragePartitionImpl*>(GetStoragePartition()); auto* native_io_context = static_cast<NativeIOContextImpl*>( storage_partition->GetNativeIOContext()); - native_io_context->BindReceiver(origin, std::move(receiver)); + native_io_context->BindReceiver(storage_key, std::move(receiver)); } void RenderProcessHostImpl::BindRestrictedCookieManagerForServiceWorker(
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index af612cd..21ea7c98 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -591,7 +591,7 @@ // Binds |receiver| to a NativeIOHost instance indirectly owned by the // StoragePartition. Used by frames and workers via BrowserInterfaceBroker. void BindNativeIOHost( - const url::Origin& origin, + const blink::StorageKey& storage_key, mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver); FileSystemManagerImpl* GetFileSystemManagerForTesting() {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_vk_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_aura_vk_browsertest.cc index f0f5cc2..84ad416 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_vk_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_vk_browsertest.cc
@@ -22,9 +22,9 @@ #include "content/public/test/content_browser_test_utils.h" #include "content/public/test/text_input_test_utils.h" #include "content/shell/browser/shell.h" -#include "ui/base/ime/init/input_method_factory.h" -#include "ui/base/ime/input_method_observer.h" -#include "ui/base/ime/mock_input_method.h" +#include "net/base/filename_util.h" +#include "net/dns/mock_host_resolver.h" +#include "third_party/blink/public/common/switches.h" #include "ui/base/ime/text_input_type.h" #include "ui/base/ime/virtual_keyboard_controller.h" #include "ui/base/ime/virtual_keyboard_controller_observer.h" @@ -121,87 +121,19 @@ bool expected_value_ = false; }; -class MockKeyboardController : public ui::VirtualKeyboardController { - public: - bool DisplayVirtualKeyboard() override { - is_keyboard_visible_ = true; - return true; - } - void DismissVirtualKeyboard() override {} - void AddObserver(ui::VirtualKeyboardControllerObserver* observer) override { - observers_.AddObserver(observer); - } - void RemoveObserver( - ui::VirtualKeyboardControllerObserver* observer) override { - observers_.RemoveObserver(observer); - } - - void NotifyObserversOnKeyboardShown(gfx::Rect dip_rect) { - is_keyboard_visible_ = true; - for (ui::VirtualKeyboardControllerObserver& observer : observers_) - observer.OnKeyboardVisible(dip_rect); - } - - void NotifyObserversOnKeyboardHidden() { - is_keyboard_visible_ = false; - for (ui::VirtualKeyboardControllerObserver& observer : observers_) - observer.OnKeyboardHidden(); - } - - bool IsKeyboardVisible() override { return is_keyboard_visible_; } - - private: - base::ObserverList<ui::VirtualKeyboardControllerObserver, false>::Unchecked - observers_; - bool is_keyboard_visible_ = false; -}; - -class VirtualKeyboardObserver : public ui::InputMethodObserver { - public: - // ui::InputMethodObserver: - void OnFocus() override {} - void OnBlur() override {} - void OnInputMethodDestroyed(const ui::InputMethod* input_method) override {} - void OnShowVirtualKeyboardIfEnabled() override { - is_keyboard_display_called_ = true; - } - void OnTextInputStateChanged(const ui::TextInputClient* client) override {} - void OnCaretBoundsChanged(const ui::TextInputClient* client) override {} - bool IsKeyboardDisplayCalled() { return is_keyboard_display_called_; } - - private: - bool is_keyboard_display_called_ = false; -}; - -class KeyboardControllerMockInputMethod : public ui::MockInputMethod { - public: - KeyboardControllerMockInputMethod() : ui::MockInputMethod(nullptr) {} - ui::VirtualKeyboardController* GetVirtualKeyboardController() override { - return &mock_keyboard_controller_; - } - - MockKeyboardController* GetMockKeyboardController() { - return &mock_keyboard_controller_; - } - - private: - MockKeyboardController mock_keyboard_controller_; -}; - class RenderWidgetHostViewAuraBrowserMockIMETest : public ContentBrowserTest { public: - void SetUp() override { - input_method_ = new KeyboardControllerMockInputMethod; - mock_keyboard_observer_ = new VirtualKeyboardObserver; - input_method_->AddObserver(mock_keyboard_observer_); - // transfers ownership. - ui::SetUpInputMethodForTesting(input_method_); - ContentBrowserTest::SetUp(); + void SetUpOnMainThread() override { + host_resolver()->AddRule("*", "127.0.0.1"); + server_.AddDefaultHandlers(GetTestDataFilePath()); + server_.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); + ASSERT_TRUE(server_.Start()); } void SetUpCommandLine(base::CommandLine* command_line) override { command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, "VirtualKeyboard,EditContext"); + command_line->AppendSwitch(blink::switches::kAllowPreCommitInput); ContentBrowserTest::SetUpCommandLine(command_line); } @@ -239,9 +171,7 @@ waiter.WaitForNotification(); } - protected: - KeyboardControllerMockInputMethod* input_method_ = nullptr; - VirtualKeyboardObserver* mock_keyboard_observer_ = nullptr; + net::EmbeddedTestServer server_{net::EmbeddedTestServer::TYPE_HTTPS}; private: BrowserAccessibility* FindNodeInSubtree(BrowserAccessibility& node, @@ -267,295 +197,6 @@ #ifdef OS_WIN IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewAuraBrowserMockIMETest, - VirtualKeyboardIntegrationTest) { - // The keyboard input pane events are not supported on Win7. - if (base::win::GetVersion() <= base::win::Version::WIN7) { - return; - } - - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<script>" - " let VKRect = navigator.virtualKeyboard.boundingRect, numEvents = 0;" - " navigator.virtualKeyboard.overlaysContent = true;" - " navigator.virtualKeyboard.addEventListener('geometrychange'," - " evt => {" - " numEvents++;" - " VKRect = navigator.virtualKeyboard.boundingRect" - " }, false);" - "</script>"; - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); - - // Check the boundingRect property so it's not null when queried. - EXPECT_EQ(0, EvalJs(shell(), "VKRect.x")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.y")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.width")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.height")); - // Send a touch event so that RenderWidgetHostViewAura will create the - // keyboard observer (requires last_pointer_type_ to be TOUCH). - ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(30, 30), - base::TimeTicks::Now(), - ui::PointerDetails(ui::EventPointerType::kTouch, 0)); - RenderWidgetHostViewAura* rwhvi = GetRenderWidgetHostView(); - rwhvi->OnTouchEvent(&press); - - // Emulate input type text focus in the root frame (the only frame), by - // setting frame focus and updating TextInputState. This is a more direct way - // of triggering focus in a textarea in the web page. - WebContentsImpl* web_contents = - static_cast<WebContentsImpl*>(shell()->web_contents()); - auto* root = web_contents->GetFrameTree()->root(); - web_contents->GetFrameTree()->SetFocusedFrame( - root, root->current_frame_host()->GetSiteInstance()); - - ui::mojom::TextInputState text_input_state; - text_input_state.show_ime_if_needed = true; - text_input_state.type = ui::TEXT_INPUT_TYPE_TEXT; - - TextInputManager* text_input_manager = rwhvi->GetTextInputManager(); - text_input_manager->UpdateTextInputState(rwhvi, text_input_state); - - // Send through a keyboard showing event with a rect, and verify the - // javascript event fires with the appropriate values. - constexpr int kKeyboardX = 0; - constexpr int kKeyboardY = 200; - constexpr int kKeyboardWidth = 200; - constexpr int kKeyboardHeight = 200; - gfx::Rect keyboard_rect(kKeyboardX, kKeyboardY, kKeyboardWidth, - kKeyboardHeight); - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardShown( - keyboard_rect); - - // There are x and y-offsets for the main frame in content_browsertest - // hosting. We need to take these into account for the expected values. - gfx::PointF root_widget_origin(0.f, 0.f); - rwhvi->TransformPointToRootSurface(&root_widget_origin); - const int expected_width = kKeyboardWidth - root_widget_origin.x(); - const int expected_y = kKeyboardY - root_widget_origin.y(); - - EXPECT_EQ(1, EvalJs(shell(), "numEvents")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.x")); - EXPECT_EQ(expected_y, EvalJs(shell(), "VKRect.y")); - EXPECT_EQ(expected_width, EvalJs(shell(), "VKRect.width")); - EXPECT_EQ(kKeyboardHeight, EvalJs(shell(), "VKRect.height")); - - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardHidden(); - EXPECT_EQ(2, EvalJs(shell(), "numEvents")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.x")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.y")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.width")); - EXPECT_EQ(0, EvalJs(shell(), "VKRect.height")); - - // Flip the policy back to non-overlay, verify the event doesn't fire - ignore_result( - EvalJs(shell(), "navigator.virtualKeyboard.overlaysContent = false")); - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardShown( - keyboard_rect); - EXPECT_EQ(2, EvalJs(shell(), "numEvents")); -} - -IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewAuraBrowserMockIMETest, - VirtualKeyboardCSSEnvVarIntegrationTest) { - // The keyboard input pane events are not supported on Win7. - if (base::win::GetVersion() <= base::win::Version::WIN7) { - return; - } - - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<style>" - " .target {" - " margin-top: env(keyboard-inset-top);" - " margin-left: env(keyboard-inset-left);" - " margin-bottom: env(keyboard-inset-bottom);" - " margin-right: env(keyboard-inset-right);" - " }" - "</style>" - "<body>" - "<div class='target'></div>" - "<script>" - " let numEvents = 0;" - " navigator.virtualKeyboard.overlaysContent = true;" - " const e = document.getElementsByClassName('target')[0];" - " const style = window.getComputedStyle(e, null);" - " navigator.virtualKeyboard.addEventListener('geometrychange'," - " evt => {" - " numEvents++;" - " }, false);" - "</script></body>"; - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); - - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('margin-top')").ExtractString()); - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('margin-left')").ExtractString()); - EXPECT_EQ("0px", EvalJs(shell(), "style.getPropertyValue('margin-bottom')") - .ExtractString()); - EXPECT_EQ("0px", EvalJs(shell(), "style.getPropertyValue('margin-right')") - .ExtractString()); - - RenderWidgetHostViewAura* rwhvi = GetRenderWidgetHostView(); - - // Send a touch event so that RenderWidgetHostViewAura will create the - // keyboard observer (requires last_pointer_type_ to be TOUCH). - ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(30, 30), - base::TimeTicks::Now(), - ui::PointerDetails(ui::EventPointerType::kTouch, 0)); - rwhvi->OnTouchEvent(&press); - - // Emulate input type text focus in the root frame (the only frame), by - // setting frame focus and updating TextInputState. This is a more direct way - // of triggering focus in a textarea in the web page. - WebContentsImpl* web_contents = - static_cast<WebContentsImpl*>(shell()->web_contents()); - auto* root = web_contents->GetFrameTree()->root(); - web_contents->GetFrameTree()->SetFocusedFrame( - root, root->current_frame_host()->GetSiteInstance()); - - ui::mojom::TextInputState text_input_state; - text_input_state.show_ime_if_needed = true; - text_input_state.type = ui::TEXT_INPUT_TYPE_TEXT; - - TextInputManager* text_input_manager = rwhvi->GetTextInputManager(); - text_input_manager->UpdateTextInputState(rwhvi, text_input_state); - - // Send through a keyboard showing event with a rect, and verify the - // javascript event fires with the appropriate values. - constexpr int kKeyboardX = 0; - constexpr int kKeyboardY = 200; - constexpr int kKeyboardWidth = 200; - constexpr int kKeyboardHeight = 200; - gfx::Rect keyboard_rect(kKeyboardX, kKeyboardY, kKeyboardWidth, - kKeyboardHeight); - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardShown( - keyboard_rect); - - // There are x and y-offsets for the main frame in content_browsertest - // hosting. We need to take these into account for the expected values. - gfx::PointF root_widget_origin(0.f, 0.f); - rwhvi->TransformPointToRootSurface(&root_widget_origin); - - EXPECT_EQ(1, EvalJs(shell(), "numEvents")); - EXPECT_EQ( - "161px", - EvalJs(shell(), "style.getPropertyValue('margin-top')").ExtractString()); - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('margin-left')").ExtractString()); - EXPECT_EQ("198px", EvalJs(shell(), "style.getPropertyValue('margin-right')") - .ExtractString()); - EXPECT_EQ("361px", EvalJs(shell(), "style.getPropertyValue('margin-bottom')") - .ExtractString()); - - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardHidden(); - EXPECT_EQ(2, EvalJs(shell(), "numEvents")); - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('margin-top')").ExtractString()); - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('margin-left')").ExtractString()); - EXPECT_EQ("0px", EvalJs(shell(), "style.getPropertyValue('margin-right')") - .ExtractString()); - EXPECT_EQ("0px", EvalJs(shell(), "style.getPropertyValue('margin-bottom')") - .ExtractString()); -} - -IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewAuraBrowserMockIMETest, - VirtualKeyboardCSSEnvVarWidthAndHeightIntegrationTest) { - // The keyboard input pane events are not supported on Win7. - if (base::win::GetVersion() <= base::win::Version::WIN7) { - return; - } - - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<style>" - " .target {" - " width: env(keyboard-inset-width);" - " height: env(keyboard-inset-height);" - " }" - "</style>" - "<body>" - "<div class='target'></div>" - "<script>" - " let numEvents = 0;" - " navigator.virtualKeyboard.overlaysContent = true;" - " const e = document.getElementsByClassName('target')[0];" - " const style = window.getComputedStyle(e, null);" - " navigator.virtualKeyboard.addEventListener('geometrychange'," - " evt => {" - " numEvents++;" - " }, false);" - "</script></body>"; - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); - - EXPECT_EQ("0px", - EvalJs(shell(), "style.getPropertyValue('width')").ExtractString()); - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('height')").ExtractString()); - - RenderWidgetHostViewAura* rwhvi = GetRenderWidgetHostView(); - - // Send a touch event so that RenderWidgetHostViewAura will create the - // keyboard observer (requires last_pointer_type_ to be TOUCH). - ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(30, 30), - base::TimeTicks::Now(), - ui::PointerDetails(ui::EventPointerType::kTouch, 0)); - rwhvi->OnTouchEvent(&press); - - // Emulate input type text focus in the root frame (the only frame), by - // setting frame focus and updating TextInputState. This is a more direct way - // of triggering focus in a textarea in the web page. - WebContentsImpl* web_contents = - static_cast<WebContentsImpl*>(shell()->web_contents()); - auto* root = web_contents->GetFrameTree()->root(); - web_contents->GetFrameTree()->SetFocusedFrame( - root, root->current_frame_host()->GetSiteInstance()); - - ui::mojom::TextInputState text_input_state; - text_input_state.show_ime_if_needed = true; - text_input_state.type = ui::TEXT_INPUT_TYPE_TEXT; - - TextInputManager* text_input_manager = rwhvi->GetTextInputManager(); - text_input_manager->UpdateTextInputState(rwhvi, text_input_state); - - // Send through a keyboard showing event with a rect, and verify the - // javascript event fires with the appropriate values. - constexpr int kKeyboardX = 0; - constexpr int kKeyboardY = 200; - constexpr int kKeyboardWidth = 200; - constexpr int kKeyboardHeight = 200; - gfx::Rect keyboard_rect(kKeyboardX, kKeyboardY, kKeyboardWidth, - kKeyboardHeight); - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardShown( - keyboard_rect); - - // There are x and y-offsets for the main frame in content_browsertest - // hosting. We need to take these into account for the expected values. - gfx::PointF root_widget_origin(0.f, 0.f); - rwhvi->TransformPointToRootSurface(&root_widget_origin); - - EXPECT_EQ(1, EvalJs(shell(), "numEvents")); - EXPECT_EQ("198px", - EvalJs(shell(), "style.getPropertyValue('width')").ExtractString()); - EXPECT_EQ( - "200px", - EvalJs(shell(), "style.getPropertyValue('height')").ExtractString()); - - input_method_->GetMockKeyboardController()->NotifyObserversOnKeyboardHidden(); - EXPECT_EQ(2, EvalJs(shell(), "numEvents")); - EXPECT_EQ("0px", - EvalJs(shell(), "style.getPropertyValue('width')").ExtractString()); - EXPECT_EQ( - "0px", - EvalJs(shell(), "style.getPropertyValue('height')").ExtractString()); -} - -IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewAuraBrowserMockIMETest, VirtualKeyboardAccessibilityFocusTest) { // The keyboard input pane events are not supported on Win7. if (base::win::GetVersion() <= base::win::Version::WIN7) { @@ -585,8 +226,6 @@ BrowserAccessibility* focus = GetManager()->GetFocus(); EXPECT_EQ(focus->GetId(), target->GetId()); - - EXPECT_EQ(true, mock_keyboard_observer_->IsKeyboardDisplayCalled()); } IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewAuraBrowserMockIMETest, @@ -596,15 +235,8 @@ return; } - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<body>" - "<textarea id='txt3'></textarea>" - "<script>" - " let elemRect = txt3.getBoundingClientRect();" - "</script>" - "</body>"; - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); + GURL start_url = server_.GetURL("a.test", "/virtual-keyboard.html"); + ASSERT_TRUE(NavigateToURL(shell(), start_url)); WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(shell()->web_contents()); @@ -617,10 +249,15 @@ // Tap on the third textarea to open VK. TextInputManagerVkPolicyObserver type_observer_auto( web_contents, ui::mojom::VirtualKeyboardPolicy::AUTO); - const int top = EvalJs(shell(), "elemRect.top").ExtractInt(); - const int left = EvalJs(shell(), "elemRect.left").ExtractInt(); - SimulateTapDownAt(web_contents, gfx::Point(left + 1, top + 1)); - SimulateTapAt(web_contents, gfx::Point(left + 1, top + 1)); + const int top = EvalJs(shell(), "elemRect3.top").ExtractInt(); + const int left = EvalJs(shell(), "elemRect3.left").ExtractInt(); + const int width = EvalJs(shell(), "elemRect3.width").ExtractInt(); + const int height = EvalJs(shell(), "elemRect3.height").ExtractInt(); + gfx::Point tap_point = gfx::Point(left + width / 2, top + height / 2); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_PRESSED, tap_point); + SimulateTapDownAt(web_contents, tap_point); + SimulateTapAt(web_contents, tap_point); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_RELEASED, tap_point); type_observer_auto.Wait(); } @@ -631,21 +268,13 @@ return; } - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<body>" - "<textarea id='txt3'></textarea>" - "<script>" - " let elemRect = txt3.getBoundingClientRect();" - " txt3.focus();" - "</script>" - "</body>"; WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(shell()->web_contents()); TextInputManagerShowImeIfNeededObserver show_ime_observer_false(web_contents, false); // Note: This data URL has JS that focuses the edit control. - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); + GURL start_url = server_.GetURL("a.test", "/virtual-keyboard.html"); + ASSERT_TRUE(NavigateToURL(shell(), start_url)); show_ime_observer_false.Wait(); // Send a touch event so that RenderWidgetHostViewAura will create the @@ -653,10 +282,15 @@ // Tap on the third textarea to open VK. TextInputManagerShowImeIfNeededObserver show_ime_observer_true(web_contents, true); - const int top = EvalJs(shell(), "elemRect.top").ExtractInt(); - const int left = EvalJs(shell(), "elemRect.left").ExtractInt(); - SimulateTapDownAt(web_contents, gfx::Point(left + 1, top + 1)); - SimulateTapAt(web_contents, gfx::Point(left + 1, top + 1)); + const int top = EvalJs(shell(), "elemRect3.top").ExtractInt(); + const int left = EvalJs(shell(), "elemRect3.left").ExtractInt(); + const int width = EvalJs(shell(), "elemRect3.width").ExtractInt(); + const int height = EvalJs(shell(), "elemRect3.height").ExtractInt(); + gfx::Point tap_point = gfx::Point(left + width / 2, top + height / 2); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_PRESSED, tap_point); + SimulateTapDownAt(web_contents, tap_point); + SimulateTapAt(web_contents, tap_point); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_RELEASED, tap_point); show_ime_observer_true.Wait(); } @@ -667,22 +301,8 @@ return; } - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<body>" - "<textarea id='txt3' virtualkeyboardpolicy='manual' " - "onfocusin='FocusIn1()' onkeydown='HideVKCalled()'></textarea>" - "<script>" - " let elemRect = txt3.getBoundingClientRect();" - " function FocusIn1() {" - " navigator.virtualKeyboard.show();" - " }" - " function HideVKCalled() {" - " navigator.virtualKeyboard.hide();" - " }" - "</script>" - "</body>"; - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); + GURL start_url = server_.GetURL("a.test", "/virtual-keyboard.html"); + ASSERT_TRUE(NavigateToURL(shell(), start_url)); WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(shell()->web_contents()); @@ -695,10 +315,15 @@ // Tap on the third textarea to open VK. TextInputManagerVkVisibilityRequestObserver type_observer_show( web_contents, ui::mojom::VirtualKeyboardVisibilityRequest::SHOW); - const int top = EvalJs(shell(), "elemRect.top").ExtractInt(); - const int left = EvalJs(shell(), "elemRect.left").ExtractInt(); - SimulateTapDownAt(web_contents, gfx::Point(left + 1, top + 1)); - SimulateTapAt(web_contents, gfx::Point(left + 1, top + 1)); + const int top = EvalJs(shell(), "elemRect1.top").ExtractInt(); + const int left = EvalJs(shell(), "elemRect1.left").ExtractInt(); + const int width = EvalJs(shell(), "elemRect1.width").ExtractInt(); + const int height = EvalJs(shell(), "elemRect1.height").ExtractInt(); + gfx::Point tap_point = gfx::Point(left + width / 2, top + height / 2); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_PRESSED, tap_point); + SimulateTapDownAt(web_contents, tap_point); + SimulateTapAt(web_contents, tap_point); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_RELEASED, tap_point); type_observer_show.Wait(); TextInputManagerVkVisibilityRequestObserver type_observer_hide( web_contents, ui::mojom::VirtualKeyboardVisibilityRequest::HIDE); @@ -714,25 +339,8 @@ return; } - const char kVirtualKeyboardDataURL[] = - "data:text/html,<!DOCTYPE html>" - "<body>" - "<textarea id='txt3' virtualkeyboardpolicy='manual' " - "onfocusin='FocusIn1()' onkeydown='HideVKCalled()'></textarea>" - "<script>" - " let elemRect = txt3.getBoundingClientRect();" - " const editContext = new EditContext();" - " txt3.editContext = editContext;" - " editContext.inputPanelPolicy = \"manual\";" - " function FocusIn1() {" - " navigator.virtualKeyboard.show();" - " }" - " function HideVKCalled() {" - " navigator.virtualKeyboard.hide();" - " }" - "</script>" - "</body>"; - EXPECT_TRUE(NavigateToURL(shell(), GURL(kVirtualKeyboardDataURL))); + GURL start_url = server_.GetURL("a.test", "/virtual-keyboard.html"); + ASSERT_TRUE(NavigateToURL(shell(), start_url)); WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(shell()->web_contents()); @@ -745,10 +353,15 @@ // Tap on the third textarea to open VK. TextInputManagerVkVisibilityRequestObserver type_observer_show( web_contents, ui::mojom::VirtualKeyboardVisibilityRequest::SHOW); - const int top = EvalJs(shell(), "elemRect.top").ExtractInt(); - const int left = EvalJs(shell(), "elemRect.left").ExtractInt(); - SimulateTapDownAt(web_contents, gfx::Point(left + 1, top + 1)); - SimulateTapAt(web_contents, gfx::Point(left + 1, top + 1)); + const int top = EvalJs(shell(), "elemRect2.top").ExtractInt(); + const int left = EvalJs(shell(), "elemRect2.left").ExtractInt(); + const int width = EvalJs(shell(), "elemRect2.width").ExtractInt(); + const int height = EvalJs(shell(), "elemRect2.height").ExtractInt(); + gfx::Point tap_point = gfx::Point(left + width / 2, top + height / 2); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_PRESSED, tap_point); + SimulateTapDownAt(web_contents, tap_point); + SimulateTapAt(web_contents, tap_point); + SimulateTouchEventAt(web_contents, ui::ET_TOUCH_RELEASED, tap_point); type_observer_show.Wait(); TextInputManagerVkVisibilityRequestObserver type_observer_hide( web_contents, ui::mojom::VirtualKeyboardVisibilityRequest::HIDE);
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index 4da7e35d..a6abeed 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -1254,6 +1254,7 @@ // The container view is indicated by a virtualViewId of NO_ID; post these events directly // since there's no web-specific information to attach. if (virtualViewId == View.NO_ID) { + if (mTracker != null) mTracker.addEvent(AccessibilityEvent.obtain(eventType)); mView.sendAccessibilityEvent(eventType); return; }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java index a577815..c199dc9 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
@@ -102,7 +102,7 @@ "Expected to receive both a traversal and selection text event"; // Constant values for unit tests - private static final int UNSUPPRESSED_EXPECTED_COUNT = 15; + private static final int UNSUPPRESSED_EXPECTED_COUNT = 25; private AccessibilityNodeInfo mNodeInfo; private AccessibilityContentShellTestData mTestData; @@ -371,6 +371,7 @@ * Ensure we throttle TYPE_WINDOW_CONTENT_CHANGED events for large tree updates. */ @Test + @FlakyTest(message = "https://crbug.com/1161533") @SmallTest @MinAndroidSdkLevel(Build.VERSION_CODES.M) public void testMaxContentChangedEventsFired_default() throws Throwable { @@ -386,15 +387,16 @@ // Signal end of test mActivityTestRule.sendEndOfTestSignal(); - // Verify number of events processed, allow for multiple atomic updates. + // Verify number of events processed int eventCount = mTestData.getTypeWindowContentChangedCount(); - Assert.assertTrue(thresholdError(eventCount, maxEvents), eventCount <= (maxEvents * 3)); + Assert.assertTrue(thresholdError(eventCount, maxEvents), eventCount <= maxEvents); } /** * Ensure we need to throttle TYPE_WINDOW_CONTENT_CHANGED events for some large tree updates. */ @Test + @FlakyTest(message = "https://crbug.com/1161533") @SmallTest @MinAndroidSdkLevel(Build.VERSION_CODES.M) public void testMaxContentChangedEventsFired_largeLimit() throws Throwable {
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index 9f2ec52..88ab93ad 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -292,6 +292,7 @@ "render_document_host_user_data.cc", "render_document_host_user_data.h", "render_frame_host.h", + "render_frame_host_receiver_set.h", "render_frame_metadata_provider.h", "render_process_host.h", "render_process_host_creation_observer.h",
diff --git a/content/public/browser/render_frame_host_receiver_set.h b/content/public/browser/render_frame_host_receiver_set.h new file mode 100644 index 0000000..1216839 --- /dev/null +++ b/content/public/browser/render_frame_host_receiver_set.h
@@ -0,0 +1,88 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_BROWSER_RENDER_FRAME_HOST_RECEIVER_SET_H_ +#define CONTENT_PUBLIC_BROWSER_RENDER_FRAME_HOST_RECEIVER_SET_H_ + +#include <map> +#include <vector> + +#include "content/common/content_export.h" +#include "content/public/browser/web_contents_observer.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" +#include "mojo/public/cpp/bindings/pending_associated_receiver.h" + +namespace content { + +class RenderFrameHost; +class WebContents; + +// Owns a set of Channel-associated interface receivers with frame context on +// message dispatch. +// +// When messages are dispatched to the implementation, the implementation can +// call GetCurrentTargetFrame() on this object (see below) to determine which +// frame sent the message. +// +// In order to expose the interface to all RenderFrames, a binder must be +// registered for the interface. Typically this is done in +// BindAssociatedReceiverFromFrame() in a ContentBrowserClient subclass. Doing +// that will expose the interface to all remote RenderFrame objects. If the +// WebContents is destroyed at any point, the receivers will automatically +// reset and will cease to dispatch further incoming messages. +// +// Because this object uses Channel-associated interface receivers, all messages +// sent via these interfaces are ordered with respect to legacy Chrome IPC +// messages on the relevant IPC::Channel (i.e. the Channel between the browser +// and whatever render process hosts the sending frame.) +template <typename Interface> +class CONTENT_EXPORT RenderFrameHostReceiverSet : public WebContentsObserver { + public: + RenderFrameHostReceiverSet(WebContents* web_contents, Interface* impl) + : WebContentsObserver(web_contents), impl_(impl) {} + ~RenderFrameHostReceiverSet() override = default; + + RenderFrameHostReceiverSet(const RenderFrameHostReceiverSet&) = delete; + RenderFrameHostReceiverSet& operator=(const RenderFrameHostReceiverSet&) = + delete; + + void Bind(RenderFrameHost* render_frame_host, + mojo::PendingAssociatedReceiver<Interface> pending_receiver) { + mojo::ReceiverId id = + receivers_.Add(impl_, std::move(pending_receiver), render_frame_host); + frame_to_receivers_map_[render_frame_host].push_back(id); + } + + RenderFrameHost* GetCurrentTargetFrame() { + return receivers_.current_context(); + } + + private: + // content::WebContentsObserver: + void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { + auto it = frame_to_receivers_map_.find(render_frame_host); + if (it == frame_to_receivers_map_.end()) + return; + for (auto id : it->second) + receivers_.Remove(id); + frame_to_receivers_map_.erase(it); + } + + // Receiver set for each frame in the page. Note, bindings are reused across + // navigations that are same-site since the RenderFrameHost is reused in that + // case. + mojo::AssociatedReceiverSet<Interface, RenderFrameHost*> receivers_; + + // Track which RenderFrameHosts are in the |receivers_| set so they can + // be removed them when a RenderFrameHost is removed. + std::map<RenderFrameHost*, std::vector<mojo::ReceiverId>> + frame_to_receivers_map_; + + // Must outlive this class. + Interface* const impl_; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_RENDER_FRAME_HOST_RECEIVER_SET_H_
diff --git a/content/public/browser/web_contents_receiver_set.h b/content/public/browser/web_contents_receiver_set.h index 8b2ded14..c7d806b 100644 --- a/content/public/browser/web_contents_receiver_set.h +++ b/content/public/browser/web_contents_receiver_set.h
@@ -148,6 +148,8 @@ OverrideForTesting); }; +// Use RenderFrameHostReceiverSet (render_frame_host_receiver_set.h) instead. +// // Owns a set of Channel-associated interface receivers with frame context on // message dispatch. //
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 6b12ccb3..611951d 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -86,12 +86,6 @@ base::FEATURE_DISABLED_BY_DEFAULT}; #endif -// Allows pages with cache-control:no-store to enter the back/forward cache. -// TODO(crbug.com/1228611): Enable this feature. -const base::Feature kCacheControlNoStoreEnterBackForwardCache{ - "CacheControlNoStoreEnterBackForwardCache", - base::FEATURE_DISABLED_BY_DEFAULT}; - // BackForwardCache is disabled on low memory devices. The threshold is defined // via a field trial param: "memory_threshold_for_back_forward_cache_in_mb" // It is compared against base::SysInfo::AmountOfPhysicalMemoryMB(). @@ -642,9 +636,8 @@ "SecurePaymentConfirmationBrowser", base::FEATURE_ENABLED_BY_DEFAULT}; // Used to enable API changes for Secure Payment Confirmation. -// TODO(crbug.com/1216464): Enable by default in M93. const base::Feature kSecurePaymentConfirmationAPIV2{ - "SecurePaymentConfirmationAPIV2", base::FEATURE_DISABLED_BY_DEFAULT}; + "SecurePaymentConfirmationAPIV2", base::FEATURE_ENABLED_BY_DEFAULT}; // Used to control whether to remove the restriction that PaymentCredential in // WebAuthn and secure payment confirmation method in PaymentRequest API must
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index adcc7315..4555b52 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -40,8 +40,6 @@ CONTENT_EXPORT extern const base::Feature kBrowserVerifiedUserActivationKeyboard; CONTENT_EXPORT extern const base::Feature kBrowserVerifiedUserActivationMouse; -CONTENT_EXPORT extern const base::Feature - kCacheControlNoStoreEnterBackForwardCache; CONTENT_EXPORT extern const base::Feature kCacheInlineScriptCode; CONTENT_EXPORT extern const base::Feature kCanvas2DImageChromium; CONTENT_EXPORT extern const base::Feature kCapabilityDelegationPaymentRequest;
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 653b4c0..4ada3cc 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -130,6 +130,7 @@ #include "ui/resources/grit/webui_generated_resources.h" #if defined(OS_WIN) +#include <combaseapi.h> #include <uiautomation.h> #include <wrl/client.h> #include "base/win/scoped_safearray.h"
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 95f69c0..692fd8a1 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -1818,7 +1818,7 @@ } TEST_F(RenderViewImplTextInputStateChanged, - VirtualKeyboardPolicyManualAndShowHideAPIsCalled) { + VirtualKeyboardPolicyManualAndShowHideAPIsCalledInInsecureContext) { // Load an HTML page consisting of two input fields. LoadHTML( "<html>" @@ -1866,7 +1866,7 @@ EXPECT_EQ(updated_states()[0]->vk_policy, ui::mojom::VirtualKeyboardPolicy::MANUAL); EXPECT_EQ(updated_states()[0]->last_vk_visibility_request, - ui::mojom::VirtualKeyboardVisibilityRequest::HIDE); + ui::mojom::VirtualKeyboardVisibilityRequest::NONE); } TEST_F(RenderViewImplTextInputStateChanged,
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 2cc8c3f9..0a14bd3d 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1073,7 +1073,7 @@ "../browser/battery_monitor_browsertest.cc", "../browser/blob_storage/blob_storage_browsertest.cc", "../browser/blob_storage/blob_url_browsertest.cc", - "../browser/bluetooth/bluetooth_device_scanning_prompt_browsertest.cc", + "../browser/bluetooth/web_bluetooth_service_impl_browsertest.cc", "../browser/bookmarklet_browsertest.cc", "../browser/browser_thread_browsertest.cc", "../browser/browsing_data/browsing_data_remover_impl_browsertest.cc",
diff --git a/content/test/data/accessibility/mac/selection/selectall-textarea-expected-mac.txt b/content/test/data/accessibility/mac/selection/selectall-textarea-expected-mac.txt new file mode 100644 index 0000000..b79ead75 --- /dev/null +++ b/content/test/data/accessibility/mac/selection/selectall-textarea-expected-mac.txt
@@ -0,0 +1,3 @@ +textarea_range={anchor: {:3, 0, down}, focus: {:3, 19, down}} +AXSelectedTextChanged on AXTextArea AXValue="The quick brown fox" AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove +textarea.AXSelectedTextMarkerRange={anchor: {:3, 19, down}, focus: {:3, 0, down}}
diff --git a/content/test/data/accessibility/mac/selection/selectall-textarea.html b/content/test/data/accessibility/mac/selection/selectall-textarea.html new file mode 100644 index 0000000..c3ddc01 --- /dev/null +++ b/content/test/data/accessibility/mac/selection/selectall-textarea.html
@@ -0,0 +1,13 @@ +<!-- +@MAC-SCRIPT: + textarea_range:= textarea.AXTextMarkerRangeForUIElement(textarea) + textarea.AXSelectedTextMarkerRange = textarea_range + wait for AXSelectedTextChanged on AXTextArea + textarea.AXSelectedTextMarkerRange +--> +<!DOCTYPE html> +<html> +<body> +<textarea id="textarea">The quick brown fox</textarea> +</body> +</html>
diff --git a/content/test/data/accessibility/readme.md b/content/test/data/accessibility/readme.md index 98ad130..5bc6400 100644 --- a/content/test/data/accessibility/readme.md +++ b/content/test/data/accessibility/readme.md
@@ -210,6 +210,12 @@ You can also use array operator[] to refer to an array element at a given index, for example `paragraph.AXChildren[0]` will refer to the first child of the paragraph. +To set a settable attribute you can assign a value to the attribute, for example: +``` +textarea_range:= textarea.AXTextMarkerRangeForUIElement(textarea) +textarea.AXSelectedTextMarkerRange = textarea_range +``` + You can use `waitfor` instruction to wait for a specific event before the script continues, for example:
diff --git a/content/test/data/virtual-keyboard.html b/content/test/data/virtual-keyboard.html new file mode 100644 index 0000000..d8648fe --- /dev/null +++ b/content/test/data/virtual-keyboard.html
@@ -0,0 +1,41 @@ +<html> +<head> +</head> +<body> + <textarea id='txt1' + virtualkeyboardpolicy='manual' + onfocusin='FocusIn1()' + onkeydown='HideVKCalled()'></textarea> + <textarea id='txt2' + virtualkeyboardpolicy='manual' + onfocusin='FocusIn1()' + onkeydown='HideVKCalled()'></textarea> + <textarea id='txt3' virtualkeyboardpolicy='auto'></textarea> + <textarea id='txt4' virtualkeyboardpolicy='auto'></textarea> + <script> + txt4.focus(); + let elemRect1 = txt1.getBoundingClientRect(); + let elemRect2 = txt2.getBoundingClientRect(); + let elemRect3 = txt3.getBoundingClientRect(); + let elemRect4 = txt4.getBoundingClientRect(); + let VKRect = navigator.virtualKeyboard.boundingRect, numEvents = 0; + navigator.virtualKeyboard.overlaysContent = true; + const editContext = new EditContext(); + txt2.editContext = editContext; + editContext.inputPanelPolicy = "manual"; + + navigator.virtualKeyboard.addEventListener('geometrychange', + evt => { + numEvents++; + VKRect = navigator.virtualKeyboard.boundingRect + }, false); + + function FocusIn1() { + navigator.virtualKeyboard.show(); + } + function HideVKCalled() { + navigator.virtualKeyboard.hide(); + } + </script> + </body> +</html>
diff --git a/docs/enterprise/policy_pref_mapping_test.md b/docs/enterprise/policy_pref_mapping_test.md index 45c6bf55..8dc736b 100644 --- a/docs/enterprise/policy_pref_mapping_test.md +++ b/docs/enterprise/policy_pref_mapping_test.md
@@ -211,7 +211,7 @@ - `local_state` - `signin_profile` (CrOS only, use when a device policy is mapped into the sign-in screen profile using - [login_profile_policy_provider.cc](https://cs.chromium.org/chromium/src/chrome/browser/chromeos/policy/login_profile_policy_provider.cc)) + [login_profile_policy_provider.cc](https://cs.chromium.org/chromium/src/chrome/browser/ash/policy/login/login_profile_policy_provider.cc)) Policies that map into CrosSettings can not be tested at the moment (see `reason_for_missing_test`).
diff --git a/docs/webui_in_chrome.md b/docs/webui_in_chrome.md index b9b8dc9..58ad27e55 100644 --- a/docs/webui_in_chrome.md +++ b/docs/webui_in_chrome.md
@@ -19,19 +19,14 @@ WebUI pages live in `chrome/browser/resources`. You should create a folder for your project `chrome/browser/resources/hello_world`. When creating WebUI resources, follow the [Web Development Style Guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/web/web.md). For a sample WebUI page you could start with the following files: -`chrome/browser/resources/hello_world/hello_world.html` +`chrome/browser/resources/hello_world/hello_world_container.html` ```html <!DOCTYPE HTML> <html> -<head> - <meta charset="utf-8"> - <link rel="stylesheet" href="hello_world.css"> - <script type="module" src="hello_world.js"></script> -</head> -<body> - <h1>Hello World</h1> - <div id="example-div"></div> -</body> + <meta charset="utf-8"> + <link rel="stylesheet" href="hello_world.css"> + <hello-world></hello-world> + <script type="module" src="hello_world.js"></script> </html> ``` @@ -42,27 +37,52 @@ } ``` +`chrome/browser/resources/hello_world/hello_world.html` +```html +<h1>Hello World</h1> +<div id="example-div">[[message_]]</div> +``` + `chrome/browser/resources/hello_world/hello_world.js` ```js import './strings.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {$} from 'chrome://resources/js/util.m.js'; +import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -function initialize() { - const block = document.createElement('div'); - block.innerText = loadTimeData.getString('message'); - $('example-div').appendChild(block); +/** @polymer */ +export class HelloWorldElement extends PolymerElement { + static get is() { + return 'hello-world'; + } + + static get template() { + return html`{__html_template__}`; + } + + static get properties() { + return { + message_: { + type: String, + value: () => loadTimeData.getString('message'), + }, + }; + } } -document.addEventListener('DOMContentLoaded', initialize); +customElements.define(HelloWorldElement.is, HelloWorldElement); ``` -Add a `BUILD.gn` file to get Javascript type checking: +Add a `BUILD.gn` file to get Javascript type checking and Polymer compilation: `chrome/browser/resources/hello_world/BUILD.gn` ``` import("//third_party/closure_compiler/compile_js.gni") +import("//tools/polymer/html_to_js.gni") + +html_to_js("web_components") { + js_files = [ "hello_world.js" ] +} js_library("hello_world") { deps = [ @@ -76,7 +96,8 @@ } ``` -Then refer to the new `:closure_compile` target from `chrome/browser/resources/BUILD.gn`: +Add the new `:closure_compile` target to `chrome/browser/resources/BUILD.gn` to +include it in coverage: ``` group("closure_compile) { @@ -90,24 +111,37 @@ Finally, create an `OWNERS` file for the new folder. ## Adding the resources -Resources for the browser are stored in `grd` files. Current best practice is to autogenerate a grd file for your +Resources for the browser are stored in `grd` files. Current best practice is to autogenerate a grd file for your component in the `BUILD` file we created earlier `chrome/browser/resources/hello_world/BUILD.gn` ``` import("//tools/grit/grit_rule.gni") +import("//tools/grit/preprocess_if_expr.gni") import("//ui/webui/resources/tools/generate_grd.gni") +preprocess_folder = "preprocessed" +preprocess_gen_manifest = "preprocessed_gen_manifest.json" resources_grd_file = "$target_gen_dir/resources.grd" + +preprocess_if_expr("preprocess_generated") { + deps = [ ":web_components" ] + in_folder = target_gen_dir + out_folder = "$target_gen_dir/$preprocess_folder" + out_manifest = "$target_gen_dir/$preprocess_gen_manifest" + in_files = [ "hello_world.js" ] +} + generate_grd("build_grd") { grd_prefix = "hello_world" out_grd = resources_grd_file input_files = [ "hello_world.css", - "hello_world.html", - "hello_world.js", + "hello_world_container.html", ] input_files_base_dir = rebase_path(".", "//") + deps = [ ":preprocess_generated" ] + manifest_files = [ "$target_gen_dir/$preprocess_gen_manifest" ] } grit("resources") {
diff --git a/extensions/browser/api/feedback_private/feedback_private_api.cc b/extensions/browser/api/feedback_private/feedback_private_api.cc index b339b025..c1b9583 100644 --- a/extensions/browser/api/feedback_private/feedback_private_api.cc +++ b/extensions/browser/api/feedback_private/feedback_private_api.cc
@@ -33,6 +33,7 @@ #include "extensions/common/api/feedback_private.h" #include "extensions/common/constants.h" #include "google_apis/gaia/gaia_auth_util.h" +#include "net/base/network_change_notifier.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "extensions/browser/api/feedback_private/log_source_access_manager.h" @@ -45,8 +46,8 @@ namespace feedback_private = api::feedback_private; -using feedback_private::FeedbackInfo; using feedback_private::FeedbackFlow; +using feedback_private::FeedbackInfo; using feedback_private::LogSource; using feedback_private::SystemInformation; @@ -58,24 +59,8 @@ namespace { -constexpr base::FilePath::CharType kBluetoothLogsFilePath[] = - FILE_PATH_LITERAL("/var/log/bluetooth/log.bz2"); -constexpr base::FilePath::CharType kBluetoothLogsFilePathOld[] = - FILE_PATH_LITERAL("/var/log/bluetooth/log.bz2.old"); -constexpr base::FilePath::CharType kBluetoothQualityReportFilePath[] = - FILE_PATH_LITERAL("/var/log/bluetooth/bluetooth_quality_report"); - -constexpr char kBluetoothLogsAttachmentName[] = "bluetooth_logs.bz2"; -constexpr char kBluetoothLogsAttachmentNameOld[] = "bluetooth_logs.old.bz2"; -constexpr char kBluetoothQualityReportAttachmentName[] = - "bluetooth_quality_report"; - constexpr int kChromeLabsAndKaleidoscopeProductId = 5192933; -#if BUILDFLAG(IS_CHROMEOS_ASH) -constexpr char kLacrosHistogramsFilename[] = "lacros_histograms.zip"; -#endif - // Getting the filename of a blob prepends a "C:\fakepath" to the filename. // This is undesirable, strip it if it exists. std::string StripFakepath(const std::string& path) { @@ -99,6 +84,91 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) } +bool IsGoogleInternalAccountEmail(content::BrowserContext* context) { + return gaia::IsGoogleInternalAccountEmail( + ExtensionsAPIClient::Get() + ->GetFeedbackPrivateDelegate() + ->GetSignedInUserEmail(context)); +} + +void SendFeedback(content::BrowserContext* browser_context, + const FeedbackInfo& feedback_info, + base::OnceCallback<void(feedback_private::LandingPageType, + bool)> callback) { + // Populate feedback_params + FeedbackParams feedback_params; + feedback_params.is_internal_email = + IsGoogleInternalAccountEmail(browser_context); + feedback_params.send_histograms = + feedback_info.send_histograms && *feedback_info.send_histograms; + feedback_params.send_bluetooth_logs = + feedback_info.send_bluetooth_logs && *feedback_info.send_bluetooth_logs; + feedback_params.send_tab_titles = + feedback_info.send_tab_titles && *feedback_info.send_tab_titles; + + FeedbackPrivateDelegate* delegate = + ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); + scoped_refptr<FeedbackData> feedback_data = + base::MakeRefCounted<FeedbackData>( + delegate->GetFeedbackUploaderForContext(browser_context), + ContentTracingManager::Get()); + + // Populate feedback data. + feedback_data->set_description(feedback_info.description); + + if (feedback_info.product_id) + feedback_data->set_product_id(*feedback_info.product_id); + if (feedback_info.category_tag) + feedback_data->set_category_tag(*feedback_info.category_tag); + if (feedback_info.page_url) + feedback_data->set_page_url(*feedback_info.page_url); + if (feedback_info.email) + feedback_data->set_user_email(*feedback_info.email); + if (feedback_info.trace_id) + feedback_data->set_trace_id(*feedback_info.trace_id); + + // Note that the blob_uuids are generated in + // renderer/resources/feedback_private_custom_bindings.js + if (feedback_info.attached_file_blob_uuid && + !feedback_info.attached_file_blob_uuid->empty()) { + feedback_data->set_attached_filename( + StripFakepath((*feedback_info.attached_file).name)); + feedback_data->set_attached_file_uuid( + *feedback_info.attached_file_blob_uuid); + } + if (feedback_info.screenshot_blob_uuid && + !feedback_info.screenshot_blob_uuid->empty()) { + feedback_data->set_screenshot_uuid(*feedback_info.screenshot_blob_uuid); + } + +#if BUILDFLAG(IS_CHROMEOS_ASH) + feedback_data->set_from_assistant(feedback_info.from_assistant && + *feedback_info.from_assistant); + feedback_data->set_assistant_debug_info_allowed( + feedback_info.assistant_debug_info_allowed && + *feedback_info.assistant_debug_info_allowed); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + + if (feedback_info.system_information) { + for (SystemInformation& info : *feedback_info.system_information) + feedback_data->AddLog(std::move(info.key), std::move(info.value)); + } + + auto landing_page_type = GetLandingPageType(*feedback_data); + SendFeedbackCallback send_callback = + base::BindOnce(std::move(callback), landing_page_type); + + FeedbackPrivateAPI::GetFactoryInstance() + ->Get(browser_context) + ->GetService() + ->SendFeedback(feedback_params, feedback_data, std::move(send_callback)); +} + +std::string ToFeedbackStatus(bool success) { + return feedback_private::ToString(success ? feedback_private::STATUS_SUCCESS + : feedback_private::STATUS_DELAYED); +} + } // namespace // static @@ -110,17 +180,17 @@ FeedbackPrivateAPI::FeedbackPrivateAPI(content::BrowserContext* context) : browser_context_(context), #if !BUILDFLAG(IS_CHROMEOS_ASH) - service_(new FeedbackService(context)) { + service_(base::MakeRefCounted<FeedbackService>(context)) { #else - service_(new FeedbackService(context)), + service_(base::MakeRefCounted<FeedbackService>(context)), log_source_access_manager_(new LogSourceAccessManager(context)){ #endif // BUILDFLAG(IS_CHROMEOS_ASH) } FeedbackPrivateAPI::~FeedbackPrivateAPI() {} -FeedbackService* FeedbackPrivateAPI::GetService() const { - return service_.get(); +scoped_refptr<FeedbackService> FeedbackPrivateAPI::GetService() const { + return service_; } #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -246,10 +316,7 @@ ExtensionFunction::ResponseAction FeedbackPrivateGetSystemInformationFunction::Run() { - send_all_crash_report_ids_ = gaia::IsGoogleInternalAccountEmail( - ExtensionsAPIClient::Get() - ->GetFeedbackPrivateDelegate() - ->GetSignedInUserEmail(browser_context())); + send_all_crash_report_ids_ = IsGoogleInternalAccountEmail(browser_context()); // Self-deleting object. system_logs::SystemLogsFetcher* fetcher = @@ -328,158 +395,17 @@ feedback_private::SendFeedback::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); - const FeedbackInfo& feedback_info = params->feedback; - - // Populate feedback data. - FeedbackPrivateDelegate* delegate = - ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); - scoped_refptr<FeedbackData> feedback_data = - base::MakeRefCounted<FeedbackData>( - delegate->GetFeedbackUploaderForContext(browser_context()), - ContentTracingManager::Get()); - feedback_data->set_description(feedback_info.description); - - if (feedback_info.product_id) - feedback_data->set_product_id(*feedback_info.product_id); - if (feedback_info.category_tag) - feedback_data->set_category_tag(*feedback_info.category_tag); - if (feedback_info.page_url) - feedback_data->set_page_url(*feedback_info.page_url); - if (feedback_info.email) - feedback_data->set_user_email(*feedback_info.email); - if (feedback_info.trace_id) - feedback_data->set_trace_id(*feedback_info.trace_id); - - if (feedback_info.attached_file_blob_uuid && - !feedback_info.attached_file_blob_uuid->empty()) { - feedback_data->set_attached_filename( - StripFakepath((*feedback_info.attached_file).name)); - feedback_data->set_attached_file_uuid( - *feedback_info.attached_file_blob_uuid); - } - - if (feedback_info.screenshot_blob_uuid && - !feedback_info.screenshot_blob_uuid->empty()) { - feedback_data->set_screenshot_uuid(*feedback_info.screenshot_blob_uuid); - } - -#if BUILDFLAG(IS_CHROMEOS_ASH) - feedback_data->set_from_assistant(feedback_info.from_assistant && - *feedback_info.from_assistant); - feedback_data->set_assistant_debug_info_allowed( - feedback_info.assistant_debug_info_allowed && - *feedback_info.assistant_debug_info_allowed); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - - const bool send_histograms = - feedback_info.send_histograms && *feedback_info.send_histograms; - const bool send_bluetooth_logs = - feedback_info.send_bluetooth_logs && *feedback_info.send_bluetooth_logs; - const bool send_tab_titles = - feedback_info.send_tab_titles && *feedback_info.send_tab_titles; - - if (params->feedback.system_information) { - for (SystemInformation& info : *params->feedback.system_information) - feedback_data->AddLog(std::move(info.key), std::move(info.value)); -#if BUILDFLAG(IS_CHROMEOS_ASH) - delegate->FetchExtraLogs( - feedback_data, - base::BindOnce(&FeedbackPrivateSendFeedbackFunction::OnAshLogsFetched, - this, send_histograms, send_bluetooth_logs, - send_tab_titles)); - return RespondLater(); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - } - - OnAllLogsFetched(send_histograms, send_bluetooth_logs, send_tab_titles, - feedback_data); + SendFeedback( + browser_context(), params->feedback, + base::BindOnce(&FeedbackPrivateSendFeedbackFunction::OnCompleted, this)); return RespondLater(); } -void FeedbackPrivateSendFeedbackFunction::OnAllLogsFetched( - bool send_histograms, - bool send_bluetooth_logs, - bool send_tab_titles, - scoped_refptr<feedback::FeedbackData> feedback_data) { - if (!send_tab_titles) { - feedback_data->RemoveLog( - feedback::FeedbackReport::kMemUsageWithTabTitlesKey); - } - feedback_data->CompressSystemInfo(); - - if (send_histograms) { - std::string histograms = - base::StatisticsRecorder::ToJSON(base::JSON_VERBOSITY_LEVEL_FULL); - feedback_data->SetAndCompressHistograms(std::move(histograms)); - } - - if (send_bluetooth_logs) { - std::string bluetooth_logs; - if (base::ReadFileToString(base::FilePath(kBluetoothLogsFilePath), - &bluetooth_logs)) { - feedback_data->AddFile(kBluetoothLogsAttachmentName, - std::move(bluetooth_logs)); - } - if (base::ReadFileToString(base::FilePath(kBluetoothLogsFilePathOld), - &bluetooth_logs)) { - feedback_data->AddFile(kBluetoothLogsAttachmentNameOld, - std::move(bluetooth_logs)); - } - if (base::ReadFileToString(base::FilePath(kBluetoothQualityReportFilePath), - &bluetooth_logs)) { - feedback_data->AddFile(kBluetoothQualityReportAttachmentName, - std::move(bluetooth_logs)); - } - } - - FeedbackService* service = FeedbackPrivateAPI::GetFactoryInstance() - ->Get(browser_context()) - ->GetService(); - DCHECK(service); - - service->SendFeedback( - feedback_data, - base::BindOnce(&FeedbackPrivateSendFeedbackFunction::OnCompleted, this, - GetLandingPageType(*feedback_data))); -} - -#if BUILDFLAG(IS_CHROMEOS_ASH) -void FeedbackPrivateSendFeedbackFunction::OnAshLogsFetched( - bool send_histograms, - bool send_bluetooth_logs, - bool send_tab_titles, - scoped_refptr<feedback::FeedbackData> feedback_data) { - FeedbackPrivateDelegate* feedback_private_delegate = - ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); - feedback_private_delegate->GetLacrosHistograms(base::BindOnce( - &FeedbackPrivateSendFeedbackFunction::OnLacrosHistogramsFetched, this, - send_histograms, send_bluetooth_logs, send_tab_titles, feedback_data)); -} - -void FeedbackPrivateSendFeedbackFunction::OnLacrosHistogramsFetched( - bool send_histograms, - bool send_bluetooth_logs, - bool send_tab_titles, - scoped_refptr<feedback::FeedbackData> feedback_data, - const std::string& compressed_histograms) { - // Attach lacros histogram to feedback data. - if (!compressed_histograms.empty()) { - feedback_data->AddFile(kLacrosHistogramsFilename, - std::move(compressed_histograms)); - } - - OnAllLogsFetched(send_histograms, send_bluetooth_logs, send_tab_titles, - feedback_data); -} -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - void FeedbackPrivateSendFeedbackFunction::OnCompleted( api::feedback_private::LandingPageType type, bool success) { - Respond(TwoArguments(base::Value(feedback_private::ToString( - success ? feedback_private::STATUS_SUCCESS - : feedback_private::STATUS_DELAYED)), + Respond(TwoArguments(base::Value(ToFeedbackStatus(success)), base::Value(feedback_private::ToString(type)))); if (!success) { ExtensionsAPIClient::Get()
diff --git a/extensions/browser/api/feedback_private/feedback_private_api.h b/extensions/browser/api/feedback_private/feedback_private_api.h index 44dfa8d..bb666ddb 100644 --- a/extensions/browser/api/feedback_private/feedback_private_api.h +++ b/extensions/browser/api/feedback_private/feedback_private_api.h
@@ -16,10 +16,6 @@ #include "extensions/common/api/feedback_private.h" #include "ui/gfx/geometry/rect.h" -namespace feedback { -class FeedbackData; -} // namespace feedback - namespace extensions { #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -31,7 +27,7 @@ explicit FeedbackPrivateAPI(content::BrowserContext* context); ~FeedbackPrivateAPI() override; - FeedbackService* GetService() const; + scoped_refptr<FeedbackService> GetService() const; #if BUILDFLAG(IS_CHROMEOS_ASH) LogSourceAccessManager* GetLogSourceAccessManager() const; @@ -64,8 +60,8 @@ GetFactoryInstance(); // Use a custom FeedbackService implementation for tests. - void SetFeedbackServiceForTesting(std::unique_ptr<FeedbackService> service) { - service_ = std::move(service); + void SetFeedbackServiceForTesting(scoped_refptr<FeedbackService> service) { + service_ = service; } private: @@ -77,7 +73,7 @@ static const bool kServiceHasOwnInstanceInIncognito = true; content::BrowserContext* const browser_context_; - std::unique_ptr<FeedbackService> service_; + scoped_refptr<FeedbackService> service_; #if BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<LogSourceAccessManager> log_source_access_manager_; @@ -158,26 +154,7 @@ protected: ~FeedbackPrivateSendFeedbackFunction() override {} ResponseAction Run() override; - - private: - void OnAllLogsFetched(bool send_histograms, - bool send_bluetooth_logs, - bool send_tab_titles, - scoped_refptr<feedback::FeedbackData> feedback_data); void OnCompleted(api::feedback_private::LandingPageType type, bool success); - -#if BUILDFLAG(IS_CHROMEOS_ASH) - void OnAshLogsFetched(bool send_histograms, - bool send_bluetooth_logs, - bool send_tab_titles, - scoped_refptr<feedback::FeedbackData> feedback_data); - void OnLacrosHistogramsFetched( - bool send_histograms, - bool send_bluetooth_logs, - bool send_tab_titles, - scoped_refptr<feedback::FeedbackData> feedback_data, - const std::string& compressed_histograms); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) }; class FeedbackPrivateLoginFeedbackCompleteFunction : public ExtensionFunction {
diff --git a/extensions/browser/api/feedback_private/feedback_private_api_chromeos_unittest.cc b/extensions/browser/api/feedback_private/feedback_private_api_chromeos_unittest.cc index 4ab4441..d7b35e2 100644 --- a/extensions/browser/api/feedback_private/feedback_private_api_chromeos_unittest.cc +++ b/extensions/browser/api/feedback_private/feedback_private_api_chromeos_unittest.cc
@@ -12,6 +12,7 @@ #include "base/test/values_test_util.h" #include "base/values.h" #include "extensions/browser/api/feedback_private/feedback_private_api_unittest_base_chromeos.h" +#include "extensions/browser/api/feedback_private/feedback_service.h" #include "extensions/browser/api/feedback_private/log_source_access_manager.h" #include "extensions/browser/api/feedback_private/mock_feedback_service.h" #include "extensions/common/value_builder.h" @@ -60,7 +61,7 @@ FeedbackPrivateAPI::GetFactoryInstance() ->Get(browser_context()) ->SetFeedbackServiceForTesting( - std::make_unique<FeedbackService>(browser_context())); + base::MakeRefCounted<FeedbackService>(browser_context())); FeedbackPrivateApiUnittestBase::TearDown(); } @@ -119,37 +120,56 @@ // Runs the feedbackPrivate.sendFeedback() function. See API function // definition for argument descriptions. - // - // The API function is expected to complete successfully. - testing::AssertionResult RunSendFeedbackFunction( - const Params& params, - FeedbackCommon::SystemLogsMap* logs) { - auto mock = std::make_unique<MockFeedbackService>(browser_context()); + scoped_refptr<FeedbackData> RunSendFeedbackFunction( + const std::string& args, // The payload that comes from client + const FeedbackParams& expected_params) { + base::Value values = base::test::ParseJson(args); + EXPECT_TRUE(values.is_list()); + + std::unique_ptr<api::feedback_private::SendFeedback::Params> params = + api::feedback_private::SendFeedback::Params::Create( + base::Value::AsListValue(values)); + EXPECT_TRUE(params); scoped_refptr<FeedbackData> actual_feedback_data; - EXPECT_CALL(*mock, SendFeedback(_, _)) - .WillOnce([&](scoped_refptr<FeedbackData> feedback_data, - FeedbackService::SendFeedbackCallback callback) { - actual_feedback_data = std::move(feedback_data); + SetupMockFeedbackService(expected_params, actual_feedback_data); + + auto function = base::MakeRefCounted<FeedbackPrivateSendFeedbackFunction>(); + + std::unique_ptr<base::Value> result_value = + RunFunctionAndReturnValue(function.get(), args); + EXPECT_TRUE(result_value); + + return actual_feedback_data; + } + + void SetupMockFeedbackService( + const FeedbackParams& expected_params, + scoped_refptr<FeedbackData>& actual_feedback_data) { + auto mock = base::MakeRefCounted<MockFeedbackService>(browser_context()); + + // scoped_refptr<FeedbackData> actual_feedback_data; + EXPECT_CALL(*mock, SendFeedback(_, _, _)) + .WillOnce([&](const FeedbackParams& params, + scoped_refptr<FeedbackData> feedback_data, + SendFeedbackCallback callback) { + // Pass the feedback data out to verify its properties + actual_feedback_data = feedback_data; + // Verify that the flags in params are set correctly + EXPECT_EQ(expected_params.is_internal_email, + params.is_internal_email); + EXPECT_EQ(expected_params.send_tab_titles, params.send_tab_titles); + EXPECT_EQ(expected_params.send_histograms, params.send_histograms); + EXPECT_EQ(expected_params.send_bluetooth_logs, + params.send_bluetooth_logs); + std::move(callback).Run(true); }); FeedbackPrivateAPI::GetFactoryInstance() ->Get(browser_context()) ->SetFeedbackServiceForTesting( - static_cast<std::unique_ptr<FeedbackService>>(std::move(mock))); - - auto function = base::MakeRefCounted<FeedbackPrivateSendFeedbackFunction>(); - - std::unique_ptr<base::Value> result_value = RunFunctionAndReturnValue( - function.get(), ParamsToJSON(params.feedback)); - if (!result_value) { - return testing::AssertionFailure() << "No result"; - } - - *logs = *actual_feedback_data->sys_info(); - - return testing::AssertionSuccess(); + static_cast<scoped_refptr<FeedbackService>>(std::move(mock))); } private: @@ -391,46 +411,107 @@ RunReadLogSourceFunction(params, &result_reader_id, &result_string)); } -TEST_F(FeedbackPrivateApiUnittest, SendFeedbackWithTabTitles) { - base::Value values = base::test::ParseJson(R"([ - { - "description": "words", - "sendTabTitles": true, - "systemInformation": [ - {"key": "mem_usage_with_title", "value": "some sensitive info"} - ] - } - ])"); - ASSERT_TRUE(values.is_list()); +TEST_F(FeedbackPrivateApiUnittest, SendFeedbackWithSysInfo) { + const std::string args = R"([ + { + "attachedFile": { + "data": {}, + "name": "C:\\fakepath\\chrome_40px.svg" + }, + "assistantDebugInfoAllowed": true, + "attachedFileBlobUuid": "2e3996de-db9e-4c3d-b62c-80d19b6418b9", + "categoryTag": "test-tag", + "description": "test-desc", + "descriptionPlaceholder": "", + "email": "tester@test.com", + "flow": "regular", + "fromAssistant": true, + "includeBluetoothLogs": true, + "pageUrl": "https://test.com", + "productId": 1122, + "screenshot": {}, + "screenshotBlobUuid": "3e72cc3c-550f-49f0-b5d2-bf21f3fbab15", + "sendBluetoothLogs": true, + "sendHistograms": true, + "sendTabTitles": true, + "systemInformation": [ + {"key": "mem_usage_with_title", "value": "some sensitive info"} + ], + "traceId": 9966, + "useSystemWindowFrame": false + } +])"; - std::unique_ptr<Params> params = - Params::Create(base::Value::AsListValue(values)); - ASSERT_TRUE(params); + const FeedbackParams expected_params{/*is_internal_email=*/false, + /*send_tab_titles=*/true, + /*send_histograms=*/true, + /*send_bluetooth_logs=*/true}; + auto feedback_data = RunSendFeedbackFunction(args, expected_params); - FeedbackCommon::SystemLogsMap logs; - EXPECT_TRUE(RunSendFeedbackFunction(*params, &logs)); - EXPECT_TRUE(base::Contains(logs, "mem_usage_with_title")); + EXPECT_EQ(9966, feedback_data->trace_id()); + EXPECT_EQ(1122, feedback_data->product_id()); + EXPECT_EQ("chrome_40px.svg", feedback_data->attached_filename()); + EXPECT_EQ("test-desc", feedback_data->description()); + EXPECT_EQ("test-tag", feedback_data->category_tag()); + EXPECT_EQ("tester@test.com", feedback_data->user_email()); + EXPECT_EQ("2e3996de-db9e-4c3d-b62c-80d19b6418b9", + feedback_data->attached_file_uuid()); + EXPECT_EQ("3e72cc3c-550f-49f0-b5d2-bf21f3fbab15", + feedback_data->screenshot_uuid()); + EXPECT_EQ("https://test.com", feedback_data->page_url()); + + EXPECT_TRUE(feedback_data->from_assistant()); + EXPECT_TRUE(feedback_data->assistant_debug_info_allowed()); + EXPECT_TRUE(feedback_data->sys_info()); + EXPECT_TRUE(feedback_data->sys_info()->count("mem_usage_with_title")); } -TEST_F(FeedbackPrivateApiUnittest, SendFeedbackWithoutTabTitles) { - base::Value values = base::test::ParseJson(R"([ - { - "description": "words", - "sendTabTitles": false, - "systemInformation": [ - {"key": "mem_usage_with_title", "value": "some sensitive info"} - ] - } - ])"); - ASSERT_TRUE(values.is_list()); +TEST_F(FeedbackPrivateApiUnittest, SendFeedbackWithoutSysInfo) { + const std::string args = R"([ + { + "attachedFile": { + "data": {}, + "name":"" + }, + "assistantDebugInfoAllowed": false, + "categoryTag": "", + "description": "test-desc", + "descriptionPlaceholder": "", + "email": "", + "flow": "regular", + "fromAssistant": false, + "includeBluetoothLogs": false, + "pageUrl": "", + "screenshot": {}, + "screenshotBlobUuid": "", + "sendBluetoothLogs": false, + "sendHistograms": false, + "sendTabTitles": false, + "systemInformation": [], + "useSystemWindowFrame": false + } +])"; - std::unique_ptr<Params> params = - Params::Create(base::Value::AsListValue(values)); - ASSERT_TRUE(params); + const FeedbackParams expected_params{/*is_internal_email=*/false, + /*send_tab_titles=*/false, + /*send_histograms=*/false, + /*send_bluetooth_logs=*/false}; + auto feedback_data = RunSendFeedbackFunction(args, expected_params); - FeedbackCommon::SystemLogsMap logs; - EXPECT_TRUE(RunSendFeedbackFunction(*params, &logs)); - EXPECT_FALSE(base::Contains(logs, "mem_usage_with_title")); + EXPECT_EQ(0, feedback_data->trace_id()); + EXPECT_EQ(-1, feedback_data->product_id()); + EXPECT_EQ("", feedback_data->attached_filename()); + EXPECT_EQ("test-desc", feedback_data->description()); + EXPECT_EQ("", feedback_data->category_tag()); + EXPECT_EQ("", feedback_data->user_email()); + EXPECT_EQ("", feedback_data->attached_file_uuid()); + EXPECT_EQ("", feedback_data->screenshot_uuid()); + EXPECT_EQ("", feedback_data->page_url()); + + EXPECT_FALSE(feedback_data->from_assistant()); + EXPECT_FALSE(feedback_data->assistant_debug_info_allowed()); + EXPECT_TRUE(feedback_data->sys_info()); + EXPECT_FALSE(feedback_data->sys_info()->count("mem_usage_with_title")); } } // namespace extensions
diff --git a/extensions/browser/api/feedback_private/feedback_service.cc b/extensions/browser/api/feedback_private/feedback_service.cc index c420934e6..60f1229 100644 --- a/extensions/browser/api/feedback_private/feedback_service.cc +++ b/extensions/browser/api/feedback_private/feedback_service.cc
@@ -10,57 +10,90 @@ #include "base/barrier_closure.h" #include "base/bind.h" -#include "base/callback.h" -#include "base/memory/weak_ptr.h" -#include "base/strings/string_number_conversions.h" +#include "base/logging.h" +#include "base/memory/ref_counted.h" +#include "base/metrics/statistics_recorder.h" +#include "base/time/time.h" #include "build/chromeos_buildflags.h" +#include "components/feedback/feedback_data.h" +#include "components/feedback/feedback_report.h" +#include "components/feedback/system_logs/system_logs_fetcher.h" +#include "components/feedback/system_logs/system_logs_source.h" #include "content/public/browser/browser_context.h" -#include "content/public/browser/browser_thread.h" +#include "extensions/browser/api/extensions_api_client.h" +#include "extensions/browser/api/feedback_private/feedback_private_delegate.h" #include "extensions/browser/blob_reader.h" -#include "extensions/browser/extensions_browser_client.h" #include "net/base/network_change_notifier.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/public/cpp/assistant/controller/assistant_controller.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" -#include "extensions/browser/api/feedback_private/log_source_access_manager.h" -#include "mojo/public/cpp/bindings/remote.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) namespace extensions { +using system_logs::SysLogsFetcherCallback; +using system_logs::SystemLogsFetcher; +using system_logs::SystemLogsResponse; + +namespace { + +constexpr base::FilePath::CharType kBluetoothLogsFilePath[] = + FILE_PATH_LITERAL("/var/log/bluetooth/log.bz2"); +constexpr base::FilePath::CharType kBluetoothLogsFilePathOld[] = + FILE_PATH_LITERAL("/var/log/bluetooth/log.bz2.old"); +constexpr base::FilePath::CharType kBluetoothQualityReportFilePath[] = + FILE_PATH_LITERAL("/var/log/bluetooth/bluetooth_quality_report"); + +constexpr char kBluetoothLogsAttachmentName[] = "bluetooth_logs.bz2"; +constexpr char kBluetoothLogsAttachmentNameOld[] = "bluetooth_logs.old.bz2"; +constexpr char kBluetoothQualityReportAttachmentName[] = + "bluetooth_quality_report"; + +#if BUILDFLAG(IS_CHROMEOS_ASH) +constexpr char kLacrosHistogramsFilename[] = "lacros_histograms.zip"; +#endif + +} // namespace + FeedbackService::FeedbackService(content::BrowserContext* browser_context) : browser_context_(browser_context) {} FeedbackService::~FeedbackService() = default; void FeedbackService::SendFeedback( + const FeedbackParams& params, scoped_refptr<feedback::FeedbackData> feedback_data, SendFeedbackCallback callback) { auto* browser_client = ExtensionsBrowserClient::Get(); feedback_data->set_locale(browser_client->GetApplicationLocale()); feedback_data->set_user_agent(browser_client->GetUserAgent()); - // CompleteSendFeedback must be called once the attached file and screenshot - // have been read, if applicable. The barrier closure will call this when its - // count of remaining tasks has been reduced to zero (immediately, if none are - // there in the first place). + FetchAttachedFileAndScreenshot( + feedback_data, + base::BindOnce(&FeedbackService::OnAttachedFileAndScreenshotFetched, this, + params, feedback_data, std::move(callback))); +} + +void FeedbackService::FetchAttachedFileAndScreenshot( + scoped_refptr<feedback::FeedbackData> feedback_data, + base::OnceClosure callback) { const bool must_attach_file = !feedback_data->attached_file_uuid().empty(); const bool must_attach_screenshot = !feedback_data->screenshot_uuid().empty(); auto barrier_closure = base::BarrierClosure( (must_attach_file ? 1 : 0) + (must_attach_screenshot ? 1 : 0), - base::BindOnce(&FeedbackService::CompleteSendFeedback, AsWeakPtr(), - feedback_data, std::move(callback))); + std::move(callback)); if (must_attach_file) { auto populate_attached_file = base::BindOnce( [](scoped_refptr<feedback::FeedbackData> feedback_data, - std::unique_ptr<std::string> data, int64_t /* total_blob_length */) { + std::unique_ptr<std::string> data, int64_t length) { feedback_data->set_attached_file_uuid(std::string()); if (data) feedback_data->AttachAndCompressFileData(std::move(*data)); }, feedback_data); + BlobReader::Read(browser_context_, feedback_data->attached_file_uuid(), std::move(populate_attached_file).Then(barrier_closure)); } @@ -68,7 +101,7 @@ if (must_attach_screenshot) { auto populate_screenshot = base::BindOnce( [](scoped_refptr<feedback::FeedbackData> feedback_data, - std::unique_ptr<std::string> data, int64_t /* total_blob_length */) { + std::unique_ptr<std::string> data, int64_t length) { feedback_data->set_screenshot_uuid(std::string()); if (data) feedback_data->set_image(std::move(*data)); @@ -79,16 +112,91 @@ } } -void FeedbackService::CompleteSendFeedback( +void FeedbackService::OnAttachedFileAndScreenshotFetched( + const FeedbackParams& params, scoped_refptr<feedback::FeedbackData> feedback_data, SendFeedbackCallback callback) { - // A particular data collection is considered completed if, - // a.) The blob URL is invalid - this will either happen because we never had - // a URL and never needed to read this data, or that the data read failed - // and we set it to invalid in the data read callback. - // b.) The associated data object exists, meaning that the data has been read - // and the read callback has updated the associated data on the feedback - // object. +#if BUILDFLAG(IS_CHROMEOS_ASH) + FetchExtraLogs(feedback_data, + base::BindOnce(&FeedbackService::OnExtraLogsFetched, this, + params, std::move(callback))); +#else + OnAllLogsFetched(params, feedback_data, std::move(callback)); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) +} + +#if BUILDFLAG(IS_CHROMEOS_ASH) +void FeedbackService::FetchExtraLogs( + scoped_refptr<feedback::FeedbackData> feedback_data, + FetchExtraLogsCallback callback) { + FeedbackPrivateDelegate* feedback_private_delegate = + ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); + feedback_private_delegate->FetchExtraLogs(feedback_data, std::move(callback)); +} + +void FeedbackService::OnExtraLogsFetched( + const FeedbackParams& params, + SendFeedbackCallback callback, + scoped_refptr<feedback::FeedbackData> feedback_data) { + FetchLacrosHistograms( + base::BindOnce(&FeedbackService::OnLacrosHistogramsFetched, this, params, + feedback_data, std::move(callback))); +} + +void FeedbackService::FetchLacrosHistograms(GetHistogramsCallback callback) { + FeedbackPrivateDelegate* feedback_private_delegate = + ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); + feedback_private_delegate->GetLacrosHistograms(std::move(callback)); +} + +void FeedbackService::OnLacrosHistogramsFetched( + const FeedbackParams& params, + scoped_refptr<feedback::FeedbackData> feedback_data, + SendFeedbackCallback callback, + const std::string& compressed_histograms) { + if (!compressed_histograms.empty()) { + feedback_data->AddFile(kLacrosHistogramsFilename, + std::move(compressed_histograms)); + } + OnAllLogsFetched(params, feedback_data, std::move(callback)); +} +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + +void FeedbackService::OnAllLogsFetched( + const FeedbackParams& params, + scoped_refptr<feedback::FeedbackData> feedback_data, + SendFeedbackCallback callback) { + if (!params.send_tab_titles) { + feedback_data->RemoveLog( + feedback::FeedbackReport::kMemUsageWithTabTitlesKey); + } + feedback_data->CompressSystemInfo(); + + if (params.send_histograms) { + std::string histograms = + base::StatisticsRecorder::ToJSON(base::JSON_VERBOSITY_LEVEL_FULL); + feedback_data->SetAndCompressHistograms(std::move(histograms)); + } + + if (params.send_bluetooth_logs) { + std::string bluetooth_logs; + if (base::ReadFileToString(base::FilePath(kBluetoothLogsFilePath), + &bluetooth_logs)) { + feedback_data->AddFile(kBluetoothLogsAttachmentName, + std::move(bluetooth_logs)); + } + if (base::ReadFileToString(base::FilePath(kBluetoothLogsFilePathOld), + &bluetooth_logs)) { + feedback_data->AddFile(kBluetoothLogsAttachmentNameOld, + std::move(bluetooth_logs)); + } + if (base::ReadFileToString(base::FilePath(kBluetoothQualityReportFilePath), + &bluetooth_logs)) { + feedback_data->AddFile(kBluetoothQualityReportAttachmentName, + std::move(bluetooth_logs)); + } + } + DCHECK(feedback_data->attached_file_uuid().empty()); DCHECK(feedback_data->screenshot_uuid().empty()); @@ -105,12 +213,10 @@ // filled - the object will manage sending of the actual report. feedback_data->OnFeedbackPageDataComplete(); - // Sending the feedback will be delayed if the user is offline. - const bool result = !net::NetworkChangeNotifier::IsOffline(); - - // TODO(rkc): Change this once we have FeedbackData/Util refactored to - // report the status of the report being sent. - std::move(callback).Run(result); + // True means report will be sent shortly. + // False means report will be sent once the device is online. + const bool status = !net::NetworkChangeNotifier::IsOffline(); + std::move(callback).Run(status); } } // namespace extensions
diff --git a/extensions/browser/api/feedback_private/feedback_service.h b/extensions/browser/api/feedback_private/feedback_service.h index fdf5e9f..d75dc5bb 100644 --- a/extensions/browser/api/feedback_private/feedback_service.h +++ b/extensions/browser/api/feedback_private/feedback_service.h
@@ -5,46 +5,90 @@ #ifndef EXTENSIONS_BROWSER_API_FEEDBACK_PRIVATE_FEEDBACK_SERVICE_H_ #define EXTENSIONS_BROWSER_API_FEEDBACK_PRIVATE_FEEDBACK_SERVICE_H_ -#include <stdint.h> +#include "base/bind.h" +#include "base/memory/ref_counted.h" +#include "base/metrics/histogram_base.h" +#include "base/metrics/histogram_functions.h" +#include "base/time/time.h" +#include "build/chromeos_buildflags.h" +#include "components/feedback/system_logs/system_logs_fetcher.h" +#include "extensions/browser/api/feedback_private/feedback_private_delegate.h" -#include "base/callback.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "components/feedback/feedback_data.h" - -namespace content { -class BrowserContext; -} // namespace content +namespace feedback { +class FeedbackData; +} // namespace feedback namespace extensions { +// The FeedbackParams holds parameters specific to a feedback report. +struct FeedbackParams { + // The user has a @google.com email or not. + bool is_internal_email = false; + // If true, include the browser tab titles in the feedback. + bool send_tab_titles = false; + // If true, include histograms in the feedback. + bool send_histograms = false; + // If true, include bluetooth logs in the feedback. + bool send_bluetooth_logs = false; +}; + +// Callback invoked when the feedback report is ready to be sent. +// True will be passed to indicate that it is being successfully sent now, +// and false to indicate that it will be delayed due to being offline. +using SendFeedbackCallback = base::OnceCallback<void(bool)>; + // The feedback service provides the ability to gather the various pieces of // data needed to send a feedback report and then send the report once all // the pieces are available. -class FeedbackService : public base::SupportsWeakPtr<FeedbackService> { +class FeedbackService : public base::RefCountedThreadSafe<FeedbackService> { public: - // Callback invoked when the feedback report is ready to be sent. - // True will be passed to indicate that it is being successfully sent now, - // and false to indicate that it will be delayed (usually due to being - // offline). - using SendFeedbackCallback = base::OnceCallback<void(bool)>; - explicit FeedbackService(content::BrowserContext* browser_context); + FeedbackService(const FeedbackService&) = delete; + FeedbackService& operator=(const FeedbackService&) = delete; + + virtual void SendFeedback(const FeedbackParams& params, + scoped_refptr<feedback::FeedbackData> feedback_data, + SendFeedbackCallback callback); + + protected: virtual ~FeedbackService(); - // Sends a feedback report. - virtual void SendFeedback(scoped_refptr<feedback::FeedbackData> feedback_data, - SendFeedbackCallback callback); - private: - // Checks if we have read all the blobs we need to; signals the feedback - // data object once all the requisite data has been populated. - void CompleteSendFeedback(scoped_refptr<feedback::FeedbackData> feedback_data, - SendFeedbackCallback callback); + friend class base::RefCountedThreadSafe<FeedbackService>; + + void FetchAttachedFileAndScreenshot( + scoped_refptr<feedback::FeedbackData> feedback_data, + base::OnceClosure callback); + void OnAttachedFileAndScreenshotFetched( + const FeedbackParams& params, + scoped_refptr<feedback::FeedbackData> feedback_data, + SendFeedbackCallback callback); +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Gets logs that aren't covered by FetchSystemInformation, but should be + // included in the feedback report. These currently consist of the Intel Wi-Fi + // debug logs (if they exist). + // Modifies |feedback_data| and passes it on to |callback|. + void FetchExtraLogs(scoped_refptr<feedback::FeedbackData> feedback_data, + FetchExtraLogsCallback callback); + void OnExtraLogsFetched(const FeedbackParams& params, + SendFeedbackCallback callback, + scoped_refptr<feedback::FeedbackData> feedback_data); + + using GetHistogramsCallback = base::OnceCallback<void(const std::string&)>; + // Gets Lacros histograms in zip compressed format which will be attached + // as a file in unified feedback report. + void FetchLacrosHistograms(GetHistogramsCallback callback); + void OnLacrosHistogramsFetched( + const FeedbackParams& params, + scoped_refptr<feedback::FeedbackData> feedback_data, + SendFeedbackCallback callback, + const std::string& compressed_histograms); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + void OnAllLogsFetched(const FeedbackParams& params, + scoped_refptr<feedback::FeedbackData> feedback_data, + SendFeedbackCallback callback); content::BrowserContext* browser_context_; - - DISALLOW_COPY_AND_ASSIGN(FeedbackService); }; } // namespace extensions
diff --git a/extensions/browser/api/feedback_private/mock_feedback_service.h b/extensions/browser/api/feedback_private/mock_feedback_service.h index 9fac573..47f5b3c 100644 --- a/extensions/browser/api/feedback_private/mock_feedback_service.h +++ b/extensions/browser/api/feedback_private/mock_feedback_service.h
@@ -5,6 +5,7 @@ #ifndef EXTENSIONS_BROWSER_API_FEEDBACK_PRIVATE_MOCK_FEEDBACK_SERVICE_H_ #define EXTENSIONS_BROWSER_API_FEEDBACK_PRIVATE_MOCK_FEEDBACK_SERVICE_H_ +#include "base/memory/ref_counted.h" #include "extensions/browser/api/feedback_private/feedback_service.h" #include "testing/gmock/include/gmock/gmock.h" @@ -13,11 +14,17 @@ class MockFeedbackService : public FeedbackService { public: explicit MockFeedbackService(content::BrowserContext* browser_context); - virtual ~MockFeedbackService(); - MOCK_METHOD2(SendFeedback, - void(scoped_refptr<feedback::FeedbackData>, - FeedbackService::SendFeedbackCallback)); + MOCK_METHOD(void, + SendFeedback, + (const FeedbackParams&, + scoped_refptr<feedback::FeedbackData>, + SendFeedbackCallback), + (override)); + + private: + friend class base::RefCountedThreadSafe<MockFeedbackService>; + ~MockFeedbackService() override; }; } // namespace extensions
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index 2c2e9c7..dcc4728 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -432,13 +432,6 @@ } VLOG(1) << "Num tracked contexts: " << script_context_set_->size(); - - ExtensionFrameHelper* frame_helper = - ExtensionFrameHelper::Get(content::RenderFrame::FromWebFrame(frame)); - if (!frame_helper) - return; // The frame is invisible to extensions. - - frame_helper->set_did_create_script_context(); } void Dispatcher::DidInitializeServiceWorkerContextOnWorkerThread(
diff --git a/extensions/renderer/extension_frame_helper.cc b/extensions/renderer/extension_frame_helper.cc index 1bde0ce..c34886d6 100644 --- a/extensions/renderer/extension_frame_helper.cc +++ b/extensions/renderer/extension_frame_helper.cc
@@ -45,9 +45,6 @@ // Returns true if the render frame corresponding with |frame_helper| matches // the given criteria. -// -// We deliberately do not access any methods that require a v8::Context or -// ScriptContext. See also comment below. bool RenderFrameMatches(const ExtensionFrameHelper* frame_helper, mojom::ViewType match_view_type, int match_window_id, @@ -78,16 +75,7 @@ frame_helper->tab_id() != match_tab_id) return false; - // Returning handles to frames that haven't created a script context yet - // can result in the caller "forcing" a script context (by accessing - // properties on the window object). This, in turn, can cause the script - // context to be initialized prematurely, with invalid values (e.g., the - // inability to retrieve a valid URL from the frame). That then leads to - // the ScriptContext being misclassified. - // Don't return any frames until they have a valid ScriptContext to limit - // the chances for bindings to prematurely initialize these contexts. - // This speculatively fixes https://crbug.com/1021014. - return frame_helper->did_create_script_context(); + return true; } // Runs every callback in |callbacks_to_be_run_and_cleared| while |frame_helper|
diff --git a/extensions/renderer/extension_frame_helper.h b/extensions/renderer/extension_frame_helper.h index a3d24537..4580ff93 100644 --- a/extensions/renderer/extension_frame_helper.h +++ b/extensions/renderer/extension_frame_helper.h
@@ -116,9 +116,6 @@ const std::string& script_id, const GURL& url) override; - void set_did_create_script_context() { did_create_script_context_ = true; } - bool did_create_script_context() const { return did_create_script_context_; } - // Called when the document element has been inserted in this frame. This // method may invoke untrusted JavaScript code that invalidate the frame and // this ExtensionFrameHelper. @@ -214,8 +211,6 @@ // navigation happens, it is either the initial one or a reload. bool has_started_first_navigation_ = false; - bool did_create_script_context_ = false; - mojo::AssociatedRemote<mojom::LocalFrameHost> local_frame_host_remote_; mojo::AssociatedReceiver<mojom::LocalFrame> local_frame_receiver_{this};
diff --git a/extensions/renderer/resources/app_window_custom_bindings.js b/extensions/renderer/resources/app_window_custom_bindings.js index 3e4168b..5df0aca6 100644 --- a/extensions/renderer/resources/app_window_custom_bindings.js +++ b/extensions/renderer/resources/app_window_custom_bindings.js
@@ -180,21 +180,11 @@ apiFunctions.setHandleRequest('getAll', function() { var views = runtimeNatives.GetExtensionViews(-1, -1, 'APP_WINDOW'); - - views = $Array.filter(views, (w) => { - if (!w.chrome.app.window.current()) { - // Even though the script context has been created, the initialization - // hasn't finished. chrome.app.window.current() is based upon the - // completion of the app.window.create() callback, and it's possible - // this is called before that. - // Treat not-fully-initialized windows as invisible; the app can query - // them once the callback for app.window.create() is fired (which is - // in-line with API expectations). - // See https://crbug.com/1021014. - return false; - } - return true; - }); + // In certain corner cases, renderers may not load correctly, and are + // missing the chrome.app bindings. Filter these views out so that the next + // lines don't crash. + // See https://crbug.com/1021014. + views = $Array.filter(views, (w) => w.chrome.app); return $Array.map(views, function(win) { return win.chrome.app.window.current(); });
diff --git a/fuchsia/runners/cast/cast_runner.cc b/fuchsia/runners/cast/cast_runner.cc index b58ebff..51fd4f3 100644 --- a/fuchsia/runners/cast/cast_runner.cc +++ b/fuchsia/runners/cast/cast_runner.cc
@@ -625,8 +625,6 @@ absl::optional<fuchsia::web::CreateContextParams> CastRunner::GetContextParamsForAppConfig( chromium::cast::ApplicationConfig* app_config) { - absl::optional<fuchsia::web::CreateContextParams> params; - if (IsAppConfigForCastStreaming(*app_config)) { // TODO(crbug.com/1082821): Remove this once the CastStreamingReceiver // Component has been implemented.
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 2b2194f..9666e160 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -550,10 +550,10 @@ You won't be signed out of your Google Account. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK">BEGIN_LINK</ph>history.google.com<ph name="END_LINK">END_LINK</ph>. </message> <message name="IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_GOOGLE_DSE" desc="Footer message in the settings to clear browsing data that informs the user they can seperately delete their search history and/or other account info at the 2 links provided."> - <ph name="BEGIN_LINK">BEGIN_LINK</ph>Search history<ph name="END_LINK">END_LINK</ph> and <ph name="BEGIN_LINK">BEGIN_LINK</ph>other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account when you’re signed in. You can delete them at any time. + <ph name="BEGIN_LINK">BEGIN_LINK</ph>Search history<ph name="END_LINK">END_LINK</ph> and <ph name="BEGIN_LINK">BEGIN_LINK</ph>other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account when you’re signed in. You can delete them anytime. </message> <message name="IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_KNOWN_DSE_SIGNED_IN" desc="Footer message in the settings to clear browsing data that informs a signed in user that they will need to look up instructions to delete their search history from their DSE, as well as that they won't be signed out and where to delete other account data."> - You won't be signed out of your Google Account. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account when you’re signed in. You can delete them at any time. + You won't be signed out of your Google Account. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account when you’re signed in. You can delete them anytime. Your search engine is <ph name="DSE_NAME">$1<ex>DuckDuckGo</ex></ph>. See their instructions for deleting your search history, if applicable. @@ -562,7 +562,7 @@ Your search engine is <ph name="DSE_NAME">$1<ex>DuckDuckGo</ex></ph>. See their instructions for deleting your search history, if applicable. </message> <message name="IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_UNKOWN_DSE_SIGNED_IN" desc="Footer message in the settings to clear browsing data that informs a signed in user that they will need to look up instructions to delete their search history from a DSE that is not well known to Google, as well as that they won't be signed out and where to delete other account data."> - You won't be signed out of your Google Account. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account when you’re signed in. You can delete them at any time. + You won't be signed out of your Google Account. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Other forms of activity<ph name="END_LINK">END_LINK</ph> may be saved in your Google Account when you’re signed in. You can delete them anytime. See your search engine’s instructions for deleting your search history, if applicable.
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_GOOGLE_DSE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_GOOGLE_DSE.png.sha1 index 9345ce0..4e389b3 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_GOOGLE_DSE.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_GOOGLE_DSE.png.sha1
@@ -1 +1 @@ -8c36a76fc84751b1484225cbbc9d8a357dca7ec2 \ No newline at end of file +d32fef4e4a4f5d390ccb258bbbf08da52a8c3418 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_KNOWN_DSE_SIGNED_IN.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_KNOWN_DSE_SIGNED_IN.png.sha1 index ea99541..6d80298 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_KNOWN_DSE_SIGNED_IN.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_KNOWN_DSE_SIGNED_IN.png.sha1
@@ -1 +1 @@ -ead95f55c7ae20ffb2572c23926b0dd02a8fbd3b \ No newline at end of file +fa681c59f8d485b1843318338c1fe4f387ee70f0 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_UNKOWN_DSE_SIGNED_IN.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_UNKOWN_DSE_SIGNED_IN.png.sha1 index 9428ae3..64a4ea2c 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_UNKOWN_DSE_SIGNED_IN.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_UNKOWN_DSE_SIGNED_IN.png.sha1
@@ -1 +1 @@ -88bb6aa2c6e0faed414d9174c07d692c93b6d691 \ No newline at end of file +02edcdba1b678bc2fd3e4060353ebbbdd7d454a4 \ No newline at end of file
diff --git a/ios/chrome/browser/flags/about_flags.h b/ios/chrome/browser/flags/about_flags.h index a7c5306..48e3c6d7 100644 --- a/ios/chrome/browser/flags/about_flags.h +++ b/ios/chrome/browser/flags/about_flags.h
@@ -12,11 +12,11 @@ #include <string> #include <vector> +#include "base/values.h" #include "components/flags_ui/flags_state.h" namespace base { class CommandLine; -class ListValue; } // namespace base namespace flags_ui { @@ -47,8 +47,8 @@ // to |unsupported_entries|. void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, flags_ui::FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries); + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries); // Enables or disables the current with id |internal_name|. void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage,
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 59fb8d4b..b10f9a3 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -698,6 +698,14 @@ flag_descriptions::kInterestFeedNoticeCardAutoDismissDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(feed::kInterestFeedNoticeCardAutoDismiss)}, + {"autofill-address-verification-in-save-prompt", + flag_descriptions::kEnableAutofillAddressSavePromptAddressVerificationName, + flag_descriptions:: + kEnableAutofillAddressSavePromptAddressVerificationDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE( + autofill::features:: + kAutofillAddressProfileSavePromptAddressVerificationSupport)}, {"autofill-address-save-prompt", flag_descriptions::kEnableAutofillAddressSavePromptName, flag_descriptions::kEnableAutofillAddressSavePromptDescription, @@ -1008,8 +1016,8 @@ void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, flags_ui::FlagAccess access, - base::ListValue* supported_entries, - base::ListValue* unsupported_entries) { + base::Value::ListStorage& supported_entries, + base::Value::ListStorage& unsupported_entries) { GetGlobalFlagsState().GetFlagFeatureEntries( flags_storage, access, supported_entries, unsupported_entries, base::BindRepeating(&SkipConditionalFeatureEntry));
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index c7fcb61..acb1a5f9 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -163,6 +163,11 @@ const char kEnableAutofillAccountWalletStorageDescription[] = "Enable the ephemeral storage for account data for autofill."; +const char kEnableAutofillAddressSavePromptAddressVerificationName[] = + "Autofill Address Save Prompts Address Verification"; +const char kEnableAutofillAddressSavePromptAddressVerificationDescription[] = + "Enable the address verification support in Autofill address save prompts."; + const char kEnableAutofillAddressSavePromptName[] = "Autofill Address Save Prompts"; const char kEnableAutofillAddressSavePromptDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 3d39e1b..2e0d3869 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -145,6 +145,12 @@ extern const char kEnableAutofillAccountWalletStorageName[]; extern const char kEnableAutofillAccountWalletStorageDescription[]; +// Title and description for the flag to enable address verification support in +// autofill address save prompts. +extern const char kEnableAutofillAddressSavePromptAddressVerificationName[]; +extern const char + kEnableAutofillAddressSavePromptAddressVerificationDescription[]; + // Title and description for the flag to enable autofill address save prompts. extern const char kEnableAutofillAddressSavePromptName[]; extern const char kEnableAutofillAddressSavePromptDescription[];
diff --git a/ios/chrome/browser/ui/authentication/cells/BUILD.gn b/ios/chrome/browser/ui/authentication/cells/BUILD.gn index b74c1968..7b12e648 100644 --- a/ios/chrome/browser/ui/authentication/cells/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/cells/BUILD.gn
@@ -43,6 +43,7 @@ ] public_deps = [ ":constants", + "//ios/chrome/browser/ui/authentication/views:views_constants", "//ios/chrome/browser/ui/table_view/cells", ] frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.h b/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.h index e6b2bca6..262ccea 100644 --- a/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.h +++ b/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/authentication/views/views_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_cell.h" @class IdentityView; @@ -27,7 +28,8 @@ - (void)configureCellWithTitle:(NSString*)title subtitle:(NSString*)subtitle image:(UIImage*)image - checked:(BOOL)checked; + checked:(BOOL)checked + identityViewStyle:(IdentityViewStyle)identityViewStyle; @end
diff --git a/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.mm b/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.mm index e5215771..d4783368 100644 --- a/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.mm +++ b/ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.mm
@@ -13,9 +13,6 @@ #endif namespace { -// Identity view. -const CGFloat kLeadingMargin = 8.; -const CGFloat kIdentityViewVerticalMargin = 7.; // Checkmark margin. const CGFloat kCheckmarkMagin = 26.; } // namespace @@ -26,23 +23,14 @@ @implementation TableViewIdentityCell -@synthesize identityView = _identityView; - - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { _identityView = [[IdentityView alloc] initWithFrame:CGRectZero]; _identityView.translatesAutoresizingMaskIntoConstraints = NO; - _identityView.minimumTopMargin = kIdentityViewVerticalMargin; - _identityView.minimumBottomMargin = kIdentityViewVerticalMargin; [self.contentView addSubview:_identityView]; - LayoutSides sideFlags = LayoutSides::kLeading | LayoutSides::kTrailing | - LayoutSides::kBottom | LayoutSides::kTop; - ChromeDirectionalEdgeInsets insets = - ChromeDirectionalEdgeInsetsMake(0, kLeadingMargin, 0, 0); - AddSameConstraintsToSidesWithInsets(_identityView, self.contentView, - sideFlags, insets); + AddSameConstraints(_identityView, self.contentView); if (@available(iOS 13.4, *)) { [self addInteraction:[[ViewPointerInteraction alloc] init]]; } @@ -53,9 +41,11 @@ - (void)configureCellWithTitle:(NSString*)title subtitle:(NSString*)subtitle image:(UIImage*)image - checked:(BOOL)checked { + checked:(BOOL)checked + identityViewStyle:(IdentityViewStyle)identityViewStyle { [self.identityView setTitle:title subtitle:subtitle]; [self.identityView setAvatar:image]; + self.identityView.style = identityViewStyle; self.accessoryType = checked ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; if (checked) { @@ -69,6 +59,7 @@ - (void)prepareForReuse { [super prepareForReuse]; self.accessibilityIdentifier = nil; + self.identityView.style = IdentityViewStyleDefault; } @end
diff --git a/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.h b/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.h index 9585224..fba721c 100644 --- a/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.h +++ b/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/authentication/views/views_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_item.h" // TableViewIdentityItem holds the model data for an identity. @@ -22,6 +23,8 @@ @property(nonatomic, strong) UIImage* avatar; // If YES, the identity is selected. @property(nonatomic, assign) BOOL selected; +// Style for the IdentityView. +@property(nonatomic, assign) IdentityViewStyle identityViewStyle; @end
diff --git a/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.mm b/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.mm index 22cb4d7..e9519e319 100644 --- a/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.mm +++ b/ios/chrome/browser/ui/authentication/cells/table_view_identity_item.mm
@@ -22,6 +22,7 @@ self = [super initWithType:type]; if (self) { self.cellClass = [TableViewIdentityCell class]; + _identityViewStyle = IdentityViewStyleDefault; } return self; } @@ -39,7 +40,8 @@ [cell configureCellWithTitle:title subtitle:subtitle image:self.avatar - checked:self.selected]; + checked:self.selected + identityViewStyle:self.identityViewStyle]; } @end
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn index 0a7b7e7..1884eed 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
@@ -56,6 +56,7 @@ "//components/autofill/core/common", "//components/prefs", "//components/prefs:test_support", + "//components/signin/public/identity_manager", "//components/sync/driver:test_support", "//components/sync_preferences", "//components/sync_preferences:test_support", @@ -88,6 +89,7 @@ "//components/signin/public/base", "//ios/chrome/app/strings", "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", + "//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin:constants", "//ios/chrome/browser/ui/bookmarks:eg_test_support+eg2", "//ios/chrome/browser/ui/content_suggestions:feature_flags", "//ios/chrome/browser/ui/recent_tabs:recent_tabs_ui_constants",
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.h b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.h index 4fb90e6..6a8b79f 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.h +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.h
@@ -5,11 +5,23 @@ #ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_COORDINATOR_H_ #define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_COORDINATOR_H_ +#import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h" // Coordinates the advanced settings to finish the sign-in flow. @interface AdvancedSettingsSigninCoordinator : SigninCoordinator +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser NS_UNAVAILABLE; + +// Designated initializer. +// |signinState| provides the original user sign-in state before starting the +// sign-in flow. +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser + signinState:(IdentitySigninState)signinState + NS_DESIGNATED_INITIALIZER; + @end #endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm index 58e5e77..3e52d8a 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm
@@ -7,7 +7,6 @@ #include "base/mac/foundation_util.h" #import "base/metrics/user_metrics.h" #import "components/signin/public/identity_manager/identity_manager.h" -#import "components/signin/public/identity_manager/primary_account_mutator.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/signin/authentication_service.h" @@ -54,11 +53,22 @@ ActionSheetCoordinator* cancelConfirmationAlertCoordinator; // Manager for user's Google identities. @property(nonatomic, assign) signin::IdentityManager* identityManager; - +// State used to revert to if the user action is canceled during sign-in. +@property(nonatomic, assign) IdentitySigninState signinStateForCancel; @end @implementation AdvancedSettingsSigninCoordinator +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser + signinState:(IdentitySigninState)signinState { + self = [super initWithBaseViewController:viewController browser:browser]; + if (self) { + _signinStateForCancel = signinState; + } + return self; +} + #pragma mark - SigninCoordinator - (void)start { @@ -88,7 +98,8 @@ initWithSyncSetupService:syncSetupService authenticationService:authenticationService syncService:syncService - prefService:self.browser->GetBrowserState()->GetPrefs()]; + prefService:self.browser->GetBrowserState()->GetPrefs() + identityManager:self.identityManager]; self.advancedSettingsSigninNavigationController.presentationController .delegate = self; @@ -106,13 +117,6 @@ [self.syncSettingsCoordinator stop]; self.syncSettingsCoordinator = nil; - if (base::FeatureList::IsEnabled(signin::kMobileIdentityConsistency)) { - // Revokes all refresh tokens and alerts services of the signed-out state. - self.identityManager->GetPrimaryAccountMutator()->ClearPrimaryAccount( - signin_metrics::ABORT_SIGNIN, - signin_metrics::SignoutDelete::kIgnoreMetric); - } - switch (action) { case SigninCoordinatorInterruptActionNoDismiss: [self finishedWithSigninResult:SigninCoordinatorResultInterrupted]; @@ -212,7 +216,8 @@ DCHECK(self.advancedSettingsSigninNavigationController); DCHECK(self.advancedSettingsSigninMediator); [self.advancedSettingsSigninMediator - saveUserPreferenceForSigninResult:signinResult]; + saveUserPreferenceForSigninResult:signinResult + originalSigninState:self.signinStateForCancel]; self.advancedSettingsSigninNavigationController = nil; self.advancedSettingsSigninMediator = nil; [self.syncSettingsCoordinator stop];
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm index a2721d0..db52052a 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm
@@ -4,6 +4,7 @@ #include "base/ios/ios_util.h" #import "components/signin/public/base/account_consistency_method.h" +#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" @@ -256,8 +257,7 @@ [ChromeEarlGrey simulateExternalAppURLOpening]; - [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; - [SigninEarlGrey verifySignedOut]; + [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity]; } // Tests interrupting sign-in by opening an URL from another app. @@ -276,8 +276,7 @@ [ChromeEarlGrey simulateExternalAppURLOpening]; - [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; - [SigninEarlGrey verifySignedOut]; + [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity]; } // Tests interrupting sign-in by opening an URL from another app. @@ -293,8 +292,7 @@ [ChromeEarlGrey simulateExternalAppURLOpening]; - [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; - [SigninEarlGrey verifySignedOut]; + [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity]; } // Tests interrupting sign-in by opening an URL from another app. @@ -310,7 +308,27 @@ [ChromeEarlGrey simulateExternalAppURLOpening]; - [ChromeEarlGrey waitForSyncInitialized:NO syncTimeout:kSyncOperationTimeout]; + [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity]; +} + +// Tests that canceling sign-in from advanced sign-in settings will +// return the user to their prior sign-in state. +- (void)testCancelSigninFromAdvancedSigninSettings { + FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1]; + [SigninEarlGrey addFakeIdentity:fakeIdentity]; + + [ChromeEarlGreyUI openSettingsMenu]; + [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()]; + [SigninEarlGreyUI tapSettingsLink]; + [ChromeEarlGreyUI waitForAppToIdle]; + + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kSyncSettingsCancelButtonId)] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabel( + @"Cancel Sync")] performAction:grey_tap()]; + [SigninEarlGrey verifySignedOut]; }
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h index a02c50b7..3cfd698 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h
@@ -14,6 +14,9 @@ class AuthenticationService; class PrefService; class SyncSetupService; +namespace signin { +class IdentityManager; +} namespace syncer { class SyncService; } @@ -23,15 +26,18 @@ - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithSyncSetupService:(SyncSetupService*)syncSetupService - authenticationService: - (AuthenticationService*)authenticationService - syncService:(syncer::SyncService*)syncService - prefService:(PrefService*)prefService +- (instancetype) + initWithSyncSetupService:(SyncSetupService*)syncSetupService + authenticationService:(AuthenticationService*)authenticationService + syncService:(syncer::SyncService*)syncService + prefService:(PrefService*)prefService + identityManager:(signin::IdentityManager*)identityManager NS_DESIGNATED_INITIALIZER; // Saves the user sync preferences. -- (void)saveUserPreferenceForSigninResult:(SigninCoordinatorResult)signinResult; +- (void)saveUserPreferenceForSigninResult:(SigninCoordinatorResult)signinResult + originalSigninState: + (IdentitySigninState)originalSigninState; @end
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.mm index 7f00faf0..0f1136d 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.mm
@@ -5,6 +5,8 @@ #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h" #import "base/metrics/user_metrics.h" +#import "components/signin/public/identity_manager/identity_manager.h" +#import "components/signin/public/identity_manager/primary_account_mutator.h" #import "components/sync/driver/sync_service.h" #import "components/unified_consent/unified_consent_metrics.h" #import "ios/chrome/browser/signin/authentication_service.h" @@ -28,6 +30,7 @@ @property(nonatomic, assign, readonly) syncer::SyncService* syncService; // Browser state preference service. @property(nonatomic, assign, readonly) PrefService* prefService; +@property(nonatomic, assign) signin::IdentityManager* identityManager; @end @@ -35,27 +38,31 @@ #pragma mark - Public -- (instancetype)initWithSyncSetupService:(SyncSetupService*)syncSetupService - authenticationService: - (AuthenticationService*)authenticationService - syncService:(syncer::SyncService*)syncService - prefService:(PrefService*)prefService { +- (instancetype) + initWithSyncSetupService:(SyncSetupService*)syncSetupService + authenticationService:(AuthenticationService*)authenticationService + syncService:(syncer::SyncService*)syncService + prefService:(PrefService*)prefService + identityManager:(signin::IdentityManager*)identityManager { self = [super init]; if (self) { DCHECK(syncSetupService); DCHECK(authenticationService); DCHECK(syncService); DCHECK(prefService); + DCHECK(identityManager); _syncSetupService = syncSetupService; _authenticationService = authenticationService; _syncService = syncService; _prefService = prefService; + _identityManager = identityManager; } return self; } -- (void)saveUserPreferenceForSigninResult: - (SigninCoordinatorResult)signinResult { +- (void)saveUserPreferenceForSigninResult:(SigninCoordinatorResult)signinResult + originalSigninState: + (IdentitySigninState)originalSigninState { switch (signinResult) { case SigninCoordinatorResultSuccess: { RecordAction( @@ -78,9 +85,7 @@ RecordAction( UserMetricsAction("Signin_Signin_ConfirmCancelAdvancedSyncSettings")); self.syncSetupService->CommitSyncChanges(); - self.authenticationService->SignOut(signin_metrics::ABORT_SIGNIN, - /*force_clear_browsing_data=*/false, - nil); + [self revertToSigninState:originalSigninState]; break; case SigninCoordinatorResultInterrupted: RecordAction( @@ -89,4 +94,37 @@ } } +// For users that cancel the sign-in flow, revert to the sign-in +// state prior to starting sign-in coordinators. +- (void)revertToSigninState:(IdentitySigninState)originalState { + switch (originalState) { + case IdentitySigninStateSignedOut: { + self.authenticationService->SignOut(signin_metrics::ABORT_SIGNIN, + /*force_clear_browsing_data=*/false, + nil); + break; + } + case IdentitySigninStateSignedInWithSyncDisabled: { + ChromeIdentity* syncingIdentity = + self.authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSync); + // If the identity is Syncing, Chrome needs to manually sign the user out + // and back in again in order to properly end the sign-in flow in its + // original state. + if (syncingIdentity) { + self.authenticationService->SignOut(signin_metrics::ABORT_SIGNIN, + /*force_clear_browsing_data=*/false, + nil); + self.authenticationService->SignIn(syncingIdentity); + } + break; + } + case IdentitySigninStateSignedInWithSyncEnabled: { + // Switching accounts is not possible without sign-out. + NOTREACHED(); + break; + } + } +} + @end
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm index 8871541..aa93480 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm
@@ -11,10 +11,12 @@ #import "components/prefs/pref_registry_simple.h" #import "components/prefs/testing_pref_service.h" #import "components/signin/public/base/signin_pref_names.h" +#import "components/signin/public/identity_manager/identity_manager.h" #import "components/sync/driver/mock_sync_service.h" #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/authentication_service_fake.h" +#import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/sync/sync_service_factory.h" #import "ios/chrome/browser/sync/sync_setup_service_factory.h" #import "ios/chrome/browser/sync/sync_setup_service_mock.h" @@ -70,7 +72,8 @@ initWithSyncSetupService:sync_setup_service() authenticationService:authentication_service() syncService:sync_service() - prefService:GetPrefService()]; + prefService:GetPrefService() + identityManager:identity_manager()]; sync_setup_service_mock_ = static_cast<SyncSetupServiceMock*>(sync_setup_service()); @@ -109,6 +112,10 @@ return ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); } + signin::IdentityManager* identity_manager() { + return IdentityManagerFactory::GetForBrowserState(browser_state_.get()); + } + protected: // Needed for test browser state created by TestChromeBrowserState(). base::test::TaskEnvironment environment_; @@ -132,7 +139,8 @@ syncer::SyncFirstSetupCompleteSource::ADVANCED_FLOW_CONFIRM)); authentication_service_fake_->SignIn(identity_); - [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultSuccess]; + [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultSuccess + originalSigninState:IdentitySigninStateSignedOut]; ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( signin::ConsentLevel::kSignin)); @@ -150,29 +158,48 @@ .Times(0); authentication_service_fake_->SignIn(identity_); - [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultSuccess]; + [mediator_ saveUserPreferenceForSigninResult:SigninCoordinatorResultSuccess + originalSigninState:IdentitySigninStateSignedOut]; ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( signin::ConsentLevel::kSignin)); } -// Tests that a user is not authenticated when sign-in is canceled. -TEST_F(AdvancedSettingsSigninMediatorTest, saveUserPreferenceSigninCanceled) { +// Tests that a signed-out user is not authenticated when sync is canceled. +TEST_F(AdvancedSettingsSigninMediatorTest, + saveUserPreferenceSigninCanceledWithSignedOutUser) { authentication_service_fake_->SignIn(identity_); [mediator_ - saveUserPreferenceForSigninResult:SigninCoordinatorResultCanceledByUser]; + saveUserPreferenceForSigninResult:SigninCoordinatorResultCanceledByUser + originalSigninState:IdentitySigninStateSignedOut]; ASSERT_FALSE(authentication_service_fake_->HasPrimaryIdentity( signin::ConsentLevel::kSignin)); } +// Tests that a signed-in user remains authenticated when sync is canceled. +TEST_F(AdvancedSettingsSigninMediatorTest, + saveUserPreferenceSigninCanceledWithSignedInUser) { + authentication_service_fake_->SignIn(identity_); + [mediator_ + saveUserPreferenceForSigninResult:SigninCoordinatorResultCanceledByUser + originalSigninState: + IdentitySigninStateSignedInWithSyncDisabled]; + + ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( + signin::ConsentLevel::kSignin)); + ASSERT_FALSE(authentication_service_fake_->HasPrimaryIdentity( + signin::ConsentLevel::kSync)); +} + // Tests that a user's authentication does not change when sign-in is // interrupted. TEST_F(AdvancedSettingsSigninMediatorTest, saveUserPreferenceSigninInterrupted) { authentication_service_fake_->SignIn(identity_); [mediator_ - saveUserPreferenceForSigninResult:SigninCoordinatorResultInterrupted]; + saveUserPreferenceForSigninResult:SigninCoordinatorResultInterrupted + originalSigninState:IdentitySigninStateSignedOut]; ASSERT_TRUE(authentication_service_fake_->HasPrimaryIdentity( signin::ConsentLevel::kSignin));
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_table_view_controller.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_table_view_controller.mm index 33133805..9d11abb 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_table_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_table_view_controller.mm
@@ -110,6 +110,7 @@ .sortedIdentityItemConfigurators) { TableViewIdentityItem* item = [[TableViewIdentityItem alloc] initWithType:IdentityItemType]; + item.identityViewStyle = IdentityViewStyleConsistency; [configurator configureIdentityChooser:item]; [model addItem:item toSectionWithIdentifier:IdentitySectionIdentifier]; }
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm index fd3e389b..1f8de3b7 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm
@@ -7,6 +7,7 @@ #import "base/strings/sys_string_conversions.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/views/identity_button_control.h" +#import "ios/chrome/browser/ui/authentication/views/identity_view.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/button_util.h" @@ -24,14 +25,8 @@ // Margins for |self.contentView| (top, bottom, leading and trailing). constexpr CGFloat kContentMargin = 16.; -// Avatar height and width. -constexpr CGFloat kAvatarSize = 30.; // Space between elements in |self.contentView|. constexpr CGFloat kContentSpacing = 16.; -// Constants for IdentityButtonControl. -constexpr CGFloat kMinimumTopMargin = 10.; -constexpr CGFloat kMinimumBottomMargin = 8.; -constexpr CGFloat kTitleSubtitleMargin = 0.; } @@ -154,14 +149,7 @@ self.identityButtonControl.backgroundColor = [UIColor colorNamed:kGroupedSecondaryBackgroundColor]; self.identityButtonControl.arrowDirection = IdentityButtonControlArrowRight; - self.identityButtonControl.avatarSize = kAvatarSize; - self.identityButtonControl.minimumTopMargin = kMinimumTopMargin; - self.identityButtonControl.minimumBottomMargin = kMinimumBottomMargin; - self.identityButtonControl.titleSubtitleMargin = kTitleSubtitleMargin; - self.identityButtonControl.titleFont = - [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; - self.identityButtonControl.subtitleFont = - [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + self.identityButtonControl.identityViewStyle = IdentityViewStyleConsistency; [self.identityButtonControl addTarget:self action:@selector(identityButtonControlAction: forEvent:)
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_constants.h b/ios/chrome/browser/ui/authentication/signin/signin_constants.h index 5987d62..8b8ba7d 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_constants.h +++ b/ios/chrome/browser/ui/authentication/signin/signin_constants.h
@@ -22,6 +22,13 @@ SigninCoordinatorResultSuccess, }; +// User's signed-in state as defined by AuthenticationService. +typedef NS_ENUM(NSUInteger, IdentitySigninState) { + IdentitySigninStateSignedOut, + IdentitySigninStateSignedInWithSyncDisabled, + IdentitySigninStateSignedInWithSyncEnabled, +}; + // Action to do when the sign-in dialog needs to be interrupted. typedef NS_ENUM(NSUInteger, SigninCoordinatorInterruptAction) { // Stops the sign-in coordinator without dismissing the view.
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator.h b/ios/chrome/browser/ui/authentication/signin/signin_coordinator.h index 25a5c00..8fd74a2 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator.h +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator.h
@@ -73,10 +73,15 @@ // Returns a coordinator for advanced sign-in settings workflow. // |viewController| presents the sign-in. +// |signinState| defines the user's sign-in state prior to all SigninCoordinator +// manipulations. + (instancetype) advancedSettingsSigninCoordinatorWithBaseViewController: (UIViewController*)viewController - browser:(Browser*)browser; + browser:(Browser*)browser + signinState: + (IdentitySigninState) + signinState; // Returns a coordinator to add an account. // |viewController| presents the sign-in.
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm index 59a877c5..fcfa391 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator.mm
@@ -108,10 +108,14 @@ + (instancetype) advancedSettingsSigninCoordinatorWithBaseViewController: (UIViewController*)viewController - browser:(Browser*)browser { + browser:(Browser*)browser + signinState: + (IdentitySigninState) + signinState { return [[AdvancedSettingsSigninCoordinator alloc] initWithBaseViewController:viewController - browser:browser]; + browser:browser + signinState:signinState]; } + (instancetype)addAccountCoordinatorWithBaseViewController:
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils.h b/ios/chrome/browser/ui/authentication/signin/signin_utils.h index 6a68b6e1..ab9cdcb 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_utils.h +++ b/ios/chrome/browser/ui/authentication/signin/signin_utils.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_SIGNIN_UTILS_H_ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" class ChromeAccountManagerService; class ChromeBrowserState; @@ -36,6 +37,10 @@ // Returns a boolean indicating whether policy allows browser sign-in. bool IsSigninAllowedByPolicy(const PrefService* prefs); +// Returns the current sign-in state of primary identity. +IdentitySigninState GetPrimaryIdentitySigninState( + ChromeBrowserState* browser_state); + } // namespace signin #endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_SIGNIN_UTILS_H_
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm index 89e570f..b56725a 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
@@ -19,6 +19,7 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" +#import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_constants.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" @@ -162,4 +163,17 @@ return prefs->GetBoolean(prefs::kSigninAllowedByPolicy); } +IdentitySigninState GetPrimaryIdentitySigninState( + ChromeBrowserState* browser_state) { + AuthenticationService* auth_service = + AuthenticationServiceFactory::GetForBrowserState(browser_state); + if (auth_service->HasPrimaryIdentity(signin::ConsentLevel::kSync)) { + return IdentitySigninStateSignedInWithSyncEnabled; + } else if (auth_service->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { + return IdentitySigninStateSignedInWithSyncDisabled; + } else { + return IdentitySigninStateSignedOut; + } +} + } // namespace signin
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm index a260aa1..50c88fa 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
@@ -18,6 +18,7 @@ #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator+protected.h" +#import "ios/chrome/browser/ui/authentication/signin/signin_utils.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/logging/user_signin_logger.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.h" @@ -70,6 +71,9 @@ @property(nonatomic, assign) BOOL viewControllerPresentingAnimation; // Callback to be invoked when the view controller presenting animation is done. @property(nonatomic, copy) ProceduralBlock interruptCallback; +// User sign-in state when the coordinator starts. This is used as the +// state to revert to in case the user is interrupted during sign-in. +@property(nonatomic, assign) IdentitySigninState signinStateOnStart; @end @@ -123,11 +127,12 @@ self.signinIntent == UserSigninIntentFirstRun); [super start]; + self.signinStateOnStart = + signin::GetPrimaryIdentitySigninState(self.browser->GetBrowserState()); + // Setup mediator. self.mediator = [[UserSigninMediator alloc] - initWithAuthenticationService:AuthenticationServiceFactory:: - GetForBrowserState( - self.browser->GetBrowserState()) + initWithAuthenticationService:authenticationService identityManager:IdentityManagerFactory::GetForBrowserState( self.browser->GetBrowserState()) consentAuditor:ConsentAuditorFactory::GetForBrowserState( @@ -385,7 +390,9 @@ self.advancedSettingsSigninCoordinator = [SigninCoordinator advancedSettingsSigninCoordinatorWithBaseViewController: self.baseViewController - browser:self.browser]; + browser:self.browser + signinState: + self.signinStateOnStart]; __weak UserSigninCoordinator* weakSelf = self; self.advancedSettingsSigninCoordinator.signinCompletion = ^( SigninCoordinatorResult advancedSigninResult,
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_add_account_item.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_add_account_item.mm index 94abcbd..ef308aa 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_add_account_item.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_add_account_item.mm
@@ -30,7 +30,11 @@ l10n_util::GetNSString(IDS_IOS_ACCOUNT_IDENTITY_CHOOSER_ADD_ACCOUNT); UIImage* image = [[UIImage imageNamed:@"settings_accounts_add_account"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - [cell configureCellWithTitle:title subtitle:nil image:image checked:NO]; + [cell configureCellWithTitle:title + subtitle:nil + image:image + checked:NO + identityViewStyle:IdentityViewStyleIdentityChooser]; } @end
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_mediator.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_mediator.mm index a328a23..8f62434 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_mediator.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_mediator.mm
@@ -103,6 +103,7 @@ for (ChromeIdentity* identity in identities) { TableViewIdentityItem* item = [[TableViewIdentityItem alloc] initWithType:0]; + item.identityViewStyle = IdentityViewStyleIdentityChooser; [self updateTableViewIdentityItem:item withChromeIdentity:identity]; [items addObject:item]; }
diff --git a/ios/chrome/browser/ui/authentication/views/identity_button_control.h b/ios/chrome/browser/ui/authentication/views/identity_button_control.h index 709eb29c..4bfb3c1 100644 --- a/ios/chrome/browser/ui/authentication/views/identity_button_control.h +++ b/ios/chrome/browser/ui/authentication/views/identity_button_control.h
@@ -7,6 +7,8 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/authentication/views/views_constants.h" + // Enum to choose the arrow on the right of IdentityButtonControl. typedef NS_ENUM(NSInteger, IdentityButtonControlArrowDirection) { // Adds a down arrow on the right of the view. @@ -23,19 +25,9 @@ // Arrow direction, default value is IdentityButtonControlArrowDown. @property(nonatomic, assign) IdentityButtonControlArrowDirection arrowDirection; -// Minimum vertical margin above the avatar image and title/subtitle, default -// value is 12. -@property(nonatomic, assign) CGFloat minimumTopMargin; -// Minimum vertical margin below the avatar image and title/subtitle, default -// value is 12. -@property(nonatomic, assign) CGFloat minimumBottomMargin; -// Avatar size, default value is 40. -@property(nonatomic, assign) CGFloat avatarSize; -// Vertical distance between the title and the subtitle., default -// value is 4. -@property(nonatomic, assign) CGFloat titleSubtitleMargin; -@property(nonatomic, strong) UIFont* titleFont; -@property(nonatomic, strong) UIFont* subtitleFont; + +// Style for the IdentityView. +@property(nonatomic, assign) IdentityViewStyle identityViewStyle; // Initialises IdentityButtonControl. - (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/authentication/views/identity_button_control.mm b/ios/chrome/browser/ui/authentication/views/identity_button_control.mm index f7d0887f..49c20b9 100644 --- a/ios/chrome/browser/ui/authentication/views/identity_button_control.mm +++ b/ios/chrome/browser/ui/authentication/views/identity_button_control.mm
@@ -128,52 +128,12 @@ [self updateArrowDirection]; } -- (void)setMinimumTopMargin:(CGFloat)minimumTopMargin { - self.identityView.minimumTopMargin = minimumTopMargin; +- (void)setIdentityViewStyle:(IdentityViewStyle)style { + self.identityView.style = style; } -- (CGFloat)minimumTopMargin { - return self.identityView.minimumTopMargin; -} - -- (void)setMinimumBottomMargin:(CGFloat)minimumBottomMargin { - self.identityView.minimumBottomMargin = minimumBottomMargin; -} - -- (CGFloat)minimumBottomMargin { - return self.identityView.minimumBottomMargin; -} - -- (void)setAvatarSize:(CGFloat)avatarSize { - self.identityView.avatarSize = avatarSize; -} - -- (CGFloat)avatarSize { - return self.identityView.avatarSize; -} - -- (void)setTitleSubtitleMargin:(CGFloat)titleSubtitleMargin { - self.identityView.titleSubtitleMargin = titleSubtitleMargin; -} - -- (CGFloat)titleSubtitleMargin { - return self.identityView.titleSubtitleMargin; -} - -- (void)setTitleFont:(UIFont*)titleFont { - self.identityView.titleFont = titleFont; -} - -- (UIFont*)titleFont { - return self.identityView.titleFont; -} - -- (void)setSubtitleFont:(UIFont*)subtitleFont { - self.identityView.subtitleFont = subtitleFont; -} - -- (UIFont*)subtitleFont { - return self.identityView.subtitleFont; +- (IdentityViewStyle)identityViewStyle { + return self.identityView.style; } #pragma mark - Private
diff --git a/ios/chrome/browser/ui/authentication/views/identity_view.h b/ios/chrome/browser/ui/authentication/views/identity_view.h index 93f3700..cb50dde1 100644 --- a/ios/chrome/browser/ui/authentication/views/identity_view.h +++ b/ios/chrome/browser/ui/authentication/views/identity_view.h
@@ -7,6 +7,8 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/authentication/views/views_constants.h" + // View with the avatar on the leading side, a title and a subtitle. Only the // title is required. The title contains the user name if it exists, or the // email address. The subtitle contains the email address if the name exists, @@ -20,22 +22,9 @@ // +--------------------------------+ @interface IdentityView : UIView -// Minimum vertical margin above the avatar image and title/subtitle, default -// value is 12. -@property(nonatomic, assign) CGFloat minimumTopMargin; -// Minimum vertical margin below the avatar image and title/subtitle, default -// value is 12. -@property(nonatomic, assign) CGFloat minimumBottomMargin; -// Avatar size, default value is 40. -@property(nonatomic, assign) CGFloat avatarSize; -// Horizontal distance between the avatar and the title, default -// value is 16. -@property(nonatomic, assign) CGFloat avatarTitleMargin; -// Vertical distance between the title and the subtitle., default -// value is 4. -@property(nonatomic, assign) CGFloat titleSubtitleMargin; -@property(nonatomic, strong) UIFont* titleFont; -@property(nonatomic, strong) UIFont* subtitleFont; +// Style for the identity view (modify the avatar size, font sizes and some +// margins). +@property(nonatomic, assign) IdentityViewStyle style; // Initialises IdentityView. - (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/authentication/views/identity_view.mm b/ios/chrome/browser/ui/authentication/views/identity_view.mm index 379df68..3b8a56e0 100644 --- a/ios/chrome/browser/ui/authentication/views/identity_view.mm +++ b/ios/chrome/browser/ui/authentication/views/identity_view.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/authentication/views/identity_view.h" #import "base/check.h" +#import "base/notreached.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" @@ -15,12 +16,41 @@ namespace { -// Sizes. -const CGFloat kAvatarSize = 40.; +// List of constants related to the IdentityViewStyle. +typedef struct { + const CGFloat avatarLeadingMargin; + const CGFloat avatarSize; + const CGFloat titleOffset; + const CGFloat minimumTopMargin; + const CGFloat minimumBottomMargin; +} StyleValues; + +const StyleValues kDefaultStyle = { + 16., /* avatarLeadingMargin */ + 40., /* avatarSize */ + 4., /* titleOffset */ + 12., /* minimumTopMargin */ + 12., /* minimumBottomMargin */ +}; + +const StyleValues kSignInChooseryStyle = { + 24., /* avatarLeadingMargin */ + 40., /* avatarSize */ + 4., /* titleOffset */ + 7., /* minimumTopMargin */ + 7., /* minimumBottomMargin */ +}; + +const StyleValues kConsistencyStyle = { + 16., /* avatarLeadingMargin */ + 30., /* avatarSize */ + 0., /* titleOffset */ + 10., /* minimumTopMargin */ + 8., /* minimumBottomMargin */ +}; + // Distances/margins. -const CGFloat kTitleOffset = 4; -const CGFloat kHorizontalAvatarMargin = 16.; -const CGFloat kVerticalMargin = 12.; +constexpr CGFloat kHorizontalAvatarLeadingMargin = 16.; } // namespace @@ -43,9 +73,8 @@ // Constraints for the avatar size. @property(nonatomic, strong) NSArray<NSLayoutConstraint*>* avatarSizeConstraints; -// Constraints to update when |self.avatarTitleMargin| is updated. -@property(nonatomic, strong) - NSLayoutConstraint* avatarTitleHorizontalConstraint; +// Leading margin constraint for the avatar. +@property(nonatomic, strong) NSLayoutConstraint* avatarLeadingMarginConstraint; @end @@ -84,18 +113,20 @@ [self addLayoutGuide:textContainerGuide]; // Layout constraints. - _avatarTitleHorizontalConstraint = [textContainerGuide.leadingAnchor - constraintEqualToAnchor:_avatarView.trailingAnchor - constant:kHorizontalAvatarMargin]; + _avatarLeadingMarginConstraint = [_avatarView.leadingAnchor + constraintEqualToAnchor:self.leadingAnchor + constant:kDefaultStyle.avatarLeadingMargin]; [NSLayoutConstraint activateConstraints:@[ - _avatarTitleHorizontalConstraint, - [_avatarView.leadingAnchor - constraintEqualToAnchor:self.leadingAnchor - constant:kHorizontalAvatarMargin] + [textContainerGuide.leadingAnchor + constraintEqualToAnchor:_avatarView.trailingAnchor + constant:kHorizontalAvatarLeadingMargin], + _avatarLeadingMarginConstraint, ]]; _avatarSizeConstraints = @[ - [_avatarView.heightAnchor constraintEqualToConstant:kAvatarSize], - [_avatarView.widthAnchor constraintEqualToConstant:kAvatarSize], + [_avatarView.heightAnchor + constraintEqualToConstant:kDefaultStyle.avatarSize], + [_avatarView.widthAnchor + constraintEqualToConstant:kDefaultStyle.avatarSize], ]; [NSLayoutConstraint activateConstraints:_avatarSizeConstraints]; AddSameCenterYConstraint(self, _avatarView); @@ -103,7 +134,7 @@ LayoutSides::kLeading | LayoutSides::kTrailing); _titleConstraintForNameAndEmail = [_subtitle.topAnchor constraintEqualToAnchor:_title.bottomAnchor - constant:kTitleOffset]; + constant:kDefaultStyle.titleOffset]; _titleConstraintForEmailOnly = [textContainerGuide.bottomAnchor constraintEqualToAnchor:_title.bottomAnchor]; @@ -126,18 +157,21 @@ _topConstraints = @[ [_avatarView.topAnchor constraintGreaterThanOrEqualToAnchor:self.topAnchor - constant:kVerticalMargin], - [_title.topAnchor constraintGreaterThanOrEqualToAnchor:self.topAnchor - constant:kVerticalMargin], + constant:kDefaultStyle.minimumTopMargin], + [_title.topAnchor + constraintGreaterThanOrEqualToAnchor:self.topAnchor + constant:kDefaultStyle.minimumTopMargin], ]; [NSLayoutConstraint activateConstraints:_topConstraints]; _bottomConstraints = @[ [self.bottomAnchor constraintGreaterThanOrEqualToAnchor:_avatarView.bottomAnchor - constant:kVerticalMargin], + constant:kDefaultStyle + .minimumBottomMargin], [self.bottomAnchor constraintGreaterThanOrEqualToAnchor:_subtitle.bottomAnchor - constant:kVerticalMargin], + constant:kDefaultStyle + .minimumBottomMargin], ]; [NSLayoutConstraint activateConstraints:_bottomConstraints]; } @@ -148,8 +182,9 @@ - (void)setAvatar:(UIImage*)avatarImage { if (avatarImage) { + const StyleValues* style = [self styleValues]; self.avatarView.image = avatarImage; - self.avatarView.layer.cornerRadius = self.avatarSize / 2.0; + self.avatarView.layer.cornerRadius = style->avatarSize / 2.0; } else { self.avatarView.image = nil; } @@ -172,56 +207,6 @@ #pragma mark - properties -- (void)setMinimumTopMargin:(CGFloat)minimumTopMargin { - for (NSLayoutConstraint* constraint in self.topConstraints) { - constraint.constant = minimumTopMargin; - } -} - -- (CGFloat)minimumTopMargin { - DCHECK(self.topConstraints.count); - return self.topConstraints[0].constant; -} - -- (void)setMinimumBottomMargin:(CGFloat)minimumBottomMargin { - for (NSLayoutConstraint* constraint in self.bottomConstraints) { - constraint.constant = minimumBottomMargin; - } -} - -- (CGFloat)minimumBottomMargin { - DCHECK(self.bottomConstraints.count); - return self.bottomConstraints[0].constant; -} - -- (void)setAvatarSize:(CGFloat)avatarSize { - for (NSLayoutConstraint* constraint in self.avatarSizeConstraints) { - constraint.constant = avatarSize; - } - self.avatarView.layer.cornerRadius = avatarSize / 2.0; -} - -- (CGFloat)avatarSize { - DCHECK(self.avatarSizeConstraints.count); - return self.avatarSizeConstraints[0].constant; -} - -- (void)setAvatarTitleMargin:(CGFloat)avatarTitleMargin { - self.avatarTitleHorizontalConstraint.constant = avatarTitleMargin; -} - -- (CGFloat)avatarTitleMargin { - return self.avatarTitleHorizontalConstraint.constant; -} - -- (void)setTitleSubtitleMargin:(CGFloat)titleSubtitleMargin { - self.titleConstraintForNameAndEmail.constant = titleSubtitleMargin; -} - -- (CGFloat)titleSubtitleMargin { - return self.titleConstraintForNameAndEmail.constant; -} - - (void)setTitleFont:(UIFont*)titleFont { self.title.font = titleFont; } @@ -238,4 +223,64 @@ return self.subtitleFont; } +- (void)setStyle:(IdentityViewStyle)style { + if (_style == style) + return; + _style = style; + [self updateStyle]; +} + +#pragma mark - private + +// Returns the default style values according to |self.style|. +- (const StyleValues*)styleValues { + switch (self.style) { + case IdentityViewStyleDefault: + return &kDefaultStyle; + case IdentityViewStyleIdentityChooser: + return &kSignInChooseryStyle; + case IdentityViewStyleConsistency: + return &kConsistencyStyle; + } + NOTREACHED(); + return nullptr; +} + +// Updates the current view according the style. +- (void)updateStyle { + const StyleValues* style = [self styleValues]; + switch (self.style) { + case IdentityViewStyleDefault: + self.titleFont = + [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + self.subtitleFont = + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; + break; + case IdentityViewStyleIdentityChooser: + self.titleFont = + [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + self.subtitleFont = + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; + break; + case IdentityViewStyleConsistency: + self.titleFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + self.subtitleFont = + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + break; + } + DCHECK(style); + self.avatarLeadingMarginConstraint.constant = style->avatarLeadingMargin; + for (NSLayoutConstraint* constraint in self.avatarSizeConstraints) { + constraint.constant = style->avatarSize; + } + self.avatarView.layer.cornerRadius = style->avatarSize / 2.; + for (NSLayoutConstraint* constraint in self.topConstraints) { + constraint.constant = style->minimumTopMargin; + } + for (NSLayoutConstraint* constraint in self.bottomConstraints) { + constraint.constant = style->minimumBottomMargin; + } + self.titleConstraintForNameAndEmail.constant = style->titleOffset; +} + @end
diff --git a/ios/chrome/browser/ui/authentication/views/views_constants.h b/ios/chrome/browser/ui/authentication/views/views_constants.h index 09b66378..6a0273d2 100644 --- a/ios/chrome/browser/ui/authentication/views/views_constants.h +++ b/ios/chrome/browser/ui/authentication/views/views_constants.h
@@ -10,4 +10,15 @@ // Accessibility identifier for the identity picker view. extern NSString* const kIdentityButtonControlIdentifier; +// Style for the identity view (modify the avatar size, font sizes and some +// margins). +typedef NS_ENUM(NSInteger, IdentityViewStyle) { + // Default style. + IdentityViewStyleDefault, + // Style for the identity chooser from the signin view. + IdentityViewStyleIdentityChooser, + // Style for the consistency view. + IdentityViewStyleConsistency, +}; + #endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_VIEWS_VIEWS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm index a53935a..b205be5 100644 --- a/ios/chrome/browser/ui/main/scene_controller.mm +++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -1518,9 +1518,17 @@ << base::SysNSStringToUTF8(NSStringFromClass( self.signinCoordinator.class)); Browser* mainBrowser = self.mainInterface.browser; + // If the account is in the decoupled FRE then the user has already signed-in + // before opening advanced settings, otherwise they are signed out. + // Note that this method should only be used by the FRE. + IdentitySigninState signinState = + base::FeatureList::IsEnabled(kEnableFREUIModuleIOS) + ? IdentitySigninStateSignedInWithSyncDisabled + : IdentitySigninStateSignedOut; self.signinCoordinator = [SigninCoordinator advancedSettingsSigninCoordinatorWithBaseViewController:baseViewController - browser:mainBrowser]; + browser:mainBrowser + signinState:signinState]; [self startSigninCoordinatorWithCompletion:^(BOOL success) { if (location_permissions_field_trial::IsInFirstRunModalGroup()) { [self showLocationPermissionsFromViewController:baseViewController];
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn index f889eb3d..ca19a988 100644 --- a/ios/chrome/browser/ui/popup_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -95,6 +95,7 @@ "//ios/chrome/common/ui/colors", "//ios/components/webui:url_constants", "//ios/public/provider/chrome/browser", + "//ios/public/provider/chrome/browser/text_zoom:text_zoom_api", "//ios/public/provider/chrome/browser/user_feedback", "//ios/web", "//ios/web/common", @@ -153,6 +154,7 @@ "//ios/chrome/test:test_support", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser:test_support", + "//ios/public/provider/chrome/browser/text_zoom:text_zoom_api", "//ios/public/provider/chrome/browser/user_feedback", "//ios/web", "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm index 87be6b9c..d8902fa 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -61,7 +61,7 @@ #include "ios/chrome/grit/ios_strings.h" #include "ios/components/webui/web_ui_url_constants.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" -#import "ios/public/provider/chrome/browser/text_zoom_provider.h" +#import "ios/public/provider/chrome/browser/text_zoom/text_zoom_api.h" #import "ios/public/provider/chrome/browser/user_feedback/user_feedback_provider.h" #include "ios/web/common/features.h" #include "ios/web/common/user_agent.h" @@ -1013,9 +1013,7 @@ [actionsArray addObject:self.findInPageItem]; // Text Zoom - if (ios::GetChromeBrowserProvider() - .GetTextZoomProvider() - ->IsTextZoomEnabled()) { + if (ios::provider::IsTextZoomEnabled()) { self.textZoomItem = CreateTableViewItem( IDS_IOS_TOOLS_MENU_TEXT_ZOOM, PopupMenuActionTextZoom, @"popup_menu_text_zoom", kToolsMenuTextZoom);
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm index 2826eac0..72a1538 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
@@ -45,7 +45,7 @@ #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h" #import "ios/chrome/browser/web_state_list/web_state_opener.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" -#import "ios/public/provider/chrome/browser/text_zoom_provider.h" +#import "ios/public/provider/chrome/browser/text_zoom/text_zoom_api.h" #import "ios/public/provider/chrome/browser/user_feedback/user_feedback_provider.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/test/fakes/fake_navigation_context.h" @@ -307,9 +307,7 @@ number_of_action_items++; } - if (ios::GetChromeBrowserProvider() - .GetTextZoomProvider() - ->IsTextZoomEnabled()) { + if (ios::provider::IsTextZoomEnabled()) { number_of_action_items++; }
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index d432726..42ecbd65 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -601,6 +601,12 @@ view:itemView]; __weak AccountsTableViewController* weakSelf = self; self.signoutCoordinator.completion = ^(BOOL success) { + if (success) { + // Allow user interaction only didn't cancel the dialog. + // if -[<SignoutActionSheetCoordinatorDelegate> + // didSelectSignoutDataRetentionStrategy] has been called. + [weakSelf allowUserInteraction]; + } [weakSelf.signoutCoordinator stop]; weakSelf.signoutCoordinator = nil; if (success) { @@ -827,6 +833,7 @@ - (void)didSelectSignoutDataRetentionStrategy { _authenticationOperationInProgress = YES; + [self preventUserInteraction]; } @end
diff --git a/ios/chrome/browser/ui/webui/flags_ui.cc b/ios/chrome/browser/ui/webui/flags_ui.cc index 2463a47..7694d2b 100644 --- a/ios/chrome/browser/ui/webui/flags_ui.cc +++ b/ios/chrome/browser/ui/webui/flags_ui.cc
@@ -136,12 +136,14 @@ base::DictionaryValue results; - auto supported_features = std::make_unique<base::ListValue>(); - auto unsupported_features = std::make_unique<base::ListValue>(); - GetFlagFeatureEntries(flags_storage_.get(), access_, supported_features.get(), - unsupported_features.get()); - results.Set(flags_ui::kSupportedFeatures, std::move(supported_features)); - results.Set(flags_ui::kUnsupportedFeatures, std::move(unsupported_features)); + std::vector<base::Value> supported_features; + std::vector<base::Value> unsupported_features; + GetFlagFeatureEntries(flags_storage_.get(), access_, supported_features, + unsupported_features); + + results.SetKey(flags_ui::kSupportedFeatures, base::Value(supported_features)); + results.SetKey(flags_ui::kUnsupportedFeatures, + base::Value(unsupported_features)); // Cannot restart the browser on iOS. results.SetBoolean(flags_ui::kNeedsRestart, false); results.SetBoolean(flags_ui::kShowOwnerWarning,
diff --git a/ios/chrome/browser/web/font_size/BUILD.gn b/ios/chrome/browser/web/font_size/BUILD.gn index 5b63c49..b0493ed 100644 --- a/ios/chrome/browser/web/font_size/BUILD.gn +++ b/ios/chrome/browser/web/font_size/BUILD.gn
@@ -22,8 +22,8 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/web:feature_flags", "//ios/components/ui_util", - "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser:font_size_java_script_feature", + "//ios/public/provider/chrome/browser/text_zoom:text_zoom_api", "//services/metrics/public/cpp:ukm_builders", ] }
diff --git a/ios/chrome/browser/web/font_size/font_size_tab_helper.mm b/ios/chrome/browser/web/font_size/font_size_tab_helper.mm index 265d350..865ce90 100644 --- a/ios/chrome/browser/web/font_size/font_size_tab_helper.mm +++ b/ios/chrome/browser/web/font_size/font_size_tab_helper.mm
@@ -22,9 +22,8 @@ #include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/web/features.h" #include "ios/components/ui_util/dynamic_type_util.h" -#include "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/font_size_java_script_feature.h" -#import "ios/public/provider/chrome/browser/text_zoom_provider.h" +#import "ios/public/provider/chrome/browser/text_zoom/text_zoom_api.h" #include "services/metrics/public/cpp/ukm_builders.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -139,8 +138,8 @@ } tab_helper_has_zoomed_ = true; - ios::GetChromeBrowserProvider().GetTextZoomProvider()->SetPageFontSize( - web_state_, size); + DCHECK(ios::provider::IsTextZoomEnabled()); + ios::provider::SetTextZoomForWebState(web_state_, size); } void FontSizeTabHelper::UserZoom(Zoom zoom) {
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index 8e20368..294415c 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -1db212a61ed182f1452bf2122a1fa50ccfd2e705 \ No newline at end of file +eebdf0a85ce8085fbbcf42579111fa4c3418996f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index 06cf152..43c769e 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -c368dd864b17e1070de8dd0c47b418808e6d1093 \ No newline at end of file +adeefd9cfa4078969cd9937208d78a9f532f9c79 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index cf40dca0..c2eac16 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -70a16f774446387a3805d2211c788f9ee60e48df \ No newline at end of file +480e499c8b4c47f96b5197cebc75d63efb5f397b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index 4b0c58b1..284d86c 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -65d08aaa214759ba9a2fa9c943ab3fb392ec8dac \ No newline at end of file +5ca0156a9d89d443ae9200bdb36cfae254448191 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index 0da97d12..eea2845 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -007a1417f54ce4e78cd463cd3677d234b981ae09 \ No newline at end of file +6274430d3b63eb7ddc4c1a7b9a8765ebc150b01a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index f383671..05a9be3 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -525b47d858d4a434ff1deca092f5f2937933fe46 \ No newline at end of file +b91d37f0b10f188955eb78c42924d4d818258594 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index aefca3b..b43bbb3 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -1d0cc18d3f8fcab2b3c71735bec92b3e889d38c1 \ No newline at end of file +a4c7cba55059d7e238e7222eecb3eee2ca8dfcbd \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 930126f..acdc5c8c 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -95a6d05353036397e265bc96bf5fa19d8059a7b0 \ No newline at end of file +ff79848ac321e4b3a7fdd4ba8c05af9a522a0d40 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index 1fd3eb21..d69955a7 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -18100757468d10eb20005962679379073e38a930 \ No newline at end of file +152687dae7e567f04d3cb0e4523c8a725c2c01c1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index b4bf001..d44e290 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -c5bb9d59ae2092a85075c7062e4dfe85410da5c2 \ No newline at end of file +f1e9028654939f9dec9e8974a4192e7304bc7b87 \ No newline at end of file
diff --git a/ios/web_view/internal/cwv_flags.mm b/ios/web_view/internal/cwv_flags.mm index e2295c98..4fcadfa 100644 --- a/ios/web_view/internal/cwv_flags.mm +++ b/ios/web_view/internal/cwv_flags.mm
@@ -113,16 +113,16 @@ BOOL usesSyncSandbox = NO; BOOL usesWalletSandbox = NO; - base::ListValue supportedFeatures; - base::ListValue unsupportedFeatures; + base::Value::ListStorage supportedFeatures; + base::Value::ListStorage unsupportedFeatures; _flagsState->GetFlagFeatureEntries( - _flagsStorage.get(), flags_ui::kGeneralAccessFlagsOnly, - &supportedFeatures, &unsupportedFeatures, + _flagsStorage.get(), flags_ui::kGeneralAccessFlagsOnly, supportedFeatures, + unsupportedFeatures, base::BindRepeating(&ios_web_view::SkipConditionalFeatureEntry)); - for (size_t i = 0; i < supportedFeatures.GetSize(); i++) { + for (size_t i = 0; i < supportedFeatures.size(); i++) { base::DictionaryValue* featureEntry; - if (!supportedFeatures.GetDictionary(i, &featureEntry)) { + if (!supportedFeatures[i].GetAsDictionary(&featureEntry)) { NOTREACHED(); } std::string internalName;
diff --git a/media/base/bitrate.cc b/media/base/bitrate.cc index e8c8d7c7..36132e7c 100644 --- a/media/base/bitrate.cc +++ b/media/base/bitrate.cc
@@ -13,6 +13,10 @@ (this->peak_ == right.peak_); } +bool Bitrate::operator!=(const Bitrate& right) const { + return !(*this == right); +} + uint32_t Bitrate::peak() const { DCHECK_EQ(mode_ == Mode::kConstant, peak_ == 0u); return peak_;
diff --git a/media/base/bitrate.h b/media/base/bitrate.h index bcf57483..de36a6f4 100644 --- a/media/base/bitrate.h +++ b/media/base/bitrate.h
@@ -34,6 +34,7 @@ return Bitrate(Mode::kVariable, target_bitrate, peak_bitrate); } bool operator==(const Bitrate& right) const; + bool operator!=(const Bitrate& right) const; // Accessor for |mode_|. constexpr Mode mode() const { return mode_; }
diff --git a/media/base/video_encoder.h b/media/base/video_encoder.h index a6e4712e..543c0c96 100644 --- a/media/base/video_encoder.h +++ b/media/base/video_encoder.h
@@ -7,6 +7,7 @@ #include "base/callback.h" #include "base/time/time.h" +#include "media/base/bitrate.h" #include "media/base/media_export.h" #include "media/base/status.h" #include "media/base/video_codecs.h" @@ -44,7 +45,7 @@ Options(); Options(const Options&); ~Options(); - absl::optional<uint64_t> bitrate; + absl::optional<Bitrate> bitrate; absl::optional<double> framerate; gfx::Size frame_size;
diff --git a/media/gpu/mac/vt_video_encode_accelerator_mac.cc b/media/gpu/mac/vt_video_encode_accelerator_mac.cc index 6c7623b..34544bcb2 100644 --- a/media/gpu/mac/vt_video_encode_accelerator_mac.cc +++ b/media/gpu/mac/vt_video_encode_accelerator_mac.cc
@@ -338,11 +338,10 @@ uint32_t framerate) { DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); - // If this is changed to use variable bitrate encoding, change the mode check - // to check that the mode matches the current mode. if (bitrate.mode() != media::Bitrate::Mode::kConstant) { - NotifyError(kInvalidArgumentError); - return; + // Even if users ask for VBR, CBR will do for now, because + // CBR is kinda a subset of VBR. + DLOG(ERROR) << "Unexpected bitrate mode. Using CBR anyway."; } if (!compression_session_) {
diff --git a/media/gpu/test/image_quality_metrics.cc b/media/gpu/test/image_quality_metrics.cc index 40eea6d7..da56c4df 100644 --- a/media/gpu/test/image_quality_metrics.cc +++ b/media/gpu/test/image_quality_metrics.cc
@@ -138,12 +138,11 @@ double ComputeSimilarity(const VideoFrame* frame1, const VideoFrame* frame2, SimilarityMetrics mode) { - ASSERT_TRUE_OR_RETURN( - frame1->IsMappable() && frame2->IsMappable(), - static_cast<double>(std::numeric_limits<std::size_t>::max())); + ASSERT_TRUE_OR_RETURN(frame1->IsMappable() && frame2->IsMappable(), + std::numeric_limits<std::size_t>::max()); ASSERT_TRUE_OR_RETURN( frame1->visible_rect().size() == frame2->visible_rect().size(), - static_cast<double>(std::numeric_limits<std::size_t>::max())); + std::numeric_limits<std::size_t>::max()); // Ideally, frame1->BitDepth() should be the same as frame2->BitDepth() // always. But in the 10 bit case, the 10 bit frame can be carried with P016LE // whose bit depth is regarded to be 16. This is due to a lack of NV12 10-bit @@ -152,7 +151,7 @@ ASSERT_TRUE_OR_RETURN( (frame1->BitDepth() == 8 && frame1->BitDepth() == frame2->BitDepth()) || std::min(frame1->BitDepth(), frame2->BitDepth()) == 10, - static_cast<double>(std::numeric_limits<std::size_t>::max())); + std::numeric_limits<std::size_t>::max()); const size_t bit_depth = std::min(frame1->BitDepth(), frame2->BitDepth()); const VideoPixelFormat common_format = bit_depth == 8 ? PIXEL_FORMAT_I420 : PIXEL_FORMAT_YUV420P10;
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index 8ac5414..456a212 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -64,6 +64,9 @@ // if encoder requests less. constexpr size_t kMinNumFramesInFlight = 4; +// VASurfaceIDs internal format. +constexpr unsigned int kVaSurfaceFormat = VA_RT_FORMAT_YUV420; + void FillVAEncRateControlParams( uint32_t bps, uint32_t window_size, @@ -90,31 +93,6 @@ hrd_param.buffer_size = buffer_size; hrd_param.initial_buffer_fullness = buffer_size / 2; } - -// Calculate the size of the allocated buffer aligned to hardware/driver -// requirements. -gfx::Size GetInputFrameSize(VideoPixelFormat format, - const gfx::Size& visible_size) { - // Get a VideoFrameLayout of a graphic buffer with the same gfx::BufferUsage - // as camera stack. - absl::optional<VideoFrameLayout> layout = GetPlatformVideoFrameLayout( - /*gpu_memory_buffer_factory=*/nullptr, format, visible_size, - gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE); - if (!layout || layout->planes().empty()) { - VLOGF(1) << "Failed to allocate VideoFrameLayout"; - return gfx::Size(); - } - - int32_t stride = layout->planes()[0].stride; - size_t plane_size = layout->planes()[0].size; - if (stride == 0 || plane_size == 0) { - VLOGF(1) << "Unexpected stride=" << stride << ", plane_size=" << plane_size; - return gfx::Size(); - } - - return gfx::Size(stride, plane_size / stride); -} - } // namespace struct VaapiVideoEncodeAccelerator::InputFrameRef { @@ -383,19 +361,6 @@ expected_input_coded_size_.width() <= encoder_->GetCodedSize().width() && expected_input_coded_size_.height() <= encoder_->GetCodedSize().height()); - DCHECK_EQ(IsConfiguredForTesting(), !aligned_va_surface_size_.IsEmpty()); - if (!IsConfiguredForTesting()) { - // The aligned VA surface size must be the same as a size of a native - // graphics buffer. Since the VA surface's format is NV12, we specify NV12 - // to query the size of the native graphics buffer. - aligned_va_surface_size_ = - GetInputFrameSize(PIXEL_FORMAT_NV12, config.input_visible_size); - if (aligned_va_surface_size_.IsEmpty()) { - NOTIFY_ERROR(kPlatformFailureError, "Failed to get frame size"); - return; - } - } - va_surfaces_per_video_frame_ = native_input_mode_ ? @@ -616,32 +581,159 @@ return blit_surface; } +bool VaapiVideoEncodeAccelerator::CreateSurfacesForGpuMemoryBufferEncoding( + const VideoFrame& frame, + const gfx::Size& encode_size, + scoped_refptr<VASurface>* input_surface, + scoped_refptr<VASurface>* reconstructed_surface) { + DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_); + DCHECK(native_input_mode_); + + if (frame.storage_type() != VideoFrame::STORAGE_GPU_MEMORY_BUFFER) { + NOTIFY_ERROR(kPlatformFailureError, + "Unexpected storage: " + << VideoFrame::StorageTypeToString(frame.storage_type())); + return false; + } + + if (frame.format() != PIXEL_FORMAT_NV12) { + NOTIFY_ERROR( + kPlatformFailureError, + "Expected NV12, got: " << VideoPixelFormatToString(frame.format())); + return false; + } + + const bool do_vpp = frame.visible_rect() != gfx::Rect(encode_size); + if (do_vpp) { + constexpr size_t kNumSurfaces = 2; // input and reconstructed surface. + if (base::Contains(available_vpp_va_surface_ids_, encode_size) && + available_vpp_va_surface_ids_[encode_size].size() < kNumSurfaces) { + DVLOGF(4) << "Not enough surfaces available"; + return false; + } + } else { + constexpr size_t kNumSurfaces = 1; // reconstructed surface. + if (available_va_surface_ids_.size() < kNumSurfaces) { + DVLOGF(4) << "Not surface available"; + return false; + } + } + + // Create VASurface from GpuMemory-based VideoFrame. + scoped_refptr<gfx::NativePixmap> pixmap = CreateNativePixmapDmaBuf(&frame); + if (!pixmap) { + NOTIFY_ERROR(kPlatformFailureError, + "Failed to create NativePixmap from VideoFrame"); + return false; + } + + *input_surface = vaapi_wrapper_->CreateVASurfaceForPixmap(std::move(pixmap)); + if (!input_surface) { + NOTIFY_ERROR(kPlatformFailureError, "Failed to create VASurface"); + return false; + } + + // Crop and Scale input surface to a surface whose size is |encode_size|. + // The size of a reconstructed surface is also |encode_size|. + if (do_vpp) { + // Create blit destination and reconstructed surfaces. + *input_surface = BlitSurfaceWithCreateVppIfNeeded( + *input_surface->get(), frame.visible_rect(), encode_size, + (num_frames_in_flight_ + 1) * 2); + DCHECK(input_surface); + + // A reconstructed surface is fine to be created by VPP VaapiWrapper and + // encoder VaapiWrapper. Use one created by VPP VaapiWrapper when VPP is + // executed. + DCHECK(!available_vpp_va_surface_ids_[encode_size].empty()); + *reconstructed_surface = base::MakeRefCounted<VASurface>( + available_vpp_va_surface_ids_[encode_size].back(), encode_size, + kVaSurfaceFormat, + base::BindOnce(vpp_va_surface_release_cb_[encode_size])); + + available_vpp_va_surface_ids_[encode_size].pop_back(); + } else { + // TODO(crbug.com/1186051): Create VA Surface here for the first time, not + // in Initialize() + *reconstructed_surface = base::MakeRefCounted<VASurface>( + available_va_surface_ids_.back(), encoder_->GetCodedSize(), + kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_)); + available_va_surface_ids_.pop_back(); + } + + return true; +} + +bool VaapiVideoEncodeAccelerator::CreateSurfacesForShmemEncoding( + const VideoFrame& frame, + scoped_refptr<VASurface>* input_surface, + scoped_refptr<VASurface>* reconstructed_surface) { + DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_); + DCHECK(!native_input_mode_); + DCHECK(frame.IsMappable()); + + if (expected_input_coded_size_ != frame.coded_size()) { + // In non-zero copy mode, the coded size of the incoming frame should be + // the same as the one we requested through + // Client::RequireBitstreamBuffers(). + NOTIFY_ERROR(kPlatformFailureError, + "Expected frame coded size: " + << expected_input_coded_size_.ToString() + << ", but got: " << frame.coded_size().ToString()); + return false; + } + + DCHECK_EQ(visible_rect_.origin(), gfx::Point(0, 0)); + if (visible_rect_ != frame.visible_rect()) { + // In non-zero copy mode, the client is responsible for scaling and + // cropping. + NOTIFY_ERROR(kPlatformFailureError, + "Expected frame visible rectangle: " + << visible_rect_.ToString() + << ", but got: " << frame.visible_rect().ToString()); + return false; + } + + constexpr size_t kNumSurfaces = 2; // input and reconstructed surface. + if (available_va_surface_ids_.size() < kNumSurfaces) { + DVLOGF(4) << "Not enough surfaces available"; + return false; + } + + scoped_refptr<VASurface> surfaces[kNumSurfaces]; + for (auto& surface : surfaces) { + surface = base::MakeRefCounted<VASurface>( + available_va_surface_ids_.back(), encoder_->GetCodedSize(), + kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_)); + available_va_surface_ids_.pop_back(); + } + + *input_surface = std::move(surfaces[0]); + *reconstructed_surface = std::move(surfaces[1]); + return true; +} + std::unique_ptr<VaapiVideoEncoderDelegate::EncodeJob> VaapiVideoEncodeAccelerator::CreateEncodeJob(scoped_refptr<VideoFrame> frame, bool force_keyframe, const gfx::Size& encode_size) { DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_); + DCHECK(frame); - if (native_input_mode_ && - frame->storage_type() != VideoFrame::STORAGE_DMABUFS && - frame->storage_type() != VideoFrame::STORAGE_GPU_MEMORY_BUFFER) { - NOTIFY_ERROR(kPlatformFailureError, - "Unexpected storage: " - << VideoFrame::StorageTypeToString(frame->storage_type())); - return nullptr; - } - - if (available_va_surface_ids_.size() < va_surfaces_per_video_frame_) { - DVLOGF(4) << "Not enough surfaces available"; - return nullptr; - } - - if (base::Contains(available_vpp_va_surface_ids_, encode_size)) { - if (available_vpp_va_surface_ids_[encode_size].empty()) { - DVLOGF(4) << "Not enough vpp surfaces available"; + scoped_refptr<VASurface> input_surface; + scoped_refptr<VASurface> reconstructed_surface; + if (native_input_mode_) { + if (!CreateSurfacesForGpuMemoryBufferEncoding( + *frame, encode_size, &input_surface, &reconstructed_surface)) { + return nullptr; + } + } else { + if (!CreateSurfacesForShmemEncoding(*frame, &input_surface, + &reconstructed_surface)) { return nullptr; } } + DCHECK(input_surface && reconstructed_surface); auto coded_buffer = vaapi_wrapper_->CreateVABuffer(VAEncCodedBufferType, output_buffer_byte_size_); @@ -649,90 +741,6 @@ NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer"); return nullptr; } - - scoped_refptr<VASurface> input_surface; - if (native_input_mode_) { - if (frame->format() != PIXEL_FORMAT_NV12) { - NOTIFY_ERROR( - kPlatformFailureError, - "Expected NV12, got: " << VideoPixelFormatToString(frame->format())); - return nullptr; - } - DCHECK(frame); - - scoped_refptr<gfx::NativePixmap> pixmap = - CreateNativePixmapDmaBuf(frame.get()); - if (!pixmap) { - NOTIFY_ERROR(kPlatformFailureError, - "Failed to create NativePixmap from VideoFrame"); - return nullptr; - } - input_surface = vaapi_wrapper_->CreateVASurfaceForPixmap(std::move(pixmap)); - - if (!input_surface) { - NOTIFY_ERROR(kPlatformFailureError, "Failed to create VASurface"); - return nullptr; - } - } else { - if (expected_input_coded_size_ != frame->coded_size()) { - // In non-zero copy mode, the coded size of the incoming frame should be - // the same as the one we requested through - // Client::RequireBitstreamBuffers(). - NOTIFY_ERROR(kPlatformFailureError, - "Expected frame coded size: " - << expected_input_coded_size_.ToString() - << ", but got: " << frame->coded_size().ToString()); - return nullptr; - } - - DCHECK_EQ(visible_rect_.origin(), gfx::Point(0, 0)); - if (visible_rect_ != frame->visible_rect()) { - // In non-zero copy mode, the client is responsible for scaling and - // cropping. - NOTIFY_ERROR(kPlatformFailureError, - "Expected frame visible rectangle: " - << visible_rect_.ToString() - << ", but got: " << frame->visible_rect().ToString()); - return nullptr; - } - input_surface = new VASurface(available_va_surface_ids_.back(), - encoder_->GetCodedSize(), kVaSurfaceFormat, - base::BindOnce(va_surface_release_cb_)); - available_va_surface_ids_.pop_back(); - } - - if (visible_rect_ != frame->visible_rect()) { - DCHECK(native_input_mode_); - // Simulcast mode, allocate the same number of surfaces as reconstructed - // surfaces when create vpp. - input_surface = BlitSurfaceWithCreateVppIfNeeded( - *input_surface, frame->visible_rect(), aligned_va_surface_size_, - num_frames_in_flight_ + 1); - DCHECK(input_surface); - } - - scoped_refptr<VASurface> reconstructed_surface; - if (encode_size != visible_rect_.size()) { - DCHECK(native_input_mode_); - // K-SVC mode, allocate surfaces as input and reconstructed surfaces for - // lower layer when create vpp. - input_surface = BlitSurfaceWithCreateVppIfNeeded( - *input_surface, visible_rect_, encode_size, - (num_frames_in_flight_ + 1) * 2); - DCHECK(input_surface); - - reconstructed_surface = - new VASurface(available_vpp_va_surface_ids_[encode_size].back(), - encode_size, kVaSurfaceFormat, - base::BindOnce(vpp_va_surface_release_cb_[encode_size])); - available_vpp_va_surface_ids_[encode_size].pop_back(); - } else { - reconstructed_surface = new VASurface( - available_va_surface_ids_.back(), encoder_->GetCodedSize(), - kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_)); - available_va_surface_ids_.pop_back(); - } - scoped_refptr<CodecPicture> picture; switch (output_codec_) { case kCodecH264:
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h index 99ba8bf..63a6aeb 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
@@ -108,6 +108,22 @@ const gfx::Size& encode_size, size_t num_va_surfaces); + // Create input and reconstructed surfaces used in encoding whose sizes are + // |encode_size| from GpuMemoryBuffer-based VideoFrame |frame|. This must be + // called only in native input mode. + bool CreateSurfacesForGpuMemoryBufferEncoding( + const VideoFrame& frame, + const gfx::Size& encode_size, + scoped_refptr<VASurface>* input_surface, + scoped_refptr<VASurface>* reconstructed_surface); + + // Create input and reconstructed surfaces used in encoding from SharedMemory + // VideoFrame |frame|. This must be called only in non native input mode. + bool CreateSurfacesForShmemEncoding( + const VideoFrame& frame, + scoped_refptr<VASurface>* input_surface, + scoped_refptr<VASurface>* reconstructed_surface); + // Checks if sufficient resources for a new encode job with |frame| as input // are available, and if so, claims them by associating them with // a EncodeJob, and returns the newly-created job, nullptr otherwise. @@ -162,9 +178,6 @@ // and will free them on destruction. scoped_refptr<VaapiWrapper> vaapi_wrapper_; - // The aligned size of the allocated physical buffer for input buffer. - gfx::Size aligned_va_surface_size_; - // The expected coded size of incoming video frames when |native_input_mode_| // is false. gfx::Size expected_input_coded_size_; @@ -212,9 +225,6 @@ std::map<gfx::Size, std::vector<VASurfaceID>, SizeComparator> available_vpp_va_surface_ids_; - // VASurfaceIDs internal format. - static constexpr unsigned int kVaSurfaceFormat = VA_RT_FORMAT_YUV420; - // VA buffers for coded frames. std::vector<VABufferID> available_va_buffer_ids_;
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc index e760e130..4a65997 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc
@@ -272,7 +272,6 @@ auto* vaapi_encoder = reinterpret_cast<VaapiVideoEncodeAccelerator*>(encoder_.get()); vaapi_encoder->supported_profiles_for_testing_.push_back(profile); - vaapi_encoder->aligned_va_surface_size_ = config.input_visible_size; if (config.input_visible_size.IsEmpty()) return false; return encoder_->Initialize(config, &client_); @@ -452,13 +451,6 @@ GetDefaultSVCResolutions(num_spatial_layers); constexpr VABufferID kCodedBufferIds[] = {123, 124, 125}; for (size_t i = 0; i < num_spatial_layers; ++i) { - const VABufferID kCodedBufferId = kCodedBufferIds[i]; - EXPECT_CALL(*mock_vaapi_wrapper_, - CreateVABuffer(VAEncCodedBufferType, output_buffer_size_)) - .WillOnce(WithArgs<1>([kCodedBufferId](size_t buffer_size) { - return ScopedVABuffer::CreateForTesting( - kCodedBufferId, VAEncCodedBufferType, buffer_size); - })); const VASurfaceID kInputSurfaceId = va_surfaces_.back(); const gfx::Size layer_size = svc_resolutions[i]; EXPECT_CALL(*mock_vaapi_wrapper_, CreateVASurfaceForPixmap(_, _)) @@ -496,6 +488,14 @@ VideoRotation::VIDEO_ROTATION_0)) .WillOnce(Return(true)); } + + const VABufferID kCodedBufferId = kCodedBufferIds[i]; + EXPECT_CALL(*mock_vaapi_wrapper_, + CreateVABuffer(VAEncCodedBufferType, output_buffer_size_)) + .WillOnce(WithArgs<1>([kCodedBufferId](size_t buffer_size) { + return ScopedVABuffer::CreateForTesting( + kCodedBufferId, VAEncCodedBufferType, buffer_size); + })); } for (size_t i = 0; i < num_spatial_layers; ++i) {
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc index 90531f9..2319406 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -137,7 +137,7 @@ DCHECK(main_client_task_runner_->BelongsToCurrentThread()); SupportedProfiles profiles; - target_bitrate_ = kDefaultTargetBitrate; + bitrate_ = Bitrate::ConstantBitrate(kDefaultTargetBitrate); frame_rate_ = kMaxFrameRateNumerator / kMaxFrameRateDenominator; IMFActivate** pp_activate = nullptr; uint32_t encoder_count = EnumerateHardwareEncoders(&pp_activate); @@ -256,7 +256,7 @@ frame_rate_ = config.initial_framerate.value(); else frame_rate_ = kMaxFrameRateNumerator / kMaxFrameRateDenominator; - target_bitrate_ = config.bitrate.target(); + bitrate_ = config.bitrate; bitstream_buffer_size_ = config.input_visible_size.GetArea(); gop_length_ = config.gop_length; @@ -591,7 +591,7 @@ RETURN_ON_HR_FAILURE(hr, "Couldn't set media type", false); hr = imf_output_media_type_->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264); RETURN_ON_HR_FAILURE(hr, "Couldn't set video format", false); - hr = imf_output_media_type_->SetUINT32(MF_MT_AVG_BITRATE, target_bitrate_); + hr = imf_output_media_type_->SetUINT32(MF_MT_AVG_BITRATE, bitrate_.target()); RETURN_ON_HR_FAILURE(hr, "Couldn't set bitrate", false); hr = MFSetAttributeRatio(imf_output_media_type_.Get(), MF_MT_FRAME_RATE, frame_rate_, 1); @@ -643,7 +643,14 @@ VARIANT var; var.vt = VT_UI4; - var.ulVal = eAVEncCommonRateControlMode_CBR; + switch (bitrate_.mode()) { + case Bitrate::Mode::kConstant: + var.ulVal = eAVEncCommonRateControlMode_CBR; + break; + case Bitrate::Mode::kVariable: + var.ulVal = eAVEncCommonRateControlMode_PeakConstrainedVBR; + break; + } hr = codec_api_->SetValue(&CODECAPI_AVEncCommonRateControlMode, &var); if (!compatible_with_win7_) { // Though CODECAPI_AVEncCommonRateControlMode is supported by Windows 7, but @@ -662,12 +669,20 @@ } } - var.ulVal = target_bitrate_; + var.ulVal = bitrate_.target(); hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMeanBitRate, &var); if (!compatible_with_win7_) { RETURN_ON_HR_FAILURE(hr, "Couldn't set bitrate", false); } + if (bitrate_.mode() == Bitrate::Mode::kVariable) { + var.ulVal = bitrate_.peak(); + hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMaxBitRate, &var); + if (!compatible_with_win7_) { + RETURN_ON_HR_FAILURE(hr, "Couldn't set bitrate", false); + } + } + if (!is_async_mft_ || (is_async_mft_ && S_OK == codec_api_->IsModifiable(&CODECAPI_AVEncAdaptiveMode))) { @@ -1240,24 +1255,30 @@ uint32_t framerate) { DVLOG(3) << __func__; DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); - // If this is changed to use variable bitrate encoding, change this mode check - // to check that the mode matches the current mode. - RETURN_ON_HR_FAILURE(bitrate.mode() == media::Bitrate::Mode::kConstant, - "Invalid bitrate mode", ); + RETURN_ON_FAILURE(bitrate.mode() == bitrate_.mode(), + "Invalid bitrate mode", ); frame_rate_ = framerate ? std::min(framerate, static_cast<uint32_t>(kMaxFrameRateNumerator)) : 1; - if (target_bitrate_ != bitrate.target()) { - target_bitrate_ = bitrate.target() ? bitrate.target() : 1; + if (bitrate_ != bitrate) { + bitrate_ = bitrate; VARIANT var; var.vt = VT_UI4; - var.ulVal = target_bitrate_; + var.ulVal = bitrate.target(); HRESULT hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMeanBitRate, &var); if (!compatible_with_win7_) { - RETURN_ON_HR_FAILURE(hr, "Couldn't update bitrate", ); + RETURN_ON_HR_FAILURE(hr, "Couldn't update mean bitrate", ); + } + + if (bitrate.mode() == Bitrate::Mode::kVariable) { + var.ulVal = bitrate.peak(); + hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMaxBitRate, &var); + if (!compatible_with_win7_) { + RETURN_ON_HR_FAILURE(hr, "Couldn't set max bitrate", ); + } } } }
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h index ac457b8..56fed1c 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
@@ -143,7 +143,7 @@ gfx::Size input_visible_size_; size_t bitstream_buffer_size_; uint32_t frame_rate_; - uint32_t target_bitrate_; + Bitrate bitrate_; // Group of picture length for encoded output stream, indicates the // distance between two key frames.
diff --git a/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc index 4bb4a37..8fd15fc 100644 --- a/media/video/openh264_video_encoder.cc +++ b/media/video/openh264_video_encoder.cc
@@ -38,8 +38,9 @@ params->uiIntraPeriod = options.keyframe_interval.value(); if (options.bitrate.has_value()) { + auto& bitrate = options.bitrate.value(); params->iRCMode = RC_BITRATE_MODE; - params->iTargetBitrate = base::saturated_cast<int>(options.bitrate.value()); + params->iTargetBitrate = base::saturated_cast<int>(bitrate.target()); } else { params->iRCMode = RC_OFF_MODE; }
diff --git a/media/video/software_video_encoder_test.cc b/media/video/software_video_encoder_test.cc index 83e23d9f..88144f0e 100644 --- a/media/video/software_video_encoder_test.cc +++ b/media/video/software_video_encoder_test.cc
@@ -326,7 +326,7 @@ TEST_P(SoftwareVideoEncoderTest, OutputCountEqualsFrameCount) { VideoEncoder::Options options; options.frame_size = gfx::Size(320, 200); - options.bitrate = 1e6; // 1Mbps + options.bitrate = Bitrate::VariableBitrate(1e6, 2e6); options.framerate = 25; options.keyframe_interval = options.framerate.value() * 3; // every 3s int total_frames_count = @@ -367,7 +367,7 @@ TEST_P(SoftwareVideoEncoderTest, EncodeAndDecode) { VideoEncoder::Options options; options.frame_size = gfx::Size(320, 200); - options.bitrate = 1e6; // 1Mbps + options.bitrate = Bitrate::ConstantBitrate(1e6); // 1Mbps options.framerate = 25; if (codec_ == kCodecH264) options.avc.produce_annexb = true; @@ -431,7 +431,7 @@ TEST_P(SVCVideoEncoderTest, EncodeClipTemporalSvc) { VideoEncoder::Options options; options.frame_size = gfx::Size(320, 200); - options.bitrate = 1e6; // 1Mbps + options.bitrate = Bitrate::ConstantBitrate(1e6); // 1Mbps options.framerate = 25; options.temporal_layers = GetParam().temporal_layers; if (codec_ == kCodecH264) @@ -596,7 +596,7 @@ TEST_P(H264VideoEncoderTest, EncodeAndDecodeWithConfig) { VideoEncoder::Options options; options.frame_size = gfx::Size(320, 200); - options.bitrate = 1e6; // 1Mbps + options.bitrate = Bitrate::ConstantBitrate(1e6); // 1Mbps options.framerate = 25; options.avc.produce_annexb = false; struct ChunkWithConfig {
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc index ab076bcc..1c3db0f 100644 --- a/media/video/video_encode_accelerator_adapter.cc +++ b/media/video/video_encode_accelerator_adapter.cc
@@ -11,6 +11,7 @@ #include "base/callback_helpers.h" #include "base/logging.h" #include "base/memory/ref_counted.h" +#include "base/numerics/ranges.h" #include "base/numerics/safe_conversions.h" #include "base/sequenced_task_runner.h" #include "base/synchronization/waitable_event.h" @@ -41,12 +42,14 @@ if (opts.framerate.has_value()) initial_framerate = static_cast<uint32_t>(opts.framerate.value()); - auto config = VideoEncodeAccelerator::Config( - format, opts.frame_size, profile, - Bitrate::ConstantBitrate(opts.bitrate.value_or( - opts.frame_size.width() * opts.frame_size.height() * - kVEADefaultBitratePerPixel)), - initial_framerate, opts.keyframe_interval); + uint64_t default_bitrate = opts.frame_size.width() * + opts.frame_size.height() * + kVEADefaultBitratePerPixel; + Bitrate bitrate = + opts.bitrate.value_or(Bitrate::ConstantBitrate(default_bitrate)); + auto config = + VideoEncodeAccelerator::Config(format, opts.frame_size, profile, bitrate, + initial_framerate, opts.keyframe_interval); if (opts.temporal_layers > 1) { VideoEncodeAccelerator::Config::SpatialLayer layer; @@ -341,12 +344,11 @@ return; } - uint32_t target_bitrate = - std::min(options.bitrate.value_or(options.frame_size.width() * - options.frame_size.height() * - kVEADefaultBitratePerPixel), - uint64_t{std::numeric_limits<uint32_t>::max()}); - Bitrate bitrate = Bitrate::ConstantBitrate(target_bitrate); + uint32_t default_bitrate = options.frame_size.width() * + options.frame_size.height() * + kVEADefaultBitratePerPixel; + auto bitrate = + options.bitrate.value_or(Bitrate::ConstantBitrate(default_bitrate)); uint32_t framerate = base::ClampRound<uint32_t>( options.framerate.value_or(VideoEncodeAccelerator::kDefaultFramerate));
diff --git a/media/video/vpx_video_encoder.cc b/media/video/vpx_video_encoder.cc index 07ce0fd..480e938 100644 --- a/media/video/vpx_video_encoder.cc +++ b/media/video/vpx_video_encoder.cc
@@ -108,11 +108,18 @@ config->kf_max_dist = opts.keyframe_interval.value(); } - if (opts.bitrate.has_value() && opts.bitrate.value()) { - config->rc_end_usage = VPX_CBR; - config->rc_target_bitrate = opts.bitrate.value() / 1000; + if (opts.bitrate.has_value()) { + auto& bitrate = opts.bitrate.value(); + config->rc_target_bitrate = bitrate.target() / 1000; + switch (bitrate.mode()) { + case Bitrate::Mode::kVariable: + config->rc_end_usage = VPX_VBR; + break; + case Bitrate::Mode::kConstant: + config->rc_end_usage = VPX_CBR; + break; + } } else { - config->rc_end_usage = VPX_VBR; config->rc_target_bitrate = double{opts.frame_size.GetCheckedArea().ValueOrDie()} / config->g_w / config->g_h * config->rc_target_bitrate;
diff --git a/mojo/public/cpp/bindings/receiver_set.cc b/mojo/public/cpp/bindings/receiver_set.cc index bd764be..38dc3cc2 100644 --- a/mojo/public/cpp/bindings/receiver_set.cc +++ b/mojo/public/cpp/bindings/receiver_set.cc
@@ -29,7 +29,9 @@ return true; } - void DidDispatchOrReject(Message* message, bool accepted) override {} + void DidDispatchOrReject(Message* message, bool accepted) override { + entry_.DidDispatchOrReject(); + } Entry& entry_; }; @@ -50,6 +52,10 @@ state_.SetDispatchContext(receiver_->GetContext(), id_); } +void ReceiverSetState::Entry::DidDispatchOrReject() { + state_.SetDispatchContext(nullptr, 0); +} + void ReceiverSetState::Entry::OnDisconnect(uint32_t custom_reason_code, const std::string& description) { WillDispatch();
diff --git a/mojo/public/cpp/bindings/receiver_set.h b/mojo/public/cpp/bindings/receiver_set.h index a6a8d36..16de0e65 100644 --- a/mojo/public/cpp/bindings/receiver_set.h +++ b/mojo/public/cpp/bindings/receiver_set.h
@@ -80,6 +80,7 @@ class DispatchFilter; void WillDispatch(); + void DidDispatchOrReject(); void OnDisconnect(uint32_t custom_reason_code, const std::string& description);
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc index 8ff1927..c55339f 100644 --- a/net/http/http_response_headers.cc +++ b/net/http/http_response_headers.cc
@@ -753,24 +753,42 @@ bool HttpResponseHeaders::GetCacheControlDirective(base::StringPiece directive, TimeDelta* result) const { - base::StringPiece name("cache-control"); + static constexpr base::StringPiece name("cache-control"); std::string value; size_t directive_size = directive.size(); size_t iter = 0; while (EnumerateHeader(&iter, name, &value)) { - if (value.size() > directive_size + 1 && - base::StartsWith(value, directive, - base::CompareCase::INSENSITIVE_ASCII) && - value[directive_size] == '=') { - int64_t seconds; - base::StringToInt64(base::MakeStringPiece( - value.begin() + directive_size + 1, value.end()), - &seconds); - *result = TimeDelta::FromSeconds(seconds); - return true; + if (!base::StartsWith(value, directive, + base::CompareCase::INSENSITIVE_ASCII)) { + continue; } + if (value.size() == directive_size || value[directive_size] != '=') + continue; + // 1*DIGIT with leading and trailing spaces, as described at + // https://datatracker.ietf.org/doc/html/rfc7234#section-1.2.1. + auto start = value.cbegin() + directive_size + 1; + auto end = value.cend(); + while (start < end && *start == ' ') { + // leading spaces + ++start; + } + while (start < end - 1 && *(end - 1) == ' ') { + // trailing spaces + --end; + } + if (start == end || + !std::all_of(start, end, [](char c) { return '0' <= c && c <= '9'; })) { + continue; + } + int64_t seconds = 0; + base::StringToInt64(base::MakeStringPiece(start, end), &seconds); + // We ignore the return value because we've already checked the input + // string. For the overflow case we use TimeDelta::FiniteMax().InSeconds(). + seconds = std::min(seconds, base::TimeDelta::FiniteMax().InSeconds()); + *result = TimeDelta::FromSeconds(seconds); + return true; } return false;
diff --git a/net/http/http_response_headers_unittest.cc b/net/http/http_response_headers_unittest.cc index 54ac958..4e62e36 100644 --- a/net/http/http_response_headers_unittest.cc +++ b/net/http/http_response_headers_unittest.cc
@@ -2184,22 +2184,39 @@ EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); } +TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithInterimSpaceIsRejected) { + InitializeHeadersWithCacheControl("max-age=1 2"); + EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); +} + +TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithMinusSignIsRejected) { + InitializeHeadersWithCacheControl("max-age=-7"); + EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); +} + TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithSpaceBeforeEqualsIsRejected) { InitializeHeadersWithCacheControl("max-age = 7"); EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); } +TEST_F(HttpResponseHeadersCacheControlTest, + MaxAgeWithLeadingandTrailingSpaces) { + InitializeHeadersWithCacheControl("max-age= 7 "); + EXPECT_EQ(TimeDelta::FromSeconds(7), GetMaxAgeValue()); +} + TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeFirstMatchUsed) { InitializeHeadersWithCacheControl("max-age=10, max-age=20"); EXPECT_EQ(TimeDelta::FromSeconds(10), GetMaxAgeValue()); } TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeBogusFirstMatchUsed) { - // "max-age10" isn't parsed as "max-age"; "max-age=now" is parsed as - // "max-age=0" and so "max-age=20" is not used. - InitializeHeadersWithCacheControl("max-age10, max-age=now, max-age=20"); - EXPECT_EQ(TimeDelta::FromSeconds(0), GetMaxAgeValue()); + // "max-age10" isn't parsed as "max-age"; "max-age=now" is bogus and + // ignored and so "max-age=20" is used. + InitializeHeadersWithCacheControl( + "max-age10, max-age=now, max-age=20, max-age=30"); + EXPECT_EQ(TimeDelta::FromSeconds(20), GetMaxAgeValue()); } TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeCaseInsensitive) { @@ -2207,9 +2224,14 @@ EXPECT_EQ(TimeDelta::FromSeconds(15), GetMaxAgeValue()); } +TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeOverflow) { + InitializeHeadersWithCacheControl("max-age=99999999999999999999"); + EXPECT_EQ(TimeDelta::FiniteMax().InSeconds(), GetMaxAgeValue().InSeconds()); +} + struct MaxAgeTestData { const char* max_age_string; - const int64_t expected_seconds; + const absl::optional<int64_t> expected_seconds; }; class MaxAgeEdgeCasesTest @@ -2223,27 +2245,31 @@ std::string max_age = "max-age="; InitializeHeadersWithCacheControl( (max_age + test.max_age_string).c_str()); - EXPECT_EQ(test.expected_seconds, GetMaxAgeValue().InSeconds()) - << " for max-age=" << test.max_age_string; + if (test.expected_seconds.has_value()) { + EXPECT_EQ(test.expected_seconds.value(), GetMaxAgeValue().InSeconds()) + << " for max-age=" << test.max_age_string; + } else { + EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer())); + } } const MaxAgeTestData max_age_tests[] = { {" 1 ", 1}, // Spaces are ignored. - {"-1", -1}, // Negative numbers are passed through. - {"--1", 0}, // Leading junk gives 0. - {"2s", 2}, // Trailing junk is ignored. - {"3 days", 3}, - {"'4'", 0}, // Single quotes don't work. - {"\"5\"", 0}, // Double quotes don't work. - {"0x6", 0}, // Hex not parsed as hex. - {"7F", 7}, // Hex without 0x still not parsed as hex. - {"010", 10}, // Octal not parsed as octal. + {"-1", absl::nullopt}, + {"--1", absl::nullopt}, + {"2s", absl::nullopt}, + {"3 days", absl::nullopt}, + {"'4'", absl::nullopt}, + {"\"5\"", absl::nullopt}, + {"0x6", absl::nullopt}, // Hex not parsed as hex. + {"7F", absl::nullopt}, // Hex without 0x still not parsed as hex. + {"010", 10}, // Octal not parsed as octal. + {"9223372036853", 9223372036853}, {"9223372036854", 9223372036854}, - // {"9223372036855", -9223372036854}, // Undefined behaviour. - // {"9223372036854775806", -2}, // Undefined behaviour. - {"9223372036854775807", 9223372036854775807}, - {"20000000000000000000", - std::numeric_limits<int64_t>::max()}, // Overflow int64_t. + {"9223372036855", 9223372036854}, + {"9223372036854775806", 9223372036854}, + {"9223372036854775807", 9223372036854}, + {"20000000000000000000", 9223372036854}, // Overflow int64_t. }; INSTANTIATE_TEST_SUITE_P(HttpResponseHeadersCacheControl, @@ -2263,9 +2289,9 @@ } TEST_F(HttpResponseHeadersCacheControlTest, - StaleWhileRevalidateWithInvalidValueTreatedAsZero) { + StaleWhileRevalidateWithInvalidValueIgnored) { InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=true"); - EXPECT_EQ(TimeDelta(), GetStaleWhileRevalidateValue()); + EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer())); } TEST_F(HttpResponseHeadersCacheControlTest, StaleWhileRevalidateValueReturned) {
diff --git a/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java b/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java index 150b4d75eb..2f03cee 100644 --- a/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java +++ b/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java
@@ -16,6 +16,7 @@ import android.text.TextUtils; import org.chromium.base.Log; +import org.chromium.base.annotations.RemovableInRelease; import java.util.List; @@ -38,9 +39,8 @@ mPrintManager.print(printJobName, documentAdapter, attributes); } + @RemovableInRelease private void dumpJobStatesForDebug() { - if (!Log.isLoggable(TAG, Log.VERBOSE)) return; - List<PrintJob> printJobs = mPrintManager.getPrintJobs(); String[] states = new String[printJobs.size()];
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc index d7bcb757..f2a60bb 100644 --- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc +++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
@@ -171,7 +171,11 @@ #endif // V8 uses PKU (a.k.a. MPK / PKEY) for protecting code spaces. - if (sysno == __NR_pkey_alloc || sysno == __NR_pkey_free) { + if (sysno == __NR_pkey_alloc) { + return RestrictPkeyAllocFlags(); + } + + if (sysno == __NR_pkey_free) { return Allow(); }
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc index 17c7e13..a8f860f 100644 --- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc +++ b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
@@ -462,4 +462,9 @@ } #endif // defined(OS_NACL_NONSFI) +ResultExpr RestrictPkeyAllocFlags() { + const Arg<int> flags(0); + return If(flags == 0, Allow()).Else(CrashSIGSYS()); +} + } // namespace sandbox.
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h index 7e4dd6e9..348970b 100644 --- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h +++ b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
@@ -114,6 +114,9 @@ // reporting. See https://crbug.com/933418 for details. SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictPtrace(); +// Restrict the flags argument for pkey_alloc. It's specified to always be 0. +SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictPkeyAllocFlags(); + } // namespace sandbox. #endif // SANDBOX_LINUX_SECCOMP_BPF_HELPERS_SYSCALL_PARAMETERS_RESTRICTIONS_H_
diff --git a/services/network/trust_tokens/test/signed_request_verification_util.cc b/services/network/trust_tokens/test/signed_request_verification_util.cc index 597c6238..6c495f6 100644 --- a/services/network/trust_tokens/test/signed_request_verification_util.cc +++ b/services/network/trust_tokens/test/signed_request_verification_util.cc
@@ -16,7 +16,7 @@ #include "net/http/http_request_headers.h" #include "net/http/structured_headers.h" #include "services/network/public/cpp/trust_token_http_headers.h" -#include "services/network/trust_tokens/ed25519_trust_token_request_signer.h" +#include "services/network/trust_tokens/ecdsa_sha256_trust_token_request_signer.h" #include "services/network/trust_tokens/trust_token_parameterization.h" #include "services/network/trust_tokens/trust_token_request_canonicalizer.h" #include "services/network/trust_tokens/trust_token_request_signing_helper.h" @@ -124,8 +124,8 @@ [](base::span<const uint8_t> data, base::span<const uint8_t> signature, base::span<const uint8_t> verification_key, const std::string& signing_alg) { - std::unique_ptr<Ed25519TrustTokenRequestSigner> signer = - std::make_unique<Ed25519TrustTokenRequestSigner>(); + std::unique_ptr<EcdsaSha256TrustTokenRequestSigner> signer = + std::make_unique<EcdsaSha256TrustTokenRequestSigner>(); return signer->Verify(data, signature, verification_key) && signing_alg == signer->GetAlgorithmIdentifier(); });
diff --git a/services/network/trust_tokens/test/signed_request_verification_util.h b/services/network/trust_tokens/test/signed_request_verification_util.h index 6669c756d..975bbed 100644 --- a/services/network/trust_tokens/test/signed_request_verification_util.h +++ b/services/network/trust_tokens/test/signed_request_verification_util.h
@@ -31,7 +31,7 @@ // - If |error_out| is non-null, on failure, sets it to a human-readable // description of the reason the verification failed. // - If |verifier| is non-null, uses the given verifier to verify the -// signatures instead of Ed25519. +// signatures instead of ecdsa_secp256r1_sha256. bool ReconstructSigningDataAndVerifySignatures( const GURL& destination, const net::HttpRequestHeaders& headers, @@ -39,7 +39,7 @@ base::span<const uint8_t> signature, base::span<const uint8_t> verification_key, const std::string& sig_alg)> verifier = - {}, // defaults to Ed25519 + {}, // defaults to ecdsa_secp256r1_sha256 std::string* error_out = nullptr, std::map<std::string, std::string>* verification_keys_out = nullptr, mojom::TrustTokenSignRequestData* sign_request_data_out = nullptr);
diff --git a/services/network/trust_tokens/test/trust_token_request_handler.cc b/services/network/trust_tokens/test/trust_token_request_handler.cc index 983967eb8..644d621 100644 --- a/services/network/trust_tokens/test/trust_token_request_handler.cc +++ b/services/network/trust_tokens/test/trust_token_request_handler.cc
@@ -20,7 +20,6 @@ #include "net/http/http_request_headers.h" #include "net/http/structured_headers.h" #include "services/network/public/cpp/trust_token_http_headers.h" -#include "services/network/trust_tokens/ed25519_trust_token_request_signer.h" #include "services/network/trust_tokens/scoped_boringssl_bytes.h" #include "services/network/trust_tokens/test/signed_request_verification_util.h" #include "services/network/trust_tokens/trust_token_request_canonicalizer.h"
diff --git a/services/network/trust_tokens/trust_token_database_owner.cc b/services/network/trust_tokens/trust_token_database_owner.cc index ca79dbe..0dc73c9 100644 --- a/services/network/trust_tokens/trust_token_database_owner.cc +++ b/services/network/trust_tokens/trust_token_database_owner.cc
@@ -28,10 +28,7 @@ "trust_tokens_issuer_toplevel_pair_config"; // When updating the database's schema, please increment the schema version. -// -// TODO(crbug.com/1133969): In particular, when changing signing keys to use -// P-256, update the version number to reset storage contents. -constexpr int kCurrentSchemaVersion = 1; +constexpr int kCurrentSchemaVersion = 2; } // namespace void TrustTokenDatabaseOwner::Create(
diff --git a/services/network/trust_tokens/trust_token_request_helper_factory.cc b/services/network/trust_tokens/trust_token_request_helper_factory.cc index ef4af6a..85a2df2d 100644 --- a/services/network/trust_tokens/trust_token_request_helper_factory.cc +++ b/services/network/trust_tokens/trust_token_request_helper_factory.cc
@@ -19,8 +19,8 @@ #include "services/network/public/mojom/trust_tokens.mojom-shared.h" #include "services/network/trust_tokens/boringssl_trust_token_issuance_cryptographer.h" #include "services/network/trust_tokens/boringssl_trust_token_redemption_cryptographer.h" -#include "services/network/trust_tokens/ed25519_key_pair_generator.h" -#include "services/network/trust_tokens/ed25519_trust_token_request_signer.h" +#include "services/network/trust_tokens/ecdsa_p256_key_pair_generator.h" +#include "services/network/trust_tokens/ecdsa_sha256_trust_token_request_signer.h" #include "services/network/trust_tokens/local_trust_token_operation_delegate.h" #include "services/network/trust_tokens/local_trust_token_operation_delegate_impl.h" #include "services/network/trust_tokens/operating_system_matching.h" @@ -166,7 +166,7 @@ Outcome::kSuccessfullyCreatedARedemptionHelper); auto helper = std::make_unique<TrustTokenRequestRedemptionHelper>( std::move(top_frame_origin), params->refresh_policy, store, - key_commitment_getter_, std::make_unique<Ed25519KeyPairGenerator>(), + key_commitment_getter_, std::make_unique<EcdsaP256KeyPairGenerator>(), std::make_unique<BoringsslTrustTokenRedemptionCryptographer>(), std::move(net_log)); std::move(done).Run(TrustTokenStatusOrRequestHelper( @@ -208,7 +208,7 @@ Outcome::kSuccessfullyCreatedASigningHelper); auto helper = std::make_unique<TrustTokenRequestSigningHelper>( store, std::move(signing_params), - std::make_unique<Ed25519TrustTokenRequestSigner>(), + std::make_unique<EcdsaSha256TrustTokenRequestSigner>(), std::make_unique<TrustTokenRequestCanonicalizer>(), std::move(net_log)); std::move(done).Run(TrustTokenStatusOrRequestHelper(
diff --git a/sql/statement.cc b/sql/statement.cc index e69c931..c3b55c3 100644 --- a/sql/statement.cc +++ b/sql/statement.cc
@@ -402,7 +402,7 @@ static_assert(static_cast<int>(ColumnType::kNull) == SQLITE_NULL, "NULL mismatch"); -ColumnType Statement::GetColumnType(int col) const { +ColumnType Statement::GetColumnType(int col) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -415,14 +415,14 @@ return static_cast<enum ColumnType>(sqlite3_column_type(ref_->stmt(), col)); } -bool Statement::ColumnBool(int column_index) const { +bool Statement::ColumnBool(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID return static_cast<bool>(ColumnInt64(column_index)); } -int Statement::ColumnInt(int column_index) const { +int Statement::ColumnInt(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -441,7 +441,7 @@ return sqlite3_column_int(ref_->stmt(), column_index); } -int64_t Statement::ColumnInt64(int column_index) const { +int64_t Statement::ColumnInt64(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -460,7 +460,7 @@ return sqlite3_column_int64(ref_->stmt(), column_index); } -double Statement::ColumnDouble(int column_index) const { +double Statement::ColumnDouble(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -479,7 +479,7 @@ return sqlite3_column_double(ref_->stmt(), column_index); } -base::Time Statement::ColumnTime(int column_index) const { +base::Time Statement::ColumnTime(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -500,7 +500,7 @@ base::TimeDelta::FromMicroseconds(int_value)); } -std::string Statement::ColumnString(int column_index) const { +std::string Statement::ColumnString(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -526,7 +526,7 @@ return result; } -std::u16string Statement::ColumnString16(int column_index) const { +std::u16string Statement::ColumnString16(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -546,7 +546,7 @@ return string.empty() ? std::u16string() : base::UTF8ToUTF16(string); } -int Statement::ColumnByteLength(int column_index) const { +int Statement::ColumnByteLength(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -565,7 +565,7 @@ return sqlite3_column_bytes(ref_->stmt(), column_index); } -const void* Statement::ColumnBlob(int column_index) const { +const void* Statement::ColumnBlob(int column_index) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -584,8 +584,7 @@ return sqlite3_column_blob(ref_->stmt(), column_index); } -bool Statement::ColumnBlobAsString(int column_index, - std::string* result) const { +bool Statement::ColumnBlobAsString(int column_index, std::string* result) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -612,7 +611,7 @@ } bool Statement::ColumnBlobAsVector(int column_index, - std::vector<char>* result) const { + std::vector<char>* result) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID @@ -642,7 +641,7 @@ } bool Statement::ColumnBlobAsVector(int column_index, - std::vector<uint8_t>* result) const { + std::vector<uint8_t>* result) { #if !defined(OS_ANDROID) // TODO(crbug.com/866218): Remove this conditional DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #endif // OS_ANDROID
diff --git a/sql/statement.h b/sql/statement.h index c664ab8..91871fc 100644 --- a/sql/statement.h +++ b/sql/statement.h
@@ -162,15 +162,15 @@ // "type conversion." This means requesting the value of a column of a type // where that type is not the native type. For safety, call ColumnType only // on a column before getting the value out in any way. - ColumnType GetColumnType(int col) const; + ColumnType GetColumnType(int col); // These all take a 0-based argument index. - bool ColumnBool(int column_index) const; - int ColumnInt(int column_index) const; - int64_t ColumnInt64(int column_index) const; - double ColumnDouble(int column_index) const; - std::string ColumnString(int column_index) const; - std::u16string ColumnString16(int column_index) const; + bool ColumnBool(int column_index); + int ColumnInt(int column_index); + int64_t ColumnInt64(int column_index); + double ColumnDouble(int column_index); + std::string ColumnString(int column_index); + std::u16string ColumnString16(int column_index); // Conforms with base::Time serialization recommendations. // @@ -181,16 +181,16 @@ // // TODO(crbug.com/1195962): Migrate all time serialization to this method, and // then remove the migration details above. - base::Time ColumnTime(int column_index) const; + base::Time ColumnTime(int column_index); // When reading a blob, you can get a raw pointer to the underlying data, // along with the length, or you can just ask us to copy the blob into a // vector. Danger! ColumnBlob may return nullptr if there is no data! - int ColumnByteLength(int column_index) const; - const void* ColumnBlob(int column_index) const; - bool ColumnBlobAsString(int column_index, std::string* result) const; - bool ColumnBlobAsVector(int column_index, std::vector<char>* result) const; - bool ColumnBlobAsVector(int column_index, std::vector<uint8_t>* result) const; + int ColumnByteLength(int column_index); + const void* ColumnBlob(int column_index); + bool ColumnBlobAsString(int column_index, std::string* result); + bool ColumnBlobAsVector(int column_index, std::vector<char>* result); + bool ColumnBlobAsVector(int column_index, std::vector<uint8_t>* result); // Diagnostics --------------------------------------------------------------
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 20106b8..e298f97 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -131,17 +131,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "merge": { @@ -81079,17 +81075,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "merge": { @@ -83140,17 +83132,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "isolate_profile_data": true, @@ -85271,17 +85259,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 947d940..d11b1d31 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -12272,19 +12272,14 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer", - "--additional-driver-flag=--use-gl=any", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--disable-software-compositing-fallback", - "--additional-driver-flag=--disable-headless-mode", "--no-xvfb", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-gl=any" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-gl=any", + "--flag-specific=skia-gl" ], "isolate_name": "blink_web_tests", "merge": { @@ -12358,14 +12353,6 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--use-gl=any", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--disable-software-compositing-fallback", - "--additional-driver-flag=--use-vulkan=native", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", - "--additional-driver-flag=--disable-headless-mode", "--no-xvfb", "--fuzzy-diff", "--skipped=always", @@ -12373,7 +12360,8 @@ "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=native" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=native", + "--flag-specific=skia-vulkan-native" ], "isolate_name": "blink_web_tests", "merge": { @@ -12730,19 +12718,14 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer", - "--additional-driver-flag=--use-gl=any", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--disable-software-compositing-fallback", - "--additional-driver-flag=--disable-headless-mode", "--no-xvfb", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-gl=any" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-gl=any", + "--flag-specific=skia-gl" ], "isolate_name": "blink_web_tests", "merge": { @@ -12816,14 +12799,6 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--use-gl=any", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--disable-software-compositing-fallback", - "--additional-driver-flag=--use-vulkan=native", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", - "--additional-driver-flag=--disable-headless-mode", "--no-xvfb", "--fuzzy-diff", "--skipped=always", @@ -12831,7 +12806,8 @@ "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=native" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=native", + "--flag-specific=skia-vulkan-native" ], "isolate_name": "blink_web_tests", "merge": {
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index c534d272..edf3d090 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -11699,17 +11699,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "isolate_profile_data": true, @@ -15613,17 +15609,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "merge": { @@ -17617,17 +17609,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "merge": { @@ -19605,17 +19593,13 @@ { "args": [ "--num-retries=3", - "--additional-driver-flag=--enable-gpu-rasterization", - "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan", - "--additional-driver-flag=--enable-oop-rasterization", - "--additional-driver-flag=--use-vulkan=swiftshader", - "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing", "--fuzzy-diff", "--skipped=always", "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer", "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization", - "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader" + "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader", + "--flag-specific=skia-vulkan-swiftshader" ], "isolate_name": "blink_web_tests", "merge": {
diff --git a/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter index 991169c..de597c2 100644 --- a/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter +++ b/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
@@ -107,6 +107,3 @@ # crbug.com/1180466 -org.chromium.chrome.browser.autofill_assistant.AutofillAssistantOverlayIntegrationTest.testShowCastOnIFrameElement - -# crbug.com/1171637 --org.chromium.chrome.browser.autofill_assistant.AutofillAssistantAccessibilityIntegrationTest.testBottomSheetHasRestrictedFixedHeight
diff --git a/testing/buildbot/filters/linux-lacros.browser_tests.filter b/testing/buildbot/filters/linux-lacros.browser_tests.filter index 3fb03a1..52954a1 100644 --- a/testing/buildbot/filters/linux-lacros.browser_tests.filter +++ b/testing/buildbot/filters/linux-lacros.browser_tests.filter
@@ -81,7 +81,7 @@ -ExtensionManagementApiEscalationTest.SetEnabled -ExtensionOverrideTest.SubframeNavigationInOverridenNTPDoesNotAffectFocus -ExtensionPreferenceApiTest.Standard --ExtensionsMenuViewBrowserTest.ClickingContextMenuButton +-ExtensionsMenuViewInteractiveUITest.ClickingContextMenuButton -ExtensionWebRequestApiTest.WebSocketRequest -ExtensionWebRequestApiTest.WebSocketRequestAuthRequired -ExternalProtocolDialogBrowserTest.TestFocus
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 1cbb530..185aa6f 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -2424,12 +2424,6 @@ # retry 3 times, so we explicitly specify it. 'args': [ '--num-retries=3', - '--additional-driver-flag=--enable-gpu-rasterization', - '--additional-driver-flag=--enable-features=UseSkiaRenderer', - '--additional-driver-flag=--use-gl=any', - '--additional-driver-flag=--enable-oop-rasterization', - '--additional-driver-flag=--disable-software-compositing-fallback', - '--additional-driver-flag=--disable-headless-mode', '--no-xvfb', '--fuzzy-diff', '--skipped=always', @@ -2437,6 +2431,7 @@ '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-gl=any', + '--flag-specific=skia-gl', ], 'isolate_name': 'blink_web_tests', 'merge': { @@ -2459,14 +2454,6 @@ # retry 3 times, so we explicitly specify it. 'args': [ '--num-retries=3', - '--additional-driver-flag=--enable-gpu-rasterization', - '--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan', - '--additional-driver-flag=--use-gl=any', - '--additional-driver-flag=--enable-oop-rasterization', - '--additional-driver-flag=--disable-software-compositing-fallback', - '--additional-driver-flag=--use-vulkan=native', - '--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing', - '--additional-driver-flag=--disable-headless-mode', '--no-xvfb', '--fuzzy-diff', '--skipped=always', @@ -2475,6 +2462,7 @@ '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=native', + '--flag-specific=skia-vulkan-native', ], 'isolate_name': 'blink_web_tests', 'merge': { @@ -5108,17 +5096,13 @@ # retry 3 times, so we explicitly specify it. 'args': [ '--num-retries=3', - '--additional-driver-flag=--enable-gpu-rasterization', - '--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan', - '--additional-driver-flag=--enable-oop-rasterization', - '--additional-driver-flag=--use-vulkan=swiftshader', - '--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing', '--fuzzy-diff', '--skipped=always', '--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization', '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader', + '--flag-specific=skia-vulkan-swiftshader', ], 'isolate_name': 'blink_web_tests', 'merge': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 17fd956a..aed62f4 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -7091,6 +7091,7 @@ "android_weblayer", "chromeos", "chromeos_lacros", + "ios", "linux", "mac", "windows"
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index b2ef916..0705963 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -186,15 +186,10 @@ // because kSetOnlyIfOverridden is used for setting WebRuntimeFeatures' // Prerender2. To enable this feature, we need to force-enable this feature // using chrome://flags/#enable-prerender2 or --enable-features=Prerender2 -// command line or a valid Origin Trial token in the page. -const base::Feature kPrerender2 { - "Prerender2", -#if defined(OS_ANDROID) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif -}; +// command line or a valid Origin Trial token in the page after default-enabling +// this feature. +const base::Feature kPrerender2{"Prerender2", + base::FEATURE_DISABLED_BY_DEFAULT}; bool IsPrerender2Enabled() { return base::FeatureList::IsEnabled(blink::features::kPrerender2);
diff --git a/third_party/blink/renderer/bindings/core/v8/boxed_v8_module.h b/third_party/blink/renderer/bindings/core/v8/boxed_v8_module.h index 52e3d6d..c071dcde 100644 --- a/third_party/blink/renderer/bindings/core/v8/boxed_v8_module.h +++ b/third_party/blink/renderer/bindings/core/v8/boxed_v8_module.h
@@ -25,19 +25,13 @@ : record_(isolate, module), identity_hash_(static_cast<unsigned>(module->GetIdentityHash())) {} - void Trace(Visitor* visitor) const { - // TODO(keishi): Remove UnsafeCast. - visitor->Trace(record_.UnsafeCast<v8::Value>()); - } + void Trace(Visitor* visitor) const { visitor->Trace(record_); } v8::Local<v8::Module> NewLocal(v8::Isolate* isolate) const { return record_.NewLocal(isolate); } private: - // TODO(keishi): Visitor only defines a trace method for v8::Value so this - // needs to be cast. - GC_PLUGIN_IGNORE("757708") TraceWrapperV8Reference<v8::Module> record_; const unsigned identity_hash_; friend struct BoxedV8ModuleHash;
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record.cc b/third_party/blink/renderer/bindings/core/v8/module_record.cc index c3f7edf..30ed787 100644 --- a/third_party/blink/renderer/bindings/core/v8/module_record.cc +++ b/third_party/blink/renderer/bindings/core/v8/module_record.cc
@@ -44,7 +44,7 @@ void ModuleRecordProduceCacheData::Trace(Visitor* visitor) const { visitor->Trace(cache_handler_); - visitor->Trace(unbound_script_.UnsafeCast<v8::Value>()); + visitor->Trace(unbound_script_); } v8::Local<v8::Module> ModuleRecord::Compile(
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record.h b/third_party/blink/renderer/bindings/core/v8/module_record.h index c4c02d9..2e2ba8d 100644 --- a/third_party/blink/renderer/bindings/core/v8/module_record.h +++ b/third_party/blink/renderer/bindings/core/v8/module_record.h
@@ -50,10 +50,6 @@ private: Member<SingleCachedMetadataHandler> cache_handler_; V8CodeCache::ProduceCacheOptions produce_cache_options_; - - // TODO(keishi): Visitor only defines a trace method for v8::Value so this - // needs to be cast. - GC_PLUGIN_IGNORE("757708") TraceWrapperV8Reference<v8::UnboundModuleScript> unbound_script_; };
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h index 7285fc00..c165309 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h
@@ -104,8 +104,10 @@ kRTCEncodedAudioFrameTag = 'A', // uint32_t -> transferred audio frame ID kRTCEncodedVideoFrameTag = 'V', // uint32_t -> transferred video frame ID - kAudioDataTag = 'a', // uint32_t -> transferred audio data - kVideoFrameTag = 'v', // uint32_t -> transferred video frame ID + kAudioDataTag = 'a', // uint32_t -> transferred audio data + kVideoFrameTag = 'v', // uint32_t -> transferred video frame ID + kEncodedAudioChunkTag = 'y', // uint32_t -> transferred chunk + kEncodedVideoChunkTag = 'z', // uint32_t -> transferred chunk // The following tags were used by the Shape Detection API implementation // between M71 and M81. During these milestones, the API was always behind
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc index 91b621d..05f72e2 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc
@@ -25,6 +25,9 @@ #include "third_party/blink/renderer/modules/peerconnection/rtc_encoded_video_frame_delegate.h" #include "third_party/blink/renderer/modules/webcodecs/audio_data.h" #include "third_party/blink/renderer/modules/webcodecs/audio_data_attachment.h" +#include "third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.h" +#include "third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk.h" +#include "third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame_attachment.h" @@ -82,6 +85,10 @@ return ReadAudioData(); case kVideoFrameTag: return ReadVideoFrame(); + case kEncodedAudioChunkTag: + return ReadEncodedAudioChunk(); + case kEncodedVideoChunkTag: + return ReadEncodedVideoChunk(); default: break; } @@ -467,4 +474,52 @@ return MakeGarbageCollected<VideoFrame>(handles[index]); } +EncodedAudioChunk* +V8ScriptValueDeserializerForModules::ReadEncodedAudioChunk() { + if (!RuntimeEnabledFeatures::WebCodecsEnabled( + ExecutionContext::From(GetScriptState()))) { + return nullptr; + } + + uint32_t index; + if (!ReadUint32(&index)) + return nullptr; + + const auto* attachment = + GetSerializedScriptValue() + ->GetAttachmentIfExists<DecoderBufferAttachment>(); + if (!attachment) + return nullptr; + + const auto& buffers = attachment->Buffers(); + if (index >= attachment->size()) + return nullptr; + + return MakeGarbageCollected<EncodedAudioChunk>(buffers[index]); +} + +EncodedVideoChunk* +V8ScriptValueDeserializerForModules::ReadEncodedVideoChunk() { + if (!RuntimeEnabledFeatures::WebCodecsEnabled( + ExecutionContext::From(GetScriptState()))) { + return nullptr; + } + + uint32_t index; + if (!ReadUint32(&index)) + return nullptr; + + const auto* attachment = + GetSerializedScriptValue() + ->GetAttachmentIfExists<DecoderBufferAttachment>(); + if (!attachment) + return nullptr; + + const auto& buffers = attachment->Buffers(); + if (index >= attachment->size()) + return nullptr; + + return MakeGarbageCollected<EncodedVideoChunk>(buffers[index]); +} + } // namespace blink
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h index bcab8457..2e2e0776e 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h
@@ -12,6 +12,8 @@ class AudioData; class CryptoKey; +class EncodedAudioChunk; +class EncodedVideoChunk; class FileSystemHandle; class RTCEncodedAudioFrame; class RTCEncodedVideoFrame; @@ -52,6 +54,8 @@ RTCEncodedVideoFrame* ReadRTCEncodedVideoFrame(); AudioData* ReadAudioData(); VideoFrame* ReadVideoFrame(); + EncodedAudioChunk* ReadEncodedAudioChunk(); + EncodedVideoChunk* ReadEncodedVideoChunk(); }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc index 5eb90a3f..fc61325d 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.cc
@@ -14,6 +14,8 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_crypto_key.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_dom_file_system.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_encoded_audio_chunk.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_encoded_video_chunk.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_directory_handle.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_file_handle.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_landmark.h" @@ -28,6 +30,9 @@ #include "third_party/blink/renderer/modules/peerconnection/rtc_encoded_video_frame_delegate.h" #include "third_party/blink/renderer/modules/webcodecs/audio_data.h" #include "third_party/blink/renderer/modules/webcodecs/audio_data_attachment.h" +#include "third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.h" +#include "third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk.h" +#include "third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame_attachment.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame_transfer_list.h" @@ -175,6 +180,25 @@ } return WriteMediaAudioBuffer(std::move(data)); } + if ((wrapper_type_info == V8EncodedAudioChunk::GetWrapperTypeInfo() || + wrapper_type_info == V8EncodedVideoChunk::GetWrapperTypeInfo()) && + RuntimeEnabledFeatures::WebCodecsEnabled( + ExecutionContext::From(GetScriptState()))) { + if (IsForStorage()) { + exception_state.ThrowDOMException( + DOMExceptionCode::kDataCloneError, + "Encoded chunks cannot be serialized for storage."); + return false; + } + + if (wrapper_type_info == V8EncodedAudioChunk::GetWrapperTypeInfo()) { + auto data = wrappable->ToImpl<EncodedAudioChunk>()->buffer(); + return WriteDecoderBuffer(std::move(data), /*for_audio=*/true); + } + + auto data = wrappable->ToImpl<EncodedVideoChunk>()->buffer(); + return WriteDecoderBuffer(std::move(data), /*for_audio=*/false); + } return false; } @@ -429,4 +453,19 @@ return true; } +bool V8ScriptValueSerializerForModules::WriteDecoderBuffer( + scoped_refptr<media::DecoderBuffer> data, + bool for_audio) { + auto* attachment = GetSerializedScriptValue() + ->GetOrCreateAttachment<DecoderBufferAttachment>(); + auto& buffers = attachment->Buffers(); + buffers.push_back(std::move(data)); + const uint32_t index = static_cast<uint32_t>(buffers.size() - 1); + + WriteTag(for_audio ? kEncodedAudioChunkTag : kEncodedVideoChunkTag); + WriteUint32(index); + + return true; +} + } // namespace blink
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h index a31e39f8..b0566a3 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h
@@ -12,6 +12,7 @@ namespace media { class AudioBuffer; +class DecoderBuffer; } namespace blink { @@ -50,6 +51,8 @@ bool WriteRTCEncodedVideoFrame(RTCEncodedVideoFrame*); bool WriteVideoFrameHandle(scoped_refptr<VideoFrameHandle>); bool WriteMediaAudioBuffer(scoped_refptr<media::AudioBuffer>); + bool WriteDecoderBuffer(scoped_refptr<media::DecoderBuffer> data, + bool for_audio); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index 6397c9b..1eeed6c 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -32,9 +32,7 @@ #include <algorithm> #include <cmath> -#include <iterator> #include <memory> -#include <vector> #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/animation/animation_effect.h" @@ -74,36 +72,6 @@ namespace { -constexpr CSSPropertyID kCompositableProperties[] = { - CSSPropertyID::kOpacity, CSSPropertyID::kBackdropFilter, - CSSPropertyID::kRotate, CSSPropertyID::kScale, - CSSPropertyID::kTranslate, CSSPropertyID::kTransform, - CSSPropertyID::kFilter}; - -const size_t kNumCompositableCSSProperties = - sizeof(kCompositableProperties) / sizeof(kCompositableProperties[0]); - -compositor_target_property::Type GetCompositedTransformType( - CSSPropertyID property_id) { - switch (property_id) { - case CSSPropertyID::kRotate: - return compositor_target_property::ROTATE; - - case CSSPropertyID::kScale: - return compositor_target_property::SCALE; - - case CSSPropertyID::kTranslate: - return compositor_target_property::TRANSLATE; - - case CSSPropertyID::kTransform: - return compositor_target_property::TRANSFORM; - - default: - NOTREACHED(); - return compositor_target_property::TRANSFORM; - } -} - bool ConsiderAnimationAsIncompatible(const Animation& animation, const Animation& animation_to_add, const EffectModel& effect_to_add) { @@ -289,6 +257,7 @@ } PropertyHandleSet properties = keyframe_effect.Properties(); + unsigned transform_property_count = 0; for (const auto& property : properties) { if (!property.IsCSSProperty()) { // None of the below reasons make any sense if |property| isn't CSS, so we @@ -306,6 +275,7 @@ reasons |= CheckCanStartTransformAnimationOnCompositorForSVG(*svg_element); } + transform_property_count++; } const PropertySpecificKeyframeVector& keyframes = @@ -450,6 +420,10 @@ reasons |= kCompositorPropertyAnimationsHaveNoEffect; } + // TODO: Support multiple transform property animations on the compositor + if (transform_property_count > 1) + reasons |= kMultipleTransformAnimationsOnSameTarget; + if (animation_to_add && HasIncompatibleAnimations(target_element, *animation_to_add, effect)) { reasons |= kTargetHasIncompatibleAnimations; @@ -586,41 +560,37 @@ const Element& target_element, const Animation& animation_to_add, const EffectModel& effect_to_add) { + const bool affects_opacity = + effect_to_add.Affects(PropertyHandle(GetCSSPropertyOpacity())); + const bool affects_transform = effect_to_add.IsTransformRelatedEffect(); + const bool affects_filter = + effect_to_add.Affects(PropertyHandle(GetCSSPropertyFilter())); + const bool affects_backdrop_filter = + effect_to_add.Affects(PropertyHandle(GetCSSPropertyBackdropFilter())); + if (!target_element.HasAnimations()) return; - bool affects_property[kNumCompositableCSSProperties]; - for (unsigned i = 0; i < kNumCompositableCSSProperties; i++) { - PropertyHandle property = - PropertyHandle(CSSProperty::Get(kCompositableProperties[i])); - affects_property[i] = effect_to_add.Affects(property); - } - ElementAnimations* element_animations = target_element.GetElementAnimations(); DCHECK(element_animations); for (const auto& entry : element_animations->Animations()) { Animation* attached_animation = entry.key; - const auto* effect = - DynamicTo<KeyframeEffect>(attached_animation->effect()); - if (!effect || effect->EffectTarget() != target_element) - continue; - if (!ConsiderAnimationAsIncompatible(*attached_animation, animation_to_add, effect_to_add)) { continue; } - for (unsigned i = 0; i < kNumCompositableCSSProperties; i++) { - if (!affects_property[i]) - continue; - - PropertyHandle property = - PropertyHandle(CSSProperty::Get(kCompositableProperties[i])); - if (effect->Affects(property)) { - attached_animation->CancelAnimationOnCompositor(); - return; - } + if ((affects_opacity && attached_animation->Affects( + target_element, GetCSSPropertyOpacity())) || + (affects_transform && + IsTransformRelatedAnimation(target_element, attached_animation)) || + (affects_filter && + attached_animation->Affects(target_element, GetCSSPropertyFilter())) || + (affects_backdrop_filter && + attached_animation->Affects(target_element, + GetCSSPropertyBackdropFilter()))) { + attached_animation->CancelAnimationOnCompositor(); } } } @@ -907,8 +877,7 @@ FloatSize box_size = ComputedStyleUtils::ReferenceBoxForTransform( *target_element.GetLayoutObject()) .Size(); - target_property = - GetCompositedTransformType(property.GetCSSProperty().PropertyID()); + target_property = compositor_target_property::TRANSFORM; auto transform_curve = std::make_unique<CompositorTransformAnimationCurve>(); AddKeyframesToCurve(*transform_curve, values, box_size);
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index e0cae30..353a6c76 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -1117,6 +1117,25 @@ animation1, *effect1) & CompositorAnimations:: kTransformRelatedPropertyCannotBeAcceleratedOnTarget); + + StringKeyframeEffectModel* effect2 = CreateKeyframeEffectModel( + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, "translateX(-45px)", + 0), + CreateReplaceOpKeyframe(CSSPropertyID::kRotate, "none", 0), + CreateReplaceOpKeyframe(CSSPropertyID::kTransform, "translateX(45px)", + 1.0), + CreateReplaceOpKeyframe(CSSPropertyID::kRotate, "45deg", 1.0)); + + auto* keyframe_effect2 = + MakeGarbageCollected<KeyframeEffect>(element_.Get(), effect2, timing_); + + Animation* animation2 = timeline_->Play(keyframe_effect2); + effect2->SnapshotAllCompositorKeyframesIfNecessary(*element_.Get(), *style, + nullptr); + + EXPECT_TRUE(CheckCanStartEffectOnCompositor(timing_, *element_.Get(), + animation2, *effect2) & + CompositorAnimations::kMultipleTransformAnimationsOnSameTarget); } TEST_P(AnimationCompositorAnimationsTest,
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc index e45902df..3b1953b37 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -335,6 +335,11 @@ effect_target_->GetComputedStyle()->HasOffset()) reasons |= CompositorAnimations::kTargetHasCSSOffset; + // Do not put transforms on compositor if more than one of them are defined + // in computed style because they need to be explicitly ordered + if (HasMultipleTransformProperties()) + reasons |= CompositorAnimations::kTargetHasMultipleTransformProperties; + reasons |= CompositorAnimations::CheckCanStartAnimationOnCompositor( SpecifiedTiming(), *effect_target_, GetAnimation(), *Model(), paint_artifact_compositor, animation_playback_rate, @@ -716,11 +721,28 @@ return true; } } + return HasMultipleTransformProperties(); } return false; } +bool KeyframeEffect::HasMultipleTransformProperties() const { + if (!effect_target_->GetComputedStyle()) + return false; + + unsigned transform_property_count = 0; + if (effect_target_->GetComputedStyle()->HasTransformOperations()) + transform_property_count++; + if (effect_target_->GetComputedStyle()->Rotate()) + transform_property_count++; + if (effect_target_->GetComputedStyle()->Scale()) + transform_property_count++; + if (effect_target_->GetComputedStyle()->Translate()) + transform_property_count++; + return transform_property_count > 1; +} + ActiveInterpolationsMap KeyframeEffect::InterpolationsForCommitStyles() { // If the associated animation has been removed, it needs to be temporarily // reintroduced to the effect stack in order to be including in the
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.h b/third_party/blink/renderer/core/animation/keyframe_effect.h index 710ef28e..702db6a 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.h +++ b/third_party/blink/renderer/core/animation/keyframe_effect.h
@@ -165,6 +165,7 @@ absl::optional<AnimationTimeDelta> inherited_time, AnimationTimeDelta time_to_next_iteration) const override; bool HasIncompatibleStyle() const; + bool HasMultipleTransformProperties() const; void RestartRunningAnimationOnCompositor(); Member<Element> effect_target_;
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc index 569a5f7..1c229edbc 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
@@ -499,6 +499,15 @@ EXPECT_TRUE(keyframe_effect->CheckCanStartAnimationOnCompositor( nullptr, animation_playback_rate) & CompositorAnimations::kTargetHasCSSOffset); + + // If the target has multiple transform properties we can't composite it. + element->SetInlineStyleProperty(CSSPropertyID::kRotate, "90deg"); + element->SetInlineStyleProperty(CSSPropertyID::kScale, "2 1"); + UpdateAllLifecyclePhasesForTest(); + + EXPECT_TRUE(keyframe_effect->CheckCanStartAnimationOnCompositor( + nullptr, animation_playback_rate) & + CompositorAnimations::kTargetHasMultipleTransformProperties); } TEST_F(KeyframeEffectTest, TranslationTransformsPreserveAxisAlignment) {
diff --git a/third_party/blink/renderer/core/dom/container_node.cc b/third_party/blink/renderer/core/dom/container_node.cc index 16ec3a8..f82aadf 100644 --- a/third_party/blink/renderer/core/dom/container_node.cc +++ b/third_party/blink/renderer/core/dom/container_node.cc
@@ -55,6 +55,7 @@ #include "third_party/blink/renderer/core/layout/layout_text.h" #include "third_party/blink/renderer/core/layout/line/inline_text_box.h" #include "third_party/blink/renderer/core/layout/line/root_inline_box.h" +#include "third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/runtime_call_stats.h" @@ -718,6 +719,14 @@ return nullptr; } + if (auto* layout_object = child->GetLayoutObject()) { + // Request to merge previous and next |LayoutNGTextCombine| of |child|. + // See http:://crbug.com/1227066 + if (UNLIKELY(IsA<LayoutNGTextCombine>(layout_object->PreviousSibling())) && + UNLIKELY(IsA<LayoutNGTextCombine>(layout_object->NextSibling()))) + SetForceReattachLayoutTree(); + } + { HTMLFrameOwnerElement::PluginDisposeSuspendScope suspend_plugin_dispose; TreeOrderedMap::RemoveScope tree_remove_scope;
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.cc b/third_party/blink/renderer/core/dom/element_rare_data.cc index 2cc01ae..dfb6753 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data.cc +++ b/third_party/blink/renderer/core/dom/element_rare_data.cc
@@ -50,7 +50,8 @@ }; ElementRareData::ElementRareData(NodeRenderingData* node_layout_data) - : NodeRareData(node_layout_data, true), class_list_(nullptr) {} + : NodeRareData(ClassType::kElementRareData, node_layout_data), + class_list_(nullptr) {} ElementRareData::~ElementRareData() { DCHECK(!pseudo_element_data_);
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h index a11c868..9480f0c 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data.h +++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -51,7 +51,7 @@ class ResizeObservation; class ResizeObserver; -class ElementRareData : public NodeRareData { +class ElementRareData final : public NodeRareData { public: explicit ElementRareData(NodeRenderingData*); ~ElementRareData();
diff --git a/third_party/blink/renderer/core/dom/node_rare_data.cc b/third_party/blink/renderer/core/dom/node_rare_data.cc index fed737f..f110a3f 100644 --- a/third_party/blink/renderer/core/dom/node_rare_data.cc +++ b/third_party/blink/renderer/core/dom/node_rare_data.cc
@@ -79,20 +79,23 @@ } void NodeData::Trace(Visitor* visitor) const { - if (bit_field_.get_concurrently<IsRareData>()) { - if (bit_field_.get_concurrently<IsElementRareData>()) - static_cast<const ElementRareData*>(this)->TraceAfterDispatch(visitor); - else - static_cast<const NodeRareData*>(this)->TraceAfterDispatch(visitor); - } else { - static_cast<const NodeRenderingData*>(this)->TraceAfterDispatch(visitor); + switch (GetClassType()) { + case ClassType::kNodeRareData: + To<NodeRareData>(this)->TraceAfterDispatch(visitor); + break; + case ClassType::kElementRareData: + To<ElementRareData>(this)->TraceAfterDispatch(visitor); + break; + case ClassType::kNodeRenderingData: + To<NodeRenderingData>(this)->TraceAfterDispatch(visitor); + break; } } NodeRenderingData::NodeRenderingData( LayoutObject* layout_object, scoped_refptr<const ComputedStyle> computed_style) - : NodeData(false, false), + : NodeData(ClassType::kNodeRenderingData), layout_object_(layout_object), computed_style_(computed_style) {} @@ -109,6 +112,10 @@ return *shared_empty_data; } +void NodeRenderingData::TraceAfterDispatch(Visitor* visitor) const { + NodeData::TraceAfterDispatch(visitor); +} + void NodeRareData::RegisterScrollTimeline(ScrollTimeline* timeline) { if (!scroll_timelines_) { scroll_timelines_ = @@ -129,13 +136,6 @@ NodeData::TraceAfterDispatch(visitor); } -void NodeRareData::FinalizeGarbageCollectedObject() { - if (bit_field_.get<IsElementRareData>()) - static_cast<ElementRareData*>(this)->~ElementRareData(); - else - this->~NodeRareData(); -} - void NodeRareData::IncrementConnectedSubframeCount() { SECURITY_CHECK((connected_frame_count_ + 1) <= Page::MaxNumberOfFrames()); ++connected_frame_count_;
diff --git a/third_party/blink/renderer/core/dom/node_rare_data.h b/third_party/blink/renderer/core/dom/node_rare_data.h index a822231..d9e0238 100644 --- a/third_party/blink/renderer/core/dom/node_rare_data.h +++ b/third_party/blink/renderer/core/dom/node_rare_data.h
@@ -27,6 +27,7 @@ #include "third_party/blink/renderer/platform/heap/thread_state.h" #include "third_party/blink/renderer/platform/wtf/bit_field.h" #include "third_party/blink/renderer/platform/wtf/buildflags.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" namespace blink { @@ -34,10 +35,13 @@ class ComputedStyle; enum class DynamicRestyleFlags; enum class ElementFlags; +class ElementRareData; class FlatTreeNodeData; class LayoutObject; class MutationObserverRegistration; class NodeListsNodeData; +class NodeRenderingData; +class NodeRareData; class ScrollTimeline; class NodeMutationObserverData final @@ -67,41 +71,75 @@ HeapHashSet<Member<MutationObserverRegistration>> transient_registry_; }; -class GC_PLUGIN_IGNORE( - "GC plugin reports that TraceAfterDispatch is not called but it is called " - "by both NodeRareDate::TraceAfterDispatch and " - "NodeRenderingData::TraceAfterDispatch.") NodeData - : public GarbageCollected<NodeData> { +class NodeData : public GarbageCollected<NodeData> { public: - NodeData(bool is_rare_data, bool is_element_rare_data) - : connected_frame_count_(0), - element_flags_(0), - bit_field_(RestyleFlags::encode(0) | - IsElementRareData::encode(is_element_rare_data) | - IsRareData::encode(is_rare_data)) { - DCHECK(!is_element_rare_data || is_rare_data); - } - void Trace(Visitor*) const; - void TraceAfterDispatch(blink::Visitor*) const {} - enum { kConnectedFrameCountBits = 10, // Must fit Page::maxNumberOfFrames. kNumberOfElementFlags = 6, kNumberOfDynamicRestyleFlags = 14 }; + enum class ClassType : uint8_t { + kNodeRareData, + kElementRareData, + kNodeRenderingData, + kLastType = kNodeRenderingData + }; + + void Trace(Visitor*) const; + void TraceAfterDispatch(blink::Visitor*) const {} + protected: using BitField = WTF::ConcurrentlyReadBitField<uint16_t>; using RestyleFlags = BitField::DefineFirstValue<uint16_t, kNumberOfDynamicRestyleFlags>; - using IsElementRareData = RestyleFlags:: - DefineNextValue<bool, 1, WTF::BitFieldValueConstness::kConst>; - using IsRareData = IsElementRareData:: - DefineNextValue<bool, 1, WTF::BitFieldValueConstness::kConst>; + static constexpr size_t kClassTypeBits = 2; + static_assert(static_cast<size_t>(ClassType::kLastType) < + ((size_t{1} << kClassTypeBits)), + "Too many subtypes to fit into bitfield."); + using ClassTypeData = + RestyleFlags::DefineNextValue<uint8_t, + kClassTypeBits, + WTF::BitFieldValueConstness::kConst>; + + explicit NodeData(ClassType sub_type) + : connected_frame_count_(0), + element_flags_(0), + bit_field_(RestyleFlags::encode(0) | + ClassTypeData::encode(static_cast<uint8_t>(sub_type))) {} + + ClassType GetClassType() const { + return static_cast<ClassType>(bit_field_.get_concurrently<ClassTypeData>()); + } uint16_t connected_frame_count_ : kConnectedFrameCountBits; uint16_t element_flags_ : kNumberOfElementFlags; BitField bit_field_; + + friend struct DowncastTraits<NodeRareData>; + friend struct DowncastTraits<NodeRenderingData>; + friend struct DowncastTraits<ElementRareData>; +}; + +template <> +struct DowncastTraits<NodeRenderingData> { + static bool AllowFrom(const NodeData& node_data) { + return node_data.GetClassType() == NodeData::ClassType::kNodeRenderingData; + } +}; + +template <> +struct DowncastTraits<NodeRareData> { + static bool AllowFrom(const NodeData& node_data) { + return node_data.GetClassType() == NodeData::ClassType::kNodeRareData; + } +}; + +template <> +struct DowncastTraits<ElementRareData> { + static bool AllowFrom(const NodeData& node_data) { + return node_data.GetClassType() == NodeData::ClassType::kElementRareData; + } }; class NodeRenderingData final : public NodeData { @@ -125,20 +163,17 @@ static NodeRenderingData& SharedEmptyData(); bool IsSharedEmptyData() { return this == &SharedEmptyData(); } - void TraceAfterDispatch(Visitor* visitor) const { - NodeData::TraceAfterDispatch(visitor); - } + void TraceAfterDispatch(Visitor* visitor) const; private: LayoutObject* layout_object_; scoped_refptr<const ComputedStyle> computed_style_; }; -class GC_PLUGIN_IGNORE("Manual dispatch implemented in NodeData.") NodeRareData - : public NodeData { +class NodeRareData : public NodeData { public: explicit NodeRareData(NodeRenderingData* node_layout_data) - : NodeRareData(node_layout_data, false) {} + : NodeRareData(ClassType::kNodeRareData, node_layout_data) {} NodeRareData(const NodeRareData&) = delete; NodeRareData& operator=(const NodeRareData&) = delete; @@ -203,16 +238,14 @@ bool HasRestyleFlags() const { return bit_field_.get<RestyleFlags>(); } void ClearRestyleFlags() { bit_field_.set<RestyleFlags>(0); } - void TraceAfterDispatch(blink::Visitor*) const; - void FinalizeGarbageCollectedObject(); void RegisterScrollTimeline(ScrollTimeline*); void UnregisterScrollTimeline(ScrollTimeline*); + void TraceAfterDispatch(blink::Visitor*) const; + protected: - explicit NodeRareData(NodeRenderingData* node_layout_data, - bool is_element_rare_data) - : NodeData(true, is_element_rare_data), - node_layout_data_(node_layout_data) { + NodeRareData(ClassType class_type, NodeRenderingData* node_layout_data) + : NodeData(class_type), node_layout_data_(node_layout_data) { CHECK_NE(node_layout_data, nullptr); }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc index 4dec1b0..ac1a570a 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc
@@ -842,6 +842,81 @@ ToSimpleLayoutTree(root_layout_object)); } +// http://crbug.com/1227066 +TEST_F(LayoutNGTextCombineTest, RemoveChildToOneCombinedText) { + InsertStyleElement( + "c { text-combine-upright: all; }" + "div { writing-mode: vertical-rl; }"); + SetBodyInnerHTML("<div id=root><c>a<b id=t>x</b>z</c></div>"); + auto& root = *GetElementById("root"); + const auto& root_layout_object = + *To<LayoutNGBlockFlow>(root.GetLayoutObject()); + + EXPECT_EQ(R"DUMP( +LayoutNGBlockFlow DIV id="root" + +--LayoutInline C + | +--LayoutNGTextCombine (anonymous) + | | +--LayoutText #text "a" + | +--LayoutInline B id="t" + | | +--LayoutNGTextCombine (anonymous) + | | | +--LayoutText #text "x" + | +--LayoutNGTextCombine (anonymous) + | | +--LayoutText #text "z" +)DUMP", + ToSimpleLayoutTree(root_layout_object)); + + GetElementById("t")->remove(); + RunDocumentLifecycle(); + + EXPECT_EQ(R"DUMP( +LayoutNGBlockFlow DIV id="root" + +--LayoutInline C + | +--LayoutNGTextCombine (anonymous) + | | +--LayoutText #text "a" + | | +--LayoutText #text "z" +)DUMP", + ToSimpleLayoutTree(root_layout_object)); +} + +// http://crbug.com/1227066 +TEST_F(LayoutNGTextCombineTest, ReplaceChildToOneCombinedText) { + InsertStyleElement( + "c { text-combine-upright: all; }" + "div { writing-mode: vertical-rl; }"); + SetBodyInnerHTML("<div id=root><c>a<b id=t>x</b>z</c></div>"); + auto& root = *GetElementById("root"); + const auto& root_layout_object = + *To<LayoutNGBlockFlow>(root.GetLayoutObject()); + + EXPECT_EQ(R"DUMP( +LayoutNGBlockFlow DIV id="root" + +--LayoutInline C + | +--LayoutNGTextCombine (anonymous) + | | +--LayoutText #text "a" + | +--LayoutInline B id="t" + | | +--LayoutNGTextCombine (anonymous) + | | | +--LayoutText #text "x" + | +--LayoutNGTextCombine (anonymous) + | | +--LayoutText #text "z" +)DUMP", + ToSimpleLayoutTree(root_layout_object)); + + auto& target = *GetElementById("t"); + auto& new_text = *Text::Create(GetDocument(), "X"); + target.parentNode()->replaceChild(&new_text, &target); + RunDocumentLifecycle(); + + EXPECT_EQ(R"DUMP( +LayoutNGBlockFlow DIV id="root" + +--LayoutInline C + | +--LayoutNGTextCombine (anonymous) + | | +--LayoutText #text "a" + | | +--LayoutText #text "X" + | | +--LayoutText #text "z" +)DUMP", + ToSimpleLayoutTree(root_layout_object)); +} + TEST_F(LayoutNGTextCombineTest, SetDataToEmpty) { InsertStyleElement( "c { text-combine-upright: all; }"
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index f10c509..79ed0f4 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1334,6 +1334,17 @@ full_context_.direct_compositing_reasons & CompositingReasonsForEffectProperty(); + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + // If an effect node exists, add an additional direct compositing reason + // for 3d transforms to ensure it is composited. + CompositingReasons additional_transform_compositing_trigger = + CompositingReason::k3DTransform | + CompositingReason::kTrivial3DTransform; + state.direct_compositing_reasons |= + (full_context_.direct_compositing_reasons & + additional_transform_compositing_trigger); + } + if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { state.direct_compositing_reasons |= full_context_.direct_compositing_reasons & @@ -1583,6 +1594,18 @@ state.direct_compositing_reasons = full_context_.direct_compositing_reasons & CompositingReasonsForFilterProperty(); + + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + // If an effect node exists, add an additional direct compositing reason + // for 3d transforms to ensure it is composited. + CompositingReasons additional_transform_compositing_trigger = + CompositingReason::k3DTransform | + CompositingReason::kTrivial3DTransform; + state.direct_compositing_reasons |= + (full_context_.direct_compositing_reasons & + additional_transform_compositing_trigger); + } + state.compositor_element_id = GetCompositorElementId(CompositorElementIdNamespace::kEffectFilter);
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc index 510a103..3dd46b77 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -6971,4 +6971,28 @@ EXPECT_EQ(FloatPoint3D(100, 100, 0), transform_node->Origin()); } +// While not required for correctness, it is important for performance (e.g., +// the MotionMark Focus benchmark) that we do not decomposite effect nodes when +// the author has specified 3d transforms (see: +// |PaintArtifactCompositor::DecompositeEffect|). +TEST_P(PaintPropertyTreeBuilderTest, EffectDirectCompositingReasonWith3D) { + if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) + return; + SetBodyInnerHTML(R"HTML( + <style> + #target { + width: 100px; + height: 100px; + transform: translate3d(1px, 1px, 0); + opacity: 0.5; + filter: blur(1px); + } + </style> + <div id="target"></div> + )HTML"); + const auto* properties = PaintPropertiesForElement("target"); + EXPECT_TRUE(properties->Effect()->HasDirectCompositingReasons()); + EXPECT_TRUE(properties->Filter()->HasDirectCompositingReasons()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/script/module_script.cc b/third_party/blink/renderer/core/script/module_script.cc index 53848c4..ee769fa1 100644 --- a/third_party/blink/renderer/core/script/module_script.cc +++ b/third_party/blink/renderer/core/script/module_script.cc
@@ -100,7 +100,7 @@ void ModuleScript::Trace(Visitor* visitor) const { visitor->Trace(settings_object_); - visitor->Trace(record_.UnsafeCast<v8::Value>()); + visitor->Trace(record_); visitor->Trace(parse_error_); visitor->Trace(error_to_rethrow_); Script::Trace(visitor);
diff --git a/third_party/blink/renderer/core/script/module_script.h b/third_party/blink/renderer/core/script/module_script.h index 79199c5..f6929ec 100644 --- a/third_party/blink/renderer/core/script/module_script.h +++ b/third_party/blink/renderer/core/script/module_script.h
@@ -87,9 +87,6 @@ Member<Modulator> settings_object_; // https://html.spec.whatwg.org/C/#concept-script-record - // TODO(keishi): Visitor only defines a trace method for v8::Value so this - // needs to be cast. - GC_PLUGIN_IGNORE("757708") TraceWrapperV8Reference<v8::Module> record_; // https://html.spec.whatwg.org/C/#concept-script-parse-error
diff --git a/third_party/blink/renderer/modules/virtualkeyboard/navigator_virtual_keyboard.idl b/third_party/blink/renderer/modules/virtualkeyboard/navigator_virtual_keyboard.idl index edf95e28..5b9350b 100644 --- a/third_party/blink/renderer/modules/virtualkeyboard/navigator_virtual_keyboard.idl +++ b/third_party/blink/renderer/modules/virtualkeyboard/navigator_virtual_keyboard.idl
@@ -10,5 +10,5 @@ ImplementedAs=VirtualKeyboard, RuntimeEnabled=VirtualKeyboard ] partial interface Navigator { - [SameObject] readonly attribute VirtualKeyboard virtualKeyboard; + [SecureContext, SameObject] readonly attribute VirtualKeyboard virtualKeyboard; };
diff --git a/third_party/blink/renderer/modules/virtualkeyboard/virtual_keyboard.idl b/third_party/blink/renderer/modules/virtualkeyboard/virtual_keyboard.idl index 384f023..d773c9e5 100644 --- a/third_party/blink/renderer/modules/virtualkeyboard/virtual_keyboard.idl +++ b/third_party/blink/renderer/modules/virtualkeyboard/virtual_keyboard.idl
@@ -8,6 +8,7 @@ [ Exposed=Window, + SecureContext, RuntimeEnabled=VirtualKeyboard ] interface VirtualKeyboard : EventTarget { void show();
diff --git a/third_party/blink/renderer/modules/webcodecs/BUILD.gn b/third_party/blink/renderer/modules/webcodecs/BUILD.gn index 3e92645a..d431724b 100644 --- a/third_party/blink/renderer/modules/webcodecs/BUILD.gn +++ b/third_party/blink/renderer/modules/webcodecs/BUILD.gn
@@ -26,6 +26,8 @@ "codec_state_helper.cc", "codec_state_helper.h", "codec_trace_names.h", + "decoder_buffer_attachment.cc", + "decoder_buffer_attachment.h", "decoder_selector.cc", "decoder_selector.h", "decoder_template.cc",
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.cc b/third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.cc new file mode 100644 index 0000000..f1ff748 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.cc
@@ -0,0 +1,11 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.h" + +namespace blink { + +const void* const DecoderBufferAttachment::kAttachmentKey = nullptr; + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.h b/third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.h new file mode 100644 index 0000000..5222a9c --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/decoder_buffer_attachment.h
@@ -0,0 +1,39 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_DECODER_BUFFER_ATTACHMENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_DECODER_BUFFER_ATTACHMENT_H_ + +#include "media/base/decoder_buffer.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" +#include "third_party/blink/renderer/modules/modules_export.h" + +namespace blink { + +// Used to serialize EncodedAudioChunk and EncodedVideoChunk. +class MODULES_EXPORT DecoderBufferAttachment + : public SerializedScriptValue::Attachment { + public: + using DecoderBufferVector = Vector<scoped_refptr<media::DecoderBuffer>>; + + static const void* const kAttachmentKey; + DecoderBufferAttachment() = default; + ~DecoderBufferAttachment() override = default; + + bool IsLockedToAgentCluster() const override { return !buffers_.IsEmpty(); } + + size_t size() const { return buffers_.size(); } + + DecoderBufferVector& Buffers() { return buffers_; } + + const DecoderBufferVector& Buffers() const { return buffers_; } + + private: + DecoderBufferVector buffers_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_DECODER_BUFFER_ATTACHMENT_H_
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index 3d6fc517..7151053 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -201,6 +201,21 @@ return nullptr; } + if (config->hasBitrate()) { + uint32_t bps = static_cast<uint32_t>(base::ClampToRange( + config->bitrate(), uint64_t{0}, + static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()))); + if (config->hasBitrateMode() && config->bitrateMode() == "constant") { + result->options.bitrate = media::Bitrate::ConstantBitrate(bps); + } else { + // VBR in media:Bitrate supports both target and peak bitrate. + // Currently webcodecs doesn't expose peak bitrate + // (assuming unconstrained VBR), here we just set peak as 10 times target + // as a good enough way of expressing unconstrained VBR. + result->options.bitrate = media::Bitrate::VariableBitrate(bps, 10 * bps); + } + } + if (config->hasDisplayWidth() && config->hasDisplayHeight()) { result->display_size.emplace(config->displayWidth(), config->displayHeight()); @@ -220,9 +235,6 @@ result->options.framerate = config->framerate(); } - if (config->hasBitrate()) - result->options.bitrate = config->bitrate(); - // https://w3c.github.io/webrtc-svc/ if (config->hasScalabilityMode()) { if (config->scalabilityMode() == "L1T2") {
diff --git a/third_party/blink/renderer/platform/heap/impl/visitor.h b/third_party/blink/renderer/platform/heap/impl/visitor.h index 13c863a..8b16937 100644 --- a/third_party/blink/renderer/platform/heap/impl/visitor.h +++ b/third_party/blink/renderer/platform/heap/impl/visitor.h
@@ -213,7 +213,7 @@ // Cross-component tracing interface. template <typename V8Type> void Trace(const TraceWrapperV8Reference<V8Type>& v8reference) { - Visit(v8reference.template Cast<v8::Value>()); + TraceV8ReferenceImpl(v8reference); } // Dynamic visitor interface. @@ -300,6 +300,24 @@ } private: + template <typename V8Type> + void TraceV8ReferenceImpl( + const TraceWrapperV8Reference<V8Type>& v8reference, + std::enable_if_t<std::is_base_of<v8::Value, V8Type>::value>* = nullptr) { + Visit(v8reference.template Cast<v8::Value>()); + } + + template <typename V8Type> + void TraceV8ReferenceImpl( + const TraceWrapperV8Reference<V8Type>& v8reference, + std::enable_if_t<!std::is_base_of<v8::Value, V8Type>::value && + std::is_base_of<v8::Data, V8Type>::value>* = nullptr) { + // The following cast is technically unsafe but works as the memory layout + // for the references is the same and V8 only needs to know that the value + // is a heap object. + Visit(v8reference.template UnsafeCast<v8::Value>()); + } + template <typename T> static void HandleWeakCell(const LivenessBroker&, const void*);
diff --git a/third_party/blink/web_tests/FlagSpecificConfig b/third_party/blink/web_tests/FlagSpecificConfig index c8f0c72..5778134 100644 --- a/third_party/blink/web_tests/FlagSpecificConfig +++ b/third_party/blink/web_tests/FlagSpecificConfig
@@ -26,6 +26,40 @@ { "name": "highdpi", "args": ["--force-device-scale-factor=1.5"] + }, + { + "name": "skia-gl", + "args": [ + "--enable-gpu-rasterization", + "--enable-features=UseSkiaRenderer", + "--use-gl=any", + "--enable-oop-rasterization", + "--disable-software-compositing-fallback", + "--disable-headless-mode" + ] + }, + { + "name": "skia-vulkan-native", + "args": [ + "--enable-gpu-rasterization", + "--enable-features=UseSkiaRenderer,Vulkan", + "--use-gl=any", + "--enable-oop-rasterization", + "--disable-software-compositing-fallback", + "--use-vulkan=native", + "--disable-vulkan-fallback-to-gl-for-testing", + "--disable-headless-mode" + ] + }, + { + "name": "skia-vulkan-swiftshader", + "args": [ + "--enable-gpu-rasterization", + "--enable-features=UseSkiaRenderer,Vulkan", + "--enable-oop-rasterization", + "--use-vulkan=swiftshader", + "--disable-vulkan-fallback-to-gl-for-testing" + ] } ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index bb6d9a25..e751967 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -747,7 +747,7 @@ crbug.com/1046784 http/tests/devtools/sources/source-frame-toolbar-items.js [ Slow ] crbug.com/1046784 http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ] crbug.com/1108423 external/wpt/referrer-policy/gen/worker-classic.http-rp/unset/worker-classic.http.html [ Slow ] -crbug.com/1115091 [ Linux ] external/wpt/secure-payment-confirmation/secure-payment-confirmation.tenative.https.html [ Slow ] +crbug.com/1115091 [ Linux ] external/wpt/secure-payment-confirmation/secure-payment-confirmation.tentative.https.html [ Slow ] crbug.com/1135978 [ Linux Release ] fast/dom/css-delete-doc.html [ Slow ] crbug.com/1145424 [ Linux ] http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Slow ] crbug.com/1145424 [ Win ] http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Slow ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index d7be916..d20be0c9b 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -28,7 +28,6 @@ "external/wpt/css/css-animations", "external/wpt/css/css-scroll-snap", "external/wpt/css/css-transforms/animation", - "external/wpt/css/css-transforms/individual-transform/animation", "external/wpt/feature-policy/experimental-features", "external/wpt/permissions-policy/experimental-features", "external/wpt/html/canvas/offscreen/manual/convert-to-blob",
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations index 5467a9a..2ed1a7db 100644 --- a/third_party/blink/web_tests/WebGPUExpectations +++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -138,6 +138,10 @@ ### Test bugs ### +# NOTE: Reenable crbug.com/1087130 suppressions when these are lifted +crbug.com/760 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createView:Using_defaults_validates_the_same_as_setting_values_for_more_than_1_array_layer:* [ Failure ] +crbug.com/760 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,render_pass_descriptor:it_is_invalid_to_use_a_resolve_target_with_array_layer_count_greater_than_1:* [ Failure ] + # These tests aren't working on CQ, unclear whether the test or harness (or Chrome) is broken. # Mac: mostly works # Linux: actual is white/blank - is actually crashing silently @@ -196,10 +200,12 @@ crbug.com/dawn/746 wpt_internal/webgpu/cts.html?q=webgpu:api,operation,shader_module,compilation_info:offset_and_length:valid=false;unicode=true [ Failure ] -crbug.com/dawn/129 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:viewDimension="1d";* [ Failure ] -crbug.com/dawn/129 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:dimension="1d";* [ Failure ] -crbug.com/dawn/547 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:viewDimension="3d";* [ Failure ] -crbug.com/dawn/547 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:dimension="3d";* [ Failure ] +crbug.com/dawn/760 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:* [ Failure ] +# NOTE: Uncomment the following when the above is lifted. +#crbug.com/dawn/129 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:viewDimension="1d";* [ Failure ] +#crbug.com/dawn/129 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:dimension="1d";* [ Failure ] +#crbug.com/dawn/547 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:viewDimension="3d";* [ Failure ] +#crbug.com/dawn/547 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createBindGroup:texture_must_have_correct_dimension:dimension="3d";* [ Failure ] # Dawn is missing several validation rules about depthReadOnly/stencilReadOnly. wpt_internal/webgpu/cts.html?q=webgpu:api,validation,render_pass,storeOp:* [ Failure ] @@ -309,7 +315,7 @@ ### # Very flaky on Windows/Linux, especially (but not exclusively!) with backend validation -crbug.com/1087130 [ Linux ] wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createView:* [ RetryOnFailure ] +#crbug.com/1087130 [ Linux ] wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createView:* [ RetryOnFailure ] # Nvidia only, worker only, very flaky [ Linux ] wpt_internal/webgpu/cts.html?worker=1&q=webgpu:api,operation,render_pass,storeop2:* [ Failure ] @@ -319,4 +325,4 @@ ### # Very flaky on Windows/Linux, especially (but not exclusively!) with backend validation -crbug.com/1087130 [ Win ] wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createView:* [ RetryOnFailure ] +#crbug.com/1087130 [ Win ] wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createView:* [ RetryOnFailure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/individual-transform/animation/individual-transform-ordering-ref.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/individual-transform/animation/individual-transform-ordering-ref.html deleted file mode 100644 index 94e7e439..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-transforms/individual-transform/animation/individual-transform-ordering-ref.html +++ /dev/null
@@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8"> - <title>Individual transform: combine individual transform properties</title> - <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms"> - <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm"> - <meta name="assert" content="Tests that we combine transforms in the correct order."/> - <style> - @keyframes anim { - to { - transform: translate(50px, 50px) rotate(45deg) scale(2, 1); - } - } - .block { - display: inline-block; - width: 50px; - height: 50px; - margin: 50px; - padding: 0; - transform-origin: 0 0; - background: lime; - /* Freeze the animation at the midpoint. */ - animation-timing-function: cubic-bezier(0, 1, 1, 0); - animation-duration: 1000000s; - animation-delay: -500000s; - animation-name: anim; - } - </style> - </head> - <body> - <div> - <div class="block"></div> - <div class="block"></div> - </div> - <div> - <div class="block"></div> - <div class="block"></div> - </div> - <div> - <div class="block"></div> - <div class="block"></div> - </div> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/individual-transform/animation/individual-transform-ordering.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/individual-transform/animation/individual-transform-ordering.html deleted file mode 100644 index 9d127f1..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-transforms/individual-transform/animation/individual-transform-ordering.html +++ /dev/null
@@ -1,114 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8"> - <title>Individual transform: combine individual transform properties</title> - <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms"> - <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm"> - <meta name="assert" content="Tests that we combine transforms in the correct order when animating."/> - <link rel="match" href="individual-transform-ordering-ref.html"> - <style> - .block { - display: inline-block; - width: 50px; - height: 50px; - margin: 50px; - padding: 0; - transform-origin: 0 0; - background: lime; - /* Freeze the animation at the midpoint. */ - animation-timing-function: cubic-bezier(0, 1, 1, 0); - animation-duration: 1000000s; - animation-delay: -500000s; - } - @keyframes anim-1 { - to { - translate: 50px 50px; - rotate: 45deg; - scale: 2 1; - } - } - #div-1 { - animation-name: anim-1; - } - @keyframes anim-2 { - to { - rotate: 45deg; - scale: 2 1; - translate: 50px 50px; - } - } - #div-2 { - animation-name: anim-2; - } - @keyframes anim-3 { - to { - transform: scale(2, 1); - translate: 50px 50px; - rotate: 45deg; - } - } - #div-3 { - animation-name: anim-3; - } - @keyframes anim-4 { - to { - transform: rotate(45deg) scale(2, 1); - translate: 50px 50px; - } - } - #div-4 { - animation-name: anim-4; - } - @Keyframes anim-5 { - to { transform: rotate(45deg); } - } - @Keyframes anim-6 { - from { transform: none; } - to { transform: translate(50px, 50px) rotate(45deg) scale(2, 1); } - } - /* anim-6 replaces anim-5 since both updating the transform property. */ - #div-5 { - animation-name: anim-5, anim-6; - } - @keyframes anim-7 { - to { - rotate: 45deg; - scale: 2 2; - } - } - @keyframes anim-8 { - from { - translate: 0px 0px; - scale: 1 1; - } - to { - translate: 50px 50px; - scale: 2 1; - } - } - /* - * The scale property is overridden in anim-8, but the rotate property - * from anim-7 is still relevant and must be applied in the correct order - * (after translate but before scale). - */ - #div-6 { - animation-name: anim-7, anim-8; - } - </style> - </head> - <body> - <div> - <div id="div-1" class="block"></div> - <div id="div-2" class="block"></div> - </div> - <div> - <div id="div-3" class="block"></div> - <div id="div-4" class="block"></div> - </div> - <div> - <div id="div-5" class="block"></div> - <div id="div-6" class="block"></div> - </div> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https-expected.txt new file mode 100644 index 0000000..2abf55d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Cross-Origin-Embedder-Policy is inherited by about:blank popup. assert_true: Non-initial about:blank document: Cross-origin without CORP did not fail expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https.html new file mode 100644 index 0000000..2dc73c7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https.html
@@ -0,0 +1,59 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/script-factory.js"></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/common/utils.js"></script> +<script> + const origins = get_host_info(); + + promise_test(async t => { + const popup = window.open(); + t.add_cleanup(() => { popup.close(); }); + + let data_from_popup = () => new Promise(resolve => + window.addEventListener("message", (({ data }) => resolve(data)))); + + let check_result = (data, text) => { + assert_equals(data.origin, origin); + assert_true(data.sameOriginNoCORPSuccess, + text + ": Same-origin without CORP did not succeed"); + assert_true(data.crossOriginNoCORPFailure, + text + ": Cross-origin without CORP did not fail"); + }; + + // Check if COEP is inherited by the popup. + let script = popup.document.createElement('script'); + script.innerHTML = + `${createScript(window.origin, origins.HTTPS_REMOTE_ORIGIN, "opener")}`; + popup.document.body.appendChild(script); + check_result(await data_from_popup(), "Initial empty document"); + + // Navigate the popup away. + popup.location = origins.HTTPS_REMOTE_ORIGIN + + "/html/cross-origin-embedder-policy/resources/postmessage-ready.html"; + assert_equals(await new Promise(resolve => + window.addEventListener("message", msg => resolve(msg.data))), + "ready"); + + // Navigate the popup to about:blank and wait for it. + popup.location = "about:blank"; + await t.step_wait( + condition = () => { + try { + return popup.location.href === "about:blank"; + } catch {} + return false; + }, + description = "Wait for the popup to navigate.", + timeout=3000, + interval=50); + + // Check again if COEP is inherited. + script = popup.document.createElement('script'); + script.innerHTML = + `${createScript(window.origin, origins.HTTPS_REMOTE_ORIGIN, "opener")}`; + popup.document.body.appendChild(script); + check_result(await data_from_popup(), "Non-initial about:blank document"); + }, `Cross-Origin-Embedder-Policy is inherited by about:blank popup.`); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https.html.headers new file mode 100644 index 0000000..66044509 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/about-blank-popup.https.html.headers
@@ -0,0 +1 @@ +Cross-Origin-Embedder-Policy: require-corp
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https-expected.txt new file mode 100644 index 0000000..09cd640c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https-expected.txt
@@ -0,0 +1,12 @@ +This is a testharness.js-based test. +PASS Cross-Origin-Embedder-Policy and blob: URL from https://web-platform.test:8444 in subframe via subframe +PASS Cross-Origin-Embedder-Policy and blob: URL from https://web-platform.test:8444 in subframe via navigate +FAIL Cross-Origin-Embedder-Policy and blob: URL from https://web-platform.test:8444 in subframe via popup assert_true: Cross-origin without CORP did not fail expected true got false +PASS Cross-Origin-Embedder-Policy and blob: URL from https://www1.web-platform.test:8444 in subframe via subframe +PASS Cross-Origin-Embedder-Policy and blob: URL from https://www1.web-platform.test:8444 in subframe via navigate +FAIL Cross-Origin-Embedder-Policy and blob: URL from https://www1.web-platform.test:8444 in subframe via popup assert_true: Cross-origin without CORP did not fail expected true got false +PASS Cross-Origin-Embedder-Policy and blob: URL from https://not-web-platform.test:8444 in subframe via subframe +PASS Cross-Origin-Embedder-Policy and blob: URL from https://not-web-platform.test:8444 in subframe via navigate +FAIL Cross-Origin-Embedder-Policy and blob: URL from https://not-web-platform.test:8444 in subframe via popup assert_true: Cross-origin without CORP did not fail expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https.html index 77af2bc7..ce72f247 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https.html +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/blob.https.html
@@ -21,20 +21,21 @@ "crossOrigin": origins.HTTPS_ORIGIN } ].forEach(({ origin, crossOrigin }) => { - ["subframe", "navigate"].forEach(variant => { + ["subframe", "navigate", "popup"].forEach(variant => { async_test(t => { const id = token(); const frame = document.createElement("iframe"); t.add_cleanup(() => { frame.remove(); }); const path = new URL("resources/blob-url-factory.html", window.location).pathname; frame.src = `${origin}${path}?id=${id}&variant=${variant}&crossOrigin=${crossOrigin}`; - window.addEventListener("message", t.step_func_done(({ data }) => { + window.addEventListener("message", t.step_func(({ data }) => { if (data.id !== id) { return; } assert_equals(data.origin, origin); assert_true(data.sameOriginNoCORPSuccess, "Same-origin without CORP did not succeed"); assert_true(data.crossOriginNoCORPFailure, "Cross-origin without CORP did not fail"); + t.done(); })); document.body.append(frame); }, `Cross-Origin-Embedder-Policy and blob: URL from ${origin} in subframe via ${variant}`);
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/blob-url-factory.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/blob-url-factory.html index d203906..928d404 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/blob-url-factory.html +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/blob-url-factory.html
@@ -4,13 +4,20 @@ const query = new URLSearchParams(window.location.search); const id = query.get("id"); const variant = query.get("variant"); -const parent = (variant === "subframe") ? "parent.parent" : "parent"; +let parent = "parent"; +if (variant === "subframe") { + parent = "parent.parent"; +} else if (variant === "popup") { + parent = "opener.parent"; +} const blob = new Blob([`<script>${createScript(window.origin, query.get("crossOrigin"), parent, id)}<\/script>`], { type: "text/html" }); const blobURL = URL.createObjectURL(blob); if (variant === "subframe") { const frame = document.createElement("iframe"); frame.src = blobURL; document.body.append(frame); +} else if (variant === "popup") { + window.open(blobURL); } else { window.location = blobURL; }
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/postmessage-ready.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/postmessage-ready.html new file mode 100644 index 0000000..3282711d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/resources/postmessage-ready.html
@@ -0,0 +1,4 @@ +<!DOCTYPE html> +<script> + opener.postMessage("ready", "*"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html index 0b7d6d91..f96d917 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html
@@ -1,13 +1,17 @@ -<!doctype html> <html> <head> <title> Check ServiceWorkers can set COOP/COEP headers for documents's responses </title> <meta name="timeout" content="long"> + <meta name="variant" content="?1-1"> + <meta name="variant" content="?2-2"> + <meta name="variant" content="?3-3"> + <meta name="variant" content="?4-last"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> + <script src="/common/subset-tests.js"></script> <script src="/service-workers/service-worker/resources/test-helpers.sub.js"> </script> <script src="./resources/popup-coop-by-sw.js"> </script> @@ -19,21 +23,21 @@ // Its response will be provided by a ServiceWorker. A browsing context // group swap must happen if the popup's headers contains COOP/COEP headers. -popupCoopBySwTest("sw_normal, popup_normal", - sw_normal, popup_normal, - swap_browsing_context_group) +subsetTest(popupCoopBySwTest, "sw_normal, popup_normal", + sw_normal, popup_normal, + swap_browsing_context_group) -popupCoopBySwTest("sw_normal, popup_coop", - sw_normal, popup_coop, - keep_browsing_context_group) +subsetTest(popupCoopBySwTest, "sw_normal, popup_coop", + sw_normal, popup_coop, + keep_browsing_context_group) -popupCoopBySwTest("sw_coop, popup_normal", - sw_coop, popup_normal, - swap_browsing_context_group) +subsetTest(popupCoopBySwTest, "sw_coop, popup_normal", + sw_coop, popup_normal, + swap_browsing_context_group) -popupCoopBySwTest("sw_coop, popup_coop", - sw_coop, popup_coop, - keep_browsing_context_group) +subsetTest(popupCoopBySwTest, "sw_coop, popup_coop", + sw_coop, popup_coop, + keep_browsing_context_group) </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/secure-payment-confirmation.tenative.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/secure-payment-confirmation.tentative.https.html similarity index 62% rename from third_party/blink/web_tests/external/wpt/secure-payment-confirmation/secure-payment-confirmation.tenative.https.html rename to third_party/blink/web_tests/external/wpt/secure-payment-confirmation/secure-payment-confirmation.tentative.https.html index 93a3d17c..671f328 100644 --- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/secure-payment-confirmation.tenative.https.html +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/secure-payment-confirmation.tentative.https.html
@@ -19,7 +19,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }, 'Valid payment method data does not throw exceptions.'); @@ -31,7 +36,12 @@ // Omitted action field. credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }, 'The action field is optional.'); @@ -43,7 +53,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), // Omitted timeout field. + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }, 'The timeout field is optional.'); @@ -56,7 +71,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }, {supportedMethods: 'basic-card'}], details); }); @@ -70,7 +90,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -84,7 +109,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details, {requestShipping: true}); }); @@ -98,7 +128,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details, {requestPayerName: true}); }); @@ -112,7 +147,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details, {requestPayerEmail: true}); }); @@ -126,7 +166,12 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details, {requestPayerPhone: true}); }); @@ -141,7 +186,12 @@ action: 'authorize', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -155,7 +205,12 @@ action: 'authenticate', // Omitted credentialIds field. networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -168,8 +223,12 @@ data: { action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], - // Omitted networkData field. + // Omitted networkData and challenge fields. timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -185,7 +244,12 @@ // Empty credentialIds field. credentialIds: [], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -198,9 +262,14 @@ data: { action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], - // Null networkData field. + // Null networkData and challenge fields. networkData: null, + challenge: null, timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -213,9 +282,14 @@ data: { action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], - // Empty networkData field. + // Empty networkData and challenge fields. networkData: [], + challenge: [], timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -229,8 +303,13 @@ action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), // Timeout longer than 1 hour. timeout: 1000 * 60 * 60 + 1, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -246,7 +325,12 @@ credentialIds: [Uint8Array.from( 'x'.repeat(1024 * 1024), c => c.charCodeAt(0))], networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); @@ -259,11 +343,70 @@ data: { action: 'authenticate', credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], - // Large networkData value. + // Large networkData and challenge values. networkData: Uint8Array.from('x'.repeat(1024 * 1024), c => c.charCodeAt(0)), + challenge: Uint8Array.from('x'.repeat(1024 * 1024), c => c.charCodeAt(0)), timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, }, }], details); }); }, 'Large networkData value throws exception.'); + +test(() => { + assert_throws_js(TypeError, () => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + action: 'authenticate', + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + timeout: 60000, + // Omitted instrument field. + }, + }], details); + }); +}, 'Instrument field is required.'); + +test(() => { + assert_throws_js(TypeError, () => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + action: 'authenticate', + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + timeout: 60000, + instrument: { + // Ommitted instrument display name. + icon: 'https://example.test/icon.png', + }, + }, + }], details); + }); +}, 'Instrument display name is required.'); + +test(() => { + assert_throws_js(TypeError, () => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + action: 'authenticate', + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + networkData: Uint8Array.from('x', c => c.charCodeAt(0)), + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + timeout: 60000, + instrument: { + displayName: 'X', + // Ommitted instrument icon. + }, + }, + }], details); + }); +}, 'Instrument icon is required.'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/virtual-keyboard/META.yml b/third_party/blink/web_tests/external/wpt/virtual-keyboard/META.yml index eaefdd0..a925b52 100644 --- a/third_party/blink/web_tests/external/wpt/virtual-keyboard/META.yml +++ b/third_party/blink/web_tests/external/wpt/virtual-keyboard/META.yml
@@ -1,3 +1,3 @@ -spec: https://github.com/w3c/editing/pull/309 +spec: https://github.com/w3c/editing/blob/gh-pages/docs/virtualkeyboard/index.html suggested_reviewers: - snianu
diff --git a/third_party/blink/web_tests/external/wpt/virtual-keyboard/virtual-keyboard-type.html b/third_party/blink/web_tests/external/wpt/virtual-keyboard/virtual-keyboard-type.https.html similarity index 77% rename from third_party/blink/web_tests/external/wpt/virtual-keyboard/virtual-keyboard-type.html rename to third_party/blink/web_tests/external/wpt/virtual-keyboard/virtual-keyboard-type.https.html index 1ba71f5..47d09ce 100644 --- a/third_party/blink/web_tests/external/wpt/virtual-keyboard/virtual-keyboard-type.html +++ b/third_party/blink/web_tests/external/wpt/virtual-keyboard/virtual-keyboard-type.https.html
@@ -19,6 +19,14 @@ assert_equals(navigator.virtualKeyboard.toString(), "[object VirtualKeyboard]"); }, "navigator.virtualKeyboard has type `VirtualKeyboard`"); + test(function() { + assert_true(navigator.virtualKeyboard.show instanceof Function); + }, "navigator.virtualKeyboard.show instanceof Function"); + + test(function() { + assert_true(navigator.virtualKeyboard.hide instanceof Function); + }, "navigator.virtualKeyboard.hide instanceof Function"); + addEventListener("load", function() { document.getElementById("viewtype-log").innerText = typeof(navigator.virtualKeyboard); });
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/chunk-serialization.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/chunk-serialization.any.js new file mode 100644 index 0000000..e8a0b131 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webcodecs/chunk-serialization.any.js
@@ -0,0 +1,73 @@ +// META: global=window +// META: script=/common/media.js +// META: script=/webcodecs/utils.js + +var defaultAudioInit = { + type: 'key', + timestamp: 1234, + data: new Uint8Array([5, 6, 7, 8]) +}; + +var defaultVideoInit = { + type: 'key', + timestamp: 1234, + duration: 5678, + data: new Uint8Array([9, 10, 11, 12]) +}; + +function createDefaultChunk(type, init) { + return type == 'audio' ? new EncodedAudioChunk(init) : + new EncodedVideoChunk(init); +} + +function runTest(t, type) { + let defaultInit = type == 'audio' ? defaultAudioInit : defaultVideoInit; + let originalData = createDefaultChunk(type, defaultInit); + + let channel = new MessageChannel(); + let localPort = channel.port1; + let externalPort = channel.port2; + + externalPort.onmessage = t.step_func((e) => { + let newData = e.data; + + // We should have a valid deserialized buffer. + assert_equals(newData.type, defaultInit.type, 'type'); + assert_equals(newData.duration, defaultInit.duration, 'duration'); + assert_equals(newData.timestamp, defaultInit.timestamp, 'timestamp'); + assert_equals( + newData.byteLength, defaultInit.data.byteLength, 'byteLength'); + + const originalData_copyDest = new Uint8Array(defaultInit.data); + const newData_copyDest = new Uint8Array(defaultInit.data); + + originalData.copyTo(originalData_copyDest); + newData.copyTo(newData_copyDest); + + for (var i = 0; i < newData_copyDest.length; ++i) { + assert_equals( + newData_copyDest[i], originalData_copyDest[i], `data (i=${i})`); + } + + externalPort.postMessage('Done'); + }) + + localPort.onmessage = t.step_func_done((e) => { + assert_equals(originalData.type, defaultInit.type, 'type'); + assert_equals(originalData.duration, defaultInit.duration, 'duration'); + assert_equals(originalData.timestamp, defaultInit.timestamp, 'timestamp'); + assert_equals( + originalData.byteLength, defaultInit.data.byteLength, 'byteLength'); + }) + + localPort.postMessage(originalData); +} + +async_test(t => { + runTest(t, 'audio'); +}, 'Verify EncodedAudioChunk is serializable.'); + + +async_test(t => { + runTest(t, 'video'); +}, 'Verify EncodedVideoChunk is serializable.');
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/videoFrame-createImageBitmap.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/videoFrame-createImageBitmap.any.js index 7b08d29..415d0bbc 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/videoFrame-createImageBitmap.any.js +++ b/third_party/blink/web_tests/external/wpt/webcodecs/videoFrame-createImageBitmap.any.js
@@ -83,7 +83,7 @@ let myCanvas = new OffscreenCanvas(width, height); let myCtx = myCanvas.getContext('2d'); myCtx.drawImage(toImageBitmap, 0, 0); - let tolerance = 6; + let tolerance = 10; try { testCanvas(myCtx, width, height, kSRGBPixel, null, (actual, expected) => { @@ -128,7 +128,7 @@ width: width, height: height, bitrate: 10e6, - framerate: 30, + framerate: 30 }; let encoder = new VideoEncoder(encoderInit);
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt index 24e3018..408aa4ec 100644 --- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -39,16 +39,6 @@ PASS childWindow.navigator.userAgent is '' PASS childWindow.navigator.vendor is window.navigator.vendor PASS childWindow.navigator.vendorSub is '' -PASS childWindow.navigator.virtualKeyboard.boundingRect.bottom is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.height is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.left is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.right is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.top is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.width is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.x is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.y is 0 -PASS childWindow.navigator.virtualKeyboard.ongeometrychange is null -PASS childWindow.navigator.virtualKeyboard.overlaysContent is false PASS childWindow.navigator.webdriver is false PASS childWindow.onabort is null PASS childWindow.onafterprint is null
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt index 095ead6..2f60f00 100644 --- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -39,16 +39,6 @@ PASS childWindow.navigator.userAgent is '' PASS childWindow.navigator.vendor is window.navigator.vendor PASS childWindow.navigator.vendorSub is '' -PASS childWindow.navigator.virtualKeyboard.boundingRect.bottom is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.height is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.left is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.right is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.top is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.width is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.x is 0 -PASS childWindow.navigator.virtualKeyboard.boundingRect.y is 0 -PASS childWindow.navigator.virtualKeyboard.ongeometrychange is null -PASS childWindow.navigator.virtualKeyboard.overlaysContent is false PASS childWindow.navigator.webdriver is false PASS childWindow.onabort is null PASS childWindow.onafterprint is null
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/flat-with-transformed-child-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/flat-with-transformed-child-expected.png deleted file mode 100644 index 21353e94..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/flat-with-transformed-child-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/geometry/preserve-3d-switching-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/geometry/preserve-3d-switching-expected.txt index 13b741ed..6fd1855 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/geometry/preserve-3d-switching-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/geometry/preserve-3d-switching-expected.txt
@@ -25,8 +25,8 @@ { "name": "LayoutNGBlockFlow (positioned) DIV", "bounds": [200, 200], - "contentsOpaqueForText": true, - "backgroundColor": "#008000B3", + "contentsOpaque": true, + "backgroundColor": "#008000", "transform": 6 } ],
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-all-on-background-hw-expected.png deleted file mode 100644 index 4f1f312..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-all-on-background-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-blur-hw-expected.png deleted file mode 100644 index 08ac8c1..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-blur-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-brightness-clamping-hw-expected.png deleted file mode 100644 index 7c8649de..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-brightness-clamping-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-drop-shadow-hw-expected.png deleted file mode 100644 index ffd9d85..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-drop-shadow-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-colorspace-hw-expected.png deleted file mode 100644 index 6f596db..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-colorspace-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-composite-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-composite-hw-expected.png deleted file mode 100644 index fbd82ffe..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-composite-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-hidpi-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-hidpi-hw-expected.png deleted file mode 100644 index 0e4fb478..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-hidpi-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-hw-expected.png deleted file mode 100644 index a09ff49..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-ordering-hw-expected.png deleted file mode 100644 index 85b810a..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-ordering-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-subregion-chained-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-subregion-chained-hw-expected.png deleted file mode 100644 index de553078..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-subregion-chained-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-subregion-hw-expected.png deleted file mode 100644 index d3245ff..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-subregion-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-zoom-hw-expected.png deleted file mode 100644 index ec13acb..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/css3/filters/effect-reference-zoom-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/composited-reflected-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/composited-reflected-expected.png deleted file mode 100644 index 4fbab80e..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/composited-reflected-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png deleted file mode 100644 index 14103d63..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png index f96edad..0435899 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png deleted file mode 100644 index 5c12af0b..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png deleted file mode 100644 index 3ee4f62..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png deleted file mode 100644 index a8a07a2..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png deleted file mode 100644 index a2b3e735..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png index 9315fd3..01bb6443 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png deleted file mode 100644 index bdc645b4..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-composite-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hidpi-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hidpi-hw-expected.png deleted file mode 100644 index 0e4fb478..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hidpi-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png index a0efd31..14c7840 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png deleted file mode 100644 index 58dedbfe..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-chained-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-chained-hw-expected.png index 48d39c2..5f431971 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-chained-hw-expected.png +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-chained-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png deleted file mode 100644 index cac8104..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-tile-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-tile-hw-expected.png deleted file mode 100644 index d4fd81c1..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-tile-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png deleted file mode 100644 index a86a292..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/compositing/lots-of-img-layers-expected.png deleted file mode 100644 index 35b2d50..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/compositing/lots-of-img-layers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/css3/filters/effect-blur-hw-expected.png deleted file mode 100644 index a17d776..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/css3/filters/effect-blur-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png deleted file mode 100644 index c4c382b..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-features=UseSkiaRenderer/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/scrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/scrolled-within-boxshadow-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/scrolled-within-boxshadow-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/scrolled-within-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/translated-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/translated-boxshadow-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/translated-boxshadow-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/translated-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/unscrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/unscrolled-within-boxshadow-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/unscrolled-within-boxshadow-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/culling/unscrolled-within-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/fixed-background-after-style-recalc-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/fixed-background-after-style-recalc-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/fixed-background-after-style-recalc-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/fixed-background-after-style-recalc-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/clipping-foreground-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/clipping-foreground-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/clipping-foreground-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/clipping-foreground-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/foreground-layer-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/foreground-layer-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/foreground-layer-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/foreground-layer-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/vertical-scroll-composited-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/vertical-scroll-composited-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/geometry/vertical-scroll-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/iframes/composited-iframe-alignment-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/iframes/composited-iframe-alignment-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/iframes/composited-iframe-alignment-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/iframes/composited-iframe-alignment-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/lots-of-img-layers-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/lots-of-img-layers-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/lots-of-img-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-added-filters-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-added-filters-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-removed-filters-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-removed-filters-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-above-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-above-composited-subframe-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-above-composited-subframe-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-above-composited-subframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-composited-subframe-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-composited-subframe-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/border-radius-composited-subframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/mask-with-filter-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/mask-with-filter-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/overflow/mask-with-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/compositing/transform-3d-scales-different-x-y-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/transform-3d-scales-different-x-y-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/compositing/transform-3d-scales-different-x-y-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-02-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-02-d-g-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-02-d-g-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-02-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-03-b-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-03-b-g-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-03-b-g-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t090501-c414-flt-03-b-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-auto1-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-auto1-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-auto1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-border-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-border-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-content-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-content-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-padding-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-padding-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/background/background-repeat-round-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-default-value-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-default-value-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-default-value-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-default-value-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-gradient-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-gradient-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-image-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-image-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-gradient-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-color-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-color-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-image-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-image-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-svg-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-svg-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-multiple-background-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-multiple-background-layers-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-multiple-background-layers-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-multiple-background-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-single-layer-no-blending-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-single-layer-no-blending-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-single-layer-no-blending-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-single-layer-no-blending-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-svg-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-svg-color-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-svg-color-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-svg-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-tiled-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-tiled-gradient-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-tiled-gradient-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/background-blend-mode-tiled-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-stacking-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-stacking-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-stacking-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-tiled-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-tiled-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-tiled-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/effect-background-blend-mode-tiled-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-1-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-1-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-2-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-2-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-3-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-3-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/blending/mix-blend-mode-isolated-group-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-parents-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-parents-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-parents-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/blur-filter-page-scroll-parents-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/crash-filter-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/crash-filter-change-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/crash-filter-change-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/crash-filter-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-blur-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-blur-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-brightness-clamping-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-brightness-clamping-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-brightness-clamping-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-brightness-clamping-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-combined-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-combined-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-combined-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-combined-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-drop-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-drop-shadow-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-drop-shadow-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-drop-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-colorspace-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-colorspace-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-colorspace-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-colorspace-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-subregion-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-subregion-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-change-repaint-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-change-repaint-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-change-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-blur-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-blur-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-child-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-child-layers-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-child-layers-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-child-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-shadow-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-shadow-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/filter-repaint-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/regions-expanding-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/regions-expanding-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/regions-expanding-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/filters/regions-expanding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-auto1-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-auto1-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-auto1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-border-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-border-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-content-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-content-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-padding-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-padding-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-round-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-space-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-space-border-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-space-border-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/css3/masking/mask-repeat-space-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/fast/canvas/pixelated-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/fast/canvas/pixelated-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/fast/canvas/pixelated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-rotate-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-rotate-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-rotate-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-animate-rotate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cover-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cover-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cover-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cover-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-png-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-cross-fade-png-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-repeat-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-repeat-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-repeat-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-repeat-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-space-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-space-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-space-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-background-image-space-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-fade-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-fade-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-image-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-image-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-border-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-group-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-group-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-group-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-group-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-pattern-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-filter-all-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-filter-all-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-svg-resource-url-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-svg-resource-url-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-svg-resource-url-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-image-svg-resource-url-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-mask-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-mask-image-svg-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-mask-image-svg-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-mask-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-object-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-object-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-object-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-object-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-fill-text-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-fill-text-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/color-profile-svg-fill-text-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-canvas-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-canvas-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-image-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-image-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/rgb-png-with-cmyk-color-profile-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/rgb-png-with-cmyk-color-profile-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/ycbcr-with-cmyk-color-profile-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/ycbcr-with-cmyk-color-profile-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-border-radius-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-border-radius-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-border-radius-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-border-radius-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-filter-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-layer-filter-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/color-profile-layer-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/color-profile-video-poster-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/color-profile-video-poster-image-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/color-profile-video-poster-image-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/media/color-profile-video-poster-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/media/controls/paint-controls-webkit-appearance-none-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-no-audio-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/video-no-audio-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-no-audio-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/media/video-no-audio-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-poster-scale-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/media/video-poster-scale-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-poster-scale-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/media/video-poster-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/shadows-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/shadows-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/shadows-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/transforms/shadows-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/svg-vs-css-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/svg-vs-css-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/svg-vs-css-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/transformed-document-element-expected.png b/third_party/blink/web_tests/flag-specific/skia-gl/transforms/transformed-document-element-expected.png similarity index 100% rename from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/transformed-document-element-expected.png rename to third_party/blink/web_tests/flag-specific/skia-gl/transforms/transformed-document-element-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/scrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/scrolled-within-boxshadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/scrolled-within-boxshadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/scrolled-within-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/translated-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/translated-boxshadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/translated-boxshadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/translated-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/unscrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/unscrolled-within-boxshadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/unscrolled-within-boxshadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/culling/unscrolled-within-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/fixed-background-after-style-recalc-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/fixed-background-after-style-recalc-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/fixed-background-after-style-recalc-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/fixed-background-after-style-recalc-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/clipping-foreground-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/clipping-foreground-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/clipping-foreground-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/clipping-foreground-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/foreground-layer-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/foreground-layer-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/foreground-layer-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/foreground-layer-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/vertical-scroll-composited-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/vertical-scroll-composited-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/geometry/vertical-scroll-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/iframes/composited-iframe-alignment-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/iframes/composited-iframe-alignment-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/iframes/composited-iframe-alignment-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/iframes/composited-iframe-alignment-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/lots-of-img-layers-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/lots-of-img-layers-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/lots-of-img-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-added-filters-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-added-filters-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-removed-filters-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-removed-filters-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-above-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-above-composited-subframe-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-above-composited-subframe-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-above-composited-subframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-composited-subframe-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-composited-subframe-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/border-radius-composited-subframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/mask-with-filter-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/mask-with-filter-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/overflow/mask-with-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/transform-3d-scales-different-x-y-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/transform-3d-scales-different-x-y-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/compositing/transform-3d-scales-different-x-y-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-02-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-02-d-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-02-d-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-02-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-03-b-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-03-b-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-03-b-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t090501-c414-flt-03-b-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-auto1-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-auto1-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-auto1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-border-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-border-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-content-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-content-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-padding-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-padding-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/background/background-repeat-round-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-default-value-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-default-value-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-default-value-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-default-value-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-gradient-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-gradient-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-gradient-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-color-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-color-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-svg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-svg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-multiple-background-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-multiple-background-layers-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-multiple-background-layers-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-multiple-background-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-single-layer-no-blending-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-single-layer-no-blending-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-single-layer-no-blending-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-single-layer-no-blending-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-svg-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-svg-color-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-svg-color-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-svg-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-tiled-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-tiled-gradient-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-tiled-gradient-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/background-blend-mode-tiled-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-stacking-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-stacking-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-stacking-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-tiled-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-tiled-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-tiled-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/effect-background-blend-mode-tiled-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-1-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-1-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-2-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-2-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-3-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-3-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/blending/mix-blend-mode-isolated-group-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-parents-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-parents-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-parents-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/blur-filter-page-scroll-parents-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/crash-filter-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/crash-filter-change-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/crash-filter-change-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/crash-filter-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-blur-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-blur-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-brightness-clamping-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-brightness-clamping-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-brightness-clamping-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-brightness-clamping-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-combined-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-combined-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-combined-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-combined-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-drop-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-drop-shadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-drop-shadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-drop-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-colorspace-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-colorspace-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-colorspace-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-colorspace-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-subregion-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-subregion-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-change-repaint-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-change-repaint-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-change-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-blur-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-blur-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-child-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-child-layers-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-child-layers-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-child-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-shadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-shadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/filter-repaint-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/regions-expanding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/regions-expanding-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/regions-expanding-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/filters/regions-expanding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-auto1-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-auto1-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-auto1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-border-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-border-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-content-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-content-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-padding-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-padding-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-round-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-space-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-space-border-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-space-border-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/css3/masking/mask-repeat-space-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/fast/canvas/pixelated-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/fast/canvas/pixelated-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/fast/canvas/pixelated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-rotate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-rotate-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-animate-rotate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cover-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cover-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cover-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cover-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-png-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-cross-fade-png-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-repeat-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-repeat-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-repeat-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-repeat-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-space-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-space-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-space-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-background-image-space-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-fade-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-border-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-group-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-group-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-group-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-group-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-pattern-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-filter-all-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-svg-resource-url-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-svg-resource-url-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-svg-resource-url-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-image-svg-resource-url-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-mask-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-mask-image-svg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-mask-image-svg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-mask-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-object-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-object-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-object-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-object-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-fill-text-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-fill-text-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/color-profile-svg-fill-text-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-canvas-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-canvas-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/rgb-png-with-cmyk-color-profile-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/rgb-png-with-cmyk-color-profile-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/ycbcr-with-cmyk-color-profile-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/ycbcr-with-cmyk-color-profile-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-border-radius-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-border-radius-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-border-radius-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-border-radius-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-filter-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-layer-filter-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/color-profile-layer-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/color-profile-video-poster-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/color-profile-video-poster-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/color-profile-video-poster-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/color-profile-video-poster-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/controls/paint-controls-webkit-appearance-none-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-no-audio-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-no-audio-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-no-audio-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-no-audio-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-poster-scale-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-poster-scale-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-poster-scale-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/media/video-poster-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/shadows-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/shadows-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/shadows-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/shadows-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/svg-vs-css-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/svg-vs-css-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/svg-vs-css-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/transformed-document-element-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/transformed-document-element-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/transformed-document-element-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-native/transforms/transformed-document-element-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/scrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/culling/scrolled-within-boxshadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/scrolled-within-boxshadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/culling/scrolled-within-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/translated-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/culling/translated-boxshadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/translated-boxshadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/culling/translated-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/unscrolled-within-boxshadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/culling/unscrolled-within-boxshadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/culling/unscrolled-within-boxshadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/culling/unscrolled-within-boxshadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/fixed-background-after-style-recalc-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/fixed-background-after-style-recalc-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/fixed-background-after-style-recalc-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/fixed-background-after-style-recalc-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/clipping-foreground-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/geometry/clipping-foreground-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/clipping-foreground-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/geometry/clipping-foreground-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/foreground-layer-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/geometry/foreground-layer-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/foreground-layer-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/geometry/foreground-layer-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/geometry/vertical-scroll-composited-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/geometry/vertical-scroll-composited-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/geometry/vertical-scroll-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/iframes/composited-iframe-alignment-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/iframes/composited-iframe-alignment-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/iframes/composited-iframe-alignment-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/iframes/composited-iframe-alignment-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/lots-of-img-layers-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/lots-of-img-layers-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/lots-of-img-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-added-filters-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-added-filters-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-removed-filters-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/masks/mask-with-removed-filters-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-above-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/border-radius-above-composited-subframe-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-above-composited-subframe-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/border-radius-above-composited-subframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/border-radius-composited-subframe-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/border-radius-composited-subframe-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/border-radius-composited-subframe-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/mask-with-filter-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/overflow/mask-with-filter-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/mask-with-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/transform-3d-scales-different-x-y-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/compositing/transform-3d-scales-different-x-y-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/transform-3d-scales-different-x-y-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-02-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t090501-c414-flt-02-d-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-02-d-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t090501-c414-flt-02-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-03-b-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t090501-c414-flt-03-b-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t090501-c414-flt-03-b-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t090501-c414-flt-03-b-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t100304-c43-rpl-bbx-00-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-auto1-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-auto1-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-auto1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-border-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-border-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-content-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-content-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-padding-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/background/background-repeat-round-padding-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/background/background-repeat-round-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-default-value-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-default-value-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-default-value-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-default-value-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-gradient-gradient-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-gradient-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-gradient-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-gradient-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-gradient-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-gradient-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-image-color-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-color-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-image-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-image-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-image-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-image-svg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-image-svg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-multiple-background-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-multiple-background-layers-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-multiple-background-layers-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-multiple-background-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-single-layer-no-blending-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-single-layer-no-blending-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-single-layer-no-blending-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-single-layer-no-blending-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-svg-color-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-svg-color-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-svg-color-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-svg-color-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-tiled-gradient-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-tiled-gradient-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/background-blend-mode-tiled-gradient-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/background-blend-mode-tiled-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/effect-background-blend-mode-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/effect-background-blend-mode-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/effect-background-blend-mode-stacking-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-stacking-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/effect-background-blend-mode-stacking-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-tiled-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/effect-background-blend-mode-tiled-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/effect-background-blend-mode-tiled-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/effect-background-blend-mode-tiled-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/mix-blend-mode-isolated-group-1-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-1-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/mix-blend-mode-isolated-group-1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/mix-blend-mode-isolated-group-2-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-2-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/mix-blend-mode-isolated-group-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/mix-blend-mode-isolated-group-3-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/blending/mix-blend-mode-isolated-group-3-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/blending/mix-blend-mode-isolated-group-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-parents-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-parents-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/blur-filter-page-scroll-parents-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-parents-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/crash-filter-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/crash-filter-change-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/crash-filter-change-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/crash-filter-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-blur-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-blur-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-brightness-clamping-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-brightness-clamping-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-brightness-clamping-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-brightness-clamping-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-combined-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-combined-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-combined-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-combined-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-drop-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-drop-shadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-drop-shadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-drop-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-colorspace-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-reference-colorspace-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-colorspace-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-reference-colorspace-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-reference-subregion-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/effect-reference-subregion-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-change-repaint-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-change-repaint-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-change-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-blur-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-blur-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-child-layers-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-child-layers-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-child-layers-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-child-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-shadow-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/filter-repaint-shadow-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/regions-expanding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/regions-expanding-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/filters/regions-expanding-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/regions-expanding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-auto1-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-auto1-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-auto1-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-auto1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-border-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-border-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-content-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-content-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-content-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-padding-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-padding-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-round-padding-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-round-padding-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-space-border-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-space-border-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/css3/masking/mask-repeat-space-border-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/masking/mask-repeat-space-border-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/pixelated-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/fast/canvas/pixelated-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/fast/canvas/pixelated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-animate-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-animate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-rotate-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-animate-rotate-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-animate-rotate-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-animate-rotate-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cover-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-cover-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cover-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-cover-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-cross-fade-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-cross-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-cross-fade-png-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-cross-fade-png-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-cross-fade-png-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-repeat-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-repeat-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-repeat-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-repeat-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-space-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-space-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-background-image-space-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-background-image-space-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-fade-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-border-fade-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-fade-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-border-fade-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-border-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-border-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-border-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-group-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-group-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-group-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-group-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-canvas-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-canvas-pattern-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-filter-all-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-filter-all-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-filter-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-svg-resource-url-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-svg-resource-url-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-image-svg-resource-url-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-image-svg-resource-url-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-mask-image-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-mask-image-svg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-mask-image-svg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-mask-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-object-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-object-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-object-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-object-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-svg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-svg-fill-text-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/color-profile-svg-fill-text-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/color-profile-svg-fill-text-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/optimize-contrast-canvas-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-canvas-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/optimize-contrast-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/optimize-contrast-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/rgb-png-with-cmyk-color-profile-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/rgb-png-with-cmyk-color-profile-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/ycbcr-with-cmyk-color-profile-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/ycbcr-with-cmyk-color-profile-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-border-radius-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-border-radius-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-border-radius-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-border-radius-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-filter-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-image-profile-match-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-layer-filter-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/color-profile-layer-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/images/yuv-decode-eligible/webp-color-profile-lossy-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/color-profile-video-poster-image-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/color-profile-video-poster-image-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/color-profile-video-poster-image-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/color-profile-video-poster-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/controls/paint-controls-webkit-appearance-none-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/controls/paint-controls-webkit-appearance-none-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/controls/paint-controls-webkit-appearance-none-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-no-audio-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/video-no-audio-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-no-audio-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/video-no-audio-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-poster-scale-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/video-poster-scale-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/media/video-poster-scale-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/media/video-poster-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/shadows-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/shadows-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/shadows-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/shadows-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/svg-vs-css-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/svg-vs-css-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/svg-vs-css-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/svg-vs-css-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/transformed-document-element-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/transformed-document-element-expected.png similarity index 100% copy from third_party/blink/web_tests/flag-specific/enable-gpu-rasterization/transforms/transformed-document-element-expected.png copy to third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/transforms/transformed-document-element-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-cancel.html b/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-cancel.html index d52a419..11a7e81c0 100644 --- a/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-cancel.html +++ b/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-cancel.html
@@ -63,21 +63,21 @@ assertAnimationComposited('rotate', 'rotate', true); assertAnimationComposited('scale', 'scale', true); -assertAnimationComposited('transform', 'translate', true); -assertAnimationComposited('transform', 'rotate', true); -assertAnimationComposited('transform', 'scale', true); +assertAnimationComposited('transform', 'translate', false); +assertAnimationComposited('transform', 'rotate', false); +assertAnimationComposited('transform', 'scale', false); -assertAnimationComposited('translate', 'transform', true); -assertAnimationComposited('translate', 'rotate', true); -assertAnimationComposited('translate', 'scale', true); +assertAnimationComposited('translate', 'transform', false); +assertAnimationComposited('translate', 'rotate', false); +assertAnimationComposited('translate', 'scale', false); -assertAnimationComposited('rotate', 'transform', true); -assertAnimationComposited('rotate', 'scale', true); -assertAnimationComposited('rotate', 'translate', true); +assertAnimationComposited('rotate', 'transform', false); +assertAnimationComposited('rotate', 'scale', false); +assertAnimationComposited('rotate', 'translate', false); -assertAnimationComposited('scale', 'transform', true); -assertAnimationComposited('scale', 'rotate', true); -assertAnimationComposited('scale', 'translate', true); +assertAnimationComposited('scale', 'transform', false); +assertAnimationComposited('scale', 'rotate', false); +assertAnimationComposited('scale', 'translate', false); assertAnimationComposited('opacity', 'transform', true); assertAnimationComposited('opacity', 'translate', true);
diff --git a/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-properties.html b/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-properties.html index b7cd669..81efc4e 100644 --- a/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-properties.html +++ b/third_party/blink/web_tests/virtual/threaded-no-composited-antialiasing/animations/compositor-independent-transform-properties.html
@@ -38,6 +38,7 @@ } var assertIsComposited = function(properties) { return assertComposited(properties, true); } +var assertIsNotComposited = function(properties) { return assertComposited(properties, false); } assertIsComposited('transform'); assertIsComposited('opacity'); @@ -51,14 +52,14 @@ assertIsComposited(['rotate', 'opacity']); assertIsComposited(['scale', 'opacity']); -assertIsComposited(['transform', 'translate']); -assertIsComposited(['transform', 'scale']); -assertIsComposited(['transform', 'rotate']); +assertIsNotComposited(['transform', 'translate']); +assertIsNotComposited(['transform', 'scale']); +assertIsNotComposited(['transform', 'rotate']); -assertIsComposited(['translate', 'scale']); -assertIsComposited(['translate', 'rotate']); -assertIsComposited(['rotate', 'scale']); +assertIsNotComposited(['translate', 'scale']); +assertIsNotComposited(['translate', 'rotate']); +assertIsNotComposited(['rotate', 'scale']); -assertIsComposited(['translate', 'rotate', 'scale']); -assertIsComposited(['transform', 'translate', 'rotate', 'scale']); +assertIsNotComposited(['translate', 'rotate', 'scale']); +assertIsNotComposited(['transform', 'translate', 'rotate', 'scale']); </script>
diff --git a/third_party/blink/web_tests/virtual/threaded/external/wpt/css/css-transforms/individual-transform/animation/README.txt b/third_party/blink/web_tests/virtual/threaded/external/wpt/css/css-transforms/individual-transform/animation/README.txt deleted file mode 100644 index 189593f..0000000 --- a/third_party/blink/web_tests/virtual/threaded/external/wpt/css/css-transforms/individual-transform/animation/README.txt +++ /dev/null
@@ -1,4 +0,0 @@ -# This suite runs tests in -# external/wpt/css/css-transforms/individual-transform/animation with -# --enable-threaded-compositing -
diff --git a/third_party/tcmalloc/README.chromium b/third_party/tcmalloc/README.chromium index 3a8e560..ec09d38 100644 --- a/third_party/tcmalloc/README.chromium +++ b/third_party/tcmalloc/README.chromium
@@ -79,4 +79,3 @@ - Enable ASLR support on both Linux and ChromeOS - Remove unused base::subtle::Acquire_Store/Release_Load (https://github.com/gperftools/gperftools/pull/1249) - Fix thread-safety annotations (https://github.com/gperftools/gperftools/pull/1251) -- Fixed -Wimplicit-int-float-conversion.
diff --git a/third_party/tcmalloc/chromium/src/sampler.cc b/third_party/tcmalloc/chromium/src/sampler.cc index 6337826..358b52c7 100644 --- a/third_party/tcmalloc/chromium/src/sampler.cc +++ b/third_party/tcmalloc/chromium/src/sampler.cc
@@ -116,8 +116,7 @@ // Very large values of interval overflow ssize_t. If we happen to // hit such improbable condition, we simply cheat and clamp interval // to largest supported value. - return static_cast<ssize_t>( - std::min(interval, static_cast<double>(MAX_SSIZE))); + return static_cast<ssize_t>(std::min<double>(interval, MAX_SSIZE)); } bool Sampler::RecordAllocationSlow(size_t k) {
diff --git a/tools/clang/scripts/include-analysis.html b/tools/clang/scripts/include-analysis.html index 6cd0394..51c51728 100644 --- a/tools/clang/scripts/include-analysis.html +++ b/tools/clang/scripts/include-analysis.html
@@ -29,6 +29,8 @@ <p>Number of files: <span id="numFiles">x</span>. Total file size: <span id="totFileSize">x</span> bytes.</p> +<p><a href="https://commondatastorage.googleapis.com/chromium-browser-clang/chrome_includes-index.html">Archive</a></p> + <button onClick="changeState({view: 'files'})">Per-File Analysis</button> <button onClick="changeState({view: 'edges'})">Per-Edge Analysis</button>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index ae9b110..8aba7cc 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -45187,6 +45187,13 @@ <int value="11" label="Success: Image is translatable"/> </enum> +<enum name="LensRegionSearchCaptureResult"> + <summary>Result of Lens Region Search feature.</summary> + <int value="0" label="Success"/> + <int value="1" label="Failed to open results in a new tab"/> + <int value="2" label="Error capturing image from selected region"/> +</enum> + <enum name="LensSdkError"> <int value="1" label="Internal Error"/> <int value="2" label="Session already started"/> @@ -48991,6 +48998,7 @@ <int value="168025622" label="EnableInputEventLogging:enabled"/> <int value="168429629" label="ContentIndexingNTP:enabled"/> <int value="168887810" label="ReadLaterReminderNotification:disabled"/> + <int value="171273307" label="SystemEmojiPickerClipboard:disabled"/> <int value="173288154" label="PrintPdfAsImage:enabled"/> <int value="173339199" label="SmsReceiverCrossDevice:disabled"/> <int value="174759256" label="LockScreenMediaControls:enabled"/> @@ -49678,6 +49686,7 @@ label="KeepAliveRendererForKeepaliveRequests:disabled"/> <int value="719922283" label="MessagesForAndroidSaveCard:enabled"/> <int value="720931007" label="WebAuthenticationBle:enabled"/> + <int value="723385329" label="SystemEmojiPickerClipboard:enabled"/> <int value="723619383" label="TopSitesFromSiteEngagement:enabled"/> <int value="724052572" label="EnableFilesystemInIncognito"/> <int value="724208771" label="TabsInCBD:enabled"/>
diff --git a/tools/metrics/histograms/histograms_xml/apps/histograms.xml b/tools/metrics/histograms/histograms_xml/apps/histograms.xml index d0ce1ee..24ca358 100644 --- a/tools/metrics/histograms/histograms_xml/apps/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/apps/histograms.xml
@@ -2280,7 +2280,7 @@ </histogram> <histogram name="Apps.ScrollableShelf.AnimationSmoothness" units="%" - expires_after="2021-08-01"> + expires_after="2022-07-14"> <!-- Name completed by histogram suffixes name="HomeLauncherVisibility" -->
diff --git a/tools/metrics/histograms/histograms_xml/ash/histograms.xml b/tools/metrics/histograms/histograms_xml/ash/histograms.xml index a6b064c..8c720571 100644 --- a/tools/metrics/histograms/histograms_xml/ash/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/ash/histograms.xml
@@ -1233,7 +1233,7 @@ </histogram> <histogram base="true" name="Ash.HotseatWidgetAnimation.AnimationSmoothness" - units="%" expires_after="2021-08-04"> + units="%" expires_after="2022-07-14"> <!-- Name completed by histogram suffixes name="HotseatTransitionType" -->
diff --git a/tools/metrics/histograms/histograms_xml/permissions/histograms.xml b/tools/metrics/histograms/histograms_xml/permissions/histograms.xml index d77c756..2f5612d2 100644 --- a/tools/metrics/histograms/histograms_xml/permissions/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/permissions/histograms.xml
@@ -151,7 +151,7 @@ </histogram> <histogram name="Permissions.Chip.TimeToDecision.{RequestAction}" units="ms" - expires_after="2021-08-22"> + expires_after="2022-08-22"> <owner>bsep@chromium.org</owner> <owner>engedy@chromium.org</owner> <owner>olesiamarukhno@google.com</owner> @@ -571,7 +571,7 @@ </histogram> <histogram name="Permissions.Prompt.TimeToDecision.{RequestAction}" units="ms" - expires_after="2021-08-22"> + expires_after="2022-08-22"> <owner>bsep@chromium.org</owner> <owner>engedy@chromium.org</owner> <owner>olesiamarukhno@google.com</owner>
diff --git a/tools/metrics/histograms/histograms_xml/settings/histograms.xml b/tools/metrics/histograms/histograms_xml/settings/histograms.xml index 478c572..7550fd31 100644 --- a/tools/metrics/histograms/histograms_xml/settings/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/settings/histograms.xml
@@ -21,6 +21,24 @@ <histograms> +<histogram name="Settings.AdvancedSpellcheck.OnStartup" enum="BooleanEnabled" + expires_after="M98"> + <owner>harrisonsean@chromium.org</owner> + <owner>chrome-friendly-settings@google.com</owner> + <summary> + The state of the advanced spellcheck setting, recorded on profile startup. + </summary> +</histogram> + +<histogram name="Settings.AutocompleteSearches.OnStartup" enum="BooleanEnabled" + expires_after="M98"> + <owner>harrisonsean@chromium.org</owner> + <owner>chrome-friendly-settings@google.com</owner> + <summary> + The state of the autocomplete searches setting, recorded on profile startup. + </summary> +</histogram> + <histogram name="Settings.FilterOnLoadTime" units="ms" expires_after="2018-08-30"> <owner>gab@chromium.org</owner> @@ -159,6 +177,16 @@ </summary> </histogram> +<histogram name="Settings.PreloadStatus.OnStartup" enum="BooleanEnabled" + expires_after="M98"> + <owner>harrisonsean@chromium.org</owner> + <owner>chrome-friendly-settings@google.com</owner> + <summary> + The status of the preload setting, recorded on profile startup. Not recorded + for iOS where the setting does not exist. + </summary> +</histogram> + <histogram name="Settings.PrivacyElementInteractions" enum="SettingsPrivacyElementInteractions" expires_after="2021-12-26"> <owner>harrisonsean@chromium.org</owner>
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 6902e9e..9c51a68e 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -67,6 +67,9 @@ crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-deep.html [ Skip ] crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-id-deep.html [ Skip ] +# Benchmark: blink_perf.sanitizer-api +crbug.com/1229646 [ linux ] blink_perf.sanitizer-api/sanitizer.html [ Skip ] + # Benchmark: blink_perf.shadow_dom crbug.com/702319 [ android-nexus-5x ] blink_perf.shadow_dom/* [ Skip ]
diff --git a/ui/accessibility/platform/inspect/ax_property_node.cc b/ui/accessibility/platform/inspect/ax_property_node.cc index eb6f4584..bfbd85f 100644 --- a/ui/accessibility/platform/inspect/ax_property_node.cc +++ b/ui/accessibility/platform/inspect/ax_property_node.cc
@@ -12,31 +12,69 @@ namespace ui { // static +AXPropertyNode AXPropertyNode::From( + const std::string& property, + const std::vector<std::string>& line_indexes) { + std::string::const_iterator lvalue_end(property.end()), + rvalue_begin(property.end()); + + // Find rvalue start if any. For example, in a statement + // textarea.AXSelectedTextMarkerRange = textarea_range, textarea_range will be + // rvalue. Do not confuse it with variable assignment ':=', for example, + // textarea_range:= textarea.AXTextMarkerRangeForUIElement(textarea) which is + // stored as a labelled lvalue. + size_t index = property.find_last_of('='); + if (index > 0 && index != std::string::npos) { + if (property[index - 1] != ':') { + lvalue_end = property.begin() + index - 1; + index = property.find_first_not_of("= ", index); + rvalue_begin = index == std::string::npos ? property.end() + : property.begin() + index; + } + } + + // lvalue + AXPropertyNode lvalue_root; + Parse(&lvalue_root, property.begin(), lvalue_end); + if (lvalue_root.arguments.size() == 0) // Empty AXPropertyNode. + return lvalue_root; + + AXPropertyNode* lvalue = &lvalue_root.arguments[0]; + lvalue->original_property = property; + lvalue->line_indexes = line_indexes; + + // rvalue if any + if (lvalue_end != property.end()) { + AXPropertyNode rvalue_root; + Parse(&rvalue_root, rvalue_begin, property.end()); + + // Connect rvalue to the latest lvalue in a chain. + AXPropertyNode* last_in_chain = lvalue; + for (; last_in_chain->next; last_in_chain = last_in_chain->next.get()) + ; + + // Use {std::make_unique_for_overwrite} once we allow C++20. + last_in_chain->rvalue = std::unique_ptr<AXPropertyNode>(new AXPropertyNode); + *(last_in_chain->rvalue) = std::move(rvalue_root.arguments[0]); + } + + return std::move(*lvalue); +} + +// static AXPropertyNode AXPropertyNode::From(const AXPropertyFilter& filter) { - // Property invocation: property_str expected format is - // prop_name or prop_name(arg1, ... argN). - AXPropertyNode root; - const std::string& property_str = filter.property_str; - Parse(&root, property_str.begin(), property_str.end()); - - AXPropertyNode* node = &root.arguments[0]; - - // Expel a trailing wildcard if any. - node->original_property = - property_str.substr(0, property_str.find_last_of('*')); + // Expel an optional trailing wildcard which is used in tree formatter output + // filtering. + std::string property = + filter.property_str.substr(0, filter.property_str.find_last_of('*')); // Line indexes filter: filter_str expected format is // :line_num_1, ... :line_num_N, a comma separated list of line indexes // the property should be queried for. For example, ":1,:5,:7" indicates that // the property should called for objects placed on 1, 5 and 7 lines only. - const std::string& filter_str = filter.filter_str; - if (!filter_str.empty()) { - node->line_indexes = - base::SplitString(filter_str, std::string(1, ','), - base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - } - - return std::move(*node); + return From(property, base::SplitString( + filter.filter_str, std::string(1, ','), + base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)); } AXPropertyNode::AXPropertyNode() = default; @@ -141,6 +179,17 @@ } out += ')'; } + + // Chains. + if (next) { + out += "." + next->ToFlatString(); + } + + // Rvalue. + if (rvalue) { + out += "=" + rvalue->ToFlatString(); + } + return out; } @@ -163,6 +212,9 @@ if (next) { // Chains. out += ".\n" + next->ToTreeString(indent); } + if (rvalue) { // Rvalue. + out += "=\n" + rvalue->ToTreeString(indent); + } return out; }
diff --git a/ui/accessibility/platform/inspect/ax_property_node.h b/ui/accessibility/platform/inspect/ax_property_node.h index 4078453..64d34d1b 100644 --- a/ui/accessibility/platform/inspect/ax_property_node.h +++ b/ui/accessibility/platform/inspect/ax_property_node.h
@@ -24,7 +24,9 @@ // parameterized property for column/row 0 indexes. class AX_EXPORT AXPropertyNode final { public: - // Parses a property node from a property filter. + // Parses a property node from a string or a property filter. + static AXPropertyNode From(const std::string& property, + const std::vector<std::string>& line_indexes = {}); static AXPropertyNode From(const AXPropertyFilter& filter); AXPropertyNode(); @@ -47,6 +49,9 @@ // Next property node in a chain if any. std::unique_ptr<AXPropertyNode> next; + // Rvalue if any. + std::unique_ptr<AXPropertyNode> rvalue; + // Used to store the original unparsed property including invocation // arguments if any. std::string original_property;
diff --git a/ui/accessibility/platform/inspect/ax_property_node_unittest.cc b/ui/accessibility/platform/inspect/ax_property_node_unittest.cc index 5a4bb81..8e53684 100644 --- a/ui/accessibility/platform/inspect/ax_property_node_unittest.cc +++ b/ui/accessibility/platform/inspect/ax_property_node_unittest.cc
@@ -42,7 +42,7 @@ } void ParseAndCheckTree(const char* input, const char* expected) { - auto got = Parse(input).ToTreeString(); + auto got = AXPropertyNode::From(input).ToTreeString(); EXPECT_EQ(got, expected); } @@ -228,4 +228,14 @@ ))~~"); } +TEST_F(AXPropertyNodeTest, RValue) { + ParseAndCheckTree("textarea.AXSelectedTextMarkerRange = {loc: 3, len: 2}", + R"~~(textarea. +AXSelectedTextMarkerRange= +{}( + loc:3, + len:2 +))~~"); +} + } // namespace ui
diff --git a/ui/accessibility/platform/inspect/ax_script_instruction.cc b/ui/accessibility/platform/inspect/ax_script_instruction.cc index 2201dcf..6da1812 100644 --- a/ui/accessibility/platform/inspect/ax_script_instruction.cc +++ b/ui/accessibility/platform/inspect/ax_script_instruction.cc
@@ -27,7 +27,7 @@ AXPropertyNode AXScriptInstruction::AsScript() const { DCHECK(!IsEvent()); - return AXPropertyNode::From({instruction_, AXPropertyFilter::SCRIPT}); + return AXPropertyNode::From(instruction_); } std::string AXScriptInstruction::AsEvent() const {
diff --git a/ui/accessibility/platform/inspect/ax_script_instruction.h b/ui/accessibility/platform/inspect/ax_script_instruction.h index df721c4..887d7ec 100644 --- a/ui/accessibility/platform/inspect/ax_script_instruction.h +++ b/ui/accessibility/platform/inspect/ax_script_instruction.h
@@ -22,6 +22,7 @@ bool IsEvent() const; bool IsScript() const; + AXPropertyNode AsScript() const; std::string AsEvent() const;
diff --git a/ui/android/java/src/org/chromium/ui/modelutil/PropertyModel.java b/ui/android/java/src/org/chromium/ui/modelutil/PropertyModel.java index 765f23991..d37bb0e 100644 --- a/ui/android/java/src/org/chromium/ui/modelutil/PropertyModel.java +++ b/ui/android/java/src/org/chromium/ui/modelutil/PropertyModel.java
@@ -14,7 +14,7 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.core.util.ObjectsCompat; -import org.chromium.build.BuildConfig; +import org.chromium.base.annotations.RemovableInRelease; import java.util.ArrayList; import java.util.Collection; @@ -273,8 +273,9 @@ mData = startingValues; } + @RemovableInRelease private void validateKey(PropertyKey key) { - if (BuildConfig.ENABLE_ASSERTS && !mData.containsKey(key)) { + if (!mData.containsKey(key)) { throw new IllegalArgumentException( "Invalid key passed in: " + key + ". Current data is: " + mData.toString()); } @@ -464,8 +465,9 @@ mData = values; } + @RemovableInRelease private void validateKey(PropertyKey key) { - if (BuildConfig.ENABLE_ASSERTS && !mData.containsKey(key)) { + if (!mData.containsKey(key)) { throw new IllegalArgumentException("Invalid key passed in: " + key); } }
diff --git a/ui/events/chromecast/scroller_unittest.cc b/ui/events/chromecast/scroller_unittest.cc index 1ffbd21..d955f318 100644 --- a/ui/events/chromecast/scroller_unittest.cc +++ b/ui/events/chromecast/scroller_unittest.cc
@@ -103,9 +103,15 @@ base::TimeTicks start_time = base::TimeTicks::Now(); // Start a fling and verify initialized values. - scroller.Fling(kDefaultStartX, kDefaultStartY, kDefaultVelocityX, - kDefaultVelocityY, INT_MIN, static_cast<float>(INT_MAX), - INT_MIN, static_cast<float>(INT_MAX), start_time); + scroller.Fling(kDefaultStartX, + kDefaultStartY, + kDefaultVelocityX, + kDefaultVelocityY, + INT_MIN, + INT_MAX, + INT_MIN, + INT_MAX, + start_time); EXPECT_EQ(kDefaultStartX, scroller.GetStartX()); EXPECT_EQ(kDefaultStartY, scroller.GetStartY());
diff --git a/ui/events/keycodes/dom/keycode_converter.cc b/ui/events/keycodes/dom/keycode_converter.cc index 0ee71ce..99bc1a1 100644 --- a/ui/events/keycodes/dom/keycode_converter.cc +++ b/ui/events/keycodes/dom/keycode_converter.cc
@@ -383,6 +383,19 @@ } } +// static +bool KeycodeConverter::IsDomKeyNamed(DomKey dom_key) { + if (dom_key.IsDeadKey()) { + return true; + } + for (auto& mapping : kDomKeyMappings) { + if (mapping.dom_key == dom_key) { + return mapping.string != nullptr; + } + } + return false; +} + // USB keycodes // Note that USB keycodes are not part of any web standard. // Please don't use USB keycodes in new code.
diff --git a/ui/events/keycodes/dom/keycode_converter.h b/ui/events/keycodes/dom/keycode_converter.h index 032ab082..85223748 100644 --- a/ui/events/keycodes/dom/keycode_converter.h +++ b/ui/events/keycodes/dom/keycode_converter.h
@@ -117,6 +117,10 @@ // Returns true if the DomKey is a modifier. static bool IsDomKeyForModifier(DomKey dom_key); + // Returns true if the DomKey is a named key, as defined by + // https://www.w3.org/TR/uievents-key/#named-key-attribute-value + static bool IsDomKeyNamed(DomKey dom_key); + // The following methods relate to USB keycodes. // Note that USB keycodes are not part of any web standard. // Please don't use USB keycodes in new code.
diff --git a/ui/events/keycodes/dom/keycode_converter_unittest.cc b/ui/events/keycodes/dom/keycode_converter_unittest.cc index 3d939e57..bd1be3b 100644 --- a/ui/events/keycodes/dom/keycode_converter_unittest.cc +++ b/ui/events/keycodes/dom/keycode_converter_unittest.cc
@@ -186,40 +186,45 @@ bool is_dead; bool test_to_string; const char* const string; + bool is_named; } test_cases[] = { // Invalid arguments to KeyStringToDomKey(). - {ui::DomKey::NONE, false, false, true, ""}, - {ui::DomKey::NONE, false, false, false, "?!?"}, - {ui::DomKey::NONE, false, false, false, "\x61\xCC\x81"}, + {ui::DomKey::NONE, false, false, true, "", false}, + {ui::DomKey::NONE, false, false, false, "?!?", false}, + {ui::DomKey::NONE, false, false, false, "\x61\xCC\x81", false}, // Some single Unicode characters. - {ui::DomKey::Constant<'-'>::Character, true, false, true, "-"}, - {ui::DomKey::Constant<'A'>::Character, true, false, true, "A"}, - {ui::DomKey::Constant<0xE1>::Character, true, false, true, "\xC3\xA1"}, + {ui::DomKey::Constant<'-'>::Character, true, false, true, "-", false}, + {ui::DomKey::Constant<'A'>::Character, true, false, true, "A", false}, + {ui::DomKey::Constant<0xE1>::Character, true, false, true, "\xC3\xA1", + false}, {ui::DomKey::Constant<0x1F648>::Character, true, false, true, - "\xF0\x9F\x99\x88"}, + "\xF0\x9F\x99\x88", false}, // Unicode-equivalent named values. - {ui::DomKey::BACKSPACE, true, false, true, "Backspace"}, - {ui::DomKey::TAB, true, false, true, "Tab"}, - {ui::DomKey::ENTER, true, false, true, "Enter"}, - {ui::DomKey::ESCAPE, true, false, true, "Escape"}, - {ui::DomKey::DEL, true, false, true, "Delete"}, - {ui::DomKey::BACKSPACE, true, false, false, "\b"}, - {ui::DomKey::TAB, true, false, false, "\t"}, - {ui::DomKey::ENTER, true, false, false, "\r"}, - {ui::DomKey::ESCAPE, true, false, false, "\x1B"}, - {ui::DomKey::DEL, true, false, false, "\x7F"}, - {ui::DomKey::Constant<'\b'>::Character, true, false, true, "Backspace"}, - {ui::DomKey::Constant<'\t'>::Character, true, false, true, "Tab"}, - {ui::DomKey::Constant<'\r'>::Character, true, false, true, "Enter"}, - {ui::DomKey::Constant<0x1B>::Character, true, false, true, "Escape"}, - {ui::DomKey::Constant<0x7F>::Character, true, false, true, "Delete"}, + {ui::DomKey::BACKSPACE, true, false, true, "Backspace", true}, + {ui::DomKey::TAB, true, false, true, "Tab", true}, + {ui::DomKey::ENTER, true, false, true, "Enter", true}, + {ui::DomKey::ESCAPE, true, false, true, "Escape", true}, + {ui::DomKey::DEL, true, false, true, "Delete", true}, + {ui::DomKey::BACKSPACE, true, false, false, "\b", true}, + {ui::DomKey::TAB, true, false, false, "\t", true}, + {ui::DomKey::ENTER, true, false, false, "\r", true}, + {ui::DomKey::ESCAPE, true, false, false, "\x1B", true}, + {ui::DomKey::DEL, true, false, false, "\x7F", true}, + {ui::DomKey::Constant<'\b'>::Character, true, false, true, "Backspace", + true}, + {ui::DomKey::Constant<'\t'>::Character, true, false, true, "Tab", true}, + {ui::DomKey::Constant<'\r'>::Character, true, false, true, "Enter", true}, + {ui::DomKey::Constant<0x1B>::Character, true, false, true, "Escape", + true}, + {ui::DomKey::Constant<0x7F>::Character, true, false, true, "Delete", + true}, // 'Dead' key. - {ui::DomKey::Constant<0xFFFF>::Dead, false, true, true, "Dead"}, + {ui::DomKey::Constant<0xFFFF>::Dead, false, true, true, "Dead", true}, // Sample non-Unicode key names. - {ui::DomKey::SHIFT, false, false, true, "Shift"}, - {ui::DomKey::F16, false, false, true, "F16"}, - {ui::DomKey::ZOOM_IN, false, false, true, "ZoomIn"}, - {ui::DomKey::UNIDENTIFIED, false, false, true, "Unidentified"}, + {ui::DomKey::SHIFT, false, false, true, "Shift", true}, + {ui::DomKey::F16, false, false, true, "F16", true}, + {ui::DomKey::ZOOM_IN, false, false, true, "ZoomIn", true}, + {ui::DomKey::UNIDENTIFIED, false, false, true, "Unidentified", true}, }; for (const auto& test : test_cases) { // Check KeyStringToDomKey(). @@ -232,6 +237,7 @@ std::string s(ui::KeycodeConverter::DomKeyToKeyString(test.key)); EXPECT_STREQ(test.string, s.c_str()); } + EXPECT_EQ(ui::KeycodeConverter::IsDomKeyNamed(key), test.is_named); } // Round-trip test all UI Events KeyboardEvent.key strings, and check // that encodings are distinct.
diff --git a/ui/gfx/image/image_util.cc b/ui/gfx/image/image_util.cc index 9a107428..3893b88 100644 --- a/ui/gfx/image/image_util.cc +++ b/ui/gfx/image/image_util.cc
@@ -52,6 +52,14 @@ return ResizedImageForSearchByImageSkiaRepresentation(image); } +Image ResizedImageForMaxDimensions(const Image& image, + int max_width, + int max_height, + int max_area) { + return ResizedImageForMaxDimensionsSkiaRepresentation(image, max_width, + max_height, max_area); +} + // The MacOS implementation of this function is in image_utils_mac.mm. #if !defined(OS_MAC) bool JPEG1xEncodedDataFromImage(const Image& image, @@ -84,22 +92,28 @@ } Image ResizedImageForSearchByImageSkiaRepresentation(const Image& image) { + return ResizedImageForMaxDimensionsSkiaRepresentation( + image, kSearchByImageMaxImageWidth, kSearchByImageMaxImageHeight, + kSearchByImageMaxImageArea); +} + +Image ResizedImageForMaxDimensionsSkiaRepresentation(const Image& image, + int max_width, + int max_height, + int max_area) { const gfx::ImageSkiaRep& image_skia_rep = image.AsImageSkia().GetRepresentation(1.0f); if (image_skia_rep.scale() != 1.0f) return image; const SkBitmap& bitmap = image_skia_rep.GetBitmap(); - if (bitmap.height() * bitmap.width() > kSearchByImageMaxImageArea && - (bitmap.width() > kSearchByImageMaxImageWidth || - bitmap.height() > kSearchByImageMaxImageHeight)) { - double scale = std::min( - static_cast<double>(kSearchByImageMaxImageWidth) / bitmap.width(), - static_cast<double>(kSearchByImageMaxImageHeight) / bitmap.height()); - int width = base::ClampToRange<int>(scale * bitmap.width(), 1, - kSearchByImageMaxImageWidth); - int height = base::ClampToRange<int>(scale * bitmap.height(), 1, - kSearchByImageMaxImageHeight); + if (bitmap.height() * bitmap.width() > max_area && + (bitmap.width() > max_width || bitmap.height() > max_height)) { + double scale = std::min(static_cast<double>(max_width) / bitmap.width(), + static_cast<double>(max_height) / bitmap.height()); + int width = base::ClampToRange<int>(scale * bitmap.width(), 1, max_width); + int height = + base::ClampToRange<int>(scale * bitmap.height(), 1, max_height); SkBitmap new_bitmap = skia::ImageOperations::Resize( bitmap, skia::ImageOperations::RESIZE_GOOD, width, height); return Image(ImageSkia(ImageSkiaRep(new_bitmap, 0.0f)));
diff --git a/ui/gfx/image/image_util.h b/ui/gfx/image/image_util.h index e1ff62a..aa954a2 100644 --- a/ui/gfx/image/image_util.h +++ b/ui/gfx/image/image_util.h
@@ -60,7 +60,19 @@ // kSearchByImageMaxImageHeight) in preparation for searching. GFX_EXPORT Image ResizedImageForSearchByImage(const Image& image); +// Downsizes the image if its area exceeds the max_area defined AND (either its +// width exceeds the max_width defined OR its height exceeds the max_height +// defined). +GFX_EXPORT Image ResizedImageForMaxDimensions(const Image& image, + int max_width, + int max_height, + int max_area); + Image ResizedImageForSearchByImageSkiaRepresentation(const Image& image); +Image ResizedImageForMaxDimensionsSkiaRepresentation(const Image& image, + int max_width, + int max_height, + int max_area); } // namespace gfx
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc index 334d9fe..2765c73 100644 --- a/ui/views/controls/combobox/combobox.cc +++ b/ui/views/controls/combobox/combobox.cc
@@ -82,7 +82,8 @@ }, this)); } - + TransparentButton(const TransparentButton&) = delete; + TransparentButton& operator&=(const TransparentButton&) = delete; ~TransparentButton() override = default; bool OnMousePressed(const ui::MouseEvent& mouse_event) override { @@ -97,9 +98,6 @@ double GetAnimationValue() const { return hover_animation().GetCurrentValue(); } - - private: - DISALLOW_COPY_AND_ASSIGN(TransparentButton); }; #if !defined(OS_MAC) @@ -126,6 +124,8 @@ public: ComboboxMenuModel(Combobox* owner, ui::ComboboxModel* model) : owner_(owner), model_(model) {} + ComboboxMenuModel(const ComboboxMenuModel&) = delete; + ComboboxMenuModel& operator&(const ComboboxMenuModel&) = delete; ~ComboboxMenuModel() override = default; private: @@ -214,8 +214,6 @@ Combobox* owner_; // Weak. Owns this. ui::ComboboxModel* model_; // Weak. - - DISALLOW_COPY_AND_ASSIGN(ComboboxMenuModel); }; ////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/views/controls/combobox/combobox.h b/ui/views/controls/combobox/combobox.h index bd8400db06..f94eeb2 100644 --- a/ui/views/controls/combobox/combobox.h +++ b/ui/views/controls/combobox/combobox.h
@@ -9,7 +9,6 @@ #include <string> #include <utility> -#include "base/macros.h" #include "base/scoped_observation.h" #include "base/time/time.h" #include "ui/base/models/combobox_model.h" @@ -58,6 +57,8 @@ explicit Combobox(ui::ComboboxModel* model, int text_context = kDefaultComboboxTextContext, int text_style = kDefaultComboboxTextStyle); + Combobox(const Combobox&) = delete; + Combobox& operator=(const Combobox&) = delete; ~Combobox() override; const gfx::FontList& GetFontList() const; @@ -161,9 +162,6 @@ PrefixSelector* GetPrefixSelector(); - // Returns the color to use for the combobox's focus ring. - SkColor GetFocusRingColor() const; - // Optionally used to tie the lifetime of the model to this combobox. See // constructor. std::unique_ptr<ui::ComboboxModel> owned_model_; @@ -224,8 +222,6 @@ base::ScopedObservation<ui::ComboboxModel, ui::ComboboxModelObserver> observation_{this}; - - DISALLOW_COPY_AND_ASSIGN(Combobox); }; BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Combobox, View)
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc index 9e7e089..a0a0fe58 100644 --- a/ui/views/controls/textfield/textfield.cc +++ b/ui/views/controls/textfield/textfield.cc
@@ -8,17 +8,12 @@ #include <set> #include <string> #include <utility> -#include "ui/base/data_transfer_policy/data_transfer_endpoint.h" -#include "ui/events/gesture_event_details.h" - -#if defined(OS_WIN) -#include <vector> -#endif #include "base/auto_reset.h" #include "base/command_line.h" #include "base/metrics/histogram_functions.h" #include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -27,6 +22,7 @@ #include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/cursor/cursor.h" +#include "ui/base/data_transfer_policy/data_transfer_endpoint.h" #include "ui/base/default_style.h" #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h" @@ -43,6 +39,7 @@ #include "ui/display/screen.h" #include "ui/events/base_event_utils.h" #include "ui/events/event.h" +#include "ui/events/gesture_event_details.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/canvas.h" #include "ui/gfx/geometry/insets.h" @@ -55,7 +52,6 @@ #include "ui/views/controls/focusable_border.h" #include "ui/views/controls/label.h" #include "ui/views/controls/menu/menu_runner.h" -#include "ui/views/controls/native/native_view_host.h" #include "ui/views/controls/textfield/textfield_controller.h" #include "ui/views/controls/views_text_services_context_menu.h" #include "ui/views/drag_utils.h"
diff --git a/ui/views/controls/textfield/textfield.h b/ui/views/controls/textfield/textfield.h index dcc88d8..af165933 100644 --- a/ui/views/controls/textfield/textfield.h +++ b/ui/views/controls/textfield/textfield.h
@@ -13,15 +13,9 @@ #include <string> #include <utility> -#if defined(OS_WIN) -#include <vector> -#endif - #include "base/bind.h" #include "base/compiler_specific.h" -#include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "base/time/time.h" #include "base/timer/timer.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -40,7 +34,6 @@ #include "ui/gfx/selection_model.h" #include "ui/gfx/text_constants.h" #include "ui/views/context_menu_controller.h" -#include "ui/views/controls/focus_ring.h" #include "ui/views/controls/textfield/textfield_model.h" #include "ui/views/drag_controller.h" #include "ui/views/metadata/view_factory.h" @@ -49,6 +42,10 @@ #include "ui/views/view.h" #include "ui/views/word_lookup_client.h" +#if defined(OS_WIN) +#include <vector> +#endif + namespace base { class TimeDelta; } @@ -636,9 +633,6 @@ // Textfield::GetCaretBlinkMs(). void OnCursorBlinkTimerFired(); - // Returns the color to use for the FocusRing, if one is present. - SkColor GetFocusRingColor() const; - void OnEnabledChanged(); // The text model.