diff --git a/DEPS b/DEPS index 6bd42a5..1a5f282 100644 --- a/DEPS +++ b/DEPS
@@ -171,7 +171,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'fedca19411717706006c21922ded5bf25b6a0f58', + 'v8_revision': 'be181e241c6da9baa49a424b7d91613c8ebf76f8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -179,7 +179,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': 'ae1b7786b89a5cde6bafe93f6a2ccce8f6d9621c', + 'angle_revision': '48aa52f7305a0dc0e611c8cfa0031629054ba3e4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -230,7 +230,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': '572eb8c70fdcc6e7a6ae0961841fea7661c51fa2', + 'catapult_revision': '1b3fb455bf1849f1e6187e1eaeaef32b9f30d3c5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -302,7 +302,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '919812ed1c25b9aba8fcf182de96b91181e4cfb0', + 'dawn_revision': '8d000e0cc230663dbeae86f59aaa16fc91b1eac1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -862,7 +862,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'df1de01ceff385b5cb29bca977de70bc21c89765', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '7c836ccb431d88c2a337047d21135e4100362754', 'condition': 'checkout_linux', }, @@ -887,7 +887,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '989bc351863dd6cbb7e645a027a3c5e04104e44f', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b594247e39a48445ccfc7e70678f97e1de451057', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -1280,7 +1280,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '3787dee781561934b95519d7b5d16b05166dd882', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '45f9f6cebc3a5956cee84448fa90b499dc8a8bf4', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1470,7 +1470,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '2701c130839edbeb226735b0775966b6423d9e83', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'a6d7b028242c38447d8dd13fe232682aceb10932', + Var('webrtc_git') + '/src.git' + '@' + 'c71d85bc4e719fcf28f8f89b2975292391f1c021', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1532,7 +1532,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@42ac78d2d012b030f7994c889f377269f9d51051', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@930722709254c044a05cec3f2cab366c2d25d475', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index c4821d4..3061536 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc
@@ -881,9 +881,9 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) { + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) { mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver = - mojo::MakeRequest(out_factory); + out_factory->InitWithNewPipeAndPassReceiver(); if (content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) { // Manages its own lifetime. new android_webview::AwProxyingURLLoaderFactory(
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h index f8baf28f..e710f90 100644 --- a/android_webview/browser/aw_content_browser_client.h +++ b/android_webview/browser/aw_content_browser_client.h
@@ -188,7 +188,8 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) override; + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) + override; void RegisterNonNetworkSubresourceURLLoaderFactories( int render_process_id, int render_frame_id,
diff --git a/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc b/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc index 079ddd63..f753cffa 100644 --- a/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc +++ b/android_webview/browser/gfx/skia_output_surface_dependency_webview.cc
@@ -108,4 +108,14 @@ return gl_surface_; } +void SkiaOutputSurfaceDependencyWebView::RegisterDisplayContext( + gpu::DisplayContext* display_context) { + // No GpuChannelManagerDelegate here, so leave it no-op for now. +} + +void SkiaOutputSurfaceDependencyWebView::UnregisterDisplayContext( + gpu::DisplayContext* display_context) { + // No GpuChannelManagerDelegate here, so leave it no-op for now. +} + } // namespace android_webview
diff --git a/android_webview/browser/gfx/skia_output_surface_dependency_webview.h b/android_webview/browser/gfx/skia_output_surface_dependency_webview.h index ac9b1c7..ff27ec25 100644 --- a/android_webview/browser/gfx/skia_output_surface_dependency_webview.h +++ b/android_webview/browser/gfx/skia_output_surface_dependency_webview.h
@@ -43,6 +43,8 @@ gpu::SurfaceHandle GetSurfaceHandle() override; scoped_refptr<gl::GLSurface> CreateGLSurface( base::WeakPtr<gpu::ImageTransportSurfaceDelegate> stub) override; + void RegisterDisplayContext(gpu::DisplayContext* display_context) override; + void UnregisterDisplayContext(gpu::DisplayContext* display_context) override; private: gl::GLSurface* const gl_surface_;
diff --git a/android_webview/lib/webview_entry_point.cc b/android_webview/lib/webview_entry_point.cc index 66281e0a..900a6f8f 100644 --- a/android_webview/lib/webview_entry_point.cc +++ b/android_webview/lib/webview_entry_point.cc
@@ -13,7 +13,7 @@ switch (library_process_type) { case base::android::PROCESS_WEBLAYER: case base::android::PROCESS_WEBLAYER_CHILD: - return weblayer::OnJNIOnLoadInit("resources.pak"); + return weblayer::OnJNIOnLoadInit(); break; default: return android_webview::OnJNIOnLoadInit();
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni index c417bc6..9a5c392 100644 --- a/android_webview/system_webview_apk_tmpl.gni +++ b/android_webview/system_webview_apk_tmpl.gni
@@ -10,6 +10,7 @@ import("//build/util/version.gni") import("//chrome/android/trichrome.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") +import("//weblayer/variables.gni") declare_args() { # Android package name to use when compiling the system_webview_apk and @@ -34,7 +35,10 @@ ] target_sdk_version = android_sdk_version - locale_config_java_packages = [ webview_locale_config_java_package ] + locale_config_java_packages = [ + webview_locale_config_java_package, + weblayer_locale_config_java_package, + ] if (!defined(alternative_android_sdk_dep)) { alternative_android_sdk_dep = webview_framework_dep
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 10d8dfbd..efccd81 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -50,6 +50,7 @@ "public/cpp/arc_custom_tab.h", "public/cpp/ash_prefs.h", "public/cpp/assistant/assistant_settings.h", + "public/cpp/autotest_private_api_utils.h", "public/cpp/docked_magnifier_controller.h", "public/cpp/event_rewriter_controller.h", "public/cpp/first_run_helper.h", @@ -216,6 +217,7 @@ "autoclick/autoclick_ring_handler.h", "autoclick/autoclick_scroll_position_handler.cc", "autoclick/autoclick_scroll_position_handler.h", + "autotest_private_api_utils.cc", "bluetooth_devices_observer.cc", "bluetooth_devices_observer.h", "cancel_mode.cc",
diff --git a/ash/accelerators/debug_commands.cc b/ash/accelerators/debug_commands.cc index ed446af..9550535 100644 --- a/ash/accelerators/debug_commands.cc +++ b/ash/accelerators/debug_commands.cc
@@ -76,6 +76,9 @@ *out << indent_str; *out << name << " (" << window << ")" << " type=" << window->type(); + int window_id = window->id(); + if (window_id != aura::Window::kInitialId) + *out << " id=" << window_id; if (window->GetProperty(kWindowStateKey)) *out << " " << WindowState::Get(window)->GetStateType(); *out << ((window == active_window) ? " [active]" : "")
diff --git a/ash/autotest_private_api_utils.cc b/ash/autotest_private_api_utils.cc new file mode 100644 index 0000000..dacaf3c --- /dev/null +++ b/ash/autotest_private_api_utils.cc
@@ -0,0 +1,19 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/public/cpp/autotest_private_api_utils.h" + +#include "ash/shell.h" +#include "ash/wm/mru_window_tracker.h" +#include "ash/wm/tablet_mode/scoped_skip_user_session_blocked_check.h" + +namespace ash { + +std::vector<aura::Window*> GetAppWindowList() { + ScopedSkipUserSessionBlockedCheck skip_session_blocked; + return Shell::Get()->mru_window_tracker()->BuildWindowForCycleWithPipList( + ash::kAllDesks); +} + +} // namespace ash
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc index a0cf6e5..cf9177d 100644 --- a/ash/display/mirror_window_controller.cc +++ b/ash/display/mirror_window_controller.cc
@@ -30,6 +30,7 @@ #include "ui/base/ui_base_switches_util.h" #include "ui/compositor/reflector.h" #include "ui/display/display_layout.h" +#include "ui/display/manager/display_layout_store.h" #include "ui/display/manager/display_manager.h" #include "ui/display/manager/managed_display_info.h" #include "ui/display/screen.h" @@ -249,15 +250,32 @@ } if (features::IsVizDisplayCompositorEnabled()) { - // |mirror_size| is the size of the mirror source in physical pixels. - // The RootWindowTransformer corrects the scale of the mirrored display - // and the location of input events. - gfx::Size mirror_size = - display_manager->GetDisplayInfo(reflecting_source_id_) - .bounds_in_native() - .size(); - aura::Window* mirror_window = - mirroring_host_info_map_[display_info.id()]->mirror_window; + // |mirror_size| is the size of the compositor of the mirror source in + // physical pixels. The RootWindowTransformer corrects the scale of the + // mirrored display and the location of input events. + ui::Compositor* source_compositor = + Shell::GetRootWindowForDisplayId(reflecting_source_id_) + ->GetHost() + ->compositor(); + gfx::Size mirror_size = source_compositor->size(); + + auto* mirroring_host_info = mirroring_host_info_map_[display_info.id()]; + + // The rotation of the source display (internal display) should be undone + // in the destination display (external display) if mirror mode is enabled + // in tablet mode. This allows the destination display to show in an + // orientation independent of the source display. + // See https://crbug.com/824417 + const bool should_undo_rotation = Shell::Get() + ->display_manager() + ->layout_store() + ->forced_mirror_mode_for_tablet(); + if (!should_undo_rotation) { + mirroring_host_info->ash_host->AsWindowTreeHost() + ->SetDisplayTransformHint(source_compositor->display_transform()); + } + + aura::Window* mirror_window = mirroring_host_info->mirror_window; mirror_window->SetBounds(gfx::Rect(mirror_size)); mirror_window->Show(); mirror_window->layer()->SetShowReflectedSurface(reflecting_surface_id,
diff --git a/ash/display/overscan_calibrator.cc b/ash/display/overscan_calibrator.cc index edb41433..f9c23f7 100644 --- a/ash/display/overscan_calibrator.cc +++ b/ash/display/overscan_calibrator.cc
@@ -124,12 +124,12 @@ void OverscanCalibrator::OnPaintLayer(const ui::PaintContext& context) { ui::PaintRecorder recorder(context, calibration_layer_->size()); - static const SkColor kTransparent = SkColorSetARGB(0, 0, 0, 0); gfx::Rect full_bounds = calibration_layer_->bounds(); gfx::Rect inner_bounds = full_bounds; inner_bounds.Inset(insets_); recorder.canvas()->FillRect(full_bounds, SK_ColorBLACK); - recorder.canvas()->FillRect(inner_bounds, kTransparent, SkBlendMode::kClear); + recorder.canvas()->FillRect(inner_bounds, SK_ColorTRANSPARENT, + SkBlendMode::kClear); gfx::Point center = inner_bounds.CenterPoint(); int vertical_offset = inner_bounds.height() / 2 - kArrowGapWidth;
diff --git a/ash/display/root_window_transformers.cc b/ash/display/root_window_transformers.cc index 6fbf5e06..afb4861b 100644 --- a/ash/display/root_window_transformers.cc +++ b/ash/display/root_window_transformers.cc
@@ -12,6 +12,7 @@ #include "ash/shell.h" #include "ash/utility/transformer_util.h" #include "base/command_line.h" +#include "components/viz/common/features.h" #include "ui/compositor/dip_util.h" #include "ui/display/display.h" #include "ui/display/manager/display_layout_store.h" @@ -56,6 +57,44 @@ return transform; } +// Returns a transform with rotation adjusted |insets_in_pixel|. The transform +// is applied to the root window so that |insets_in_pixel| looks correct after +// the rotation applied at the output. +gfx::Transform CreateReverseRotatedInsetsTransform( + display::Display::Rotation rotation, + const gfx::Insets& insets_in_pixel, + float device_scale_factor) { + float x_offset = 0; + float y_offset = 0; + + switch (rotation) { + case display::Display::ROTATE_0: + x_offset = insets_in_pixel.left(); + y_offset = insets_in_pixel.top(); + break; + case display::Display::ROTATE_90: + x_offset = insets_in_pixel.top(); + y_offset = insets_in_pixel.right(); + break; + case display::Display::ROTATE_180: + x_offset = insets_in_pixel.right(); + y_offset = insets_in_pixel.bottom(); + break; + case display::Display::ROTATE_270: + x_offset = insets_in_pixel.bottom(); + y_offset = insets_in_pixel.left(); + break; + } + + gfx::Transform transform; + if (x_offset != 0 || y_offset != 0) { + x_offset /= device_scale_factor; + y_offset /= device_scale_factor; + transform.Translate(x_offset, y_offset); + } + return transform; +} + // RootWindowTransformer for ash environment. class AshRootWindowTransformer : public RootWindowTransformer { public: @@ -70,10 +109,16 @@ display.device_scale_factor()) * CreateRootWindowRotationTransform(root, display); transform_ = root_window_bounds_transform_; + insets_and_scale_transform_ = CreateReverseRotatedInsetsTransform( + info.GetLogicalActiveRotation(), host_insets_, + display.device_scale_factor()); MagnificationController* magnifier = Shell::Get()->magnification_controller(); - if (magnifier) - transform_ *= magnifier->GetMagnifierTransform(); + if (magnifier) { + gfx::Transform magnifier_scale = magnifier->GetMagnifierTransform(); + transform_ *= magnifier_scale; + insets_and_scale_transform_ *= magnifier_scale; + } CHECK(transform_.GetInverse(&invert_transform_)); } @@ -98,6 +143,9 @@ } gfx::Insets GetHostInsets() const override { return host_insets_; } + gfx::Transform GetInsetsAndScaleTransform() const override { + return insets_and_scale_transform_; + } private: ~AshRootWindowTransformer() override = default; @@ -115,6 +163,7 @@ gfx::Transform root_window_bounds_transform_; gfx::Insets host_insets_; + gfx::Transform insets_and_scale_transform_; DISALLOW_COPY_AND_ASSIGN(AshRootWindowTransformer); }; @@ -180,8 +229,12 @@ transform_.Scale(inverted_scale, inverted_scale); } - // Make sure the rotation transform is applied in the beginning. - transform_.PreconcatTransform(rotation_transform); + // Apply rotation only when reflector is used for mirroring (non viz display + // compositor). + if (!features::IsVizDisplayCompositorEnabled()) { + // Make sure the rotation transform is applied in the beginning. + transform_.PreconcatTransform(rotation_transform); + } } // aura::RootWindowTransformer overrides: @@ -195,6 +248,9 @@ return root_bounds_; } gfx::Insets GetHostInsets() const override { return insets_; } + gfx::Transform GetInsetsAndScaleTransform() const override { + return transform_; + } private: ~MirrorRootWindowTransformer() override = default; @@ -253,6 +309,9 @@ return root_bounds_; } gfx::Insets GetHostInsets() const override { return gfx::Insets(); } + gfx::Transform GetInsetsAndScaleTransform() const override { + return gfx::Transform(); + } private: gfx::Transform transform_;
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc index 163c58ca..97559154 100644 --- a/ash/display/root_window_transformers_unittest.cc +++ b/ash/display/root_window_transformers_unittest.cc
@@ -291,7 +291,8 @@ // on 2.25 scale factor device so that HW overlay kicks in. // https://crbug.com/869090. TEST_F(RootWindowTransformersTest, OriginAlignmentWithFractionalScale) { - auto* host_window = Shell::GetPrimaryRootWindow()->GetHost()->window(); + auto* host = Shell::GetPrimaryRootWindow()->GetHost(); + auto* host_window = host->window(); EXPECT_EQ(Shell::GetPrimaryRootWindow(), host_window); float device_scale_factor = 2.25f; @@ -310,7 +311,7 @@ gfx::RectF tmp(1998, 2999); // Creates a transform that can be applied to already scaled layer. gfx::Transform transform(invert_transform); - transform.ConcatTransform(host_window->layer()->transform()); + transform.ConcatTransform(host->GetRootTransform() * invert_transform); transform.ConcatTransform(scale_transform); transform.TransformRect(&tmp); EXPECT_EQ(gfx::SizeF(2999, 1998), tmp.size()); @@ -323,7 +324,7 @@ gfx::RectF tmp(2999, 1998); gfx::Transform transform(invert_transform); - transform.ConcatTransform(host_window->layer()->transform()); + transform.ConcatTransform(host->GetRootTransform() * invert_transform); transform.ConcatTransform(scale_transform); transform.TransformRect(&tmp); EXPECT_EQ(gfx::SizeF(2999, 1998), tmp.size()); @@ -336,7 +337,7 @@ gfx::RectF tmp(1998, 2999); gfx::Transform transform(invert_transform); - transform.ConcatTransform(host_window->layer()->transform()); + transform.ConcatTransform(host->GetRootTransform() * invert_transform); transform.ConcatTransform(scale_transform); transform.TransformRect(&tmp); EXPECT_EQ(gfx::SizeF(2999, 1998), tmp.size());
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc index f309c77b..747c1eb6 100644 --- a/ash/display/window_tree_host_manager.cc +++ b/ash/display/window_tree_host_manager.cc
@@ -24,6 +24,7 @@ #include "ash/shell.h" #include "ash/system/status_area_widget.h" #include "ash/system/unified/unified_system_tray.h" +#include "ash/utility/transformer_util.h" #include "ash/wm/window_util.h" #include "base/command_line.h" #include "base/metrics/histogram.h" @@ -75,12 +76,17 @@ const display::Display& display) { display::ManagedDisplayInfo info = GetDisplayManager()->GetDisplayInfo(display.id()); + const display::Display::Rotation effective_rotation = + info.GetLogicalActiveRotation(); aura::WindowTreeHost* host = ash_host->AsWindowTreeHost(); - ash_host->SetCursorConfig(display, info.GetLogicalActiveRotation()); + ash_host->SetCursorConfig(display, effective_rotation); std::unique_ptr<RootWindowTransformer> transformer( CreateRootWindowTransformerForDisplay(host->window(), display)); ash_host->SetRootWindowTransformer(std::move(transformer)); + host->SetDisplayTransformHint( + DisplayRotationToOverlayTransform(effective_rotation)); + // Just moving the display requires the full redraw. // chrome-os-partner:33558. host->compositor()->ScheduleFullRedraw();
diff --git a/ash/host/root_window_transformer.h b/ash/host/root_window_transformer.h index 66ebd0bae..e7c73a1 100644 --- a/ash/host/root_window_transformer.h +++ b/ash/host/root_window_transformer.h
@@ -38,6 +38,10 @@ // Returns the insets that specifies the effective area of // the host window. virtual gfx::Insets GetHostInsets() const = 0; + + // Returns the transform for applying host insets and magnifier scale. It is + // similar to GetTransform() but without the screen rotation. + virtual gfx::Transform GetInsetsAndScaleTransform() const = 0; }; } // namespace ash
diff --git a/ash/host/transformer_helper.cc b/ash/host/transformer_helper.cc index e0256cbd..0d9afdb3 100644 --- a/ash/host/transformer_helper.cc +++ b/ash/host/transformer_helper.cc
@@ -49,6 +49,9 @@ } gfx::Insets GetHostInsets() const override { return gfx::Insets(); } + gfx::Transform GetInsetsAndScaleTransform() const override { + return transform_; + } private: ~SimpleRootWindowTransformer() override = default; @@ -86,7 +89,7 @@ transformer_ = std::move(transformer); aura::WindowTreeHost* host = ash_host_->AsWindowTreeHost(); aura::Window* window = host->window(); - window->SetTransform(transformer_->GetTransform()); + window->SetTransform(transformer_->GetInsetsAndScaleTransform()); // If the layer is not animating with a transform animation, then we need to // update the root window size immediately. if (!window->layer()->GetAnimator()->IsAnimatingProperty(
diff --git a/ash/login/ui/lock_screen_media_controls_view.cc b/ash/login/ui/lock_screen_media_controls_view.cc index 539865b..e350055c 100644 --- a/ash/login/ui/lock_screen_media_controls_view.cc +++ b/ash/login/ui/lock_screen_media_controls_view.cc
@@ -11,6 +11,7 @@ #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/style/ash_color_provider.h" #include "base/metrics/histogram_functions.h" #include "components/media_message_center/media_controls_progress_view.h" #include "components/media_message_center/media_notification_util.h" @@ -41,7 +42,6 @@ namespace { -constexpr SkColor kMediaControlsBackground = SkColorSetA(SK_ColorDKGRAY, 150); constexpr SkColor kMediaButtonColor = SK_ColorWHITE; constexpr SkColor kProgressBarForeground = SkColorSetARGB(0xFF, 0x8A, 0xB4, 0xF8); @@ -215,7 +215,10 @@ contents_view_->SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical, kMediaControlsInsets)); contents_view_->SetBackground(views::CreateRoundedRectBackground( - kMediaControlsBackground, kMediaControlsCornerRadius)); + AshColorProvider::Get()->GetBaseLayerColor( + AshColorProvider::BaseLayerType::kTransparentWithBlur, + AshColorProvider::AshColorMode::kDark), + kMediaControlsCornerRadius)); contents_view_->SetPaintToLayer(); // Needed for opacity animation. contents_view_->layer()->SetFillsBoundsOpaquely(false);
diff --git a/ash/login_status.h b/ash/login_status.h index c7d726c..6d835e65 100644 --- a/ash/login_status.h +++ b/ash/login_status.h
@@ -14,8 +14,7 @@ GUEST, // A guest is logged in (i.e. incognito) PUBLIC, // A public account is logged in SUPERVISED, // A supervised user is logged in - KIOSK_APP, // Is in kiosk app mode - ARC_KIOSK_APP // Is in ARC kiosk mode + KIOSK_APP // In kiosk mode for Chrome app, ARC, or PWA. }; } // namespace ash
diff --git a/ash/metrics/user_metrics_recorder.cc b/ash/metrics/user_metrics_recorder.cc index 042db14..12701581 100644 --- a/ash/metrics/user_metrics_recorder.cc +++ b/ash/metrics/user_metrics_recorder.cc
@@ -87,12 +87,6 @@ LoginStatus::KIOSK_APP; } -// Returns true if ARC kiosk mode is active. -bool IsArcKioskModeActive() { - return Shell::Get()->session_controller()->login_status() == - LoginStatus::ARC_KIOSK_APP; -} - // Returns true if there is an active user and their session isn't currently // locked. bool IsUserActive() { @@ -495,7 +489,7 @@ } bool UserMetricsRecorder::IsUserInActiveDesktopEnvironment() const { - return IsUserActive() && !IsKioskModeActive() && !IsArcKioskModeActive(); + return IsUserActive() && !IsKioskModeActive(); } void UserMetricsRecorder::StartTimer() {
diff --git a/ash/public/cpp/autotest_private_api_utils.h b/ash/public/cpp/autotest_private_api_utils.h new file mode 100644 index 0000000..14f0ceb --- /dev/null +++ b/ash/public/cpp/autotest_private_api_utils.h
@@ -0,0 +1,24 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_PUBLIC_CPP_AUTOTEST_PRIVATE_API_UTILS_H_ +#define ASH_PUBLIC_CPP_AUTOTEST_PRIVATE_API_UTILS_H_ + +#include <vector> + +#include "ash/ash_export.h" + +namespace aura { +class Window; +} + +// Utility functions for autotest private APIs and ShellTestAPI. +namespace ash { + +// Get application windows, windows that are shown in overview grid. +ASH_EXPORT std::vector<aura::Window*> GetAppWindowList(); + +} // namespace ash + +#endif // ASH_PUBLIC_CPP_AUTOTEST_PRIVATE_API_UTILS_H_
diff --git a/ash/session/session_controller_impl.cc b/ash/session/session_controller_impl.cc index fef5776..b075e72 100644 --- a/ash/session/session_controller_impl.cc +++ b/ash/session/session_controller_impl.cc
@@ -566,7 +566,7 @@ case user_manager::USER_TYPE_CHILD: return LoginStatus::SUPERVISED; case user_manager::USER_TYPE_ARC_KIOSK_APP: - return LoginStatus::ARC_KIOSK_APP; + return LoginStatus::KIOSK_APP; case user_manager::USER_TYPE_ACTIVE_DIRECTORY: // TODO: There is no LoginStatus for this. return LoginStatus::USER;
diff --git a/ash/session/session_controller_impl_unittest.cc b/ash/session/session_controller_impl_unittest.cc index ce36ef13..f172da14 100644 --- a/ash/session/session_controller_impl_unittest.cc +++ b/ash/session/session_controller_impl_unittest.cc
@@ -293,7 +293,7 @@ {user_manager::USER_TYPE_SUPERVISED, LoginStatus::SUPERVISED}, {user_manager::USER_TYPE_KIOSK_APP, LoginStatus::KIOSK_APP}, {user_manager::USER_TYPE_CHILD, LoginStatus::SUPERVISED}, - {user_manager::USER_TYPE_ARC_KIOSK_APP, LoginStatus::ARC_KIOSK_APP}, + {user_manager::USER_TYPE_ARC_KIOSK_APP, LoginStatus::KIOSK_APP}, // TODO: Add USER_TYPE_ACTIVE_DIRECTORY if we add a status for it. };
diff --git a/ash/shelf/scrollable_shelf_view_unittest.cc b/ash/shelf/scrollable_shelf_view_unittest.cc index 0231be6..2121cc4 100644 --- a/ash/shelf/scrollable_shelf_view_unittest.cc +++ b/ash/shelf/scrollable_shelf_view_unittest.cc
@@ -10,7 +10,8 @@ #include "ash/shelf/shelf_view_test_api.h" #include "ash/shelf/shelf_widget.h" #include "ash/test/ash_test_base.h" -#include "chromeos/constants/chromeos_switches.h" +#include "base/test/scoped_feature_list.h" +#include "chromeos/constants/chromeos_features.h" #include "ui/display/manager/display_manager.h" namespace ash { @@ -40,6 +41,9 @@ ~ScrollableShelfViewTest() override = default; void SetUp() override { + scoped_feature_list_.InitWithFeatures( + {chromeos::features::kShelfScrollable}, {}); + AshTestBase::SetUp(); scrollable_shelf_view_ = GetPrimaryShelf() ->shelf_widget() @@ -99,6 +103,7 @@ EXPECT_TRUE(visible_space_in_screen.Contains(first_tappable_icon_bounds)); } + base::test::ScopedFeatureList scoped_feature_list_; ScrollableShelfView* scrollable_shelf_view_ = nullptr; ShelfView* shelf_view_ = nullptr; std::unique_ptr<ShelfViewTestAPI> test_api_;
diff --git a/ash/system/message_center/arc_notification_manager_delegate_impl.cc b/ash/system/message_center/arc_notification_manager_delegate_impl.cc index 33b4015..db83e45 100644 --- a/ash/system/message_center/arc_notification_manager_delegate_impl.cc +++ b/ash/system/message_center/arc_notification_manager_delegate_impl.cc
@@ -24,8 +24,7 @@ Shell::Get()->session_controller()->login_status(); return login_status == LoginStatus::PUBLIC || - login_status == LoginStatus::KIOSK_APP || - login_status == LoginStatus::ARC_KIOSK_APP; + login_status == LoginStatus::KIOSK_APP; } void ArcNotificationManagerDelegateImpl::ShowMessageCenter() {
diff --git a/ash/utility/transformer_util.cc b/ash/utility/transformer_util.cc index fcb5ef3..4e4e6c3 100644 --- a/ash/utility/transformer_util.cc +++ b/ash/utility/transformer_util.cc
@@ -52,4 +52,20 @@ return rotate; } +gfx::OverlayTransform DisplayRotationToOverlayTransform( + display::Display::Rotation rotation) { + switch (rotation) { + case display::Display::ROTATE_0: + return gfx::OVERLAY_TRANSFORM_NONE; + case display::Display::ROTATE_90: + return gfx::OVERLAY_TRANSFORM_ROTATE_90; + case display::Display::ROTATE_180: + return gfx::OVERLAY_TRANSFORM_ROTATE_180; + case display::Display::ROTATE_270: + return gfx::OVERLAY_TRANSFORM_ROTATE_270; + } + NOTREACHED(); + return gfx::OVERLAY_TRANSFORM_NONE; +} + } // namespace ash
diff --git a/ash/utility/transformer_util.h b/ash/utility/transformer_util.h index 456e6c6b..3059aec3 100644 --- a/ash/utility/transformer_util.h +++ b/ash/utility/transformer_util.h
@@ -7,6 +7,7 @@ #include "ash/ash_export.h" #include "ui/display/display.h" +#include "ui/gfx/overlay_transform.h" namespace gfx { class SizeF; @@ -22,6 +23,10 @@ display::Display::Rotation new_rotation, const gfx::SizeF& size_to_rotate); +// Maps display::Display::Rotation to gfx::OverlayTransform. +ASH_EXPORT gfx::OverlayTransform DisplayRotationToOverlayTransform( + display::Display::Rotation rotation); + } // namespace ash #endif // ASH_TRANSFORMER_UTIL_H_
diff --git a/base/android/jni_generator/config.gni b/base/android/jni_generator/config.gni new file mode 100644 index 0000000..5afbb3f --- /dev/null +++ b/base/android/jni_generator/config.gni
@@ -0,0 +1,8 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Including this is an android_apk's processor_args_javac list will result in +# the JNI processor not writing a dummy GEN_JNI class. This is required when +# using proxy natives in android_apk targets. +skip_gen_jni_arg = "org.chromium.chrome.skipGenJni"
diff --git a/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java b/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java index 711730e..4f68abc7 100644 --- a/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java +++ b/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java
@@ -36,6 +36,7 @@ import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -58,8 +59,10 @@ * containing an interface annotated with NativeMethods. * */ +@SupportedOptions({JniProcessor.SKIP_GEN_JNI_ARG}) @AutoService(Processor.class) public class JniProcessor extends AbstractProcessor { + static final String SKIP_GEN_JNI_ARG = "org.chromium.chrome.skipGenJni"; private static final Class<NativeMethods> JNI_STATIC_NATIVES_CLASS = NativeMethods.class; private static final Class<MainDex> MAIN_DEX_CLASS = MainDex.class; @@ -209,11 +212,14 @@ try { // Need to write NativeClass first because the wrapper classes - // depend on it. - JavaFile nativeClassFile = - JavaFile.builder(mNativeClassPackage, mNativesBuilder.build()).build(); + // depend on it. This step is skipped for APK targets since the final GEN_JNI class is + // provided elsewhere. + if (!processingEnv.getOptions().containsKey(SKIP_GEN_JNI_ARG)) { + JavaFile nativeClassFile = + JavaFile.builder(mNativeClassPackage, mNativesBuilder.build()).build(); - nativeClassFile.writeTo(processingEnv.getFiler()); + nativeClassFile.writeTo(processingEnv.getFiler()); + } for (JavaFile f : writeQueue) { f.writeTo(processingEnv.getFiler());
diff --git a/base/win/BUILD.gn b/base/win/BUILD.gn index e6e27510..33a38267 100644 --- a/base/win/BUILD.gn +++ b/base/win/BUILD.gn
@@ -26,6 +26,7 @@ static_library("pe_image") { sources = [ + "../no_destructor.h", "current_module.h", "pe_image.cc", "pe_image.h",
diff --git a/base/win/pe_image.cc b/base/win/pe_image.cc index b08fe0c..490d3ec 100644 --- a/base/win/pe_image.cc +++ b/base/win/pe_image.cc
@@ -9,7 +9,10 @@ #include <delayimp.h> #include <stddef.h> +#include <set> +#include <string> +#include "base/no_destructor.h" #include "base/win/current_module.h" namespace base { @@ -48,6 +51,11 @@ char PdbFileName[1]; }; +#define LDR_IS_DATAFILE(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)1) +#define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2) +#define LDR_IS_RESOURCE(handle) \ + (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle)) + } // namespace // Callback used to enumerate imports. See EnumImportChunksFunction. @@ -494,8 +502,12 @@ // current module is the module whose IAT we are enumerating. // Use the module_name as retrieved from the IAT because this method // is case sensitive. - if (module_ == CURRENT_MODULE()) - ::__HrLoadAllImportsForDll(module_name); + if (module_ == CURRENT_MODULE() && !LDR_IS_RESOURCE(module_)) { + static base::NoDestructor<std::set<std::string>> loaded_dlls; + // pair.second is true if this is a new element + if (loaded_dlls.get()->emplace(module_name).second) + ::__HrLoadAllImportsForDll(module_name); + } } if (!callback(*this, delay_descriptor, module_name, name_table, iat,
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 4eb0322..4326816 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -2140,6 +2140,10 @@ # LocaleConfig.java file will be generated for each package, and will # contain the list of compressed and uncompressed locale pak files. # disable_r8_outlining: Turn off outlining during the proguard step. + # annotation_processor_deps: List of java_annotation_processor targets to + # use when compiling the java_files given to this target (optional). + # processor_args_javac: List of args to pass to annotation processors when + # compiling java_files given to this target (optional). template("android_apk_or_module") { forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.android_manifest)) @@ -2773,10 +2777,10 @@ "alternative_android_sdk_dep", "android_manifest", "android_manifest_dep", + "annotation_processor_deps", "apk_under_test", "base_module_target", "chromium_code", - "classpath_deps", "jacoco_never_instrument", "java_files", "javac_args", @@ -2784,6 +2788,7 @@ "manifest_package", "native_lib_placeholders", "no_build_hooks", + "processor_args_javac", "secondary_abi_loadable_modules", "secondary_native_lib_placeholders", "static_library_dependent_targets", @@ -3365,6 +3370,7 @@ "alternative_android_sdk_dep", "android_manifest", "android_manifest_dep", + "annotation_processor_deps", "apk_under_test", "app_as_shared_lib", "build_hooks_android_impl_deps", @@ -3407,6 +3413,7 @@ "no_xml_namespaces", "png_to_webp", "post_process_package_resources_script", + "processor_args_javac", "product_version_resources_dep", "proguard_configs", "proguard_enabled", @@ -3497,6 +3504,7 @@ "alternative_android_sdk_dep", "android_manifest", "android_manifest_dep", + "annotation_processor_deps", "app_as_shared_lib", "base_module_target", "bundle_target", @@ -3529,6 +3537,7 @@ "package_id", "package_name", "png_to_webp", + "processor_args_javac", "product_version_resources_dep", "proguard_configs", "proguard_enabled",
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn index 25e95f1..244a804e 100644 --- a/build/toolchain/win/BUILD.gn +++ b/build/toolchain/win/BUILD.gn
@@ -212,7 +212,7 @@ } tool("rc") { - command = "$python_path $tool_wrapper_path rc-wrapper $env rc.exe /nologo {{defines}} {{include_dirs}} /fo{{output}} {{source}}" + command = "$python_path $tool_wrapper_path rc-wrapper $env rc.exe /nologo $sys_include_flags{{defines}} {{include_dirs}} /fo{{output}} {{source}}" depsformat = "msvc" outputs = [ "$object_subdir/{{source_name_part}}.res",
diff --git a/build/toolchain/win/rc/rc.py b/build/toolchain/win/rc/rc.py index a01a5ab..7592a33 100755 --- a/build/toolchain/win/rc/rc.py +++ b/build/toolchain/win/rc/rc.py
@@ -8,7 +8,8 @@ options: -h, --help Print this message. --I<dir> Add include path. +-I<dir> Add include path, used for both headers and resources. +-imsvc<dir> Add system include path, used for preprocessing only. -D<sym> Define a macro for the preprocessor. /fo<out> Set path of output .res file. /nologo Ignored (rc.py doesn't print a logo by default). @@ -33,6 +34,7 @@ """Parses flags off sys.argv and returns the parsed flags.""" # Can't use optparse / argparse because of /fo flag :-/ includes = [] + imsvcs = [] defines = [] output = None input = None @@ -44,6 +46,8 @@ sys.exit(0) if flag.startswith('-I'): includes.append(flag) + elif flag.startswith('-imsvc'): + imsvcs.append(flag) elif flag.startswith('-D'): defines.append(flag) elif flag.startswith('/fo'): @@ -72,10 +76,10 @@ sys.exit(1) if not output: output = os.path.splitext(input)[0] + '.res' - Flags = namedtuple('Flags', ['includes', 'defines', 'output', 'input', - 'show_includes']) - return Flags(includes=includes, defines=defines, output=output, input=input, - show_includes=show_includes) + Flags = namedtuple('Flags', ['includes', 'defines', 'output', 'imsvcs', + 'input', 'show_includes']) + return Flags(includes=includes, defines=defines, output=output, imsvcs=imsvcs, + input=input, show_includes=show_includes) def ReadInput(input): @@ -119,13 +123,13 @@ # Closing temp_handle immediately defeats the purpose of mkstemp(), but I # can't figure out how to let write to the temp file on Windows otherwise. os.close(temp_handle) - clang_cmd = [clang, '/P', '/DRC_INVOKED', '/TC', '-', '/Fi' + temp_file] + clang_cmd = [clang, '/P', '/X', '/DRC_INVOKED', '/TC', '-', '/Fi' + temp_file] if os.path.dirname(flags.input): # This must precede flags.includes. clang_cmd.append('-I' + os.path.dirname(flags.input)) if flags.show_includes: clang_cmd.append('/showIncludes') - clang_cmd += flags.includes + flags.defines + clang_cmd += flags.imsvcs + flags.includes + flags.defines p = subprocess.Popen(clang_cmd, stdin=subprocess.PIPE) p.communicate(input=rc_file_data) if p.returncode != 0: @@ -198,7 +202,7 @@ f.write(preprocessed_output) msrc_out = flags.output + '_ms_rc' - msrc_cmd = ['rc', '/nologo', '/fo' + msrc_out] + msrc_cmd = ['rc', '/nologo', '/x', '/fo' + msrc_out] # Make sure rc-relative resources can be found. rc.exe looks for external # resource files next to the file, but the preprocessed file isn't where the
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 4bcbf9bd..d53e32e 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -278,6 +278,7 @@ "//chrome/android/webapk/libs/runtime_library:webapk_service_aidl_java", "//chrome/browser/android/thin_webview:factory_java", "//chrome/browser/android/thin_webview:java", + "//chrome/browser/download/android:java", "//chrome/browser/image_fetcher:java", "//chrome/browser/ui/android/widget:java", "//chrome/browser/util/android:java", @@ -760,6 +761,7 @@ deps = [ ":browser_java_test_support", + ":chrome_public_test_apk_resources", ":chrome_test_util_java", ":partner_location_descriptor_proto_java", "$google_play_services_package:google_play_services_base_java", @@ -782,7 +784,8 @@ "//chrome/android/third_party/compositor_animator:compositor_animator_java", "//chrome/android/webapk/libs/client:client_java", "//chrome/android/webapk/libs/common:common_java", - "//chrome/browser/android/metrics:ukm_utils_java", + "//chrome/browser/android/metrics:ukm_java_test_support", + "//chrome/browser/android/metrics:ukm_javatests", "//chrome/browser/ui/android/widget:java", "//chrome/browser/ui/android/widget:test_support_java", "//chrome/browser/util/android:java", @@ -1073,6 +1076,14 @@ } } +android_resources("chrome_public_test_apk_resources") { + resource_dirs = [ "javatests/res" ] + deps = [ + ":chrome_app_java_resources", + ] + custom_package = "org.chromium.chrome.test" +} + # Overrides icon / name defined in chrome_app_java_resources. android_resources("chrome_public_apk_resources") { resource_dirs = [ "java/res_chromium" ] @@ -1481,7 +1492,7 @@ ":browser_java_test_support", ":chrome_public_base_module_java", "//chrome/android/features/autofill_assistant:autofill_assistant_java_test_support", - "//chrome/browser/android/metrics:ukm_utils_java", + "//chrome/browser/android/metrics:ukm_java_test_support", "//chrome/browser/subresource_filter:subresource_filter_java_test_support", "//components/heap_profiling:heap_profiling_java_test_support", "//components/minidump_uploader:minidump_uploader_java",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 309d7af..4945509 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -614,8 +614,6 @@ "java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory.java", "java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java", "java/src/org/chromium/chrome/browser/download/service/DownloadTaskScheduler.java", - "java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java", - "java/src/org/chromium/chrome/browser/download/ui/DownloadFilter.java", "java/src/org/chromium/chrome/browser/engagement/SiteEngagementService.java", "java/src/org/chromium/chrome/browser/explore_sites/CategoryCardAdapter.java", "java/src/org/chromium/chrome/browser/explore_sites/CategoryCardViewHolderFactory.java", @@ -1642,6 +1640,7 @@ "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonViewBinder.java", "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java", + "java/src/org/chromium/chrome/browser/toolbar/ToolbarColors.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarCommonPropertiesModel.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java", "java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java", @@ -1690,6 +1689,7 @@ "java/src/org/chromium/chrome/browser/tracing/TracingNotificationManager.java", "java/src/org/chromium/chrome/browser/tracing/TracingNotificationService.java", "java/src/org/chromium/chrome/browser/translate/TranslateBridge.java", + "java/src/org/chromium/chrome/browser/translate/TranslateUtils.java", "java/src/org/chromium/chrome/browser/upgrade/PackageReplacedBroadcastReceiver.java", "java/src/org/chromium/chrome/browser/usage_stats/DigitalWellbeingClient.java", "java/src/org/chromium/chrome/browser/usage_stats/EventTracker.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni index d1e968d..da5fecc 100644 --- a/chrome/android/chrome_public_apk_tmpl.gni +++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -14,6 +14,7 @@ import("//chrome/android/features/dev_ui/dev_ui_module.gni") import("//chrome/common/features.gni") import("//device/vr/buildflags/buildflags.gni") +import("//weblayer/variables.gni") import("channel.gni") declare_args() { @@ -344,6 +345,7 @@ locale_config_java_packages = [ "org.chromium.chrome.browser", webview_locale_config_java_package, + weblayer_locale_config_java_package, ] if (android_64bit_target_cpu) { # Build //android_webview:monochrome with the opposite bitness that
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 5b9dbb4..4c96ae2 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -46,7 +46,7 @@ "javatests/src/org/chromium/chrome/browser/WarmupManagerTest.java", "javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java", "javatests/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayoutTest.java", - "javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java", + "javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java", "javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java", "javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java", "javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java", @@ -225,7 +225,6 @@ "javatests/src/org/chromium/chrome/browser/metrics/BackgroundMetricsTest.java", "javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java", "javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java", - "javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java", "javatests/src/org/chromium/chrome/browser/modaldialog/AppModalPresenterTest.java", "javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogTestUtils.java", "javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java",
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java index 47467a5..678ba177 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java
@@ -27,7 +27,7 @@ import org.junit.runner.RunWith; import org.chromium.base.ContextUtils; -import org.chromium.chrome.browser.util.ColorUtils; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -162,7 +162,7 @@ @SmallTest @UiThreadTest public void testSetTint() { - ColorStateList tint = ColorUtils.getThemedToolbarIconTint(getActivity(), true); + ColorStateList tint = ToolbarColors.getThemedToolbarIconTint(getActivity(), true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Assert.assertNotEquals(tint, mLeftButton.getImageTintList()); Assert.assertNotEquals(tint, mRightButton.getImageTintList());
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS index 238aa483..b95d98e 100644 --- a/chrome/android/java/DEPS +++ b/chrome/android/java/DEPS
@@ -3,6 +3,7 @@ "+chrome/browser/android/thin_webview/java", "+chrome/browser/ui/android/widget", + "+chrome/browser/download/android/java", "+chrome/browser/util/android/java", "+chrome/lib/lifecycle/public", "+chrome/lib/image_fetcher/public",
diff --git a/chrome/android/java/res/layout/explore_sites_dense_tile_bottom_view.xml b/chrome/android/java/res/layout/explore_sites_dense_tile_bottom_view.xml index d3d535e5..61d5422 100644 --- a/chrome/android/java/res/layout/explore_sites_dense_tile_bottom_view.xml +++ b/chrome/android/java/res/layout/explore_sites_dense_tile_bottom_view.xml
@@ -8,7 +8,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="@dimen/explore_sites_dense_title_bottom_tile_view_width" - android:layout_height="@dimen/explore_sites_dense_title_bottom_tile_view_height" + android:layout_height="wrap_content" + android:minHeight="@dimen/explore_sites_dense_title_bottom_tile_view_height" app:iconCornerRadius="@dimen/explore_sites_dense_icon_corner_radius"> <!-- The icon background. --> @@ -59,4 +60,4 @@ android:lines="2" android:textAppearance="@style/TextAppearance.BlackCaption" app:leading="@dimen/text_size_small_leading" /> -</org.chromium.chrome.browser.explore_sites.ExploreSitesTileView> \ No newline at end of file +</org.chromium.chrome.browser.explore_sites.ExploreSitesTileView>
diff --git a/chrome/android/java/res/layout/explore_sites_dense_tile_right_view.xml b/chrome/android/java/res/layout/explore_sites_dense_tile_right_view.xml index ef04ca0..f6cd33a 100644 --- a/chrome/android/java/res/layout/explore_sites_dense_tile_right_view.xml +++ b/chrome/android/java/res/layout/explore_sites_dense_tile_right_view.xml
@@ -8,7 +8,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="@dimen/explore_sites_dense_title_right_tile_view_width" - android:layout_height="@dimen/explore_sites_dense_title_right_tile_view_height" + android:layout_height="wrap_content" + android:minHeight="@dimen/explore_sites_dense_title_right_tile_view_height" android:orientation="horizontal" app:iconCornerRadius="@dimen/explore_sites_dense_icon_corner_radius"> <!-- The icon background. --> @@ -51,7 +52,7 @@ <org.chromium.ui.widget.TextViewWithLeading android:id="@+id/tile_view_title" android:layout_width="match_parent" - android:layout_height="@dimen/explore_sites_dense_title_right_title_height" + android:layout_height="wrap_content" android:layout_marginTop="@dimen/explore_sites_dense_title_right_title_margin_top" android:layout_marginStart="@dimen/explore_sites_dense_title_right_title_margin_start" android:ellipsize="end"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index 2fbd4a5..4bde768 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -773,7 +773,7 @@ public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { return new AppMenuPropertiesDelegateImpl(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), - getWindow().getDecorView(), null); + getWindow().getDecorView(), null, getToolbarManager().getBookmarkBridgeSupplier()); } /**
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 da03f96..ef132a2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -1725,7 +1725,8 @@ return new TabbedAppMenuPropertiesDelegate(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), getWindow().getDecorView(), this, - mOverviewModeController.mOverviewModeBehaviorSupplier); + mOverviewModeController.mOverviewModeBehaviorSupplier, + getToolbarManager().getBookmarkBridgeSupplier()); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ThemeColorProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/ThemeColorProvider.java index 89afe904..0d60afa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ThemeColorProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ThemeColorProvider.java
@@ -11,6 +11,7 @@ import androidx.annotation.Nullable; import org.chromium.base.ObserverList; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.util.ColorUtils; /** @@ -66,8 +67,8 @@ public ThemeColorProvider(Context context) { mThemeColorObservers = new ObserverList<ThemeColorObserver>(); mTintObservers = new ObserverList<TintObserver>(); - mLightModeTint = ColorUtils.getThemedToolbarIconTint(context, true); - mDarkModeTint = ColorUtils.getThemedToolbarIconTint(context, false); + mLightModeTint = ToolbarColors.getThemedToolbarIconTint(context, true); + mDarkModeTint = ToolbarColors.getThemedToolbarIconTint(context, false); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorFactory.java index 6b2ecba..b76b874a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorFactory.java
@@ -7,12 +7,8 @@ import android.content.Context; import android.view.View; -import androidx.annotation.Nullable; -import org.chromium.base.ObservableSupplier; -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; -import org.chromium.chrome.browser.toolbar.ToolbarManager; /** * A factory for creating an {@link AppMenuCoordinator}. @@ -25,18 +21,15 @@ * @param context The activity context. * @param activityLifecycleDispatcher The {@link ActivityLifecycleDispatcher} for the containing * activity. - * @param buttonDelegate The {@link ToolbarManager} for the containing activity. + * @param buttonDelegate The {@link MenuButtonDelegate} for the containing activity. * @param appMenuDelegate The {@link AppMenuDelegate} for the containing activity. * @param decorView The decor {@link View}, e.g. from Window#getDecorView(), for the containing * activity. - * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the - * {@link OverviewModeBehavior} associated with the containing activity. */ public static AppMenuCoordinator createAppMenuCoordinator(Context context, ActivityLifecycleDispatcher activityLifecycleDispatcher, - MenuButtonDelegate buttonDelegate, AppMenuDelegate appMenuDelegate, View decorView, - @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { - return new AppMenuCoordinatorImpl(context, activityLifecycleDispatcher, buttonDelegate, - appMenuDelegate, decorView, overviewModeBehaviorSupplier); + MenuButtonDelegate buttonDelegate, AppMenuDelegate appMenuDelegate, View decorView) { + return new AppMenuCoordinatorImpl( + context, activityLifecycleDispatcher, buttonDelegate, appMenuDelegate, decorView); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorImpl.java index b2a295f..9f2440e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinatorImpl.java
@@ -9,15 +9,11 @@ import android.view.View; import android.view.ViewConfiguration; -import androidx.annotation.Nullable; -import org.chromium.base.ObservableSupplier; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; -import org.chromium.chrome.browser.toolbar.ToolbarManager; /** A UI coordinator the app menu. */ class AppMenuCoordinatorImpl implements AppMenuCoordinator { @@ -25,7 +21,7 @@ * Factory which creates the AppMenuHandlerImpl. */ @VisibleForTesting - public interface AppMenuHandlerFactory { + interface AppMenuHandlerFactory { /** * @param delegate Delegate used to check the desired AppMenu properties on show. * @param appMenuDelegate The AppMenuDelegate to handle menu item selection. @@ -35,21 +31,18 @@ * It is assumed to have back_menu_id, forward_menu_id, bookmark_this_page_id. * @param decorView The decor {@link View}, e.g. from Window#getDecorView(), for the * containing activity. - * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the - * {@link OverviewModeBehavior} associated with the containing activity. * @return AppMenuHandlerImpl for the given activity and menu resource id. */ AppMenuHandlerImpl get(AppMenuPropertiesDelegate delegate, AppMenuDelegate appMenuDelegate, int menuResourceId, View decorView, - ActivityLifecycleDispatcher activityLifecycleDispatcher, - @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier); + ActivityLifecycleDispatcher activityLifecycleDispatcher); } /** * @param factory The {@link AppMenuHandlerFactory} for creating {@link #mAppMenuHandler} */ @VisibleForTesting - public static void setAppMenuHandlerFactoryForTesting(AppMenuHandlerFactory factory) { + static void setAppMenuHandlerFactoryForTesting(AppMenuHandlerFactory factory) { sAppMenuHandlerFactory = factory; } @@ -60,27 +53,24 @@ private AppMenuPropertiesDelegate mAppMenuPropertiesDelegate; private AppMenuHandlerImpl mAppMenuHandler; - private static AppMenuHandlerFactory sAppMenuHandlerFactory = (delegate, appMenuDelegate, - menuResourceId, decorView, activityLifecycleDispatcher, overviewModeBehaviorSupplier) + private static AppMenuHandlerFactory sAppMenuHandlerFactory = + (delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher) -> new AppMenuHandlerImpl(delegate, appMenuDelegate, menuResourceId, decorView, - activityLifecycleDispatcher, overviewModeBehaviorSupplier); + activityLifecycleDispatcher); /** * Construct a new AppMenuCoordinatorImpl. * @param context The activity context. * @param activityLifecycleDispatcher The {@link ActivityLifecycleDispatcher} for the containing * activity. - * @param buttonDelegate The {@link ToolbarManager} for the containing activity. + * @param buttonDelegate The {@link MenuButtonDelegate} for the containing activity. * @param appMenuDelegate The {@link AppMenuDelegate} for the containing activity. * @param decorView The decor {@link View}, e.g. from Window#getDecorView(), for the containing * activity. - * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the - * {@link OverviewModeBehavior} associated with the containing activity. */ public AppMenuCoordinatorImpl(Context context, ActivityLifecycleDispatcher activityLifecycleDispatcher, - MenuButtonDelegate buttonDelegate, AppMenuDelegate appMenuDelegate, View decorView, - @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { + MenuButtonDelegate buttonDelegate, AppMenuDelegate appMenuDelegate, View decorView) { mContext = context; mButtonDelegate = buttonDelegate; mAppMenuDelegate = appMenuDelegate; @@ -88,7 +78,7 @@ mAppMenuHandler = sAppMenuHandlerFactory.get(mAppMenuPropertiesDelegate, mAppMenuDelegate, mAppMenuPropertiesDelegate.getAppMenuLayoutId(), decorView, - activityLifecycleDispatcher, overviewModeBehaviorSupplier); + activityLifecycleDispatcher); // TODO(twellington): Move to UpdateMenuItemHelper or common UI coordinator parent? mAppMenuHandler.addObserver(new AppMenuObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandlerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandlerImpl.java index 5b2e6cf7..9e6316a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandlerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandlerImpl.java
@@ -18,15 +18,10 @@ import android.view.WindowManager; import android.widget.PopupMenu; -import androidx.annotation.Nullable; - import org.chromium.base.Callback; -import org.chromium.base.ObservableSupplier; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver; import org.chromium.chrome.browser.lifecycle.StartStopWithNativeObserver; @@ -53,10 +48,8 @@ private final AppMenuDelegate mAppMenuDelegate; private final View mDecorView; private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; - private final @Nullable ObservableSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier; - private @Nullable Callback<OverviewModeBehavior> mOverviewModeSupplierCallback; - private @Nullable OverviewModeBehavior mOverviewModeBehavior; - private OverviewModeBehavior.OverviewModeObserver mOverviewModeObserver; + + private Callback<MenuItem> mTestOptionsItemSelectedListener; /** * The resource id of the menu item to highlight when the menu next opens. A value of @@ -80,13 +73,10 @@ * activity. * @param activityLifecycleDispatcher The {@link ActivityLifecycleDispatcher} for the containing * activity. - * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the - * {@link OverviewModeBehavior} associated with the containing activity. */ public AppMenuHandlerImpl(AppMenuPropertiesDelegate delegate, AppMenuDelegate appMenuDelegate, int menuResourceId, View decorView, - ActivityLifecycleDispatcher activityLifecycleDispatcher, - @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { + ActivityLifecycleDispatcher activityLifecycleDispatcher) { mAppMenuDelegate = appMenuDelegate; mDelegate = delegate; mDecorView = decorView; @@ -98,50 +88,6 @@ mActivityLifecycleDispatcher = activityLifecycleDispatcher; mActivityLifecycleDispatcher.register(this); - mOverviewModeObserver = new EmptyOverviewModeObserver() { - // OverviewModeBehavior.OverviewModeObserver implementation - @Override - public void onOverviewModeStartedShowing(boolean showToolbar) { - hideAppMenu(); - } - - @Override - public void onOverviewModeFinishedShowing() { - // Ideally we wouldn't allow the app menu to show while animating the overview mode. - // This is hard to track, however, because in some instances - // #onOverviewModeStartedShowing is called after #onOverviewModeFinishedShowing (see - // https://crbug.com/969047). Once that bug is fixed, we can remove this call to - // hide in favor of disallowing app menu shows during animation. Alternatively, we - // could expose a way to query whether an animation is in progress. - hideAppMenu(); - } - - @Override - public void onOverviewModeStartedHiding(boolean showToolbar, boolean delayAnimation) { - hideAppMenu(); - } - - @Override - public void onOverviewModeFinishedHiding() { - hideAppMenu(); - } - }; - - // TODO(twellington): Move overview mode/app menu logic to parent root UI coordinator (to - // control interaction between peer components)? - mOverviewModeBehaviorSupplier = overviewModeBehaviorSupplier; - if (mOverviewModeBehaviorSupplier != null) { - mOverviewModeSupplierCallback = overviewModeBehavior -> { - if (mOverviewModeBehavior != null) { - mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver); - } - - mOverviewModeBehavior = overviewModeBehavior; - mOverviewModeBehavior.addOverviewModeObserver(mOverviewModeObserver); - }; - mOverviewModeBehaviorSupplier.addObserver(mOverviewModeSupplierCallback); - } - assert mHardwareButtonMenuAnchor != null : "Using AppMenu requires to have menu_anchor_stub view"; } @@ -154,12 +100,6 @@ hideAppMenu(); mActivityLifecycleDispatcher.unregister(this); - if (mOverviewModeBehaviorSupplier != null) { - mOverviewModeBehaviorSupplier.removeObserver(mOverviewModeSupplierCallback); - } - if (mOverviewModeBehavior != null) { - mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver); - } } @Override @@ -333,6 +273,11 @@ @VisibleForTesting public void onOptionsItemSelected(MenuItem item) { + if (mTestOptionsItemSelectedListener != null) { + mTestOptionsItemSelectedListener.onResult(item); + return; + } + mAppMenuDelegate.onOptionsItemSelected( item.getItemId(), mDelegate.getBundleForMenuItem(item)); } @@ -384,4 +329,15 @@ } return true; } + + @VisibleForTesting + void overrideOnOptionItemSelectedListenerForTests( + Callback<MenuItem> onOptionsItemSelectedListener) { + mTestOptionsItemSelectedListener = onOptionsItemSelectedListener; + } + + @VisibleForTesting + AppMenuPropertiesDelegate getDelegateForTests() { + return mDelegate; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java index 73e8c67..5e4d074 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
@@ -11,9 +11,6 @@ import androidx.annotation.Nullable; -import org.chromium.chrome.browser.bookmarks.BookmarkBridge; -import org.chromium.chrome.browser.tab.Tab; - /** * App Menu helper that handles hiding and showing menu items based on activity state. */ @@ -97,17 +94,4 @@ * @param view The view that was inflated. */ void onHeaderViewInflated(AppMenuHandler appMenuHandler, View view); - - /** - * Updates the bookmarks bridge. - * - * @param bookmarkBridge The bookmarks bridge. - */ - void setBookmarkBridge(BookmarkBridge bookmarkBridge); - - /** - * Returns true iff the translate menu item should be visible. - * @param tab Tab being displayed. - */ - boolean isTranslateMenuItemVisible(Tab tab); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java index 4310d17..4d2248b2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -41,7 +41,7 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.ToolbarManager; -import org.chromium.chrome.browser.translate.TranslateBridge; +import org.chromium.chrome.browser.translate.TranslateUtils; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; @@ -63,7 +63,9 @@ protected final ToolbarManager mToolbarManager; protected final View mDecorView; private final @Nullable ObservableSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier; + private final ObservableSupplier<BookmarkBridge> mBookmarkBridgeSupplier; private @Nullable Callback<OverviewModeBehavior> mOverviewModeSupplierCallback; + private Callback<BookmarkBridge> mBookmarkBridgeSupplierCallback; protected @Nullable OverviewModeBehavior mOverviewModeBehavior; protected BookmarkBridge mBookmarkBridge; @@ -80,11 +82,14 @@ * activity. * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the * {@link OverviewModeBehavior} associated with the containing activity. + * @param bookmarkBridgeSupplier An {@link ObservableSupplier} for the {@link BookmarkBridge} + * associated with the containing activity. */ public AppMenuPropertiesDelegateImpl(Context context, ActivityTabProvider activityTabProvider, MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, - @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { + @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier, + ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier) { mContext = context; mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext); mActivityTabProvider = activityTabProvider; @@ -100,6 +105,10 @@ }; mOverviewModeBehaviorSupplier.addObserver(mOverviewModeSupplierCallback); } + + mBookmarkBridgeSupplier = bookmarkBridgeSupplier; + mBookmarkBridgeSupplierCallback = (bookmarkBridge) -> mBookmarkBridge = bookmarkBridge; + mBookmarkBridgeSupplier.addObserver(mBookmarkBridgeSupplierCallback); } @Override @@ -107,6 +116,7 @@ if (mOverviewModeBehaviorSupplier != null) { mOverviewModeBehaviorSupplier.removeObserver(mOverviewModeSupplierCallback); } + mBookmarkBridgeSupplier.removeObserver(mBookmarkBridgeSupplierCallback); } @Override @@ -342,7 +352,7 @@ * Sets the visibility of the "Translate" menu item. */ protected void prepareTranslateMenuItem(Menu menu, Tab currentTab) { - boolean isTranslateVisible = isTranslateMenuItemVisible(currentTab); + boolean isTranslateVisible = TranslateUtils.canTranslateCurrentTab(currentTab); RecordHistogram.recordBooleanHistogram( "Translate.MobileMenuTranslate.Shown", isTranslateVisible); menu.findItem(R.id.translate_id).setVisible(isTranslateVisible); @@ -409,11 +419,6 @@ @Override public void onHeaderViewInflated(AppMenuHandler appMenuHandler, View view) {} - @Override - public void setBookmarkBridge(BookmarkBridge bookmarkBridge) { - mBookmarkBridge = bookmarkBridge; - } - /** * Updates the bookmark item's visibility. * @@ -468,15 +473,4 @@ ? mContext.getString(R.string.menu_request_desktop_site_on) : mContext.getString(R.string.menu_request_desktop_site_off)); } - - @Override - public boolean isTranslateMenuItemVisible(Tab tab) { - String url = tab.getUrl(); - boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX) - || url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX); - boolean isFileScheme = url.startsWith(UrlConstants.FILE_URL_PREFIX); - boolean isContentScheme = url.startsWith(UrlConstants.CONTENT_URL_PREFIX); - return !isChromeScheme && !isFileScheme && !isContentScheme && !TextUtils.isEmpty(url) - && tab.getWebContents() != null && TranslateBridge.canManuallyTranslate(tab); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuTestSupport.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuTestSupport.java index cf8de0f..c31ec1de 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuTestSupport.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuTestSupport.java
@@ -4,11 +4,14 @@ package org.chromium.chrome.browser.appmenu; +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.ListView; -import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.base.Callback; +import org.chromium.chrome.R; /** * Utility methods for performing operations on the app menu needed for testing. @@ -20,11 +23,11 @@ */ public class AppMenuTestSupport { /** - * @param The {@link ChromeActivity} for the current test. + * @param coordinator The {@link AppMenuCoordinator} associated with the app menu being tested. * @return The {@link Menu} held by the app menu. */ - public static Menu getMenu(ChromeActivity activity) { - return getAppMenuCoordinator(activity) + public static Menu getMenu(AppMenuCoordinator coordinator) { + return ((AppMenuCoordinatorImpl) coordinator) .getAppMenuHandlerImplForTesting() .getAppMenu() .getMenu(); @@ -33,22 +36,84 @@ /** * See {@link AppMenuHandlerImpl#onOptionsItemSelected(MenuItem)}. */ - public static void onOptionsItemSelected(ChromeActivity activity, MenuItem item) { - getAppMenuCoordinator(activity).getAppMenuHandlerImplForTesting().onOptionsItemSelected( - item); + public static void onOptionsItemSelected(AppMenuCoordinator coordinator, MenuItem item) { + ((AppMenuCoordinatorImpl) coordinator) + .getAppMenuHandlerImplForTesting() + .onOptionsItemSelected(item); } /** - * See {@link AppMenuHandlerImpl#showAppMenu(View, boolean, boolean)}. + * Show the app menu. + * @param coordinator The {@link AppMenuCoordinator} associated with the app menu being tested. + * @param anchorView Anchor view (usually a menu button) to be used for the popup, if null is + * passed then hardware menu button anchor will be used. + * @param startDragging Whether dragging is started. For example, if the app menu is showed by + * tapping on a button, this should be false. If it is showed by start + * dragging down on the menu button, this should be true. Note that if + * anchorView is null, this must be false since we no longer support + * hardware menu button dragging. + * @param showFromBottom Whether the menu should be shown from the bottom up. + * @return True, if the menu is shown, false, if menu is not shown, example + * reasons: the menu is not yet available to be shown, or the menu is + * already showing. */ - public static boolean showAppMenu(ChromeActivity activity, View anchorView, + public static boolean showAppMenu(AppMenuCoordinator coordinator, View anchorView, boolean startDragging, boolean showFromBottom) { - return getAppMenuCoordinator(activity).getAppMenuHandlerImplForTesting().showAppMenu( - anchorView, startDragging, showFromBottom); + return ((AppMenuCoordinatorImpl) coordinator) + .getAppMenuHandlerImplForTesting() + .showAppMenu(anchorView, startDragging, showFromBottom); } - private static AppMenuCoordinatorImpl getAppMenuCoordinator(ChromeActivity activity) { - return ((AppMenuCoordinatorImpl) activity.getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting()); + /** + * @param coordinator The {@link AppMenuCoordinator} associated with the app menu being tested. + * @return The {@link ListView} for the app menu. + */ + public static ListView getListView(AppMenuCoordinator coordinator) { + return ((AppMenuCoordinatorImpl) coordinator) + .getAppMenuHandlerImplForTesting() + .getAppMenu() + .getListView(); } -} + + /** + * @param coordinator The {@link AppMenuCoordinator} associated with the app menu being tested. + * @return Whether the app menu should be shown according to the app menu component. + */ + public static boolean shouldShowAppMenu(AppMenuCoordinator coordinator) { + return ((AppMenuCoordinatorImpl) coordinator) + .getAppMenuHandlerImplForTesting() + .shouldShowAppMenu(); + } + + /** + * Override the callback that's executed when an option in the menu is selected. Typically + * handled by {@link AppMenuDelegate#onOptionsItemSelected(int, Bundle)}. + * @param coordinator The {@link AppMenuCoordinator} associated with the app menu being tested. + * @param onOptionsItemSelectedListener The callback to execute instead of the AppMenuDelegate + * method. + */ + public static void overrideOnOptionItemSelectedListener( + AppMenuCoordinator coordinator, Callback<MenuItem> onOptionsItemSelectedListener) { + ((AppMenuCoordinatorImpl) coordinator) + .getAppMenuHandlerImplForTesting() + .overrideOnOptionItemSelectedListenerForTests(onOptionsItemSelectedListener); + } + + /** + * @param coordinator The {@link AppMenuCoordinator} associated with the app menu being tested. + * @return The {@link AppMenuPropertiesDelegate} for the coordinator. + */ + public static AppMenuPropertiesDelegate getAppMenuPropertiesDelegate( + AppMenuCoordinator coordinator) { + return ((AppMenuCoordinatorImpl) coordinator) + .getAppMenuHandlerImplForTesting() + .getDelegateForTests(); + } + + /** + * @return The view id for the ListView displaying app menu items. + */ + public static int getAppMenuLayoutListViewId() { + return R.id.app_menu_list; + } +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index b407ff4..d602e94 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -55,7 +55,7 @@ import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.ControlContainer; -import org.chromium.chrome.browser.util.ColorUtils; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.components.content_capture.ContentCaptureConsumer; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.KeyboardVisibilityDelegate; @@ -960,7 +960,7 @@ @Override public int getBrowserControlsBackgroundColor() { return mTabVisible == null ? Color.WHITE - : ColorUtils.getToolbarSceneLayerBackground(mTabVisible); + : ToolbarColors.getToolbarSceneLayerBackground(mTabVisible); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java index 1a049de..8971826 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java
@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchUma; import org.chromium.chrome.browser.contextualsearch.QuickActionCategory; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.content_public.browser.LoadUrlParams; @@ -300,7 +301,7 @@ Resources res = mContext.getResources(); if (mToolbarBackgroundColor != 0 - && !ColorUtils.isUsingDefaultToolbarColor( + && !ToolbarColors.isUsingDefaultToolbarColor( res, false, mToolbarBackgroundColor) && ColorUtils.shouldUseLightForegroundOnBackground( mToolbarBackgroundColor)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java index 44568dc..65ff505 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
@@ -52,7 +52,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tabmodel.TabSelectionType; -import org.chromium.chrome.browser.util.ColorUtils; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.SPenSupport; @@ -655,10 +655,11 @@ isNtp && ((NewTabPage) tab.getNativePage()).isLocationBarShownInNTP(); boolean needsUpdate = layoutTab.initFromHost(TabThemeColorHelper.getBackgroundColor(tab), - shouldStall(tab), canUseLiveTexture, ColorUtils.getToolbarSceneLayerBackground(tab), - ColorUtils.getTextBoxColorForToolbarBackground(mContext.getResources(), + shouldStall(tab), canUseLiveTexture, + ToolbarColors.getToolbarSceneLayerBackground(tab), + ToolbarColors.getTextBoxColorForToolbarBackground(mContext.getResources(), isLocationBarShownInNtp, themeColor, tab.isIncognito()), - ColorUtils.getTextBoxAlphaForToolbarBackground(tab)); + ToolbarColors.getTextBoxAlphaForToolbarBackground(tab)); if (needsUpdate) requestUpdate(); mHost.requestRender();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java index ba4b7ed..f39966a8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java
@@ -22,8 +22,8 @@ import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.toolbar.ControlContainer; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.ui.widget.ClipDrawableProgressBar.DrawingInfo; -import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.resources.ResourceManager; @@ -118,8 +118,9 @@ isIncognito = currentTab.isIncognito(); } - int textBoxColor = ColorUtils.getTextBoxColorForToolbarBackground(mContext.getResources(), - isLocationBarShownInNtp, browserControlsBackgroundColor, isIncognito); + int textBoxColor = + ToolbarColors.getTextBoxColorForToolbarBackground(mContext.getResources(), + isLocationBarShownInNtp, browserControlsBackgroundColor, isIncognito); int textBoxResourceId = R.drawable.modern_location_bar; ToolbarSceneLayerJni.get().updateToolbarLayer(mNativePtr, ToolbarSceneLayer.this,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index f1424d71..b65d807 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -66,8 +66,8 @@ import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.usage_stats.UsageStatsService; -import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; @@ -188,7 +188,7 @@ @Override public void performPostInflationStartup() { super.performPostInflationStartup(); - getStatusBarColorController().updateStatusBarColor(ColorUtils.isUsingDefaultToolbarColor( + getStatusBarColorController().updateStatusBarColor(ToolbarColors.isUsingDefaultToolbarColor( getResources(), false, getBaseStatusBarColor())); // Properly attach tab's InfoBarContainer to the view hierarchy if the tab is already @@ -329,8 +329,9 @@ public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), - getWindow().getDecorView(), mIntentDataProvider.getUiType(), - mIntentDataProvider.getMenuTitles(), mIntentDataProvider.isOpenedByChrome(), + getWindow().getDecorView(), getToolbarManager().getBookmarkBridgeSupplier(), + mIntentDataProvider.getUiType(), mIntentDataProvider.getMenuTitles(), + mIntentDataProvider.isOpenedByChrome(), mIntentDataProvider.shouldShowShareMenuItem(), mIntentDataProvider.shouldShowStarButton(), mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java index 5ef3b3d3..011fc44 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -17,11 +17,13 @@ import androidx.annotation.Nullable; import org.chromium.base.ContextUtils; +import org.chromium.base.ObservableSupplier; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.DefaultBrowserInfo; import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegateImpl; +import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType; import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.firstrun.FirstRunStatus; @@ -40,7 +42,7 @@ * App menu properties delegate for {@link CustomTabActivity}. */ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateImpl { - private final static String CUSTOM_MENU_ITEM_ID_KEY = "CustomMenuItemId"; + private static final String CUSTOM_MENU_ITEM_ID_KEY = "CustomMenuItemId"; private final @CustomTabsUiType int mUiType; private final boolean mShowShare; @@ -61,10 +63,11 @@ ActivityTabProvider activityTabProvider, MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, + ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier, @CustomTabsUiType final int uiType, List<String> menuEntries, boolean isOpenedByChrome, boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito) { super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector, - toolbarManager, decorView, null); + toolbarManager, decorView, null, bookmarkBridgeSupplier); mUiType = uiType; mMenuEntries = menuEntries; mIsOpenedByChrome = isOpenedByChrome;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java index ef11b7eb..71f2e42 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
@@ -7,7 +7,6 @@ import android.graphics.Bitmap; import org.chromium.base.annotations.CalledByNative; -import org.chromium.chrome.browser.download.ui.DownloadFilter; import org.chromium.components.download.DownloadState; import org.chromium.components.download.ResumeMode; import org.chromium.components.offline_items_collection.ContentId;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java index cce7178..9b066ead 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -41,7 +41,6 @@ import org.chromium.chrome.browser.download.DownloadNotificationUmaHelper.UmaBackgroundDownload; import org.chromium.chrome.browser.download.DownloadNotificationUmaHelper.UmaDownloadResumption; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; -import org.chromium.chrome.browser.download.ui.BackendProvider; import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.media.MediaViewerUtils; @@ -87,10 +86,9 @@ * handles all Android DownloadManager interactions. And DownloadManagerService should not know * download Id issued by Android DownloadManager. */ -public class DownloadManagerService - implements DownloadController.DownloadNotificationService, - NetworkChangeNotifierAutoDetect.Observer, DownloadServiceDelegate, - BackendProvider.DownloadDelegate, ProfileManager.Observer { +public class DownloadManagerService implements DownloadController.DownloadNotificationService, + NetworkChangeNotifierAutoDetect.Observer, + DownloadServiceDelegate, ProfileManager.Observer { // Download status. @IntDef({DownloadStatus.IN_PROGRESS, DownloadStatus.COMPLETE, DownloadStatus.FAILED, DownloadStatus.CANCELLED, DownloadStatus.INTERRUPTED}) @@ -1174,7 +1172,6 @@ * @param isOffTheRecord Whether the download is off the record. * @param externallyRemoved If the file is externally removed by other applications. */ - @Override public void removeDownload( final String downloadGuid, boolean isOffTheRecord, boolean externallyRemoved) { mHandler.post(() -> { @@ -1196,7 +1193,6 @@ * @param mimeType MIME type of the file. * @return Whether the download is openable by the browser. */ - @Override public boolean isDownloadOpenableInBrowser(boolean isOffTheRecord, String mimeType) { // TODO(qinmin): for audio and video, check if the codec is supported by Chrome. return isSupportedMimeType(mimeType); @@ -1598,14 +1594,12 @@ } /** Adds a new DownloadObserver to the list. */ - @Override public void addDownloadObserver(DownloadObserver observer) { mDownloadObservers.addObserver(observer); DownloadSharedPreferenceHelper.getInstance().addObserver(observer); } /** Removes a DownloadObserver from the list. */ - @Override public void removeDownloadObserver(DownloadObserver observer) { mDownloadObservers.removeObserver(observer); DownloadSharedPreferenceHelper.getInstance().removeObserver(observer); @@ -1618,7 +1612,6 @@ * * @param isOffTheRecord Whether or not to get downloads for the off the record profile. */ - @Override public void getAllDownloads(boolean isOffTheRecord) { DownloadManagerServiceJni.get().getAllDownloads( getNativeDownloadManagerService(), DownloadManagerService.this, isOffTheRecord); @@ -1628,7 +1621,6 @@ * Fires an Intent that alerts the DownloadNotificationService that an action must be taken * for a particular item. */ - @Override public void broadcastDownloadAction(DownloadItem downloadItem, String action) { Context appContext = ContextUtils.getApplicationContext(); Intent intent = DownloadNotificationFactory.buildActionIntent(appContext, action, @@ -1638,7 +1630,6 @@ appContext.startService(intent); } - @Override public void renameDownload(ContentId id, String name, Callback<Integer /*RenameResult*/> callback, boolean isOffTheRecord) { DownloadManagerServiceJni.get().renameDownload(getNativeDownloadManagerService(), @@ -1674,7 +1665,6 @@ * Checks if the files associated with any downloads have been removed by an external action. * @param isOffTheRecord Whether or not to check downloads for the off the record profile. */ - @Override public void checkForExternallyRemovedDownloads(boolean isOffTheRecord) { DownloadManagerServiceJni.get().checkForExternallyRemovedDownloads( getNativeDownloadManagerService(), DownloadManagerService.this, isOffTheRecord); @@ -2059,7 +2049,6 @@ * @param downloadGuid Download GUID. * @param isOffTheRecord Whether the download is off the record. */ - @Override public void updateLastAccessTime(String downloadGuid, boolean isOffTheRecord) { if (TextUtils.isEmpty(downloadGuid)) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java index 9fd4824f..3fcc510b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java
@@ -7,7 +7,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.chrome.browser.download.ui.DownloadFilter; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java index 7e18c804..52cf700 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
@@ -40,7 +40,6 @@ import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; -import org.chromium.chrome.browser.download.ui.DownloadFilter; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.media.MediaViewerUtils; import org.chromium.chrome.browser.offlinepages.DownloadUiActionFlags;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java index b8fa9d0a..18c89db0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/metrics/FilterChangeLogger.java
@@ -5,9 +5,9 @@ package org.chromium.chrome.browser.download.home.metrics; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.browser.download.DownloadFilter; import org.chromium.chrome.browser.download.home.filter.FilterCoordinator; import org.chromium.chrome.browser.download.home.filter.Filters.FilterType; -import org.chromium.chrome.browser.download.ui.DownloadFilter; /** * Helper class to log filter changes as the occur.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java deleted file mode 100644 index 4ab1a6fa..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.download.ui; - -import org.chromium.base.Callback; -import org.chromium.chrome.browser.download.DownloadItem; -import org.chromium.chrome.browser.download.DownloadManagerService; -import org.chromium.chrome.browser.download.DownloadManagerService.DownloadObserver; -import org.chromium.components.offline_items_collection.ContentId; - -/** - * Provides classes that need to be interacted with by the download UI. This interface will be - * removed once {@link OfflineContentProvider} is enabled for downloads. - */ -public interface BackendProvider { - - /** Interacts with the Downloads backend. */ - public static interface DownloadDelegate { - /** See {@link DownloadManagerService#addDownloadObserver}. */ - void addDownloadObserver(DownloadObserver observer); - - /** See {@link DownloadManagerService#removeDownloadObserver}. */ - void removeDownloadObserver(DownloadObserver observer); - - /** See {@link DownloadManagerService#getAllDownloads}. */ - void getAllDownloads(boolean isOffTheRecord); - - /** See {@link DownloadManagerService#broadcastDownloadAction}. */ - void broadcastDownloadAction(DownloadItem downloadItem, String action); - - /** See {@link DownloadManagerService#checkForExternallyRemovedDownloads}. */ - void checkForExternallyRemovedDownloads(boolean isOffTheRecord); - - /** See {@link DownloadManagerService#removeDownload}. */ - void removeDownload(String guid, boolean isOffTheRecord, boolean externallyRemoved); - - /** See {@link DownloadManagerService#isDownloadOpenableInBrowser}. */ - boolean isDownloadOpenableInBrowser(boolean isOffTheRecord, String mimeType); - - /** See {@link DownloadManagerService#updateLastAccessTime}. */ - void updateLastAccessTime(String downloadGuid, boolean isOffTheRecord); - - /** See {@link DownloadManagerService#renameDownload}. */ - void renameDownload(ContentId id, String name, Callback<Integer /*RenameResult*/> callback, - boolean isOffTheRecord); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java index a48305ef..2b5ee923 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java
@@ -21,8 +21,8 @@ import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinatorFactory; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.toolbar.ToolbarCommonPropertiesModel; -import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.content_public.browser.BrowserStartupController; import org.chromium.ui.modelutil.PropertyModel; @@ -336,7 +336,7 @@ } @ColorRes - int tintColor = ColorUtils.getThemedToolbarIconTintRes(!mDarkTheme); + int tintColor = ToolbarColors.getThemedToolbarIconTintRes(!mDarkTheme); mModel.set(StatusProperties.SEPARATOR_COLOR_RES, separatorColor); mNavigationIconTintRes = tintColor; @@ -500,7 +500,7 @@ tint = 0; } else { tint = mDarkTheme ? R.color.default_icon_color_secondary_list - : ColorUtils.getThemedToolbarIconTintRes(!mDarkTheme); + : ToolbarColors.getThemedToolbarIconTintRes(!mDarkTheme); } return tint;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java index 5b779aca..d747047 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.appmenu.AppMenuHandler; import org.chromium.chrome.browser.appmenu.AppMenuIconRowFooter; import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegateImpl; +import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.datareduction.DataReductionMainMenuItem; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; @@ -31,9 +32,10 @@ MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, AppMenuDelegate appMenuDelegate, - ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { + ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier, + ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier) { super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector, - toolbarManager, decorView, overviewModeBehaviorSupplier); + toolbarManager, decorView, overviewModeBehaviorSupplier, bookmarkBridgeSupplier); mAppMenuDelegate = appMenuDelegate; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java index 97d3603..0443c72 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -416,7 +416,7 @@ if (isIncognito() || needLightIcon) { // For a dark theme color, use light icons. - return ColorUtils.getThemedToolbarIconTintRes(true); + return ToolbarColors.getThemedToolbarIconTintRes(true); } if (isPreview()) { @@ -433,7 +433,7 @@ // For theme colors which are not dark and are also not // light enough to warrant an opaque URL bar, use dark // icons. - return ColorUtils.getThemedToolbarIconTintRes(false); + return ToolbarColors.getThemedToolbarIconTintRes(false); } // TODO(https://crbug.com/940134): Change the color here and also #needLightIcon logic. @@ -449,7 +449,7 @@ return R.color.google_green_600; } - return ColorUtils.getThemedToolbarIconTintRes(false); + return ToolbarColors.getThemedToolbarIconTintRes(false); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java index daf169a..a73a32b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java
@@ -17,7 +17,6 @@ import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; import org.chromium.chrome.browser.ui.widget.TintedDrawable; -import org.chromium.chrome.browser.util.ColorUtils; import java.util.Locale; @@ -49,7 +48,7 @@ private TabSwitcherDrawable(Context context, boolean useLight, Bitmap bitmap) { super(context, bitmap); - setTint(ColorUtils.getThemedToolbarIconTint(context, useLight)); + setTint(ToolbarColors.getThemedToolbarIconTint(context, useLight)); mSingleDigitTextSize = context.getResources().getDimension(R.dimen.toolbar_tab_count_text_size_1_digit); mDoubleDigitTextSize =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarColors.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarColors.java new file mode 100644 index 0000000..08d126c --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarColors.java
@@ -0,0 +1,132 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.toolbar; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.graphics.Color; +import android.support.v7.content.res.AppCompatResources; + +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ntp.NewTabPage; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabThemeColorHelper; +import org.chromium.chrome.browser.util.ColorUtils; + +/** + * Helpers to determine colors in toolbars. + */ +public class ToolbarColors { + private static final float LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA = 0.2f; + + /** + * Determine the text box color based on the current toolbar background color. + * @param res {@link Resources} used to retrieve colors. + * @param isLocationBarShownInNtp Whether the location bar is currently shown in an NTP. Note + * that this should be false if the returned text box color is + * not used in an NTP. + * @param color The color of the toolbar background. + * @param isIncognito Whether or not the color is used for incognito mode. + * @return The base color for the textbox given a toolbar background color. + */ + public static int getTextBoxColorForToolbarBackground( + Resources res, boolean isLocationBarShownInNtp, int color, boolean isIncognito) { + // Text box color on default toolbar background in incognito mode is a pre-defined + // color. We calculate the equivalent opaque color from the pre-defined translucent color. + if (isIncognito) { + final int overlayColor = ApiCompatibilityUtils.getColor( + res, R.color.toolbar_text_box_background_incognito); + final float overlayColorAlpha = Color.alpha(overlayColor) / 255f; + final int overlayColorOpaque = overlayColor & 0xFF000000; + return ColorUtils.getColorWithOverlay(color, overlayColorOpaque, overlayColorAlpha); + } + + // NTP should have no visible text box in the toolbar, so just return the NTP + // background color. + if (isLocationBarShownInNtp) return ColorUtils.getPrimaryBackgroundColor(res, false); + + // Text box color on default toolbar background in standard mode is a pre-defined + // color instead of a calculated color. + if (isUsingDefaultToolbarColor(res, false, color)) { + return ApiCompatibilityUtils.getColor(res, R.color.toolbar_text_box_background); + } + + // TODO(mdjones): Clean up shouldUseOpaqueTextboxBackground logic. + if (ColorUtils.shouldUseOpaqueTextboxBackground(color)) return Color.WHITE; + + return ColorUtils.getColorWithOverlay( + color, Color.WHITE, LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA); + } + + /** + * @param tab The {@link Tab} on which the toolbar scene layer color is used. + * @return The toolbar (or browser controls) color used in the compositor scene layer. Note that + * this is primarily used for compositor animation, and doesn't affect the Android view. + */ + public static @ColorInt int getToolbarSceneLayerBackground(Tab tab) { + // On NTP, the toolbar background is tinted as the NTP background color, so return NTP + // background color here to make animation smoother. + if (tab.getNativePage() instanceof NewTabPage) { + if (((NewTabPage) tab.getNativePage()).isLocationBarShownInNTP()) { + return tab.getNativePage().getBackgroundColor(); + } + } + + return TabThemeColorHelper.getColor(tab); + } + + /** + * @return Alpha for the textbox given a Tab. + */ + public static float getTextBoxAlphaForToolbarBackground(Tab tab) { + if (tab.getNativePage() instanceof NewTabPage) { + if (((NewTabPage) tab.getNativePage()).isLocationBarShownInNTP()) return 0f; + } + int color = TabThemeColorHelper.getColor(tab); + return ColorUtils.shouldUseOpaqueTextboxBackground(color) + ? 1f + : LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA; + } + + /** + * Test if the toolbar is using the default color. + * @param resources The resources to get the toolbar primary color. + * @param isIncognito Whether to retrieve the default theme color for incognito mode. + * @param color The color that the toolbar is using. + * @return If the color is the default toolbar color. + */ + public static boolean isUsingDefaultToolbarColor( + Resources resources, boolean isIncognito, int color) { + return color == ColorUtils.getDefaultThemeColor(resources, isIncognito); + } + + /** + * Returns the icon tint for based on the given parameters. Does not adjust color based on + * night mode as this may conflict with toolbar theme colors. + * @param useLight Whether or not the icon tint should be light. + * @return The {@link ColorRes} for the icon tint of themed toolbar. + */ + public static @ColorRes int getThemedToolbarIconTintRes(boolean useLight) { + // Light toolbar theme colors may be used in night mode, so use toolbar_icon_tint_dark which + // is not overridden in night- resources. + return useLight ? R.color.tint_on_dark_bg : R.color.toolbar_icon_tint_dark; + } + + /** + * Returns the icon tint for based on the given parameters. Does not adjust color based on + * night mode as this may conflict with toolbar theme colors. + * @param context The {@link Context} used to retrieve colors. + * @param useLight Whether or not the icon tint should be light. + * @return The {@link ColorStateList} for the icon tint of themed toolbar. + */ + public static ColorStateList getThemedToolbarIconTint(Context context, boolean useLight) { + return AppCompatResources.getColorStateList(context, getThemedToolbarIconTintRes(useLight)); + } +}
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 3f30b1d..db56d48 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
@@ -24,6 +24,8 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; +import org.chromium.base.ObservableSupplier; +import org.chromium.base.ObservableSupplierImpl; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.CachedMetrics.ActionEvent; import org.chromium.base.metrics.RecordHistogram; @@ -97,6 +99,7 @@ import org.chromium.chrome.browser.toolbar.top.ViewShiftingActionBarDelegate; import org.chromium.chrome.browser.toolbar.top.tab_switcher_action_menu.TabSwitcherActionMenuCoordinator; import org.chromium.chrome.browser.translate.TranslateBridge; +import org.chromium.chrome.browser.translate.TranslateUtils; import org.chromium.chrome.browser.ui.ImmersiveModeManager; import org.chromium.chrome.browser.ui.widget.highlight.ViewHighlighter; import org.chromium.chrome.browser.ui.widget.textbubble.TextBubble; @@ -172,6 +175,7 @@ private MenuDelegatePhone mMenuDelegatePhone; private final LocationBarModel mLocationBarModel; private Profile mCurrentProfile; + private final ObservableSupplierImpl<BookmarkBridge> mBookmarkBridgeSupplier; private BookmarkBridge mBookmarkBridge; private TemplateUrlServiceObserver mTemplateUrlObserver; private LocationBar mLocationBar; @@ -241,6 +245,7 @@ mUrlFocusChangedCallback = urlFocusChangedCallback; mToolbarActionModeCallback = new ToolbarActionModeCallback(); + mBookmarkBridgeSupplier = new ObservableSupplierImpl<>(); mLocationBarFocusObserver = new UrlFocusChangeListener() { /** The params used to control how the scrim behaves when shown for the omnibox. */ @@ -884,8 +889,7 @@ if (tab == null) return; ChromeActivity activity = tab.getActivity(); - if (mAppMenuPropertiesDelegate == null - || !mAppMenuPropertiesDelegate.isTranslateMenuItemVisible(tab) + if (mAppMenuPropertiesDelegate == null || !TranslateUtils.canTranslateCurrentTab(tab) || !TranslateBridge.shouldShowManualTranslateIPH(tab)) { return; } @@ -1089,6 +1093,13 @@ } /** + * @return An {@link ObservableSupplier} that supplies the {@link BookmarksBridge}. + */ + public ObservableSupplier<BookmarkBridge> getBookmarkBridgeSupplier() { + return mBookmarkBridgeSupplier; + } + + /** * @return The toolbar interface that this manager handles. */ public Toolbar getToolbar() { @@ -1182,6 +1193,7 @@ if (mBookmarkBridge != null) { mBookmarkBridge.destroy(); mBookmarkBridge = null; + mBookmarkBridgeSupplier.set(null); } if (mTemplateUrlObserver != null) { TemplateUrlServiceFactory.get().removeObserver(mTemplateUrlObserver); @@ -1849,15 +1861,13 @@ if (profile != null) { mBookmarkBridge = new BookmarkBridge(profile); mBookmarkBridge.addObserver(mBookmarksObserver); - if (mAppMenuPropertiesDelegate != null) { - mAppMenuPropertiesDelegate.setBookmarkBridge(mBookmarkBridge); - } mLocationBar.setAutocompleteProfile(profile); mLocationBar.setShowIconsWhenUrlFocused( SearchEngineLogoUtils.shouldShowSearchEngineLogo( mLocationBarModel.isIncognito())); } mCurrentProfile = profile; + mBookmarkBridgeSupplier.set(mBookmarkBridge); } updateButtonStatus();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java index 8a2ca40..95c73aa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
@@ -434,7 +434,7 @@ public void setThemeColor(int color, boolean isIncognito) { mThemeColor = color; boolean isDefaultTheme = - ColorUtils.isUsingDefaultToolbarColor(getResources(), isIncognito, mThemeColor); + ToolbarColors.isUsingDefaultToolbarColor(getResources(), isIncognito, mThemeColor); // All colors use a single path if using the status bar color as the background. if (mUseStatusBarColorAsBackground) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarNewTabButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarNewTabButton.java index 8349dcf..57af55f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarNewTabButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomToolbarNewTabButton.java
@@ -24,7 +24,7 @@ import org.chromium.chrome.browser.ThemeColorProvider.TintObserver; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider.IncognitoStateObserver; -import org.chromium.chrome.browser.util.ColorUtils; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.ui.widget.ChromeImageButton; @@ -137,7 +137,7 @@ if (mThemeColorProvider == null || mIncognitoStateProvider == null) return; mBackground.setColorFilter( - ColorUtils.getTextBoxColorForToolbarBackground(mResources, false, + ToolbarColors.getTextBoxColorForToolbarBackground(mResources, false, mThemeColorProvider.getThemeColor(), mThemeColorProvider.useLight() && mIncognitoStateProvider.isIncognitoSelected()),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/SearchAccelerator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/SearchAccelerator.java index f6a9cd0..958a1421 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/SearchAccelerator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/bottom/SearchAccelerator.java
@@ -21,7 +21,7 @@ import org.chromium.chrome.browser.ThemeColorProvider.TintObserver; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider.IncognitoStateObserver; -import org.chromium.chrome.browser.util.ColorUtils; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.ui.widget.ChromeImageButton; @@ -123,8 +123,8 @@ private void updateBackground() { if (mThemeColorProvider == null || mIncognitoStateProvider == null) return; - mBackground.setColorFilter(ColorUtils.getTextBoxColorForToolbarBackground(mResources, false, - mThemeColorProvider.getThemeColor(), + mBackground.setColorFilter(ToolbarColors.getTextBoxColorForToolbarBackground(mResources, + false, mThemeColorProvider.getThemeColor(), mIncognitoStateProvider.isIncognitoSelected()), PorterDuff.Mode.SRC_IN); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java index 134d172f..c31eb8b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java
@@ -59,6 +59,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TrustedCdn; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; import org.chromium.chrome.browser.toolbar.ToolbarTabController; import org.chromium.chrome.browser.ui.widget.TintedDrawable; @@ -168,8 +169,8 @@ public CustomTabToolbar(Context context, AttributeSet attrs) { super(context, attrs); - mDarkModeTint = ColorUtils.getThemedToolbarIconTint(context, false); - mLightModeTint = ColorUtils.getThemedToolbarIconTint(context, true); + mDarkModeTint = ToolbarColors.getThemedToolbarIconTint(context, false); + mLightModeTint = ToolbarColors.getThemedToolbarIconTint(context, true); } @Override @@ -736,7 +737,7 @@ : R.color.default_text_color_light)); if (getProgressBar() != null) { - if (!ColorUtils.isUsingDefaultToolbarColor( + if (!ToolbarColors.isUsingDefaultToolbarColor( getResources(), false, getBackground().getColor())) { getProgressBar().setThemeColor(getBackground().getColor(), false); } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index 8bc47f0..e115a6f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -42,12 +42,12 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.MenuButton; import org.chromium.chrome.browser.toolbar.TabCountProvider; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; import org.chromium.chrome.browser.toolbar.ToolbarProgressBar; import org.chromium.chrome.browser.toolbar.ToolbarTabController; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; import org.chromium.chrome.browser.ui.widget.textbubble.TextBubble; -import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.ui.UiUtils; @@ -92,7 +92,7 @@ */ public ToolbarLayout(Context context, AttributeSet attrs) { super(context, attrs); - mDefaultTint = ColorUtils.getThemedToolbarIconTint(getContext(), false); + mDefaultTint = ToolbarColors.getThemedToolbarIconTint(getContext(), false); mProgressBar = createProgressBar(); addOnLayoutChangeListener(new OnLayoutChangeListener() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 0a3c7282..e480d21 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -67,6 +67,7 @@ import org.chromium.chrome.browser.toolbar.TabCountProvider; import org.chromium.chrome.browser.toolbar.TabCountProvider.TabCountObserver; import org.chromium.chrome.browser.toolbar.TabSwitcherDrawable; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; import org.chromium.chrome.browser.ui.widget.animation.CancelAwareAnimatorListener; import org.chromium.chrome.browser.ui.widget.animation.Interpolators; @@ -345,9 +346,9 @@ super(context, attrs); mToolbarSidePadding = getResources().getDimensionPixelOffset(R.dimen.toolbar_edge_padding); mLightModeDefaultColor = - ColorUtils.getThemedToolbarIconTint(getContext(), true).getDefaultColor(); + ToolbarColors.getThemedToolbarIconTint(getContext(), true).getDefaultColor(); mDarkModeDefaultColor = - ColorUtils.getThemedToolbarIconTint(getContext(), false).getDefaultColor(); + ToolbarColors.getThemedToolbarIconTint(getContext(), false).getDefaultColor(); } @Override @@ -431,7 +432,7 @@ * @return The location bar color. */ private int getLocationBarColorForToolbarColor(int toolbarColor) { - return ColorUtils.getTextBoxColorForToolbarBackground( + return ToolbarColors.getTextBoxColorForToolbarBackground( getResources(), false, toolbarColor, isIncognito()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index e8b3f1c7..5a98e3f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.toolbar.KeyboardNavigationListener; import org.chromium.chrome.browser.toolbar.TabCountProvider; import org.chromium.chrome.browser.toolbar.TabCountProvider.TabCountObserver; +import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.ui.UiUtils; @@ -386,7 +387,7 @@ @Override public void onThemeColorChanged(int color, boolean shouldAnimate) { setBackgroundColor(color); - final int textBoxColor = ColorUtils.getTextBoxColorForToolbarBackground( + final int textBoxColor = ToolbarColors.getTextBoxColorForToolbarBackground( getResources(), false, color, isIncognito()); mLocationBar.getBackground().setColorFilter(textBoxColor, PorterDuff.Mode.SRC_IN);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateUtils.java new file mode 100644 index 0000000..990b9d7 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateUtils.java
@@ -0,0 +1,29 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.translate; + +import android.text.TextUtils; + +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.util.UrlConstants; + +/** + * Utility classes related to the translate feature. + */ +public class TranslateUtils { + /** + * Returns true iff the content displayed in the current tab can be translated. + * @param tab The tab in question. + */ + public static boolean canTranslateCurrentTab(Tab tab) { + String url = tab.getUrl(); + boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX) + || url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX); + boolean isFileScheme = url.startsWith(UrlConstants.FILE_URL_PREFIX); + boolean isContentScheme = url.startsWith(UrlConstants.CONTENT_URL_PREFIX); + return !isChromeScheme && !isFileScheme && !isContentScheme && !TextUtils.isEmpty(url) + && tab.getWebContents() != null && TranslateBridge.canManuallyTranslate(tab); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index f2a340a..e76f108 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -215,6 +215,30 @@ @Override public void onOverviewModeStartedShowing(boolean showToolbar) { if (mFindToolbarManager != null) mFindToolbarManager.hideToolbar(); + hideAppMenu(); + } + + @Override + public void onOverviewModeFinishedShowing() { + // Ideally we wouldn't allow the app menu to show while animating the + // overview mode. This is hard to track, however, because in some + // instances #onOverviewModeStartedShowing is called after + // #onOverviewModeFinishedShowing (see https://crbug.com/969047). + // Once that bug is fixed, we can remove this call to hide in favor of + // disallowing app menu shows during animation. Alternatively, we + // could expose a way to query whether an animation is in progress. + hideAppMenu(); + } + + @Override + public void onOverviewModeStartedHiding( + boolean showToolbar, boolean delayAnimation) { + hideAppMenu(); + } + + @Override + public void onOverviewModeFinishedHiding() { + hideAppMenu(); } }; } @@ -231,8 +255,7 @@ if (mActivity.supportsAppMenu()) { mAppMenuCoordinator = AppMenuCoordinatorFactory.createAppMenuCoordinator(mActivity, mActivity.getLifecycleDispatcher(), mActivity.getToolbarManager(), mActivity, - mActivity.getWindow().getDecorView(), - mActivity.getOverviewModeBehaviorSupplier()); + mActivity.getWindow().getDecorView()); mActivity.getToolbarManager().onAppMenuInitialized( mAppMenuCoordinator.getAppMenuHandler(), mAppMenuCoordinator.getAppMenuPropertiesDelegate()); @@ -243,6 +266,10 @@ } } + private void hideAppMenu() { + if (mAppMenuCoordinator != null) mAppMenuCoordinator.getAppMenuHandler().hideAppMenu(); + } + private void initFindToolbarManager() { if (!mActivity.supportsFindInPage()) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java index e0090fc..32969bc3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java
@@ -10,14 +10,10 @@ import android.graphics.Color; import android.support.v7.content.res.AppCompatResources; -import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ntp.NewTabPage; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabThemeColorHelper; /** * Helper functions for working with colors. @@ -25,7 +21,6 @@ public class ColorUtils { private static final float CONTRAST_LIGHT_ITEM_THRESHOLD = 3f; private static final float LIGHTNESS_OPAQUE_BOX_THRESHOLD = 0.82f; - private static final float LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA = 0.2f; private static final float MAX_LUMINANCE_FOR_VALID_THEME_COLOR = 0.94f; private static final float THEMED_FOREGROUND_BLACK_FRACTION = 0.64f; @@ -106,96 +101,6 @@ } /** - * Returns the icon tint for based on the given parameters. Does not adjust color based on - * night mode as this may conflict with toolbar theme colors. - * @param useLight Whether or not the icon tint should be light. - * @return The {@link ColorRes} for the icon tint of themed toolbar. - */ - public static @ColorRes int getThemedToolbarIconTintRes(boolean useLight) { - // Light toolbar theme colors may be used in night mode, so use toolbar_icon_tint_dark which - // is not overridden in night- resources. - return useLight ? R.color.tint_on_dark_bg : R.color.toolbar_icon_tint_dark; - } - - /** - * Returns the icon tint for based on the given parameters. Does not adjust color based on - * night mode as this may conflict with toolbar theme colors. - * @param context The {@link Context} used to retrieve colors. - * @param useLight Whether or not the icon tint should be light. - * @return The {@link ColorStateList} for the icon tint of themed toolbar. - */ - public static ColorStateList getThemedToolbarIconTint(Context context, boolean useLight) { - return AppCompatResources.getColorStateList(context, getThemedToolbarIconTintRes(useLight)); - } - - /** - * Determine the text box color based on the current toolbar background color. - * @param res {@link Resources} used to retrieve colors. - * @param isLocationBarShownInNtp Whether the location bar is currently shown in an NTP. Note - * that this should be false if the returned text box color is - * not used in an NTP. - * @param color The color of the toolbar background. - * @param isIncognito Whether or not the color is used for incognito mode. - * @return The base color for the textbox given a toolbar background color. - */ - public static int getTextBoxColorForToolbarBackground( - Resources res, boolean isLocationBarShownInNtp, int color, boolean isIncognito) { - // Text box color on default toolbar background in incognito mode is a pre-defined - // color. We calculate the equivalent opaque color from the pre-defined translucent color. - if (isIncognito) { - final int overlayColor = ApiCompatibilityUtils.getColor( - res, R.color.toolbar_text_box_background_incognito); - final float overlayColorAlpha = Color.alpha(overlayColor) / 255f; - final int overlayColorOpaque = overlayColor & 0xFF000000; - return getColorWithOverlay(color, overlayColorOpaque, overlayColorAlpha); - } - - // NTP should have no visible text box in the toolbar, so just return the NTP - // background color. - if (isLocationBarShownInNtp) return getPrimaryBackgroundColor(res, false); - - // Text box color on default toolbar background in standard mode is a pre-defined - // color instead of a calculated color. - if (ColorUtils.isUsingDefaultToolbarColor(res, false, color)) { - return ApiCompatibilityUtils.getColor(res, R.color.toolbar_text_box_background); - } - - // TODO(mdjones): Clean up shouldUseOpaqueTextboxBackground logic. - if (shouldUseOpaqueTextboxBackground(color)) return Color.WHITE; - - return getColorWithOverlay(color, Color.WHITE, LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA); - } - - /** - * @param tab The {@link Tab} on which the toolbar scene layer color is used. - * @return The toolbar (or browser controls) color used in the compositor scene layer. Note that - * this is primarily used for compositor animation, and doesn't affect the Android view. - */ - public static @ColorInt int getToolbarSceneLayerBackground(Tab tab) { - // On NTP, the toolbar background is tinted as the NTP background color, so return NTP - // background color here to make animation smoother. - if (tab.getNativePage() instanceof NewTabPage) { - if (((NewTabPage) tab.getNativePage()).isLocationBarShownInNTP()) { - return tab.getNativePage().getBackgroundColor(); - } - } - - return TabThemeColorHelper.getColor(tab); - } - - /** - * @return Alpha for the textbox given a Tab. - */ - public static float getTextBoxAlphaForToolbarBackground(Tab tab) { - if (tab.getNativePage() instanceof NewTabPage) { - if (((NewTabPage) tab.getNativePage()).isLocationBarShownInNTP()) return 0f; - } - int color = TabThemeColorHelper.getColor(tab); - return shouldUseOpaqueTextboxBackground(color) - ? 1f : LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA; - } - - /** * Get a color when overlayed with a different color. * @param baseColor The base Android color. * @param overlayColor The overlay Android color. @@ -263,18 +168,6 @@ } /** - * Test if the toolbar is using the default color. - * @param resources The resources to get the toolbar primary color. - * @param isIncognito Whether to retrieve the default theme color for incognito mode. - * @param color The color that the toolbar is using. - * @return If the color is the default toolbar color. - */ - public static boolean isUsingDefaultToolbarColor( - Resources resources, boolean isIncognito, int color) { - return color == getDefaultThemeColor(resources, isIncognito); - } - - /** * Determine if a theme color is valid. A theme color is invalid if its luminance is > 0.94. * @param color The color to test. * @return True if the theme color is valid.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index 17e5596..6467225 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -454,10 +454,11 @@ public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), - getWindow().getDecorView(), CustomTabsUiType.MINIMAL_UI_WEBAPP, - new ArrayList<String>(), true /* is opened by Chrome */, - true /* should show share */, false /* should show star (bookmarking) */, - false /* should show download */, false /* is incognito */); + getWindow().getDecorView(), getToolbarManager().getBookmarkBridgeSupplier(), + CustomTabsUiType.MINIMAL_UI_WEBAPP, new ArrayList<String>(), + true /* is opened by Chrome */, true /* should show share */, + false /* should show star (bookmarking) */, false /* should show download */, + false /* is incognito */); } /** @@ -688,7 +689,7 @@ @Override public int getBaseStatusBarColor() { - return isStatusBarDefaultThemeColor() ? Color.WHITE : mBrandColor; + return isStatusBarDefaultThemeColor() ? Color.BLACK : mBrandColor; } @Override
diff --git a/chrome/android/javatests/res/values/ids.xml b/chrome/android/javatests/res/values/ids.xml new file mode 100644 index 0000000..8315189 --- /dev/null +++ b/chrome/android/javatests/res/values/ids.xml
@@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> +<resources> + <!-- Test view ids --> + <item type="id" name="test_view_one" /> + <item type="id" name="test_view_two" /> +</resources>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java index 9c24103..aec07a9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.appmenu; import android.support.test.filters.SmallTest; -import android.view.View; import org.junit.Assert; import org.junit.Before; @@ -13,15 +12,12 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.ObservableSupplier; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.RetryOnFailure; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; -import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -39,32 +35,8 @@ public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = new ChromeActivityTestRule<>(ChromeActivity.class); - private AppMenuHandlerForTest mAppMenuHandler; private TestDataReductionProxySettings mSettings; - /** - * AppMenuHandlerImpl that will be used to intercept the delegate for testing. - */ - public static class AppMenuHandlerForTest extends AppMenuHandlerImpl { - AppMenuPropertiesDelegate mDelegate; - - /** - * AppMenuHandlerImpl for intercepting options item selections. - */ - public AppMenuHandlerForTest(AppMenuPropertiesDelegate delegate, - AppMenuDelegate appMenuDelegate, int menuResourceId, View decorView, - ActivityLifecycleDispatcher activityLifecycleDispatcher, - ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { - super(delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher, - overviewModeBehaviorSupplier); - mDelegate = delegate; - } - - public AppMenuPropertiesDelegate getDelegate() { - return mDelegate; - } - } - private static class TestDataReductionProxySettings extends DataReductionProxySettings { private long mContentLengthSavedInHistorySummary; @@ -84,15 +56,6 @@ @Before public void setUp() throws Exception { - AppMenuCoordinatorImpl.setAppMenuHandlerFactoryForTesting( - (delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher, - overviewModeBehaviorSupplier) -> { - mAppMenuHandler = new AppMenuHandlerForTest(delegate, appMenuDelegate, - menuResourceId, decorView, activityLifecycleDispatcher, - overviewModeBehaviorSupplier); - return mAppMenuHandler; - }); - mActivityTestRule.startMainActivityOnBlankPage(); mSettings = new TestDataReductionProxySettings(); @@ -109,28 +72,33 @@ public void testMenuDataSaver() throws Throwable { mActivityTestRule.runOnUiThread((Runnable) () -> { // Data Saver hasn't been turned on, the footer shouldn't show. - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + Assert.assertEquals(0, getFooterResourceId()); // Turn Data Saver on, the footer should not show since the user hasn't saved any bytes // yet. DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( mActivityTestRule.getActivity().getApplicationContext(), true); - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + Assert.assertEquals(0, getFooterResourceId()); // The user has only saved 50KB so far. Ensure footer is not shown since it is not above // the threshold yet. mSettings.setContentLengthSavedInHistorySummary(50 * 1024); - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + Assert.assertEquals(0, getFooterResourceId()); // The user has now saved 100KB. Ensure the footer is shown. mSettings.setContentLengthSavedInHistorySummary(100 * 1024); - Assert.assertEquals(R.layout.data_reduction_main_menu_item, - mAppMenuHandler.getDelegate().getFooterResourceId()); + Assert.assertEquals(R.layout.data_reduction_main_menu_item, getFooterResourceId()); // Ensure the footer is removed if the proxy is turned off. DataReductionProxySettings.getInstance().setDataReductionProxyEnabled( mActivityTestRule.getActivity().getApplicationContext(), false); - Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId()); + Assert.assertEquals(0, getFooterResourceId()); }); } + + private int getFooterResourceId() { + return AppMenuTestSupport + .getAppMenuPropertiesDelegate(mActivityTestRule.getAppMenuCoordinator()) + .getFooterResourceId(); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java similarity index 80% rename from chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java index 948d219..767cf5b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/TabbedAppMenuTest.java
@@ -18,7 +18,7 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.ObservableSupplier; +import org.chromium.base.Callback; import org.chromium.base.task.PostTask; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; @@ -31,7 +31,6 @@ import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; -import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; @@ -49,62 +48,32 @@ @RunWith(ChromeJUnit4ClassRunner.class) @RetryOnFailure @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class AppMenuTest { +public class TabbedAppMenuTest { @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); private static final String TEST_URL = UrlUtils.encodeHtmlDataUri("<html>foo</html>"); - private AppMenu mAppMenu; - private AppMenuHandlerImpl mAppMenuHandler; + private AppMenuHandler mAppMenuHandler; - /** - * AppMenuHandlerImpl that will be used to intercept item selections for testing. - */ - public static class AppMenuHandlerForTest extends AppMenuHandlerImpl { - int mLastSelectedItemId = -1; - - /** - * AppMenuHandlerImpl for intercepting options item selections. - */ - public AppMenuHandlerForTest(AppMenuPropertiesDelegate delegate, - AppMenuDelegate appMenuDelegate, int menuResourceId, View decorView, - ActivityLifecycleDispatcher activityLifecycleDispatcher, - ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) { - super(delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher, - overviewModeBehaviorSupplier); - } - - @Override - public void onOptionsItemSelected(MenuItem item) { - mLastSelectedItemId = item.getItemId(); - } - } + int mLastSelectedItemId = -1; + private Callback<MenuItem> mItemSelectedCallback = + (item) -> mLastSelectedItemId = item.getItemId(); @Before public void setUp() { // We need list selection; ensure we are not in touch mode. InstrumentationRegistry.getInstrumentation().setInTouchMode(false); - AppMenuCoordinatorImpl.setAppMenuHandlerFactoryForTesting( - (delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher, - overviewModeBehaviorSupplier) -> { - mAppMenuHandler = new AppMenuHandlerForTest(delegate, appMenuDelegate, - menuResourceId, decorView, activityLifecycleDispatcher, - overviewModeBehaviorSupplier); - return mAppMenuHandler; - }); - mActivityTestRule.startMainActivityWithURL(TEST_URL); + AppMenuTestSupport.overrideOnOptionItemSelectedListener( + mActivityTestRule.getAppMenuCoordinator(), mItemSelectedCallback); + mAppMenuHandler = mActivityTestRule.getAppMenuCoordinator().getAppMenuHandler(); + showAppMenuAndAssertMenuShown(); - mAppMenu = ((AppMenuCoordinatorImpl) mActivityTestRule.getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting()) - .getAppMenuHandlerImplForTesting() - .getAppMenu(); - PostTask.runOrPostTask( - UiThreadTaskTraits.DEFAULT, () -> mAppMenu.getListView().setSelection(0)); + + PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> getListView().setSelection(0)); CriteriaHelper.pollInstrumentationThread(Criteria.equals(0, () -> getCurrentFocusedRow())); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } @@ -247,7 +216,7 @@ }; // App menu is shown during setup. - Assert.assertTrue("App menu should be showing.", mAppMenu.isShowing()); + Assert.assertTrue("App menu should be showing.", mAppMenuHandler.isAppMenuShowing()); Assert.assertFalse("Overview shouldn't be showing.", mActivityTestRule.getActivity().getOverviewModeBehavior().overviewVisible()); @@ -260,10 +229,11 @@ Assert.assertTrue("Overview should be showing.", mActivityTestRule.getActivity().getOverviewModeBehavior().overviewVisible()); - Assert.assertFalse("App menu shouldn't be showing.", mAppMenu.isShowing()); + Assert.assertFalse("App menu shouldn't be showing.", mAppMenuHandler.isAppMenuShowing()); TestThreadUtils.runOnUiThreadBlocking(() -> { - Assert.assertTrue( - "App menu should be allowed to show.", mAppMenuHandler.shouldShowAppMenu()); + Assert.assertTrue("App menu should be allowed to show.", + AppMenuTestSupport.shouldShowAppMenu( + mActivityTestRule.getAppMenuCoordinator())); }); showAppMenuAndAssertMenuShown(); @@ -271,12 +241,14 @@ () -> mActivityTestRule.getActivity().getLayoutManager().hideOverview(false)); Assert.assertFalse("Overview shouldn't be showing.", mActivityTestRule.getActivity().getOverviewModeBehavior().overviewVisible()); - Assert.assertFalse("App menu shouldn't be showing.", mAppMenu.isShowing()); + Assert.assertFalse("App menu shouldn't be showing.", mAppMenuHandler.isAppMenuShowing()); } private void showAppMenuAndAssertMenuShown() { PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, - () -> { mAppMenuHandler.showAppMenu(null, false, false); }); + () + -> AppMenuTestSupport.showAppMenu( + mActivityTestRule.getAppMenuCoordinator(), null, false, false)); CriteriaHelper.pollInstrumentationThread(new Criteria("AppMenu did not show") { @Override public boolean isSatisfied() { @@ -310,16 +282,16 @@ // Try moving past it by one. if (movePast) { pressKey(towardsTop ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN); - CriteriaHelper.pollInstrumentationThread(Criteria.equals(end, - () -> getCurrentFocusedRow())); + CriteriaHelper.pollInstrumentationThread( + Criteria.equals(end, () -> getCurrentFocusedRow())); } // The menu should stay open. - Assert.assertTrue(mAppMenu.isShowing()); + Assert.assertTrue(mAppMenuHandler.isAppMenuShowing()); } private void pressKey(final int keycode) { - final View view = mAppMenu.getListView(); + final View view = getListView(); PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode)); view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode)); @@ -328,14 +300,18 @@ } private int getCurrentFocusedRow() { - ListView listView = mAppMenu.getListView(); + ListView listView = getListView(); if (listView == null) return ListView.INVALID_POSITION; return listView.getSelectedItemPosition(); } private int getCount() { - ListView listView = mAppMenu.getListView(); + ListView listView = getListView(); if (listView == null) return 0; return listView.getCount(); } + + private ListView getListView() { + return AppMenuTestSupport.getListView(mActivityTestRule.getAppMenuCoordinator()); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index 0eb2ed8..9a68e17 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -1790,9 +1790,7 @@ Criteria.equals(isVisible, new Callable<Boolean>() { @Override public Boolean call() { - return mActivityTestRule.getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting() + return mActivityTestRule.getAppMenuCoordinator() .getAppMenuHandler() .isAppMenuShowing(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java index 064fe2e..ca5d794 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -239,9 +239,7 @@ // first, otherwise the UI is manipulated on a non-UI thread. TestThreadUtils.runOnUiThreadBlocking(() -> { if (getActivity() == null) return; - AppMenuCoordinator coordinator = getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting(); + AppMenuCoordinator coordinator = mCustomTabActivityTestRule.getAppMenuCoordinator(); // CCT doesn't always have a menu (ex. in the media viewer). if (coordinator == null) return; AppMenuHandler handler = coordinator.getAppMenuHandler(); @@ -611,9 +609,7 @@ PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { getActivity().onMenuOrKeyboardAction(R.id.show_menu, false); - Assert.assertNull(getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting()); + Assert.assertNull(mCustomTabActivityTestRule.getAppMenuCoordinator()); }); } @@ -733,13 +729,13 @@ openAppMenuAndAssertMenuShown(); PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { - MenuItem item = ((CustomTabAppMenuPropertiesDelegate) getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting() - .getAppMenuPropertiesDelegate()) + MenuItem item = ((CustomTabAppMenuPropertiesDelegate) + AppMenuTestSupport.getAppMenuPropertiesDelegate( + mCustomTabActivityTestRule.getAppMenuCoordinator())) .getMenuItemForTitle(TEST_MENU_TITLE); Assert.assertNotNull(item); - AppMenuTestSupport.onOptionsItemSelected(getActivity(), item); + AppMenuTestSupport.onOptionsItemSelected( + mCustomTabActivityTestRule.getAppMenuCoordinator(), item); }); onFinished.waitForCallback("Pending Intent was not sent."); @@ -786,7 +782,8 @@ openAppMenuAndAssertMenuShown(); PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { MenuItem item = - AppMenuTestSupport.getMenu(getActivity()).findItem(R.id.open_in_browser_id); + AppMenuTestSupport.getMenu(mCustomTabActivityTestRule.getAppMenuCoordinator()) + .findItem(R.id.open_in_browser_id); Assert.assertNotNull(item); getActivity().onMenuOrKeyboardAction(R.id.open_in_browser_id, false); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java index bc35c36..c2e79af 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
@@ -5,15 +5,12 @@ package org.chromium.chrome.browser.download.ui; import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNull; import android.os.Handler; import android.os.Looper; import org.chromium.base.Callback; import org.chromium.base.test.util.CallbackHelper; -import org.chromium.chrome.browser.download.DownloadItem; -import org.chromium.chrome.browser.download.DownloadManagerService.DownloadObserver; import org.chromium.components.offline_items_collection.ContentId; import org.chromium.components.offline_items_collection.LaunchLocation; import org.chromium.components.offline_items_collection.LegacyHelpers; @@ -27,80 +24,10 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.List; import java.util.Locale; /** Stubs out backends used by the Download Home UI. */ -public class StubbedProvider implements BackendProvider { - - /** Stubs out the DownloadManagerService. */ - public class StubbedDownloadDelegate implements DownloadDelegate { - public final CallbackHelper addCallback = new CallbackHelper(); - public final CallbackHelper removeCallback = new CallbackHelper(); - public final CallbackHelper checkExternalCallback = new CallbackHelper(); - public final CallbackHelper removeDownloadCallback = new CallbackHelper(); - - public final List<DownloadItem> regularItems = new ArrayList<>(); - public final List<DownloadItem> offTheRecordItems = new ArrayList<>(); - private DownloadObserver mObserver; - - @Override - public void addDownloadObserver(DownloadObserver observer) { - addCallback.notifyCalled(); - assertNull(mObserver); - mObserver = observer; - } - - @Override - public void removeDownloadObserver(DownloadObserver observer) { - removeCallback.notifyCalled(); - mObserver = null; - } - - @Override - public void getAllDownloads(final boolean isOffTheRecord) { - mHandler.post(new Runnable() { - @Override - public void run() { - mObserver.onAllDownloadsRetrieved( - isOffTheRecord ? offTheRecordItems : regularItems, isOffTheRecord); - } - }); - } - - @Override - public void broadcastDownloadAction(DownloadItem downloadItem, String action) {} - - @Override - public void checkForExternallyRemovedDownloads(boolean isOffTheRecord) { - checkExternalCallback.notifyCalled(); - } - - @Override - public void removeDownload( - final String guid, final boolean isOffTheRecord, boolean externallyRemoved) { - mHandler.post(new Runnable() { - @Override - public void run() { - mObserver.onDownloadItemRemoved(guid, isOffTheRecord); - removeDownloadCallback.notifyCalled(); - } - }); - } - - @Override - public boolean isDownloadOpenableInBrowser(boolean isOffTheRecord, String mimeType) { - return false; - } - - @Override - public void updateLastAccessTime(String downloadGuid, boolean isOffTheRecord) {} - - @Override - public void renameDownload(ContentId id, String name, - Callback<Integer /*RenameResult*/> callback, boolean isOffTheRecord) {} - } - +public class StubbedProvider { /** Stubs out the OfflineContentProvider. */ public class StubbedOfflineContentProvider implements OfflineContentProvider { public final CallbackHelper addCallback = new CallbackHelper(); @@ -180,12 +107,10 @@ private static final long ONE_GIGABYTE = 1024L * 1024L * 1024L; private final Handler mHandler; - private final StubbedDownloadDelegate mDownloadDelegate; private final StubbedOfflineContentProvider mOfflineContentProvider; public StubbedProvider() { mHandler = new Handler(Looper.getMainLooper()); - mDownloadDelegate = new StubbedDownloadDelegate(); mOfflineContentProvider = new StubbedOfflineContentProvider(); } @@ -235,5 +160,4 @@ private static long dateToEpoch(String dateStr) throws Exception { return new SimpleDateFormat("yyyyMMdd HH:mm", Locale.getDefault()).parse(dateStr).getTime(); } - }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java index b09ecb0e..986ebc8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java
@@ -32,6 +32,7 @@ import org.chromium.chrome.browser.night_mode.NightModeTestUtils; import org.chromium.chrome.browser.night_mode.NightModeTestUtils.NightModeParams; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; +import org.chromium.chrome.test.R; import org.chromium.chrome.test.ui.DummyUiActivityTestCase; import org.chromium.chrome.test.util.RenderTestRule; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -100,9 +101,9 @@ mCustomScrollView = new ScrollView(activity); mCustomTextView1 = new TextView(activity); - mCustomTextView1.setId(org.chromium.chrome.R.id.button_one); + mCustomTextView1.setId(R.id.test_view_one); mCustomTextView2 = new TextView(activity); - mCustomTextView2.setId(org.chromium.chrome.R.id.button_two); + mCustomTextView2.setId(R.id.test_view_two); }); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java index 73cc44b..a83846c8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java
@@ -34,8 +34,8 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.R; import org.chromium.chrome.test.ui.DummyUiActivityTestCase; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -75,9 +75,9 @@ mContentView.addView(mModalDialogView, MATCH_PARENT, WRAP_CONTENT); mCustomTextView1 = new TextView(activity); - mCustomTextView1.setId(R.id.button_one); + mCustomTextView1.setId(R.id.test_view_one); mCustomTextView2 = new TextView(activity); - mCustomTextView2.setId(R.id.button_two); + mCustomTextView2.setId(R.id.test_view_two); }); } @@ -204,21 +204,21 @@ PropertyModel model = createModel( mModelBuilder.with(ModalDialogProperties.CUSTOM_VIEW, mCustomTextView1)); onView(withId(R.id.custom)) - .check(matches(allOf(isDisplayed(), withChild(withId(R.id.button_one))))); + .check(matches(allOf(isDisplayed(), withChild(withId(R.id.test_view_one))))); // Change custom view. TestThreadUtils.runOnUiThreadBlocking( () -> model.set(ModalDialogProperties.CUSTOM_VIEW, mCustomTextView2)); onView(withId(R.id.custom)) - .check(matches(allOf(isDisplayed(), not(withChild(withId(R.id.button_one))), - withChild(withId(R.id.button_two))))); + .check(matches(allOf(isDisplayed(), not(withChild(withId(R.id.test_view_one))), + withChild(withId(R.id.test_view_two))))); // Set custom view to null. TestThreadUtils.runOnUiThreadBlocking( () -> model.set(ModalDialogProperties.CUSTOM_VIEW, null)); onView(withId(R.id.custom)) - .check(matches(allOf(not(isDisplayed()), not(withChild(withId(R.id.button_one))), - not(withChild(withId(R.id.button_two)))))); + .check(matches(allOf(not(isDisplayed()), not(withChild(withId(R.id.test_view_one))), + not(withChild(withId(R.id.test_view_two)))))); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java index 12b50c3..9389383 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
@@ -222,7 +222,8 @@ private void showAppMenuAndAssertMenuShown() { PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { - AppMenuTestSupport.showAppMenu(mActivityTestRule.getActivity(), null, false, false); + AppMenuTestSupport.showAppMenu( + mActivityTestRule.getAppMenuCoordinator(), null, false, false); }); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override @@ -238,18 +239,12 @@ private void hideAppMenuAndAssertMenuShown() { PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { - mActivityTestRule.getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting() - .getAppMenuHandler() - .hideAppMenu(); + mActivityTestRule.getAppMenuCoordinator().getAppMenuHandler().hideAppMenu(); }); CriteriaHelper.pollInstrumentationThread(new Criteria() { @Override public boolean isSatisfied() { - return !mActivityTestRule.getActivity() - .getRootUiCoordinatorForTesting() - .getAppMenuCoordinatorForTesting() + return !mActivityTestRule.getAppMenuCoordinator() .getAppMenuHandler() .isAppMenuShowing(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java index d931786..16fc9bef 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
@@ -86,7 +86,7 @@ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; Assert.assertEquals( - Color.WHITE, mActivityTestRule.getActivity().getWindow().getStatusBarColor()); + Color.BLACK, mActivityTestRule.getActivity().getWindow().getStatusBarColor()); } @Test
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java index bce6ea0..35e79f0 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java
@@ -29,7 +29,7 @@ private static final int MINIMUM_REQUIRED_INTENT_HELPER_VERSION = 2; // Lowest version of Chromium which supports ShellAPK showing the splash screen. - public static final int MINIMUM_REQUIRED_CHROMIUM_VERSION_NEW_SPLASH = 78; + public static final int MINIMUM_REQUIRED_CHROMIUM_VERSION_NEW_SPLASH = 77; private static final String VERSION_NAME_DEVELOPER_BUILD = "Developer Build";
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java index bcc1996..4f2244c 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java
@@ -44,6 +44,9 @@ public class WebApkUtils { private static final String TAG = "cr_WebApkUtils"; + /** Percentage to darken a color by when setting the status bar color. */ + private static final float DARKEN_COLOR_FRACTION = 0.6f; + private static final float CONTRAST_LIGHT_ITEM_THRESHOLD = 3f; /** Returns whether the application is installed and enabled. */ @@ -202,6 +205,28 @@ } /** + * Darkens the given color to use on the status bar. + * @param color Color which should be darkened. + * @return Color that should be used for Android status bar. + */ + public static int getDarkenedColorForStatusBar(int color) { + return getDarkenedColor(color, DARKEN_COLOR_FRACTION); + } + + /** + * Darken a color to a fraction of its current brightness. + * @param color The input color. + * @param darkenFraction The fraction of the current brightness the color should be. + * @return The new darkened color. + */ + public static int getDarkenedColor(int color, float darkenFraction) { + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + hsv[2] *= darkenFraction; + return Color.HSVToColor(hsv); + } + + /** * Check whether lighter or darker foreground elements (i.e. text, drawables etc.) * should be used depending on the given background color. * @param backgroundColor The background color value which is being queried. @@ -233,25 +258,6 @@ } /** - * Sets the status bar icons to dark or light. Note that this is only valid for - * Android M+. - * - * @param rootView The root view used to request updates to the system UI theming. - * @param useDarkIcons Whether the status bar icons should be dark. - */ - public static void setStatusBarIconColor(View rootView, boolean useDarkIcons) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return; - - int systemUiVisibility = rootView.getSystemUiVisibility(); - if (useDarkIcons) { - systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - } else { - systemUiVisibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - } - rootView.setSystemUiVisibility(systemUiVisibility); - } - - /** * @see android.view.Window#setStatusBarColor(int color). */ public static void setStatusBarColor(Window window, int statusBarColor) {
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java index 72c447f..701e4f1 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -150,7 +150,10 @@ private void showSplashScreen() { Bundle metadata = WebApkUtils.readMetaData(this); - updateStatusBar(metadata); + int themeColor = (int) WebApkMetaDataUtils.getLongFromMetaData( + metadata, WebApkMetaDataKeys.THEME_COLOR, Color.BLACK); + WebApkUtils.setStatusBarColor( + getWindow(), WebApkUtils.getDarkenedColorForStatusBar(themeColor)); int orientation = WebApkUtils.computeScreenLockOrientationFromMetaData(this, metadata); if (orientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { @@ -172,19 +175,6 @@ setContentView(mSplashView); } - /** - * Sets the the color of the status bar and status bar icons. - */ - private void updateStatusBar(Bundle metadata) { - int statusBarColor = (int) WebApkMetaDataUtils.getLongFromMetaData( - metadata, WebApkMetaDataKeys.THEME_COLOR, Color.WHITE); - WebApkUtils.setStatusBarColor(getWindow(), statusBarColor); - boolean needsDarkStatusBarIcons = - !WebApkUtils.shouldUseLightForegroundOnBackground(statusBarColor); - WebApkUtils.setStatusBarIconColor( - getWindow().getDecorView().getRootView(), needsDarkStatusBarIcons); - } - /** Called once the host browser has been selected. */ private void onHostBrowserSelected(HostBrowserLauncherParams params) { if (params == null) {
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index fbbadfa..f98664aa 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -6216,6 +6216,30 @@ </message> </if> + <!-- Tab Group Header Context Menu --> + <if expr="not use_titlecase"> + <message name="IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP" desc="The label of the tab group header context menu item for adding a new tab into the current group."> + New tab in group + </message> + <message name="IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP" desc="The label of the tab group header context menu item for ungrouping the current group."> + Ungroup + </message> + <message name="IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP" desc="The label of the tab group header context menu item for closing all tabs in the current group."> + Close group + </message> + </if> + <if expr="use_titlecase"> + <message name="IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP" desc="In Title Case: The label of the tab group header context menu item for adding a new tab into the current group."> + New Tab in Group + </message> + <message name="IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP" desc="In Title Case: The label of the tab group header context menu item for ungrouping the current group."> + Ungroup + </message> + <message name="IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP" desc="In Title Case: The label of the tab group header context menu item for closing all tabs in the current group."> + Close Group + </message> + </if> + <!-- Application window menu --> <if expr="not use_titlecase"> <message name="IDS_APP_MENU_RELOAD" desc="The reload menu in application windows"> @@ -6690,6 +6714,9 @@ <message name="IDS_CONTENT_CONTEXT_SHARING_SHARED_CLIPBOARD_NOTIFICATION_DESCRIPTION" desc="The description of the notification shown when a clipboard was shared."> Copied to your clipboard </message> + <message name="IDS_OMNIBOX_TOOLTIP_SHARED_CLIPBOARD" desc="The tooltip for the shared clipboard omnibox icon."> + Copy to your device + </message> </if> <if expr="use_titlecase"> @@ -6714,6 +6741,9 @@ <message name="IDS_CONTENT_CONTEXT_SHARING_SHARED_CLIPBOARD_NOTIFICATION_DESCRIPTION" desc="In Title Case: The description of the notification shown when a clipboard was shared."> Copied to Your Clipboard </message> + <message name="IDS_OMNIBOX_TOOLTIP_SHARED_CLIPBOARD" desc="The tooltip for the shared clipboard omnibox icon."> + Copy to Your Device + </message> </if>
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP.png.sha1 new file mode 100644 index 0000000..a82d797 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP.png.sha1
@@ -0,0 +1 @@ +d9a476b4b939529db264dc55dc7975c5e822ff01 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP.png.sha1 new file mode 100644 index 0000000..78d21a3 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP.png.sha1
@@ -0,0 +1 @@ +0d53c6f818e10191f4fcec953cfd73104ab78e5f \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP.png.sha1 new file mode 100644 index 0000000..f8c6b36 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP.png.sha1
@@ -0,0 +1 @@ +83d6e76428b3ee7f955e478b59cb305c1927f679 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 5f4cb5b1..180f4f6 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -4029,6 +4029,8 @@ "notifications/screen_lock_notification_blocker.cc", "notifications/screen_lock_notification_blocker.h", "platform_util.cc", + "policy/chrome_browser_cloud_management_controller.cc", + "policy/chrome_browser_cloud_management_controller.h", "policy/chrome_browser_cloud_management_register_watcher.cc", "policy/chrome_browser_cloud_management_register_watcher.h", "policy/cloud/chrome_browser_cloud_management_helper.cc", @@ -4036,8 +4038,6 @@ "policy/cloud/user_policy_signin_service.cc", "policy/cloud/user_policy_signin_service.h", "policy/cloud/user_policy_signin_service_internal.h", - "policy/machine_level_user_cloud_policy_controller.cc", - "policy/machine_level_user_cloud_policy_controller.h", "profiles/avatar_menu.cc", "profiles/avatar_menu.h", "profiles/avatar_menu_actions_desktop.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index b16423b..6c536a18 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1345,15 +1345,15 @@ }; #endif // !OS_ANDROID -// TODO(crbug.com/991082): Remove after proper service worker support for -// back-forward cache is implemented. -const FeatureEntry::FeatureParam kBackForwardCache_ServiceWorkerSupport[] = { - {"service_worker_supported", "true"}, +// TODO(crbug.com/991082,1015377): Remove after proper support for back-forward +// cache is implemented. +const FeatureEntry::FeatureParam kBackForwardCache_ExtendedSupport[] = { + {"experimental extended supported feature set", "true"}, }; const FeatureEntry::FeatureVariation kBackForwardCacheVariations[] = { - {" even for ServiceWorker-controlled pages", - kBackForwardCache_ServiceWorkerSupport, 1, nullptr}, + {"experimental extended supported feature set", + kBackForwardCache_ExtendedSupport, 1, nullptr}, }; #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/android/metrics/BUILD.gn b/chrome/browser/android/metrics/BUILD.gn index 97f500d..8016d2d 100644 --- a/chrome/browser/android/metrics/BUILD.gn +++ b/chrome/browser/android/metrics/BUILD.gn
@@ -5,6 +5,8 @@ if (is_android) { import("//build/config/android/rules.gni") + _jni_java_files = [ "javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java" ] + static_library("ukm_utils_for_test") { testonly = true sources = [ @@ -20,16 +22,31 @@ generate_jni("jni_headers") { testonly = true - sources = [ - "../../../android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java", + sources = _jni_java_files + } + + android_library("ukm_java_test_support") { + testonly = true + java_files = _jni_java_files + deps = [ + "//base:base_java", ] } - android_library("ukm_utils_java") { + android_library("ukm_javatests") { testonly = true - java_files = [ "../../../android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java" ] + java_files = + [ "javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java" ] + deps = [ - "//base:base_java", + ":ukm_java_test_support", + "//base:base_java_test_support", + "//chrome/android:chrome_java", + "//chrome/test/android:chrome_java_test_support", + "//content/public/test/android:content_java_test_support", + "//third_party/android_support_test_runner:rules_java", + "//third_party/android_support_test_runner:runner_java", + "//third_party/junit", ] } }
diff --git a/chrome/browser/android/metrics/javatests/DEPS b/chrome/browser/android/metrics/javatests/DEPS new file mode 100644 index 0000000..90687a27 --- /dev/null +++ b/chrome/browser/android/metrics/javatests/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+chrome/android", +]
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java similarity index 98% rename from chrome/android/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java rename to chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java index 6258d99..8026c3d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java +++ b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.browsing_data.BrowsingDataType; import org.chromium.chrome.browser.browsing_data.TimePeriod; +import org.chromium.chrome.browser.metrics.util.UkmUtilsForTest; import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge; import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge.OnClearBrowsingDataListener; import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java rename to chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java index cfefe7a..1f807ef3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java +++ b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.metrics; +package org.chromium.chrome.browser.metrics.util; /** * Utilities for Android UKM tests. Not to be used outside of testing.
diff --git a/chrome/browser/android/monochrome_entry_point.cc b/chrome/browser/android/monochrome_entry_point.cc index 358b677f4..b3f9aad 100644 --- a/chrome/browser/android/monochrome_entry_point.cc +++ b/chrome/browser/android/monochrome_entry_point.cc
@@ -23,7 +23,7 @@ break; case base::android::PROCESS_WEBLAYER: case base::android::PROCESS_WEBLAYER_CHILD: - return weblayer::OnJNIOnLoadInit("resources.pak"); + return weblayer::OnJNIOnLoadInit(); break; default: NOTREACHED();
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index ad1691d..bb61587 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -44,8 +44,8 @@ #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/mac/mac_startup_profiler.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" @@ -726,7 +726,7 @@ // It is safe to access the default profile here. - (void)applicationDidFinishLaunching:(NSNotification*)notify { if (g_browser_process->browser_policy_connector() - ->machine_level_user_cloud_policy_controller() + ->chrome_browser_cloud_management_controller() ->IsEnterpriseStartupDialogShowing()) { // As Chrome is not ready when the Enterprise startup dialog is being shown. // Store the notification as it will be reposted when the dialog is closed. @@ -1711,7 +1711,7 @@ - (BOOL)isProfileReady { return !g_browser_process->browser_policy_connector() - ->machine_level_user_cloud_policy_controller() + ->chrome_browser_cloud_management_controller() ->IsEnterpriseStartupDialogShowing(); }
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 33d7fec3..b535f33 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -208,7 +208,7 @@ #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) #include "chrome/browser/first_run/upgrade_util.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #endif #if defined(OS_CHROMEOS) @@ -1427,8 +1427,8 @@ #endif #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) - // Initialize the machine level user cloud policy controller after the - // browser process singleton is acquired to remove race conditions where + // Initialize the chrome browser cloud management controller controller after + // the browser process singleton is acquired to remove race conditions where // multiple browser processes start simultaneously. The main // initialization of browser_policy_connector is performed inside // PreMainMessageLoopRun() so that policies can be applied as soon as @@ -1437,16 +1437,16 @@ // Note that this protects against multiple browser process starts in // the same user data dir and not multiple starts across user data dirs. browser_process_->browser_policy_connector() - ->machine_level_user_cloud_policy_controller() + ->chrome_browser_cloud_management_controller() ->Init(browser_process_->local_state(), browser_process_->system_network_context_manager() ->GetSharedURLLoaderFactory()); - // Wait for the machine level user cloud policy enrollment to finish. + // Wait for the chrome browser cloud management enrollment to finish. // If no enrollment is needed, this function returns immediately. // Abort the launch process if the enrollment fails. if (!browser_process_->browser_policy_connector() - ->machine_level_user_cloud_policy_controller() + ->chrome_browser_cloud_management_controller() ->WaitUntilPolicyEnrollmentFinished()) { return chrome::RESULT_CODE_CLOUD_POLICY_ENROLLMENT_FAILED; }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 8171dbb..ed2c43b3 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -299,8 +299,6 @@ #include "media/mojo/buildflags.h" #include "media/webrtc/webrtc_switches.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" @@ -1579,7 +1577,7 @@ #endif } -network::mojom::URLLoaderFactoryPtrInfo +mojo::PendingRemote<network::mojom::URLLoaderFactory> ChromeContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context, @@ -1593,7 +1591,7 @@ header_client, request_initiator, network_isolation_key); #else - return network::mojom::URLLoaderFactoryPtrInfo(); + return mojo::NullRemote(); #endif } @@ -4762,7 +4760,7 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) { + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) { #if BUILDFLAG(ENABLE_EXTENSIONS) // External protocols are disabled for guests. An exception is made for the // "mailto" protocol, so that pages that utilize it work properly in a
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index b80edc76..af0c061b 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -27,6 +27,7 @@ #include "extensions/buildflags/buildflags.h" #include "media/media_buildflags.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "ppapi/buildflags/buildflags.h" #include "services/network/public/mojom/network_context.mojom-forward.h" #include "services/service_manager/public/cpp/binder_registry.h" @@ -152,7 +153,7 @@ const char* GetInitiatorSchemeBypassingDocumentBlocking() override; bool ShouldTreatURLSchemeAsFirstPartyWhenTopLevel( base::StringPiece scheme) override; - network::mojom::URLLoaderFactoryPtrInfo + mojo::PendingRemote<network::mojom::URLLoaderFactory> CreateURLLoaderFactoryForNetworkRequests( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context, @@ -551,7 +552,8 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) override; + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) + override; std::unique_ptr<content::OverlayWindow> CreateWindowForPictureInPicture( content::PictureInPictureWindowController* controller) override; void RegisterRendererPreferenceWatcher(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 3bba2e6..de048af 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1486,6 +1486,8 @@ "login/ui/login_screen_extension_ui/login_screen_extension_ui_window.h", "login/ui/login_web_dialog.cc", "login/ui/login_web_dialog.h", + "login/ui/oobe_dialog_size_utils.cc", + "login/ui/oobe_dialog_size_utils.h", "login/ui/oobe_ui_dialog_delegate.cc", "login/ui/oobe_ui_dialog_delegate.h", "login/ui/simple_web_view_dialog.cc", @@ -2695,6 +2697,7 @@ "login/supervised/supervised_user_authentication_unittest.cc", "login/ui/login_screen_extension_ui/login_screen_extension_ui_dialog_delegate_unittest.cc", "login/ui/login_screen_extension_ui/login_screen_extension_ui_web_dialog_view_unittest.cc", + "login/ui/oobe_dialog_size_utils_unittest.cc", "login/users/affiliation_unittest.cc", "login/users/multi_profile_user_controller_unittest.cc", "login/users/user_manager_unittest.cc",
diff --git a/chrome/browser/chromeos/device_sync/device_sync_client_factory.cc b/chrome/browser/chromeos/device_sync/device_sync_client_factory.cc index 8d8f76b..f40f9774 100644 --- a/chrome/browser/chromeos/device_sync/device_sync_client_factory.cc +++ b/chrome/browser/chromeos/device_sync/device_sync_client_factory.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/chromeos/device_sync/device_sync_client_factory.h" #include "base/macros.h" -#include "base/timer/timer.h" #include "chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service.h" #include "chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service_factory.h" #include "chrome/browser/chromeos/cryptauth/gcm_device_info_provider_impl.h" @@ -13,7 +12,9 @@ #include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chromeos/services/device_sync/device_sync_impl.h" +#include "chrome/common/pref_names.h" +#include "chromeos/constants/chromeos_features.h" +#include "chromeos/services/device_sync/device_sync_service.h" #include "chromeos/services/device_sync/public/cpp/device_sync_client.h" #include "chromeos/services/device_sync/public/cpp/device_sync_client_impl.h" #include "chromeos/services/multidevice_setup/public/cpp/prefs.h" @@ -21,7 +22,12 @@ #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/browser_context.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/preferences/public/mojom/preferences.mojom.h" +#include "services/service_manager/public/cpp/connector.h" namespace chromeos { @@ -37,14 +43,24 @@ Profile::FromBrowserContext(context)->GetPrefs()); } -std::unique_ptr<DeviceSyncBase> CreateDeviceSyncImplForProfile( - Profile* profile) { - return DeviceSyncImpl::Factory::Get()->BuildInstance( +std::unique_ptr<DeviceSyncService> CreateServiceInstanceForProfile( + Profile* profile, + mojo::Remote<chromeos::device_sync::mojom::DeviceSyncService>* remote) { + mojo::Remote<chromeos::device_sync::mojom::DeviceSyncServiceInitializer> + initializer; + auto service = std::make_unique<DeviceSyncService>( IdentityManagerFactory::GetForProfile(profile), gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(), - profile->GetPrefs(), chromeos::GcmDeviceInfoProviderImpl::GetInstance(), + chromeos::GcmDeviceInfoProviderImpl::GetInstance(), chromeos::ClientAppMetadataProviderServiceFactory::GetForProfile(profile), - profile->GetURLLoaderFactory(), std::make_unique<base::OneShotTimer>()); + profile->GetURLLoaderFactory(), initializer.BindNewPipeAndPassReceiver()); + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector; + content::BrowserContext::GetConnectorFor(profile)->Connect( + prefs::mojom::kServiceName, + pref_store_connector.InitWithNewPipeAndPassReceiver()); + initializer->Initialize(remote->BindNewPipeAndPassReceiver(), + std::move(pref_store_connector)); + return service; } } // namespace @@ -53,29 +69,27 @@ class DeviceSyncClientHolder : public KeyedService { public: explicit DeviceSyncClientHolder(content::BrowserContext* context) - : device_sync_(CreateDeviceSyncImplForProfile( - Profile::FromBrowserContext(context))), - device_sync_client_( - DeviceSyncClientImpl::Factory::Get()->BuildInstance()) { - // Connect the client's mojo interface pointer to the implementation. - device_sync_->BindRequest( - mojo::MakeRequest(device_sync_client_->GetDeviceSyncPtr())); - // Finish client initialization. - device_sync_client_->Initialize(base::ThreadTaskRunnerHandle::Get()); - } + : service_(CreateServiceInstanceForProfile( + Profile::FromBrowserContext(context), + &remote_service_)), + device_sync_client_(DeviceSyncClientImpl::Factory::Get()->BuildInstance( + remote_service_.get())) {} - DeviceSyncBase* device_sync() { return device_sync_.get(); } DeviceSyncClient* device_sync_client() { return device_sync_client_.get(); } private: // KeyedService: void Shutdown() override { device_sync_client_.reset(); - device_sync_->CloseAllBindings(); - device_sync_.reset(); + service_.reset(); } - std::unique_ptr<DeviceSyncBase> device_sync_; + mojo::Remote<chromeos::device_sync::mojom::DeviceSyncService> remote_service_; + + // The in-process service instance. Never exposed publicly except through the + // DeviceSyncClient, which is isolated from the service by Mojo interfaces. + std::unique_ptr<chromeos::device_sync::DeviceSyncService> service_; + std::unique_ptr<DeviceSyncClient> device_sync_client_; DISALLOW_COPY_AND_ASSIGN(DeviceSyncClientHolder); @@ -104,15 +118,6 @@ return base::Singleton<DeviceSyncClientFactory>::get(); } -// static -void DeviceSyncClientFactory::OnProfileInitialized(Profile* profile) { - DeviceSyncClientHolder* holder = static_cast<DeviceSyncClientHolder*>( - GetInstance()->GetServiceForBrowserContext(profile, true)); - - if (holder) - holder->device_sync()->OnProfileInitialized(); -} - KeyedService* DeviceSyncClientFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { // TODO(crbug.com/848347): Check prohibited by policy in services that depend
diff --git a/chrome/browser/chromeos/device_sync/device_sync_client_factory.h b/chrome/browser/chromeos/device_sync/device_sync_client_factory.h index 73d08b274..2328827 100644 --- a/chrome/browser/chromeos/device_sync/device_sync_client_factory.h +++ b/chrome/browser/chromeos/device_sync/device_sync_client_factory.h
@@ -24,9 +24,6 @@ static DeviceSyncClientFactory* GetInstance(); - // Notifies the DeviceSync subsystem that the profile is ready. - static void OnProfileInitialized(Profile* profile); - private: friend struct base::DefaultSingletonTraits<DeviceSyncClientFactory>;
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index ed37caa..7a71ce6 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -8,7 +8,10 @@ #include <sstream> #include <utility> +#include "ash/public/cpp/app_types.h" #include "ash/public/cpp/ash_pref_names.h" +#include "ash/public/cpp/autotest_private_api_utils.h" +#include "ash/public/cpp/desks_helper.h" #include "ash/public/cpp/login_screen.h" #include "ash/public/cpp/overview_test_api.h" #include "ash/public/cpp/shelf_item.h" @@ -100,6 +103,7 @@ #include "mojo/public/cpp/bindings/associated_binding.h" #include "mojo/public/cpp/bindings/receiver.h" #include "net/base/filename_util.h" +#include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" #include "ui/base/clipboard/clipboard.h" @@ -112,6 +116,8 @@ #include "ui/message_center/notification_list.h" #include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/public/cpp/notification_types.h" +#include "ui/views/widget/widget.h" +#include "ui/wm/core/window_util.h" namespace extensions { namespace { @@ -260,6 +266,26 @@ return api::autotest_private::AppType::APP_TYPE_NONE; } +api::autotest_private::AppWindowType GetAppWindowType(ash::AppType type) { + switch (type) { + case ash::AppType::ARC_APP: + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_ARCAPP; + case ash::AppType::SYSTEM_APP: + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_SYSTEMAPP; + case ash::AppType::CROSTINI_APP: + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_CROSTINIAPP; + case ash::AppType::CHROME_APP: + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_EXTENSIONAPP; + case ash::AppType::BROWSER: + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_BROWSER; + case ash::AppType::NON_APP: + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_NONE; + // TODO(oshima): Investigate if we want to have "extension" type. + } + NOTREACHED(); + return api::autotest_private::AppWindowType::APP_WINDOW_TYPE_NONE; +} + api::autotest_private::AppReadiness GetAppReadiness( apps::mojom::Readiness readiness) { switch (readiness) { @@ -435,8 +461,64 @@ return display::Display::ROTATE_0; } +api::autotest_private::Bounds ToBoundsDictionary(const gfx::Rect& bounds) { + api::autotest_private::Bounds result; + result.left = bounds.x(); + result.top = bounds.y(); + result.width = bounds.width(); + result.height = bounds.height(); + return result; +} + +aura::Window* FindAppWindowById(const int64_t id) { + auto list = ash::GetAppWindowList(); + auto iter = + std::find_if(list.begin(), list.end(), + [id](aura::Window* window) { return window->id() == id; }); + if (iter == list.end()) + return nullptr; + return *iter; +} + } // namespace +class WindowStateChangeObserver : public aura::WindowObserver { + public: + WindowStateChangeObserver(aura::Window* window, + ash::WindowStateType expected_type, + base::OnceCallback<void(bool)> callback) + : expected_type_(expected_type), callback_(std::move(callback)) { + DCHECK_NE(window->GetProperty(ash::kWindowStateTypeKey), expected_type_); + scoped_observer_.Add(window); + } + ~WindowStateChangeObserver() override {} + + // aura::WindowObserver: + void OnWindowPropertyChanged(aura::Window* window, + const void* key, + intptr_t old) override { + DCHECK(scoped_observer_.IsObserving(window)); + if (key == ash::kWindowStateTypeKey && + window->GetProperty(ash::kWindowStateTypeKey) == expected_type_) { + scoped_observer_.RemoveAll(); + std::move(callback_).Run(/*success=*/true); + } + } + + void OnWindowDestroying(aura::Window* window) override { + DCHECK(scoped_observer_.IsObserving(window)); + scoped_observer_.RemoveAll(); + std::move(callback_).Run(/*success=*/false); + } + + private: + ash::WindowStateType expected_type_; + ScopedObserver<aura::Window, aura::WindowObserver> scoped_observer_{this}; + base::OnceCallback<void(bool)> callback_; + + DISALLOW_COPY_AND_ASSIGN(WindowStateChangeObserver); +}; + /////////////////////////////////////////////////////////////////////////////// // AutotestPrivateInitializeEventsFunction /////////////////////////////////////////////////////////////////////////////// @@ -1193,7 +1275,7 @@ } /////////////////////////////////////////////////////////////////////////////// -// AutotestPrivateLaunchAppFunction +// AutotestPrivateCloseAppFunction /////////////////////////////////////////////////////////////////////////////// AutotestPrivateCloseAppFunction::~AutotestPrivateCloseAppFunction() = default; @@ -2466,7 +2548,7 @@ aura::Window* arc_window = GetArcAppWindow(params->package_name); if (!arc_window) { return RespondNow(Error(base::StrCat( - {"No ARC app window is found for ", params->package_name}))); + {"No ARC app window was found for ", params->package_name}))); } const gfx::Rect bounds = arc_window->GetBoundsInRootWindow(); @@ -2475,19 +2557,14 @@ const int64_t display_id = !screen ? -1 : screen->GetDisplayNearestWindow(arc_window).id(); - auto bounds_dict = std::make_unique<base::DictionaryValue>(); - bounds_dict->SetInteger("left", bounds.x()); - bounds_dict->SetInteger("top", bounds.y()); - bounds_dict->SetInteger("width", bounds.width()); - bounds_dict->SetInteger("height", bounds.height()); + api::autotest_private::ArcAppWindowInfo result; + result.bounds = ToBoundsDictionary(bounds); + result.display_id = display_id; + result.is_animating = is_animating; + result.is_visible = arc_window->IsVisible(); - auto result = std::make_unique<base::DictionaryValue>(); - result->SetDictionary("bounds", std::move(bounds_dict)); - result->SetString("display_id", base::NumberToString(display_id)); - result->SetBoolean("is_animating", is_animating); - result->SetBoolean("is_visible", arc_window->IsVisible()); - - return RespondNow(OneArgument(std::move(result))); + return RespondNow(OneArgument( + api::autotest_private::GetArcAppWindowInfo::Results::Create(result))); } /////////////////////////////////////////////////////////////////////////////// @@ -2560,44 +2637,6 @@ AutotestPrivateSetArcAppWindowStateFunction:: ~AutotestPrivateSetArcAppWindowStateFunction() = default; -class AutotestPrivateSetArcAppWindowStateFunction::WindowStateChangeObserver - : public aura::WindowObserver { - public: - WindowStateChangeObserver(aura::Window* window, - ash::WindowStateType expected_type, - base::OnceCallback<void(bool)> callback) - : expected_type_(expected_type), callback_(std::move(callback)) { - DCHECK_NE(window->GetProperty(ash::kWindowStateTypeKey), expected_type_); - scoped_observer_.Add(window); - } - ~WindowStateChangeObserver() override {} - - // aura::WindowObserver: - void OnWindowPropertyChanged(aura::Window* window, - const void* key, - intptr_t old) override { - DCHECK(scoped_observer_.IsObserving(window)); - if (key == ash::kWindowStateTypeKey && - window->GetProperty(ash::kWindowStateTypeKey) == expected_type_) { - scoped_observer_.RemoveAll(); - std::move(callback_).Run(/*success=*/true); - } - } - - void OnWindowDestroying(aura::Window* window) override { - DCHECK(scoped_observer_.IsObserving(window)); - scoped_observer_.RemoveAll(); - std::move(callback_).Run(/*success=*/false); - } - - private: - ash::WindowStateType expected_type_; - ScopedObserver<aura::Window, aura::WindowObserver> scoped_observer_{this}; - base::OnceCallback<void(bool)> callback_; - - DISALLOW_COPY_AND_ASSIGN(WindowStateChangeObserver); -}; - ExtensionFunction::ResponseAction AutotestPrivateSetArcAppWindowStateFunction::Run() { std::unique_ptr<api::autotest_private::SetArcAppWindowState::Params> params( @@ -2609,7 +2648,7 @@ aura::Window* arc_window = GetArcAppWindow(params->package_name); if (!arc_window) { return RespondNow(Error(base::StrCat( - {"No ARC app window is found for ", params->package_name}))); + {"No ARC app window was found for ", params->package_name}))); } ash::WindowStateType expected_state = @@ -2654,7 +2693,7 @@ bool success) { if (!success) { Respond(Error( - "ARC app window is destroyed while waiting for its state change! ")); + "ARC app window was destroyed while waiting for its state change! ")); } else { Respond(OneArgument(std::make_unique<base::Value>( api::autotest_private::ToString(ToWindowStateType(expected_type))))); @@ -2681,7 +2720,7 @@ aura::Window* arc_window = GetArcAppWindow(params->package_name); if (!arc_window) { return RespondNow(Error(base::StrCat( - {"No ARC app window is found for ", params->package_name}))); + {"No ARC app window was found for ", params->package_name}))); } return RespondNow(OneArgument(std::make_unique<base::Value>( @@ -2708,7 +2747,7 @@ aura::Window* arc_window = GetArcAppWindow(params->package_name); if (!arc_window) { return RespondNow(Error(base::StrCat( - {"No ARC app window is found for ", params->package_name}))); + {"No ARC app window was found for ", params->package_name}))); } if (!arc_window->CanFocus()) { return RespondNow(Error(base::StrCat( @@ -2799,6 +2838,154 @@ } /////////////////////////////////////////////////////////////////////////////// +// AutotestPrivateGetAppWindowListFunction +/////////////////////////////////////////////////////////////////////////////// + +AutotestPrivateGetAppWindowListFunction:: + AutotestPrivateGetAppWindowListFunction() = default; +AutotestPrivateGetAppWindowListFunction:: + ~AutotestPrivateGetAppWindowListFunction() = default; + +ExtensionFunction::ResponseAction +AutotestPrivateGetAppWindowListFunction::Run() { + // Use nagative number to avoid potential collision with normal use if any. + static int id_count = -10000; + + auto window_list = ash::GetAppWindowList(); + std::vector<api::autotest_private::AppWindowInfo> result_list; + + for (auto* window : window_list) { + if (window->id() == aura::Window::kInitialId) + window->set_id(id_count--); + api::autotest_private::AppWindowInfo window_info; + window_info.id = window->id(); + window_info.name = window->GetName(); + window_info.window_type = GetAppWindowType( + static_cast<ash::AppType>(window->GetProperty(aura::client::kAppType))); + window_info.state_type = + ToWindowStateType(window->GetProperty(ash::kWindowStateTypeKey)); + window_info.bounds_in_root = + ToBoundsDictionary(window->GetBoundsInRootWindow()); + window_info.target_bounds = ToBoundsDictionary(window->GetTargetBounds()); + window_info.display_id = + display::Screen::GetScreen()->GetDisplayNearestWindow(window).id(); + window_info.title = base::UTF16ToUTF8(window->GetTitle()); + window_info.is_animating = window->layer()->GetAnimator()->is_animating(); + window_info.is_visible = window->IsVisible(); + window_info.target_visibility = window->TargetVisibility(); + window_info.can_focus = window->CanFocus(); + window_info.has_focus = window->HasFocus(); + window_info.on_active_desk = + ash::DesksHelper::Get()->BelongsToActiveDesk(window); + window_info.is_active = wm::IsActiveWindow(window); + window_info.has_capture = window->HasCapture(); + + if (window->GetProperty(aura::client::kAppType) == + static_cast<int>(ash::AppType::ARC_APP)) { + window_info.arc_package_name = std::make_unique<std::string>( + *window->GetProperty(ash::kArcPackageNameKey)); + } + result_list.emplace_back(std::move(window_info)); + } + return RespondNow(ArgumentList( + api::autotest_private::GetAppWindowList::Results::Create(result_list))); +} + +/////////////////////////////////////////////////////////////////////////////// +// AutotestPrivateSetAppWindowStateFunction +/////////////////////////////////////////////////////////////////////////////// + +AutotestPrivateSetAppWindowStateFunction:: + AutotestPrivateSetAppWindowStateFunction() = default; +AutotestPrivateSetAppWindowStateFunction:: + ~AutotestPrivateSetAppWindowStateFunction() = default; + +ExtensionFunction::ResponseAction +AutotestPrivateSetAppWindowStateFunction::Run() { + std::unique_ptr<api::autotest_private::SetAppWindowState::Params> params( + api::autotest_private::SetAppWindowState::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params); + DVLOG(1) << "AutotestPrivateSetAppWindowStateFunction " << params->id; + + aura::Window* window = FindAppWindowById(params->id); + if (!window) { + return RespondNow(Error( + base::StringPrintf("No app window was found : id=%d", params->id))); + } + + ash::WindowStateType expected_state = + GetExpectedWindowState(params->change.event_type); + if (window->GetProperty(ash::kWindowStateTypeKey) == expected_state) { + if (params->change.fail_if_no_change && + *(params->change.fail_if_no_change)) { + return RespondNow( + Error("The app window was already in the expected window state! ")); + } else { + return RespondNow(OneArgument(std::make_unique<base::Value>( + api::autotest_private::ToString(ToWindowStateType(expected_state))))); + } + } + + window_state_observer_ = std::make_unique<WindowStateChangeObserver>( + window, expected_state, + base::BindOnce( + &AutotestPrivateSetAppWindowStateFunction::WindowStateChanged, this, + expected_state)); + + // TODO(crbug.com/990713): Make WMEvent trigger split view in tablet mode. + if (ash::TabletMode::Get()->InTabletMode()) { + if (expected_state == ash::WindowStateType::kLeftSnapped) { + ash::SplitViewTestApi().SnapWindow( + window, ash::SplitViewTestApi::SnapPosition::LEFT); + } else if (expected_state == ash::WindowStateType::kRightSnapped) { + ash::SplitViewTestApi().SnapWindow( + window, ash::SplitViewTestApi::SnapPosition::RIGHT); + } + return RespondLater(); + } + + const ash::WMEvent event(ToWMEventType(params->change.event_type)); + ash::WindowState::Get(window)->OnWMEvent(&event); + + return RespondLater(); +} + +void AutotestPrivateSetAppWindowStateFunction::WindowStateChanged( + ash::WindowStateType expected_type, + bool success) { + if (!success) { + Respond(Error( + "The app window was destroyed while waiting for its state change! ")); + } else { + Respond(OneArgument(std::make_unique<base::Value>( + api::autotest_private::ToString(ToWindowStateType(expected_type))))); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// AutotestPrivateCloseAppWindowFunction +/////////////////////////////////////////////////////////////////////////////// + +AutotestPrivateCloseAppWindowFunction:: + ~AutotestPrivateCloseAppWindowFunction() = default; + +ExtensionFunction::ResponseAction AutotestPrivateCloseAppWindowFunction::Run() { + std::unique_ptr<api::autotest_private::CloseAppWindow::Params> params( + api::autotest_private::CloseAppWindow::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params); + DVLOG(1) << "AutotestPrivateCloseAppWindowFunction " << params->id; + + auto* window = FindAppWindowById(params->id); + if (!window) { + return RespondNow(Error( + base::StringPrintf("No app window was found : id=%d", params->id))); + } + auto* widget = views::Widget::GetWidgetForNativeWindow(window); + widget->Close(); + return RespondNow(NoArguments()); +} + +/////////////////////////////////////////////////////////////////////////////// // AutotestPrivateAPI ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h index bb402d8d..b4bd816f 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -33,6 +33,7 @@ namespace extensions { class AssistantInteractionHelper; +class WindowStateChangeObserver; class AutotestPrivateInitializeEventsFunction : public ExtensionFunction { public: @@ -784,8 +785,6 @@ AUTOTESTPRIVATE_SETARCAPPWINDOWSTATE) private: - class WindowStateChangeObserver; - ~AutotestPrivateSetArcAppWindowStateFunction() override; ResponseAction Run() override; @@ -894,6 +893,42 @@ scoped_refptr<ExtensionFunction> self_; }; +class AutotestPrivateGetAppWindowListFunction : public ExtensionFunction { + public: + AutotestPrivateGetAppWindowListFunction(); + DECLARE_EXTENSION_FUNCTION("autotestPrivate.getAppWindowList", + AUTOTESTPRIVATE_GETAPPWINDOWLIST) + + private: + ~AutotestPrivateGetAppWindowListFunction() override; + ResponseAction Run() override; +}; + +class AutotestPrivateSetAppWindowStateFunction : public ExtensionFunction { + public: + AutotestPrivateSetAppWindowStateFunction(); + DECLARE_EXTENSION_FUNCTION("autotestPrivate.setAppWindowState", + AUTOTESTPRIVATE_SETAPPWINDOWSTATE) + + private: + ~AutotestPrivateSetAppWindowStateFunction() override; + ResponseAction Run() override; + + void WindowStateChanged(ash::WindowStateType expected_type, bool success); + + std::unique_ptr<WindowStateChangeObserver> window_state_observer_; +}; + +class AutotestPrivateCloseAppWindowFunction : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("autotestPrivate.closeAppWindow", + AUTOTESTPRIVATE_CLOSEAPPWINDOW) + + private: + ~AutotestPrivateCloseAppWindowFunction() override; + ResponseAction Run() override; +}; + template <> KeyedService* BrowserContextKeyedAPIFactory<AutotestPrivateAPI>::BuildServiceInstanceFor(
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc index ce9d95b..c1feaaf1 100644 --- a/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
@@ -135,7 +135,9 @@ // Test that if there is any Bluetooth device connected on HID screen, the // Bluetooth adapter should not be disabled after advancing to the next screen. -IN_PROC_BROWSER_TEST_F(HIDDetectionScreenTest, BluetoothDeviceConnected) { +// Flaky: https://crbug.com/1014951 +IN_PROC_BROWSER_TEST_F(HIDDetectionScreenTest, + DISABLED_BluetoothDeviceConnected) { OobeScreenWaiter(HIDDetectionView::kScreenId).Wait(); EXPECT_TRUE(adapter()->IsPowered());
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index 327c980..0075785 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -47,7 +47,6 @@ #include "chrome/browser/chromeos/child_accounts/consumer_status_reporting_service_factory.h" #include "chrome/browser/chromeos/child_accounts/screen_time_controller_factory.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" -#include "chrome/browser/chromeos/device_sync/device_sync_client_factory.h" #include "chrome/browser/chromeos/first_run/first_run.h" #include "chrome/browser/chromeos/first_run/goodies_displayer.h" #include "chrome/browser/chromeos/lock_screen_apps/state_controller.h" @@ -1465,9 +1464,6 @@ user_manager::known_user::UpdateGaiaID(user_context.GetAccountId(), gaia_id); } - - // DeviceSync initialization must occur after primary profile is available. - device_sync::DeviceSyncClientFactory::OnProfileInitialized(profile); } }
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc index b9bed168..7f51cfe 100644 --- a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc +++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -117,8 +117,6 @@ void FakeLoginDisplayHost::HideOobeDialog() {} -void FakeLoginDisplayHost::UpdateOobeDialogSize(int width, int height) {} - void FakeLoginDisplayHost::UpdateOobeDialogState(ash::OobeDialogState state) {} const user_manager::UserList FakeLoginDisplayHost::GetUsers() {
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h index 57b22315..a497fa45 100644 --- a/chrome/browser/chromeos/login/ui/fake_login_display_host.h +++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -56,7 +56,6 @@ void ShowGaiaDialog(bool can_close, const AccountId& prefilled_account) override; void HideOobeDialog() override; - void UpdateOobeDialogSize(int width, int height) override; void UpdateOobeDialogState(ash::OobeDialogState state) override; const user_manager::UserList GetUsers() override; void CancelPasswordChangedFlow() override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h index c877021..e8f6a30c 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host.h +++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -139,9 +139,6 @@ // Hide any visible oobe dialog. virtual void HideOobeDialog() = 0; - // Update the size of the oobe dialog. - virtual void UpdateOobeDialogSize(int width, int height) = 0; - // Update the state of the oobe dialog. virtual void UpdateOobeDialogState(ash::OobeDialogState state) = 0;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc index e75c71a..d15a3499d 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -288,11 +288,6 @@ HideDialog(); } -void LoginDisplayHostMojo::UpdateOobeDialogSize(int width, int height) { - if (dialog_) - dialog_->UpdateSizeAndPosition(width, height); -} - void LoginDisplayHostMojo::UpdateOobeDialogState(ash::OobeDialogState state) { if (dialog_) dialog_->SetState(state);
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h index 7cc02dc..f31fc4ea 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -87,7 +87,6 @@ void ShowGaiaDialog(bool can_close, const AccountId& prefilled_account) override; void HideOobeDialog() override; - void UpdateOobeDialogSize(int width, int height) override; void UpdateOobeDialogState(ash::OobeDialogState state) override; const user_manager::UserList GetUsers() override; void OnCancelPasswordChangedFlow() override; @@ -176,7 +175,7 @@ // Called after host deletion. std::vector<base::OnceClosure> completion_callbacks_; - OobeUIDialogDelegate* dialog_ = nullptr; + OobeUIDialogDelegate* dialog_ = nullptr; // Not owned. bool can_close_dialog_ = true; std::unique_ptr<WizardController> wizard_controller_;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc index 489c76c..66a410fa 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -963,10 +963,6 @@ NOTREACHED(); } -void LoginDisplayHostWebUI::UpdateOobeDialogSize(int width, int height) { - NOTREACHED(); -} - void LoginDisplayHostWebUI::UpdateOobeDialogState(ash::OobeDialogState state) { NOTREACHED(); }
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.h b/chrome/browser/chromeos/login/ui/login_display_host_webui.h index 7018f658..b0bc1da 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.h +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
@@ -84,7 +84,6 @@ void ShowGaiaDialog(bool can_close, const AccountId& prefilled_account) override; void HideOobeDialog() override; - void UpdateOobeDialogSize(int width, int height) override; void UpdateOobeDialogState(ash::OobeDialogState state) override; const user_manager::UserList GetUsers() override; void ShowFeedback() override;
diff --git a/chrome/browser/chromeos/login/ui/mock_login_display_host.h b/chrome/browser/chromeos/login/ui/mock_login_display_host.h index 600d983..2edd362c 100644 --- a/chrome/browser/chromeos/login/ui/mock_login_display_host.h +++ b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
@@ -53,7 +53,6 @@ MOCK_METHOD1(StartArcKiosk, void(const AccountId&)); MOCK_METHOD2(ShowGaiaDialog, void(bool, const AccountId&)); MOCK_METHOD0(HideOobeDialog, void()); - MOCK_METHOD2(UpdateOobeDialogSize, void(int, int)); MOCK_METHOD1(UpdateOobeDialogState, void(ash::OobeDialogState state)); MOCK_METHOD0(GetUsers, const user_manager::UserList(void));
diff --git a/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.cc b/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.cc new file mode 100644 index 0000000..33896a4 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.cc
@@ -0,0 +1,41 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h" +#include "ui/gfx/geometry/insets.h" + +namespace chromeos { + +namespace { + +constexpr gfx::Size kMaxDialogSize{768, 768}; +constexpr gfx::Size kMinDialogSize{464, 464}; +constexpr gfx::Insets kMinMargins{48, 48}; + +} // namespace + +void CalculateOobeDialogBounds(const gfx::Rect& host_bounds, + int shelf_height, + gfx::Rect* result) { + // Area to position dialog. + gfx::Rect available_area = host_bounds; + available_area.Inset(0, 0, 0, shelf_height); + + // Inset minimum margin on each side of area. + gfx::Rect area_no_margins = available_area; + area_no_margins.Inset(kMinMargins); + + gfx::Size dialog_size = area_no_margins.size(); + dialog_size.SetToMin(kMaxDialogSize); + dialog_size.SetToMax(kMinDialogSize); + + // Still, dialog should fit into available area. + dialog_size.SetToMin(available_area.size()); + + // Center dialog within an available area. + *result = available_area; + result->ClampToCenteredSize(dialog_size); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h b/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h new file mode 100644 index 0000000..5e841da5 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h
@@ -0,0 +1,22 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_UI_OOBE_DIALOG_SIZE_UTILS_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_UI_OOBE_DIALOG_SIZE_UTILS_H_ + +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" + +namespace chromeos { + +// Position OOBE dialog according to specs inside |host_bounds| excluding shelf. +// |host_bounds| is in coordinates of oobe dialog widget. |result| is +// in the same coordinates of |host_bounds|. +void CalculateOobeDialogBounds(const gfx::Rect& host_bounds, + int shelf_height, + gfx::Rect* result); + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_UI_OOBE_DIALOG_SIZE_UTILS_H_
diff --git a/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils_unittest.cc b/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils_unittest.cc new file mode 100644 index 0000000..c12bb68 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/oobe_dialog_size_utils_unittest.cc
@@ -0,0 +1,141 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h" + +#include <stddef.h> + +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" + +namespace chromeos { + +namespace { + +constexpr int kGaiaDialogMaxSize = 768; +constexpr int kGaiaDialogMinMargin = 48; +constexpr int kGaiaDialogMinSize = 464; + +constexpr int kShelfHeight = 56; +constexpr int kVirtualKeyboardHeight = 280; +constexpr int kDockedMagnifierHeight = 235; + +} // namespace + +class OobeDialogSizeUtilsTest : public testing::Test { + public: + OobeDialogSizeUtilsTest() = default; + + ~OobeDialogSizeUtilsTest() override = default; + + void ValidateDialog(const gfx::Rect& area, const gfx::Rect& dialog) { + // Dialog should fully fit into the area. + EXPECT_TRUE(area.Contains(dialog)); + + EXPECT_GE(dialog.x(), area.x()); + EXPECT_LE(dialog.right(), area.right()); + EXPECT_GE(dialog.y(), area.y()); + EXPECT_LE(dialog.bottom(), area.bottom()); + + // Dialog is centered in area. + EXPECT_EQ(area.CenterPoint(), dialog.CenterPoint()); + + EXPECT_LE(dialog.width(), kGaiaDialogMaxSize); + EXPECT_LE(dialog.height(), kGaiaDialogMaxSize); + // If there is at least some space, we should have margins. + if (dialog.width() > kGaiaDialogMinSize) { + EXPECT_GE(dialog.x(), kGaiaDialogMinMargin); + EXPECT_GE(area.right() - dialog.right(), kGaiaDialogMinMargin); + } + if (dialog.height() > kGaiaDialogMinSize) { + EXPECT_TRUE(dialog.y() >= kGaiaDialogMinMargin); + EXPECT_TRUE(area.bottom() - dialog.bottom() >= kGaiaDialogMinMargin); + } + // If dialog size is lesser than minimum size, there should be no margins + if (dialog.width() < kGaiaDialogMinSize) { + EXPECT_EQ(dialog.x(), area.x()); + EXPECT_EQ(dialog.right(), area.right()); + } + if (dialog.height() < kGaiaDialogMinSize) { + EXPECT_EQ(dialog.y(), area.y()); + EXPECT_EQ(dialog.bottom(), area.bottom()); + } + } + + gfx::Rect SizeWithoutShelf(const gfx::Rect& area) const { + return gfx::Rect(area.width(), area.height() - kShelfHeight); + } + + private: + DISALLOW_COPY_AND_ASSIGN(OobeDialogSizeUtilsTest); +}; + +// We have plenty of space on the screen. +TEST_F(OobeDialogSizeUtilsTest, Chromebook) { + gfx::Rect usual_device(1200, 800); + gfx::Rect dialog; + + CalculateOobeDialogBounds(usual_device, kShelfHeight, &dialog); + ValidateDialog(SizeWithoutShelf(usual_device), dialog); +} + +// We have plenty of space on the screen, but virtual keyboard takes some space. +TEST_F(OobeDialogSizeUtilsTest, ChromebookVirtualKeyboard) { + gfx::Rect usual_device_with_keyboard(1200, 800 - kVirtualKeyboardHeight); + gfx::Rect dialog; + + CalculateOobeDialogBounds(usual_device_with_keyboard, 0, &dialog); + ValidateDialog(usual_device_with_keyboard, dialog); +} + +// Tablet device can have smaller screen size. +TEST_F(OobeDialogSizeUtilsTest, TabletHorizontal) { + gfx::Rect tablet_device(1080, 675); + gfx::Rect dialog; + + CalculateOobeDialogBounds(tablet_device, kShelfHeight, &dialog); + ValidateDialog(SizeWithoutShelf(tablet_device), dialog); +} + +// Tablet device in horizontal mode with virtual keyboard have restricted space. +TEST_F(OobeDialogSizeUtilsTest, TabletHorizontalVirtualKeyboard) { + gfx::Rect tablet_device(1080, 675 - kVirtualKeyboardHeight); + gfx::Rect dialog; + + CalculateOobeDialogBounds(tablet_device, 0, &dialog); + ValidateDialog(tablet_device, dialog); +} + +// Tablet device in horizontal mode with docked magnifier have restricted space. +TEST_F(OobeDialogSizeUtilsTest, TabletHorizontalDockedMagnifier) { + gfx::Rect tablet_device(0, 0, 1080, 675 - kDockedMagnifierHeight); + gfx::Rect dialog; + + CalculateOobeDialogBounds(tablet_device, 0, &dialog); + ValidateDialog(tablet_device, dialog); +} + +// Tablet device in horizontal mode with virtual keyboard and docked +// magnifier results in very few space. +TEST_F(OobeDialogSizeUtilsTest, TabletHorizontalVirtualKeyboardMagnifier) { + gfx::Rect tablet_device( + 0, 0, 1080, 675 - kVirtualKeyboardHeight - kDockedMagnifierHeight); + + gfx::Rect dialog; + + CalculateOobeDialogBounds(tablet_device, 0, &dialog); + ValidateDialog(tablet_device, dialog); +} + +// Tablet in vertical mode puts some strain on dialog width. +TEST_F(OobeDialogSizeUtilsTest, TabletVertical) { + gfx::Rect tablet_device(675, 1080); + gfx::Rect dialog; + + CalculateOobeDialogBounds(tablet_device, kShelfHeight, &dialog); + ValidateDialog(SizeWithoutShelf(tablet_device), dialog); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc index 6c1b841..33c023ef 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc
@@ -10,8 +10,10 @@ #include "ash/public/cpp/login_screen.h" #include "ash/public/cpp/login_screen_model.h" +#include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shell_window_ids.h" #include "chrome/browser/chromeos/login/ui/login_display_host_mojo.h" +#include "chrome/browser/chromeos/login/ui/oobe_dialog_size_utils.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" @@ -26,9 +28,11 @@ #include "ui/base/accelerators/accelerator.h" #include "ui/base/ui_base_features.h" #include "ui/display/display.h" +#include "ui/display/screen.h" #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" #include "ui/views/controls/webview/web_dialog_view.h" #include "ui/views/focus/focus_manager.h" +#include "ui/views/view.h" #include "ui/views/widget/widget.h" namespace chromeos { @@ -36,8 +40,6 @@ namespace { constexpr char kGaiaURL[] = "chrome://oobe/gaia-signin"; -constexpr int kGaiaDialogHeight = 640; -constexpr int kGaiaDialogWidth = 768; constexpr char kAppLaunchBailout[] = "app_launch_bailout"; constexpr char kCancel[] = "cancel"; @@ -85,6 +87,77 @@ DISALLOW_COPY_AND_ASSIGN(OobeWebDialogView); }; +// View that controls size of OobeUIDialog. +// Dialog can be shown as a full-screen (in this case it will fit whole screen) +// except for Virtual Keyboard or as a window. +// For both dimensions we try to center dialog so that it has size no more than +// kGaiaDialogMaxSize with margins no less than kGaiaDialogMinMargin on each +// side. +// If available height is too small (usually due to virtual keyboard), +// and calculations above would give total dialog height lesser than +// kGaiaDialogMinHeight, then margins will be reduced to accommodate minimum +// height. +// When no virtual keyboard is displayed, ash shelf height should be excluded +// from space available for calculations. +// Host size accounts for virtual keyboard presence, but not for shelf. +// It is assumed that host view is always a full-screen view on a primary +// display. +class LayoutWidgetDelegateView : public views::WidgetDelegateView { + public: + LayoutWidgetDelegateView(OobeUIDialogDelegate* dialog_delegate, + OobeWebDialogView* oobe_view) + : dialog_delegate_(dialog_delegate), oobe_view_(oobe_view) { + AddChildView(oobe_view_); + } + + ~LayoutWidgetDelegateView() override { delete dialog_delegate_; } + + void SetFullscreen(bool value) { + if (fullscreen_ == value) + return; + fullscreen_ = value; + Layout(); + } + + void SetHasShelf(bool value) { + has_shelf_ = value; + Layout(); + } + + // views::WidgetDelegateView: + ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_WINDOW; } + + bool ShouldAdvanceFocusToTopLevelWidget() const override { return true; } + + void Layout() override { + if (fullscreen_) { + oobe_view_->SetBoundsRect(GetContentsBounds()); + return; + } + + gfx::Rect bounds; + const int shelf_height = + has_shelf_ ? ash::ShelfConfig::Get()->shelf_size() : 0; + CalculateOobeDialogBounds(GetContentsBounds(), shelf_height, &bounds); + + for (views::View* child : children()) { + child->SetBoundsRect(bounds); + } + } + + private: + OobeUIDialogDelegate* dialog_delegate_ = nullptr; // Owned by us. + OobeWebDialogView* oobe_view_ = nullptr; // Owned by views hierarchy. + + // Indicates whether Oobe web view should fully occupy the hosting widget. + bool fullscreen_ = false; + // Indicates if ash shelf is displayed (and should be excluded from available + // space). + bool has_shelf_ = true; + + DISALLOW_COPY_AND_ASSIGN(LayoutWidgetDelegateView); +}; + class CaptivePortalDialogDelegate : public ui::WebDialogDelegate, public ChromeWebModalDialogManagerDelegate, @@ -204,17 +277,14 @@ OobeUIDialogDelegate::OobeUIDialogDelegate( base::WeakPtr<LoginDisplayHostMojo> controller) - : controller_(controller), - size_(gfx::Size(kGaiaDialogWidth, kGaiaDialogHeight)) { - display_observer_.Add(display::Screen::GetScreen()); - tablet_mode_observer_.Add(ash::TabletMode::Get()); + : controller_(controller) { keyboard_observer_.Add(ChromeKeyboardControllerClient::Get()); accel_map_[ui::Accelerator( ui::VKEY_S, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)] = kAppLaunchBailout; accel_map_[ui::Accelerator(ui::VKEY_ESCAPE, 0)] = kCancel; - DCHECK(!dialog_view_ && !dialog_widget_); + DCHECK(!dialog_view_ && !widget_); // Life cycle of |dialog_view_| is managed by the widget: // Widget owns a root view which has |dialog_view_| as its child view. // Before the widget is destroyed, it will clean up the view hierarchy @@ -222,14 +292,21 @@ dialog_view_ = new OobeWebDialogView(ProfileHelper::GetSigninProfile(), this, std::make_unique<ChromeWebContentsHandler>()); + views::Widget::InitParams params( views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); - params.delegate = dialog_view_; ash_util::SetupWidgetInitParamsForContainer( ¶ms, ash::kShellWindowId_LockScreenContainer); + layout_view_ = new LayoutWidgetDelegateView(this, dialog_view_); + params.delegate = layout_view_; + params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; + params.show_state = ui::SHOW_STATE_FULLSCREEN; - dialog_widget_ = new views::Widget; - dialog_widget_->Init(std::move(params)); + widget_ = new views::Widget(); + widget_->Init(std::move(params)); + + layout_view_->SetHasShelf( + !ChromeKeyboardControllerClient::Get()->is_keyboard_visible()); extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( dialog_view_->web_contents()); @@ -244,12 +321,8 @@ } OobeUIDialogDelegate::~OobeUIDialogDelegate() { - // At shutdown, all widgets are closed. The order of destruction maybe - // different; i.e. the captive portal dialog might have been destroyed - // already. So we check the WeakPtr first. if (captive_portal_delegate_) captive_portal_delegate_->Close(); - if (controller_) controller_->OnDialogDestroyed(this); } @@ -259,7 +332,7 @@ } bool OobeUIDialogDelegate::IsVisible() { - return dialog_widget_->IsVisible(); + return widget_->IsVisible(); } void OobeUIDialogDelegate::SetShouldDisplayCaptivePortal(bool should_display) { @@ -267,7 +340,7 @@ } void OobeUIDialogDelegate::Show() { - dialog_widget_->Show(); + widget_->Show(); SetState(ash::OobeDialogState::GAIA_SIGNIN); if (should_display_captive_portal_) @@ -275,69 +348,39 @@ } void OobeUIDialogDelegate::ShowFullScreen() { - const gfx::Size size = - display::Screen::GetScreen() - ->GetDisplayNearestWindow(dialog_widget_->GetNativeWindow()) - .size(); - UpdateSizeAndPosition(size.width(), size.height()); + layout_view_->SetFullscreen(true); Show(); - showing_fullscreen_ = true; } void OobeUIDialogDelegate::Hide() { - if (!dialog_widget_) + if (!widget_) return; - dialog_widget_->Hide(); + widget_->Hide(); SetState(ash::OobeDialogState::HIDDEN); } void OobeUIDialogDelegate::Close() { - if (!dialog_widget_) + if (!widget_) return; // We do not call LoginScreen::NotifyOobeDialogVisibility here, because this // would cause the LoginShelfView to update its button visibility even though // the login screen is about to be destroyed. See http://crbug/836172 - dialog_widget_->Close(); + widget_->Close(); } void OobeUIDialogDelegate::SetState(ash::OobeDialogState state) { - if (!dialog_widget_ || state_ == state) + if (!widget_ || state_ == state) return; // Gaia WebUI is preloaded, so it's possible for WebUI to send state updates // while the widget is not visible. Defer the state update until Show(). - if (!dialog_widget_->IsVisible() && state != ash::OobeDialogState::HIDDEN) + if (!widget_->IsVisible() && state != ash::OobeDialogState::HIDDEN) return; state_ = state; ash::LoginScreen::Get()->GetModel()->NotifyOobeDialogState(state_); } -void OobeUIDialogDelegate::UpdateSizeAndPosition(int width, int height) { - size_.SetSize(width, height); - if (!dialog_widget_) - return; - - // display_manager.js sends the width and height of the content in - // updateScreenSize() when we show the app launch splash. Without this if - // statement, the dialog would be resized to just fit the content rather than - // show fullscreen as expected. - if (showing_fullscreen_) - return; - - gfx::Rect display_rect = - display::Screen::GetScreen() - ->GetDisplayNearestWindow(dialog_widget_->GetNativeWindow()) - .work_area(); - - // Place the dialog in the center of the screen. - const gfx::Rect bounds( - display_rect.x() + (display_rect.width() - size_.width()) / 2, - display_rect.y() + (display_rect.height() - size_.height()) / 2, - size_.width(), size_.height()); - dialog_widget_->SetBounds(bounds); -} - OobeUI* OobeUIDialogDelegate::GetOobeUI() const { if (dialog_view_) { content::WebUI* webui = dialog_view_->web_contents()->GetWebUI(); @@ -348,35 +391,7 @@ } gfx::NativeWindow OobeUIDialogDelegate::GetNativeWindow() const { - return dialog_widget_ ? dialog_widget_->GetNativeWindow() : nullptr; -} - -void OobeUIDialogDelegate::OnDisplayMetricsChanged( - const display::Display& display, - uint32_t changed_metrics) { - if (!dialog_widget_) - return; - - const display::Display this_display = - display::Screen::GetScreen()->GetDisplayNearestWindow( - dialog_widget_->GetNativeWindow()); - if (this_display.id() == display.id()) - UpdateSizeAndPosition(size_.width(), size_.height()); -} - -void OobeUIDialogDelegate::OnTabletModeStarted() { - OnTabletModeToggled(true); -} - -void OobeUIDialogDelegate::OnTabletModeEnded() { - OnTabletModeToggled(false); -} - -void OobeUIDialogDelegate::OnTabletModeToggled(bool enabled) { - if (!dialog_widget_) - return; - - UpdateSizeAndPosition(size_.width(), size_.height()); + return widget_ ? widget_->GetNativeWindow() : nullptr; } ui::ModalType OobeUIDialogDelegate::GetDialogModalType() const { @@ -395,7 +410,7 @@ std::vector<content::WebUIMessageHandler*>* handlers) const {} void OobeUIDialogDelegate::GetDialogSize(gfx::Size* size) const { - *size = size_; + // Dialog will be resized externally by LayoutWidgetDelegateView. } bool OobeUIDialogDelegate::CanResizeDialog() const { @@ -407,7 +422,7 @@ } void OobeUIDialogDelegate::OnDialogClosed(const std::string& json_retval) { - delete this; + widget_->Close(); } void OobeUIDialogDelegate::OnCloseContents(content::WebContents* source, @@ -446,10 +461,9 @@ } void OobeUIDialogDelegate::OnKeyboardVisibilityChanged(bool visible) { - if (!dialog_widget_) + if (!widget_) return; - - UpdateSizeAndPosition(size_.width(), size_.height()); + layout_view_->SetHasShelf(!visible); } void OobeUIDialogDelegate::OnBeforeCaptivePortalShown() {
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h index 0826e44..1eb1d42a 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h
@@ -8,8 +8,6 @@ #include <string> #include "ash/public/cpp/login_types.h" -#include "ash/public/cpp/tablet_mode.h" -#include "ash/public/cpp/tablet_mode_observer.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" @@ -18,8 +16,6 @@ #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h" #include "components/web_modal/web_contents_modal_dialog_host.h" -#include "ui/display/display_observer.h" -#include "ui/display/screen.h" #include "ui/web_dialogs/web_dialog_delegate.h" namespace content { @@ -38,8 +34,10 @@ namespace chromeos { class CaptivePortalDialogDelegate; +class LayoutWidgetDelegateView; class LoginDisplayHostMojo; class OobeUI; +class OobeWebDialogView; // This class manages the behavior of the Oobe UI dialog. // And its lifecycle is managed by the widget created in Show(). @@ -48,9 +46,7 @@ // | // V // clientView---->Widget's view hierarchy -class OobeUIDialogDelegate : public display::DisplayObserver, - public ash::TabletModeObserver, - public ui::WebDialogDelegate, +class OobeUIDialogDelegate : public ui::WebDialogDelegate, public ChromeKeyboardControllerClient::Observer, public CaptivePortalWindowProxy::Observer { public: @@ -80,20 +76,10 @@ content::WebContents* GetWebContents(); - void UpdateSizeAndPosition(int width, int height); OobeUI* GetOobeUI() const; gfx::NativeWindow GetNativeWindow() const; private: - // display::DisplayObserver: - void OnDisplayMetricsChanged(const display::Display& display, - uint32_t changed_metrics) override; - // ash::TabletModeObserver: - void OnTabletModeStarted() override; - void OnTabletModeEnded() override; - - void OnTabletModeToggled(bool enabled); - // ui::WebDialogDelegate: ui::ModalType GetDialogModalType() const override; base::string16 GetDialogTitle() const override; @@ -103,7 +89,8 @@ void GetDialogSize(gfx::Size* size) const override; bool CanResizeDialog() const override; std::string GetDialogArgs() const override; - // NOTE: This function deletes this object at the end. + // NOTE: This function starts cleanup sequence that would call FinishCleanup + // and delete this object in the end. void OnDialogClosed(const std::string& json_retval) override; void OnCloseContents(content::WebContents* source, bool* out_close_dialog) override; @@ -124,17 +111,14 @@ base::WeakPtr<CaptivePortalDialogDelegate> captive_portal_delegate_; - // This is owned by the underlying native widget. - // Before its deletion, onDialogClosed will get called and delete this object. - views::Widget* dialog_widget_ = nullptr; - views::WebDialogView* dialog_view_ = nullptr; - gfx::Size size_; - bool showing_fullscreen_ = false; + // Root widget. It is assumed that widget is placed as a full-screen inside + // LockContainer. + views::Widget* widget_ = nullptr; + // Reference to view owned by widget_. + LayoutWidgetDelegateView* layout_view_ = nullptr; + // Reference to dialog view stored in widget_. + OobeWebDialogView* dialog_view_ = nullptr; - ScopedObserver<display::Screen, display::DisplayObserver> display_observer_{ - this}; - ScopedObserver<ash::TabletMode, ash::TabletModeObserver> - tablet_mode_observer_{this}; ScopedObserver<ChromeKeyboardControllerClient, ChromeKeyboardControllerClient::Observer> keyboard_observer_{this};
diff --git a/chrome/browser/chromeos/power/extension_event_observer.cc b/chrome/browser/chromeos/power/extension_event_observer.cc index 18dcf62..72dc03b 100644 --- a/chrome/browser/chromeos/power/extension_event_observer.cc +++ b/chrome/browser/chromeos/power/extension_event_observer.cc
@@ -11,10 +11,10 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/extensions/api/gcm.h" -#include "content/public/browser/notification_service.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/process_manager.h" #include "extensions/common/extension.h" @@ -61,26 +61,19 @@ std::set<uint64_t> pending_network_requests; }; -ExtensionEventObserver::ExtensionEventObserver() - : should_delay_suspend_(true), suspend_keepalive_count_(0) { - registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED, - content::NotificationService::AllBrowserContextsAndSources()); - registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, - content::NotificationService::AllBrowserContextsAndSources()); - +ExtensionEventObserver::ExtensionEventObserver() { PowerManagerClient::Get()->AddObserver(this); + g_browser_process->profile_manager()->AddObserver(this); } ExtensionEventObserver::~ExtensionEventObserver() { - for (Profile* profile : active_profiles_) - extensions::ProcessManager::Get(profile)->RemoveObserver(this); - for (const auto& pair : keepalive_sources_) { extensions::ExtensionHost* host = const_cast<extensions::ExtensionHost*>(pair.first); host->RemoveObserver(this); } + g_browser_process->profile_manager()->RemoveObserver(this); PowerManagerClient::Get()->RemoveObserver(this); } @@ -101,22 +94,11 @@ } } -void ExtensionEventObserver::Observe( - int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - switch (type) { - case chrome::NOTIFICATION_PROFILE_ADDED: { - OnProfileAdded(content::Source<Profile>(source).ptr()); - break; - } - case chrome::NOTIFICATION_PROFILE_DESTROYED: { - OnProfileDestroyed(content::Source<Profile>(source).ptr()); - break; - } - default: - NOTREACHED(); - } +void ExtensionEventObserver::OnProfileAdded(Profile* profile) { + // Add the observer when |profile| is added and ProcessManager is available as + // a keyed service. It will be removed when the ProcessManager instance is + // shut down (OnProcessManagerShutdown). + process_manager_observers_.Add(extensions::ProcessManager::Get(profile)); } void ExtensionEventObserver::OnBackgroundHostCreated( @@ -135,6 +117,11 @@ host->AddObserver(this); } +void ExtensionEventObserver::OnProcessManagerShutdown( + extensions::ProcessManager* manager) { + process_manager_observers_.Remove(manager); +} + void ExtensionEventObserver::OnExtensionHostDestroyed( const extensions::ExtensionHost* host) { auto it = keepalive_sources_.find(host); @@ -217,20 +204,6 @@ suspend_readiness_callback_.Cancel(); } -void ExtensionEventObserver::OnProfileAdded(Profile* profile) { - auto result = active_profiles_.insert(profile); - - if (result.second) - extensions::ProcessManager::Get(profile)->AddObserver(this); -} - -void ExtensionEventObserver::OnProfileDestroyed(Profile* profile) { - if (active_profiles_.erase(profile) == 0) - return; - - extensions::ProcessManager::Get(profile)->RemoveObserver(this); -} - void ExtensionEventObserver::OnSuspendImminent(bool dark_suspend) { DCHECK(block_suspend_token_.is_empty()) << "OnSuspendImminent called while previous suspend attempt "
diff --git a/chrome/browser/chromeos/power/extension_event_observer.h b/chrome/browser/chromeos/power/extension_event_observer.h index f1b40f6..bce26385 100644 --- a/chrome/browser/chromeos/power/extension_event_observer.h +++ b/chrome/browser/chromeos/power/extension_event_observer.h
@@ -16,14 +16,13 @@ #include "base/cancelable_callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/scoped_observer.h" #include "base/time/time.h" #include "base/unguessable_token.h" +#include "chrome/browser/profiles/profile_manager_observer.h" #include "chromeos/dbus/power/power_manager_client.h" -#include "content/public/browser/notification_details.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" -#include "content/public/browser/notification_source.h" #include "extensions/browser/extension_host_observer.h" +#include "extensions/browser/process_manager.h" #include "extensions/browser/process_manager_observer.h" class Profile; @@ -39,7 +38,7 @@ // that arrive from Google's GCM servers and network requests initiated by // extensions while processing the push messages. This class is owned by // WakeOnWifiManager. -class ExtensionEventObserver : public content::NotificationObserver, +class ExtensionEventObserver : public ProfileManagerObserver, public extensions::ProcessManagerObserver, public extensions::ExtensionHostObserver, public PowerManagerClient::Observer { @@ -75,15 +74,14 @@ // ExtensionEventObserver should or should not delay the system suspend. void SetShouldDelaySuspend(bool should_delay); - // content::NotificationObserver override. - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; + // ProfileManagerObserver: + void OnProfileAdded(Profile* profile) override; - // extensions::ProcessManagerObserver overrides. + // extensions::ProcessManagerObserver: void OnBackgroundHostCreated(extensions::ExtensionHost* host) override; + void OnProcessManagerShutdown(extensions::ProcessManager* manager) override; - // extensions::ExtensionHostObserver overrides. + // extensions::ExtensionHostObserver: void OnExtensionHostDestroyed(const extensions::ExtensionHost* host) override; void OnBackgroundEventDispatched(const extensions::ExtensionHost* host, const std::string& event_name, @@ -95,7 +93,7 @@ void OnNetworkRequestDone(const extensions::ExtensionHost* host, uint64_t request_id) override; - // PowerManagerClient::Observer overrides. + // PowerManagerClient::Observer: void SuspendImminent(power_manager::SuspendImminent::Reason reason) override; void DarkSuspendImminent() override; void SuspendDone(const base::TimeDelta& duration) override; @@ -103,10 +101,6 @@ private: friend class TestApi; - // Called when a new profile is created or destroyed. - void OnProfileAdded(Profile* profile); - void OnProfileDestroyed(Profile* profile); - // Called when the system is about to perform a regular suspend or a dark // suspend. void OnSuspendImminent(bool dark_suspend); @@ -120,10 +114,11 @@ std::unique_ptr<KeepaliveSources>> keepalive_sources_; - std::set<Profile*> active_profiles_; + ScopedObserver<extensions::ProcessManager, extensions::ProcessManagerObserver> + process_manager_observers_{this}; - bool should_delay_suspend_; - int suspend_keepalive_count_; + bool should_delay_suspend_ = true; + int suspend_keepalive_count_ = 0; // |this| blocks Power Manager suspend with this token. When the token is // empty, |this| isn't blocking suspend. @@ -131,8 +126,6 @@ base::CancelableClosure suspend_readiness_callback_; - content::NotificationRegistrar registrar_; - base::WeakPtrFactory<ExtensionEventObserver> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(ExtensionEventObserver);
diff --git a/chrome/browser/chromeos/power/extension_event_observer_unittest.cc b/chrome/browser/chromeos/power/extension_event_observer_unittest.cc index f55ba2a..7d1cbad7 100644 --- a/chrome/browser/chromeos/power/extension_event_observer_unittest.cc +++ b/chrome/browser/chromeos/power/extension_event_observer_unittest.cc
@@ -50,12 +50,13 @@ PowerManagerClient::InitializeFake(); profile_manager_ = std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal()); - extension_event_observer_ = std::make_unique<ExtensionEventObserver>(); - test_api_ = extension_event_observer_->CreateTestApi(); // Must be called from ::testing::Test::SetUp. ASSERT_TRUE(profile_manager_->SetUp()); + extension_event_observer_ = std::make_unique<ExtensionEventObserver>(); + test_api_ = extension_event_observer_->CreateTestApi(); + const char kUserProfile[] = "profile1@example.com"; const AccountId account_id(AccountId::FromUserEmail(kUserProfile)); fake_user_manager_->AddUser(account_id);
diff --git a/chrome/browser/chromeos/printing/synced_printers_manager_factory.cc b/chrome/browser/chromeos/printing/synced_printers_manager_factory.cc index 86bbd0e..ea1f3a6a 100644 --- a/chrome/browser/chromeos/printing/synced_printers_manager_factory.cc +++ b/chrome/browser/chromeos/printing/synced_printers_manager_factory.cc
@@ -8,13 +8,14 @@ #include <utility> #include "base/bind.h" -#include "base/debug/dump_without_crashing.h" #include "chrome/browser/chromeos/printing/printers_sync_bridge.h" #include "chrome/browser/chromeos/printing/synced_printers_manager.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/model_type_store_service_factory.h" +#include "chrome/common/channel_info.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "components/sync/base/report_unrecoverable_error.h" #include "components/sync/model/model_type_store_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" @@ -63,8 +64,9 @@ std::unique_ptr<PrintersSyncBridge> sync_bridge = std::make_unique<PrintersSyncBridge>( - std::move(store_factory), base::BindRepeating(base::IgnoreResult( - &base::debug::DumpWithoutCrashing))); + std::move(store_factory), + base::BindRepeating(&syncer::ReportUnrecoverableError, + chrome::GetChannel())); return SyncedPrintersManager::Create(profile, std::move(sync_bridge)) .release();
diff --git a/chrome/browser/chromeos/tether/tether_service_unittest.cc b/chrome/browser/chromeos/tether/tether_service_unittest.cc index 9df3ad3..d367a888 100644 --- a/chrome/browser/chromeos/tether/tether_service_unittest.cc +++ b/chrome/browser/chromeos/tether/tether_service_unittest.cc
@@ -266,8 +266,8 @@ ~FakeDeviceSyncClientImplFactory() override = default; // chromeos::device_sync::DeviceSyncClientImpl::Factory: - std::unique_ptr<chromeos::device_sync::DeviceSyncClient> BuildInstance() - override { + std::unique_ptr<chromeos::device_sync::DeviceSyncClient> BuildInstance( + chromeos::device_sync::mojom::DeviceSyncService* service) override { auto fake_device_sync_client = std::make_unique<chromeos::device_sync::FakeDeviceSyncClient>(); fake_device_sync_client->NotifyReady();
diff --git a/chrome/browser/component_updater/crl_set_component_installer_unittest.cc b/chrome/browser/component_updater/crl_set_component_installer_unittest.cc index 0cc10a9..4c4f10c 100644 --- a/chrome/browser/component_updater/crl_set_component_installer_unittest.cc +++ b/chrome/browser/component_updater/crl_set_component_installer_unittest.cc
@@ -56,13 +56,13 @@ request.request_initiator = url::Origin(); client_ = std::make_unique<network::TestURLLoaderClient>(); - network::mojom::URLLoaderFactoryPtr loader_factory; + mojo::Remote<network::mojom::URLLoaderFactory> loader_factory; network::mojom::URLLoaderFactoryParamsPtr params = network::mojom::URLLoaderFactoryParams::New(); params->process_id = 0; params->is_corb_enabled = false; - network_context_->CreateURLLoaderFactory(mojo::MakeRequest(&loader_factory), - std::move(params)); + network_context_->CreateURLLoaderFactory( + loader_factory.BindNewPipeAndPassReceiver(), std::move(params)); loader_factory->CreateLoaderAndStart( mojo::MakeRequest(&loader_), 1, 1, network::mojom::kURLLoadOptionSendSSLInfoWithResponse |
diff --git a/chrome/browser/component_updater/recovery_component_installer.cc b/chrome/browser/component_updater/recovery_component_installer.cc index 1552b7d..b0f99aa1 100644 --- a/chrome/browser/component_updater/recovery_component_installer.cc +++ b/chrome/browser/component_updater/recovery_component_installer.cc
@@ -305,6 +305,7 @@ recovery.version = version; recovery.pk_hash.assign(kRecoverySha2Hash, &kRecoverySha2Hash[sizeof(kRecoverySha2Hash)]); + recovery.app_id = update_client::GetCrxIdFromPublicKeyHash(recovery.pk_hash); recovery.supports_group_policy_enable_component_updates = true; recovery.requires_network_encryption = false; recovery.crx_format_requirement =
diff --git a/chrome/browser/download/android/BUILD.gn b/chrome/browser/download/android/BUILD.gn new file mode 100644 index 0000000..74285f8 --- /dev/null +++ b/chrome/browser/download/android/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") + +android_library("java") { + java_files = + [ "java/src/org/chromium/chrome/browser/download/DownloadFilter.java" ] + + deps = [ + "//base:base_java", + ] +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadFilter.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadFilter.java similarity index 97% rename from chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadFilter.java rename to chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadFilter.java index e59d564..802e16d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadFilter.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadFilter.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.download.ui; +package org.chromium.chrome.browser.download; import android.text.TextUtils;
diff --git a/chrome/browser/download/download_ui_controller.cc b/chrome/browser/download/download_ui_controller.cc index 7e1274b..8171021 100644 --- a/chrome/browser/download/download_ui_controller.cc +++ b/chrome/browser/download/download_ui_controller.cc
@@ -155,7 +155,7 @@ UMA_HISTOGRAM_ENUMERATION( "Security.SafetyTips.DownloadStarted", security_state_tab_helper->GetVisibleSecurityState() - ->safety_tip_status); + ->safety_tip_info.status); } }
diff --git a/chrome/browser/enterprise_reporting/policy_info.cc b/chrome/browser/enterprise_reporting/policy_info.cc index b05767d..0ebac66 100644 --- a/chrome/browser/enterprise_reporting/policy_info.cc +++ b/chrome/browser/enterprise_reporting/policy_info.cc
@@ -9,7 +9,6 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" #include "chrome/browser/policy/policy_conversions.h" #include "components/policy/core/common/cloud/cloud_policy_client.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc index 5284f7e..73b0d058 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
@@ -16,7 +16,6 @@ #include "chrome/browser/extensions/api/enterprise_reporting_private/prefs.h" #include "chrome/browser/policy/browser_dm_token_storage.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" #include "chrome/browser/policy/policy_conversions.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/channel_info.h"
diff --git a/chrome/browser/extensions/api/image_writer_private/operation_manager.cc b/chrome/browser/extensions/api/image_writer_private/operation_manager.cc index e8010124..efdbee4 100644 --- a/chrome/browser/extensions/api/image_writer_private/operation_manager.cc +++ b/chrome/browser/extensions/api/image_writer_private/operation_manager.cc
@@ -24,6 +24,7 @@ #include "extensions/browser/event_router.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/notification_types.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/file_manager/path_util.h" @@ -80,14 +81,15 @@ return; } - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_info; + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote; content::BrowserContext::GetDefaultStoragePartition(browser_context_) ->GetURLLoaderFactoryForBrowserProcess() - ->Clone(mojo::MakeRequest(&url_loader_factory_info)); + ->Clone(url_loader_factory_remote.InitWithNewPipeAndPassReceiver()); auto operation = base::MakeRefCounted<WriteFromUrlOperation>( weak_factory_.GetWeakPtr(), extension_id, - std::move(url_loader_factory_info), url, hash, device_path, + std::move(url_loader_factory_remote), url, hash, device_path, GetAssociatedDownloadFolder()); operations_[extension_id] = operation; operation->PostTask(base::BindOnce(&Operation::Start, operation));
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.cc b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.cc index a5ebd3f0..ac0689ea 100644 --- a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.cc +++ b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/extensions/api/image_writer_private/error_messages.h" #include "chrome/browser/extensions/api/image_writer_private/operation_manager.h" #include "content/public/browser/browser_thread.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/url_fetcher.h" #include "services/network/public/cpp/simple_url_loader.h" @@ -21,13 +22,13 @@ WriteFromUrlOperation::WriteFromUrlOperation( base::WeakPtr<OperationManager> manager, const ExtensionId& extension_id, - network::mojom::URLLoaderFactoryPtrInfo factory_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote, GURL url, const std::string& hash, const std::string& device_path, const base::FilePath& download_folder) : Operation(manager, extension_id, device_path, download_folder), - url_loader_factory_ptr_info_(std::move(factory_info)), + url_loader_factory_remote_(std::move(factory_remote)), url_(url), hash_(hash), download_continuation_() {} @@ -120,11 +121,11 @@ AddCleanUpFunction( base::BindOnce(&WriteFromUrlOperation::DestroySimpleURLLoader, this)); - network::mojom::URLLoaderFactoryPtr url_loader_factory_ptr; - url_loader_factory_ptr.Bind(std::move(url_loader_factory_ptr_info_)); + mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_remote( + std::move(url_loader_factory_remote_)); simple_url_loader_->DownloadToFile( - url_loader_factory_ptr.get(), + url_loader_factory_remote.get(), base::BindOnce(&WriteFromUrlOperation::OnSimpleLoaderComplete, base::Unretained(this)), image_path_);
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.h b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.h index b35f365..9652923 100644 --- a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.h +++ b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include "chrome/browser/extensions/api/image_writer_private/operation.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/network/public/mojom/url_response_head.mojom-forward.h" #include "url/gurl.h" @@ -24,13 +25,14 @@ // Encapsulates a write of an image accessed via URL. class WriteFromUrlOperation : public Operation { public: - WriteFromUrlOperation(base::WeakPtr<OperationManager> manager, - const ExtensionId& extension_id, - network::mojom::URLLoaderFactoryPtrInfo factory_info, - GURL url, - const std::string& hash, - const std::string& storage_unit_id, - const base::FilePath& download_folder); + WriteFromUrlOperation( + base::WeakPtr<OperationManager> manager, + const ExtensionId& extension_id, + mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote, + GURL url, + const std::string& hash, + const std::string& storage_unit_id, + const base::FilePath& download_folder); void StartImpl() override; protected: @@ -61,7 +63,8 @@ void VerifyDownloadComplete(base::OnceClosure continuation); // Arguments - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info_; + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote_; GURL url_; const std::string hash_;
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc index fd04e40..942e358 100644 --- a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc +++ b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
@@ -38,13 +38,13 @@ WriteFromUrlOperationForTest( base::WeakPtr<OperationManager> manager, const ExtensionId& extension_id, - network::mojom::URLLoaderFactoryPtrInfo factory_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote, GURL url, const std::string& hash, const std::string& storage_unit_id) : WriteFromUrlOperation(manager, extension_id, - std::move(factory_info), + std::move(factory_remote), url, hash, storage_unit_id, @@ -115,15 +115,16 @@ scoped_refptr<WriteFromUrlOperationForTest> CreateOperation( const GURL& url, const std::string& hash) { - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info; + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote; content::BrowserContext::GetDefaultStoragePartition(&test_profile_) ->GetURLLoaderFactoryForBrowserProcess() - ->Clone(mojo::MakeRequest(&url_loader_factory_ptr_info)); + ->Clone(url_loader_factory_remote.InitWithNewPipeAndPassReceiver()); scoped_refptr<WriteFromUrlOperationForTest> operation( new WriteFromUrlOperationForTest( manager_.AsWeakPtr(), kDummyExtensionId, - std::move(url_loader_factory_ptr_info), url, hash, + std::move(url_loader_factory_remote), url, hash, test_utils_.GetDevicePath().AsUTF8Unsafe())); operation->Start(); return operation;
diff --git a/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc b/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc index 70f0710c..95000e3e 100644 --- a/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc +++ b/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc
@@ -15,7 +15,7 @@ #include "content/public/browser/chromeos/delegate_to_browser_gpu_service_accelerator_factory.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/video_capture_service.h" -#include "mojo/public/cpp/bindings/strong_binding.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/video_capture/public/mojom/device_factory.mojom.h" namespace extensions { @@ -97,11 +97,12 @@ void MediaPerceptionAPIDelegateChromeOS::BindVideoSourceProvider( mojo::PendingReceiver<video_capture::mojom::VideoSourceProvider> receiver) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - video_capture::mojom::AcceleratorFactoryPtr accelerator_factory; - mojo::MakeStrongBinding( + mojo::PendingRemote<video_capture::mojom::AcceleratorFactory> + accelerator_factory; + mojo::MakeSelfOwnedReceiver( std::make_unique< content::DelegateToBrowserGpuServiceAcceleratorFactory>(), - mojo::MakeRequest(&accelerator_factory)); + accelerator_factory.InitWithNewPipeAndPassReceiver()); auto& service = content::GetVideoCaptureService(); service.InjectGpuDependencies(std::move(accelerator_factory)); @@ -113,14 +114,15 @@ handler_ = std::move(handler); } -void MediaPerceptionAPIDelegateChromeOS::ForwardMediaPerceptionRequest( - chromeos::media_perception::mojom::MediaPerceptionRequest request, +void MediaPerceptionAPIDelegateChromeOS::ForwardMediaPerceptionReceiver( + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver, content::RenderFrameHost* render_frame_host) { if (!handler_) { - DLOG(ERROR) << "Got request but the handler is not set."; + DLOG(ERROR) << "Got receiver but the handler is not set."; return; } - handler_.Run(std::move(request)); + handler_.Run(std::move(receiver)); } } // namespace extensions
diff --git a/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h b/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h index 45abc51..e27bff40 100644 --- a/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h +++ b/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h
@@ -7,6 +7,7 @@ #include "base/callback_forward.h" #include "extensions/browser/api/media_perception_private/media_perception_api_delegate.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" namespace extensions { @@ -25,8 +26,9 @@ override; void SetMediaPerceptionRequestHandler( MediaPerceptionRequestHandler handler) override; - void ForwardMediaPerceptionRequest( - chromeos::media_perception::mojom::MediaPerceptionRequest request, + void ForwardMediaPerceptionReceiver( + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver, content::RenderFrameHost* render_frame_host) override; private:
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc index bd35106..0bac26b 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -10,8 +10,8 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/policy/browser_dm_token_storage.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" @@ -34,7 +34,7 @@ namespace extensions { const base::Feature SafeBrowsingPrivateEventRouter::kRealtimeReportingFeature{ - "SafeBrowsingRealtimeReporting", base::FEATURE_ENABLED_BY_DEFAULT}; + "SafeBrowsingRealtimeReporting", base::FEATURE_DISABLED_BY_DEFAULT}; // Key names used with when building the dictionary to pass to the real-time // reporting API. @@ -417,11 +417,11 @@ return; // This method is not compiled on Chrome OS because - // MachineLevelUserCloudPolicyController does not exist. Also, + // ChromeBrowserCloudManagementController does not exist. Also, // policy::BrowserDMTokenStorage::Get()->RetrieveDMToken() doesn't return a // valid token either. Once these are fixed the #if !defined can be removed. - if (!policy::MachineLevelUserCloudPolicyController:: + if (!policy::ChromeBrowserCloudManagementController:: IsMachineLevelUserCloudPolicyEnabled()) { return; }
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 068ab0658..8f353f9 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -89,6 +89,7 @@ #include "extensions/test/result_catcher.h" #include "extensions/test/test_extension_dir.h" #include "google_apis/gaia/gaia_switches.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/dns/mock_host_resolver.h" #include "net/http/http_util.h" @@ -297,16 +298,17 @@ const char* expected_content_regular_window, const char* exptected_content_incognito_window); - network::mojom::URLLoaderFactoryPtr CreateURLLoaderFactory() { + mojo::PendingRemote<network::mojom::URLLoaderFactory> + CreateURLLoaderFactory() { network::mojom::URLLoaderFactoryParamsPtr params = network::mojom::URLLoaderFactoryParams::New(); params->process_id = network::mojom::kBrowserProcessId; params->is_corb_enabled = false; - network::mojom::URLLoaderFactoryPtr loader_factory; + mojo::PendingRemote<network::mojom::URLLoaderFactory> loader_factory; content::BrowserContext::GetDefaultStoragePartition(profile()) ->GetNetworkContext() - ->CreateURLLoaderFactory(mojo::MakeRequest(&loader_factory), - std::move(params)); + ->CreateURLLoaderFactory( + loader_factory.InitWithNewPipeAndPassReceiver(), std::move(params)); return loader_factory; } @@ -1745,20 +1747,22 @@ return; } - auto loader_factory = CreateURLLoaderFactory(); + mojo::Remote<network::mojom::URLLoaderFactory> loader_factory( + CreateURLLoaderFactory()); bool has_connection_error = false; - loader_factory.set_connection_error_handler( + loader_factory.set_disconnect_handler( base::BindLambdaForTesting([&]() { has_connection_error = true; })); InstallWebRequestExtension("extension1"); content::BrowserContext::GetDefaultStoragePartition(profile()) ->FlushNetworkInterfaceForTesting(); EXPECT_TRUE(has_connection_error); + loader_factory.reset(); // The second time there should be no connection error. - loader_factory = CreateURLLoaderFactory(); + loader_factory.Bind(CreateURLLoaderFactory()); has_connection_error = false; - loader_factory.set_connection_error_handler( + loader_factory.set_disconnect_handler( base::BindLambdaForTesting([&]() { has_connection_error = true; })); InstallWebRequestExtension("extension2"); content::BrowserContext::GetDefaultStoragePartition(profile())
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc index cd182798..c2d6230 100644 --- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc +++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -622,7 +622,7 @@ } // static -network::mojom::URLLoaderFactoryPtrInfo +mojo::PendingRemote<network::mojom::URLLoaderFactory> ChromeContentBrowserClientExtensionsPart:: CreateURLLoaderFactoryForNetworkRequests( content::RenderProcessHost* process,
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h index 6fe47f4..971c2d25 100644 --- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h +++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
@@ -13,6 +13,7 @@ #include "chrome/browser/chrome_content_browser_client_parts.h" #include "content/public/browser/browser_or_resource_context.h" #include "content/public/common/resource_type.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "ui/base/page_transition_types.h" @@ -86,7 +87,7 @@ static std::unique_ptr<content::VpnServiceProxy> GetVpnServiceProxy( content::BrowserContext* browser_context); - static network::mojom::URLLoaderFactoryPtrInfo + static mojo::PendingRemote<network::mojom::URLLoaderFactory> CreateURLLoaderFactoryForNetworkRequests( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context,
diff --git a/chrome/browser/extensions/chrome_extensions_interface_registration.cc b/chrome/browser/extensions/chrome_extensions_interface_registration.cc index 49922c9..52c76a1 100644 --- a/chrome/browser/extensions/chrome_extensions_interface_registration.cc +++ b/chrome/browser/extensions/chrome_extensions_interface_registration.cc
@@ -173,7 +173,7 @@ // as the BrowserProcessImpl. registry->AddInterface( base::BindRepeating(&extensions::MediaPerceptionAPIDelegate:: - ForwardMediaPerceptionRequest, + ForwardMediaPerceptionReceiver, base::Unretained(delegate))); } }
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc index c7a7a619..ea14707 100644 --- a/chrome/browser/extensions/extension_management.cc +++ b/chrome/browser/extensions/extension_management.cc
@@ -166,6 +166,17 @@ mode == INSTALLATION_ALLOWED; } +bool ExtensionManagement::IsInstallationExplicitlyBlocked( + const ExtensionId& id) const { + auto it = settings_by_id_.find(id); + // No settings explicitly specified for |id|. + if (it == settings_by_id_.end()) + return false; + // Checks if the extension is on the black list or removed list. + InstallationMode mode = it->second->installation_mode; + return mode == INSTALLATION_BLOCKED || mode == INSTALLATION_REMOVED; +} + bool ExtensionManagement::IsOffstoreInstallAllowed( const GURL& url, const GURL& referrer_url) const {
diff --git a/chrome/browser/extensions/extension_management.h b/chrome/browser/extensions/extension_management.h index 0633000..3d4b8a79 100644 --- a/chrome/browser/extensions/extension_management.h +++ b/chrome/browser/extensions/extension_management.h
@@ -112,6 +112,10 @@ // policy or not. bool IsInstallationExplicitlyAllowed(const ExtensionId& id) const; + // Returns if an extension with id |id| is explicitly blocked by enterprise + // policy or not. + bool IsInstallationExplicitlyBlocked(const ExtensionId& id) const; + // Returns true if an extension download should be allowed to proceed. bool IsOffstoreInstallAllowed(const GURL& url, const GURL& referrer_url) const;
diff --git a/chrome/browser/extensions/extension_management_unittest.cc b/chrome/browser/extensions/extension_management_unittest.cc index c23a23e..0f586cb 100644 --- a/chrome/browser/extensions/extension_management_unittest.cc +++ b/chrome/browser/extensions/extension_management_unittest.cc
@@ -43,6 +43,7 @@ const char kTargetExtension6[] = "fghijklmnopabcdefghijklmnopabcde"; const char kTargetExtension7[] = "ghijklmnopabcdefghijklmnopabcdef"; const char kTargetExtension8[] = "hijklmnopabcdefghijklmnopabcdefg"; +const char kTargetExtension9[] = "ijklmnopabcdefghijklmnopabcdefgh"; const char kExampleUpdateUrl[] = "http://example.com/update_url"; const char kNonExistingExtension[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; @@ -78,6 +79,9 @@ "ghijklmnopabcdefghijklmnopabcdef,hijklmnopabcdefghijklmnopabcdefg,": { "installation_mode": "allowed", }, + "ijklmnopabcdefghijklmnopabcdefgh": { + "installation_mode": "removed", + }, "update_url:http://example.com/update_url": { "installation_mode": "allowed", "blocked_permissions": ["fileSystem", "bookmarks"], @@ -820,6 +824,7 @@ const char* forced = kTargetExtension2; const char* recommended = kTargetExtension3; const char* blocked = kTargetExtension4; + const char* removed = kTargetExtension9; const char* not_specified = kNonExistingExtension; // BlacklistedByDefault() is true in example preference. @@ -828,14 +833,13 @@ EXPECT_TRUE( extension_management_->IsInstallationExplicitlyAllowed(recommended)); EXPECT_FALSE(extension_management_->IsInstallationExplicitlyAllowed(blocked)); + EXPECT_FALSE(extension_management_->IsInstallationExplicitlyAllowed(removed)); EXPECT_FALSE( extension_management_->IsInstallationExplicitlyAllowed(not_specified)); - { - // Set BlacklistedByDefault() to false. - PrefUpdater pref(pref_service_); - pref.SetBlacklistedByDefault(false); - } + // Set BlacklistedByDefault() to false. + PrefUpdater pref(pref_service_); + pref.SetBlacklistedByDefault(false); // The result should remain the same. EXPECT_TRUE(extension_management_->IsInstallationExplicitlyAllowed(allowed)); @@ -843,10 +847,46 @@ EXPECT_TRUE( extension_management_->IsInstallationExplicitlyAllowed(recommended)); EXPECT_FALSE(extension_management_->IsInstallationExplicitlyAllowed(blocked)); + EXPECT_FALSE(extension_management_->IsInstallationExplicitlyAllowed(removed)); EXPECT_FALSE( extension_management_->IsInstallationExplicitlyAllowed(not_specified)); } +TEST_F(ExtensionManagementServiceTest, IsInstallationExplicitlyBlocked) { + SetExampleDictPref(kExampleDictPreference); + + // Constant name indicates the installation_mode of extensions in example + // preference. + const char* allowed = kTargetExtension; + const char* forced = kTargetExtension2; + const char* recommended = kTargetExtension3; + const char* blocked = kTargetExtension4; + const char* removed = kTargetExtension9; + const char* not_specified = kNonExistingExtension; + + // BlacklistedByDefault() is true in example preference. + EXPECT_FALSE(extension_management_->IsInstallationExplicitlyBlocked(allowed)); + EXPECT_FALSE(extension_management_->IsInstallationExplicitlyBlocked(forced)); + EXPECT_FALSE( + extension_management_->IsInstallationExplicitlyBlocked(recommended)); + EXPECT_TRUE(extension_management_->IsInstallationExplicitlyBlocked(blocked)); + EXPECT_TRUE(extension_management_->IsInstallationExplicitlyBlocked(removed)); + EXPECT_FALSE( + extension_management_->IsInstallationExplicitlyBlocked(not_specified)); + + PrefUpdater pref(pref_service_); + pref.SetBlacklistedByDefault(false); + + EXPECT_FALSE(extension_management_->IsInstallationExplicitlyBlocked(allowed)); + EXPECT_FALSE(extension_management_->IsInstallationExplicitlyBlocked(forced)); + EXPECT_FALSE( + extension_management_->IsInstallationExplicitlyBlocked(recommended)); + EXPECT_TRUE(extension_management_->IsInstallationExplicitlyBlocked(blocked)); + EXPECT_TRUE(extension_management_->IsInstallationExplicitlyBlocked(removed)); + EXPECT_FALSE( + extension_management_->IsInstallationExplicitlyBlocked(not_specified)); +} + #if !defined(OS_CHROMEOS) TEST_F(ExtensionManagementServiceTest, CloudReportingEnabledPolicy) { // Enables the policy put the extension into forced list.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 2321237..3adc346c 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -3282,7 +3282,7 @@ { "name": "treat-unsafe-downloads-as-active-content", "owners": [ "jdeblasio", "cthomp" ], - "expiry_milestone": 79 + "expiry_milestone": 82 }, { "name": "trim-on-all-frames-frozen",
diff --git a/chrome/browser/lookalikes/safety_tips/local_heuristics.cc b/chrome/browser/lookalikes/safety_tips/local_heuristics.cc index 7ee49fd..6cc9798d 100644 --- a/chrome/browser/lookalikes/safety_tips/local_heuristics.cc +++ b/chrome/browser/lookalikes/safety_tips/local_heuristics.cc
@@ -13,6 +13,10 @@ namespace { +using MatchType = LookalikeUrlInterstitialPage::MatchType; + +const base::FeatureParam<bool> kEnableLookalikeTopSites{ + &security_state::features::kSafetyTipUI, "topsites", false}; const base::FeatureParam<bool> kEnableLookalikeEditDistance{ &security_state::features::kSafetyTipUI, "editdistance", false}; const base::FeatureParam<bool> kEnableLookalikeEditDistanceSiteEngagement{ @@ -29,7 +33,7 @@ const std::vector<lookalikes::DomainInfo>& engaged_sites, GURL* safe_url) { std::string matched_domain; - LookalikeUrlInterstitialPage::MatchType match_type; + MatchType match_type; if (!lookalikes::LookalikeUrlNavigationThrottle::GetMatchingDomain( navigated_domain, engaged_sites, &matched_domain, &match_type)) { @@ -44,16 +48,23 @@ *safe_url = GURL(std::string(url::kHttpScheme) + url::kStandardSchemeSeparator + matched_domain); - // Edit distance has higher false positives, so it gets its own feature param - if (match_type == LookalikeUrlInterstitialPage::MatchType::kEditDistance) { - return kEnableLookalikeEditDistance.Get(); - } - if (match_type == - LookalikeUrlInterstitialPage::MatchType::kEditDistanceSiteEngagement) { - return kEnableLookalikeEditDistanceSiteEngagement.Get(); + switch (match_type) { + case MatchType::kTopSite: + return kEnableLookalikeTopSites.Get(); + case MatchType::kEditDistance: + return kEnableLookalikeEditDistance.Get(); + case MatchType::kEditDistanceSiteEngagement: + return kEnableLookalikeEditDistanceSiteEngagement.Get(); + case MatchType::kSiteEngagement: + // ShouldDisplayInterstitial always returns true on kSiteEngagement (i.e. + // an interstitial is always shown for this form of lookalike), so no + // Safety Tip is ever shown. + case MatchType::kNone: + NOTREACHED(); } - return true; + NOTREACHED(); + return false; } bool ShouldTriggerSafetyTipFromKeywordInURL(
diff --git a/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc b/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc index b0cfd80..1de3528 100644 --- a/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc +++ b/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc
@@ -79,7 +79,8 @@ return; } - last_navigation_safety_tip_status_ = security_state::SafetyTipStatus::kNone; + last_navigation_safety_tip_info_ = {security_state::SafetyTipStatus::kNone, + GURL()}; last_safety_tip_navigation_entry_id_ = 0; MaybeShowSafetyTip(); @@ -90,15 +91,16 @@ MaybeShowSafetyTip(); } -security_state::SafetyTipStatus -ReputationWebContentsObserver::GetSafetyTipStatusForVisibleNavigation() const { +security_state::SafetyTipInfo +ReputationWebContentsObserver::GetSafetyTipInfoForVisibleNavigation() const { content::NavigationEntry* entry = web_contents()->GetController().GetVisibleEntry(); if (!entry) - return security_state::SafetyTipStatus::kUnknown; + return {security_state::SafetyTipStatus::kUnknown, GURL()}; return last_safety_tip_navigation_entry_id_ == entry->GetUniqueID() - ? last_navigation_safety_tip_status_ - : security_state::SafetyTipStatus::kNone; + ? last_navigation_safety_tip_info_ + : security_state::SafetyTipInfo( + {security_state::SafetyTipStatus::kNone, GURL()}); } void ReputationWebContentsObserver::RegisterReputationCheckCallbackForTesting( @@ -110,7 +112,10 @@ content::WebContents* web_contents) : WebContentsObserver(web_contents), profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), - weak_factory_(this) {} + weak_factory_(this) { + last_navigation_safety_tip_info_ = {security_state::SafetyTipStatus::kNone, + GURL()}; +} void ReputationWebContentsObserver::MaybeShowSafetyTip() { if (web_contents()->GetMainFrame()->GetVisibilityState() != @@ -154,7 +159,8 @@ // Set this field independent of whether the feature to show the UI is // enabled/disabled. Metrics code uses this field and we want to record // metrics regardless of the feature being enabled/disabled. - last_navigation_safety_tip_status_ = safety_tip_status; + last_navigation_safety_tip_info_ = {safety_tip_status, suggested_url}; + // A navigation entry should always exist because reputation checks are only // triggered when a committed navigation finishes. last_safety_tip_navigation_entry_id_ =
diff --git a/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.h b/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.h index d3fcd62..859675b 100644 --- a/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.h +++ b/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.h
@@ -36,11 +36,10 @@ content::NavigationHandle* navigation_handle) override; void OnVisibilityChanged(content::Visibility visibility) override; - // Returns the type of the Safety Tip (if any) that was assigned to the + // Returns the info about the Safety Tip (if any) that was assigned to the // currently visible navigation entry. This field will be set even if the UI // was not actually shown because the feature was disabled. - security_state::SafetyTipStatus GetSafetyTipStatusForVisibleNavigation() - const; + security_state::SafetyTipInfo GetSafetyTipInfoForVisibleNavigation() const; // Allows tests to register a callback to be called when the next reputation // check finishes. @@ -67,12 +66,12 @@ void MaybeCallReputationCheckCallback(); Profile* profile_; - // Used to cache the last safety tip type (and associated navigation entry ID) + // Used to cache the last safety tip info (and associated navigation entry ID) // so that Page Info can fetch this information without performing a - // reputation check. Resets to kNone on new top frame navigations. Set even if - // the feature to show the UI is disabled. - security_state::SafetyTipStatus last_navigation_safety_tip_status_ = - security_state::SafetyTipStatus::kNone; + // reputation check. Resets type to kNone and safe_url to empty on new top + // frame navigations. Set even if the feature to show the UI is disabled. + security_state::SafetyTipInfo last_navigation_safety_tip_info_; + int last_safety_tip_navigation_entry_id_ = 0; base::OnceClosure reputation_check_callback_for_testing_;
diff --git a/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc b/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc index 20ac19c35..42edfb2 100644 --- a/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc +++ b/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc
@@ -27,7 +27,7 @@ base::UmaHistogramEnumeration( security_state::GetSafetyTipHistogramName( "Security.SafetyTips.Interaction", - helper->GetVisibleSecurityState()->safety_tip_status), + helper->GetVisibleSecurityState()->safety_tip_info.status), interaction); }
diff --git a/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc b/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc index f29fe01..6e7557f 100644 --- a/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc +++ b/chrome/browser/media/router/discovery/dial/dial_url_fetcher.cc
@@ -12,6 +12,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/load_flags.h" #include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" @@ -164,15 +165,15 @@ // Bind the request to the system URLLoaderFactory obtained on UI thread. // Currently this is the only way to guarantee a live URLLoaderFactory. // TOOD(mmenke): Figure out a way to do this transparently on IO thread. - network::mojom::URLLoaderFactoryPtr loader_factory; + mojo::Remote<network::mojom::URLLoaderFactory> loader_factory; // TODO(https://crbug.com/823869): Fix DeviceDescriptionServiceTest and remove // this conditional. - auto mojo_request = mojo::MakeRequest(&loader_factory); + auto mojo_receiver = loader_factory.BindNewPipeAndPassReceiver(); if (content::BrowserThread::IsThreadInitialized(content::BrowserThread::UI)) { base::PostTask(FROM_HERE, {content::BrowserThread::UI}, base::BindOnce(&BindURLLoaderFactoryReceiverOnUIThread, - std::move(mojo_request))); + std::move(mojo_receiver))); } loader_->DownloadToString(
diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc index 13f8c014..2e7f1e11 100644 --- a/chrome/browser/media/router/media_router_feature.cc +++ b/chrome/browser/media/router/media_router_feature.cc
@@ -32,7 +32,7 @@ #if !defined(OS_ANDROID) // Controls if browser side DialMediaRouteProvider is enabled. const base::Feature kDialMediaRouteProvider{"DialMediaRouteProvider", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Controls if browser side Cast device discovery is enabled. const base::Feature kEnableCastDiscovery{"EnableCastDiscovery",
diff --git a/chrome/browser/media/router/mojo/media_router_desktop_unittest.cc b/chrome/browser/media/router/mojo/media_router_desktop_unittest.cc index 27805e68..47663246 100644 --- a/chrome/browser/media/router/mojo/media_router_desktop_unittest.cc +++ b/chrome/browser/media/router/mojo/media_router_desktop_unittest.cc
@@ -67,11 +67,17 @@ std::unique_ptr<MediaRouterMojoImpl> CreateMediaRouter() override { std::unique_ptr<MockCastMediaSinkService> cast_media_sink_service; if (enable_cast_discovery) { - feature_list_.InitWithFeatures({kEnableCastDiscovery}, {}); + // We disable the DIAL MRP because initializing the DIAL MRP requires + // initialization of objects it depends on, which is outside the scope of + // this unit test. DIAL MRP initialization is covered by Media Router + // browser tests. + feature_list_.InitWithFeatures({kEnableCastDiscovery}, + {kDialMediaRouteProvider}); cast_media_sink_service = std::make_unique<MockCastMediaSinkService>(); cast_media_sink_service_ = cast_media_sink_service.get(); } else { - feature_list_.InitWithFeatures({}, {kEnableCastDiscovery}); + feature_list_.InitWithFeatures( + {}, {kEnableCastDiscovery, kDialMediaRouteProvider}); } media_sink_service_ = std::unique_ptr<DualMediaSinkService>(
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_perf.cc b/chrome/browser/media/webrtc/webrtc_browsertest_perf.cc index 9a61637..4d9140f 100644 --- a/chrome/browser/media/webrtc/webrtc_browsertest_perf.cc +++ b/chrome/browser/media/webrtc/webrtc_browsertest_perf.cc
@@ -9,106 +9,7 @@ #include "base/strings/stringprintf.h" #include "base/values.h" #include "chrome/test/base/in_process_browser_test.h" -#include "testing/perf/perf_result_reporter.h" - -namespace { - -constexpr char kMetricPrefixAudioReceive[] = "WebRtcAudioReceive."; -constexpr char kMetricPrefixAudioSend[] = "WebRtcAudioSend."; -constexpr char kMetricPrefixVideoSend[] = "WebRtcVideoSend."; -constexpr char kMetricPrefixVideoRecieve[] = "WebRtcVideoReceive."; -constexpr char kMetricPrefixBwe[] = "WebRtcBwe."; -constexpr char kMetricPacketsLostFrames[] = "packets_lost"; -constexpr char kMetricGoogJitterRecvMs[] = "goog_jitter_recv"; -constexpr char kMetricGoogExpandRatePercent[] = "goog_expand_rate"; -constexpr char kMetricGoogSpeechExpandRatePercent[] = "goog_speech_expand_rate"; -constexpr char kMetricGoogSecondaryDecodeRatePercent[] = - "goog_secondary_decode_rate"; -constexpr char kMetricGoogRttMs[] = "goog_rtt"; -constexpr char kMetricPacketsPerSecondPackets[] = "packets_per_second"; -constexpr char kMetricGoogFpsSentFps[] = "goog_frame_rate_sent"; -constexpr char kMetricGoogFpsInputFps[] = "goog_frame_rate_input"; -constexpr char kMetricGoogFirsReceivedUnitless[] = "goog_firs_recv"; -constexpr char kMetricGoogNacksReceivedUnitless[] = "goog_nacks_recv"; -constexpr char kMetricGoogFrameWidthCount[] = "goog_frame_width"; -constexpr char kMetricGoogFrameHeightCount[] = "goog_frame_height"; -constexpr char kMetricGoogAvgEncodeMs[] = "goog_avg_encode"; -constexpr char kMetricGoogEncodeCpuUsagePercent[] = "goog_encode_cpu_usage"; -constexpr char kMetricGoogFpsRecvFps[] = "goog_frame_rate_recv"; -constexpr char kMetricGoogFpsOutputFps[] = "goog_frame_rate_output"; -constexpr char kMetricGoogActualDelayMs[] = "goog_actual_delay"; -constexpr char kMetricGoogTargetDelayMs[] = "goog_target_delay"; -constexpr char kMetricGoogDecodeTimeMs[] = "goog_decode_time"; -constexpr char kMetricGoogMaxDecodeTimeMs[] = "goog_max_decode_time"; -constexpr char kMetricGoogJitterBufferMs[] = "goog_jitter_buffer"; -constexpr char kMetricGoogRenderDelayMs[] = "goog_render_delay"; -constexpr char kMetricAvailableSendBandwidthBitsPerS[] = "available_send_bw"; -constexpr char kMetricAvailableRecvBandwidthBitsPerS[] = "available_recv_bw"; -constexpr char kMetricTargetEncodeBitrateBitsPerS[] = "target_encode_bitrate"; -constexpr char kMetricActualEncodeBitrateBitsPerS[] = "actual_encode_bitrate"; -constexpr char kMetricTransmitBitrateBitsPerS[] = "transmit_bitrate"; - -perf_test::PerfResultReporter SetUpAudioReceiveReporter( - const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixAudioReceive, story); - reporter.RegisterFyiMetric(kMetricPacketsLostFrames, "frames"); - reporter.RegisterFyiMetric(kMetricGoogJitterRecvMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogExpandRatePercent, "%"); - reporter.RegisterFyiMetric(kMetricGoogSpeechExpandRatePercent, "%"); - reporter.RegisterFyiMetric(kMetricGoogSecondaryDecodeRatePercent, "%"); - return reporter; -} - -perf_test::PerfResultReporter SetUpAudioSendReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixAudioSend, story); - reporter.RegisterFyiMetric(kMetricGoogJitterRecvMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogRttMs, "ms"); - reporter.RegisterFyiMetric(kMetricPacketsPerSecondPackets, "packets"); - return reporter; -} - -perf_test::PerfResultReporter SetUpVideoSendReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixVideoSend, story); - reporter.RegisterFyiMetric(kMetricGoogFpsSentFps, "fps"); - reporter.RegisterFyiMetric(kMetricGoogFpsInputFps, "fps"); - reporter.RegisterFyiMetric(kMetricGoogFirsReceivedUnitless, "unitless"); - reporter.RegisterFyiMetric(kMetricGoogNacksReceivedUnitless, "unitless"); - reporter.RegisterFyiMetric(kMetricGoogFrameWidthCount, "count"); - reporter.RegisterFyiMetric(kMetricGoogFrameHeightCount, "count"); - reporter.RegisterFyiMetric(kMetricGoogAvgEncodeMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogRttMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogEncodeCpuUsagePercent, "%"); - return reporter; -} - -perf_test::PerfResultReporter SetUpVideoReceiveReporter( - const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixVideoRecieve, story); - reporter.RegisterFyiMetric(kMetricGoogFpsRecvFps, "fps"); - reporter.RegisterFyiMetric(kMetricGoogFpsOutputFps, "fps"); - reporter.RegisterFyiMetric(kMetricPacketsLostFrames, "frames"); - reporter.RegisterFyiMetric(kMetricGoogFrameWidthCount, "count"); - reporter.RegisterFyiMetric(kMetricGoogFrameHeightCount, "count"); - reporter.RegisterFyiMetric(kMetricGoogActualDelayMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogTargetDelayMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogDecodeTimeMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogMaxDecodeTimeMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogJitterBufferMs, "ms"); - reporter.RegisterFyiMetric(kMetricGoogRenderDelayMs, "ms"); - return reporter; -} - -perf_test::PerfResultReporter SetUpBweReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixBwe, story); - reporter.RegisterFyiMetric(kMetricAvailableSendBandwidthBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricAvailableRecvBandwidthBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricTargetEncodeBitrateBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricActualEncodeBitrateBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricTransmitBitrateBitsPerS, "bits/s"); - return reporter; -} - -} // namespace +#include "testing/perf/perf_test.h" static std::string Statistic(const std::string& statistic, const std::string& bucket) { @@ -122,53 +23,59 @@ } static void MaybePrintResultsForAudioReceive( - const std::string& ssrc, - const base::DictionaryValue& pc_dict, - const std::string& story) { + const std::string& ssrc, const base::DictionaryValue& pc_dict, + const std::string& modifier) { std::string value; if (!pc_dict.GetString(Statistic("audioOutputLevel", ssrc), &value)) { // Not an audio receive stream. return; } - auto reporter = SetUpAudioReceiveReporter(story); EXPECT_TRUE(pc_dict.GetString(Statistic("packetsLost", ssrc), &value)); - reporter.AddResult(kMetricPacketsLostFrames, value); + perf_test::PrintResult( + "audio_misc", modifier, "packets_lost", value, "frames", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googJitterReceived", ssrc), &value)); - reporter.AddResult(kMetricGoogJitterRecvMs, value); + perf_test::PrintResult( + "audio_rx", modifier, "goog_jitter_recv", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googExpandRate", ssrc), &value)); - reporter.AddResult(kMetricGoogExpandRatePercent, value); + perf_test::PrintResult( + "audio_rates", modifier, "goog_expand_rate", value, "%", false); EXPECT_TRUE( pc_dict.GetString(Statistic("googSpeechExpandRate", ssrc), &value)); - reporter.AddResult(kMetricGoogSpeechExpandRatePercent, value); + perf_test::PrintResult( + "audio_rates", modifier, "goog_speech_expand_rate", value, "%", false); EXPECT_TRUE( pc_dict.GetString(Statistic("googSecondaryDecodedRate", ssrc), &value)); - reporter.AddResult(kMetricGoogSecondaryDecodeRatePercent, value); + perf_test::PrintResult( + "audio_rates", modifier, "goog_secondary_decoded_rate", value, "%", + false); } -static void MaybePrintResultsForAudioSend(const std::string& ssrc, - const base::DictionaryValue& pc_dict, - const std::string& story) { +static void MaybePrintResultsForAudioSend( + const std::string& ssrc, const base::DictionaryValue& pc_dict, + const std::string& modifier) { std::string value; if (!pc_dict.GetString(Statistic("audioInputLevel", ssrc), &value)) { // Not an audio send stream. return; } - auto reporter = SetUpAudioSendReporter(story); EXPECT_TRUE(pc_dict.GetString(Statistic("googJitterReceived", ssrc), &value)); - reporter.AddResult(kMetricGoogJitterRecvMs, value); + perf_test::PrintResult( + "audio_tx", modifier, "goog_jitter_recv", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googRtt", ssrc), &value)); - reporter.AddResult(kMetricGoogRttMs, value); + perf_test::PrintResult( + "audio_tx", modifier, "goog_rtt", value, "ms", false); EXPECT_TRUE( pc_dict.GetString(Statistic("packetsSentPerSecond", ssrc), &value)); - reporter.AddResult(kMetricPacketsPerSecondPackets, value); + perf_test::PrintResult("audio_tx", modifier, "packets_sent_per_second", value, + "packets", false); } -static void MaybePrintResultsForVideoSend(const std::string& ssrc, - const base::DictionaryValue& pc_dict, - const std::string& story) { +static void MaybePrintResultsForVideoSend( + const std::string& ssrc, const base::DictionaryValue& pc_dict, + const std::string& modifier) { std::string value; if (!pc_dict.GetString(Statistic("googFrameRateSent", ssrc), &value)) { // Not a video send stream. @@ -178,70 +85,86 @@ // Graph these by unit: the dashboard expects all stats in one graph to have // the same unit (e.g. ms, fps, etc). Most graphs, like video_fps, will also // be populated by the counterparts on the video receiving side. - auto reporter = SetUpVideoSendReporter(story); - reporter.AddResult(kMetricGoogFpsSentFps, value); + perf_test::PrintResult( + "video_fps", modifier, "goog_frame_rate_sent", value, "fps", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googFrameRateInput", ssrc), &value)); - reporter.AddResult(kMetricGoogFpsInputFps, value); + perf_test::PrintResult( + "video_fps", modifier, "goog_frame_rate_input", value, "fps", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googFirsReceived", ssrc), &value)); - reporter.AddResult(kMetricGoogFirsReceivedUnitless, value); + perf_test::PrintResult( + "video_misc", modifier, "goog_firs_recv", value, "", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googNacksReceived", ssrc), &value)); - reporter.AddResult(kMetricGoogNacksReceivedUnitless, value); + perf_test::PrintResult( + "video_misc", modifier, "goog_nacks_recv", value, "", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googFrameWidthSent", ssrc), &value)); - reporter.AddResult(kMetricGoogFrameWidthCount, value); + perf_test::PrintResult("video_resolution", modifier, "goog_frame_width_sent", + value, "pixels", false); EXPECT_TRUE( pc_dict.GetString(Statistic("googFrameHeightSent", ssrc), &value)); - reporter.AddResult(kMetricGoogFrameHeightCount, value); + perf_test::PrintResult("video_resolution", modifier, "goog_frame_height_sent", + value, "pixels", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googAvgEncodeMs", ssrc), &value)); - reporter.AddResult(kMetricGoogAvgEncodeMs, value); + perf_test::PrintResult( + "video_tx", modifier, "goog_avg_encode_ms", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googRtt", ssrc), &value)); - reporter.AddResult(kMetricGoogRttMs, value); + perf_test::PrintResult("video_tx", modifier, "goog_rtt", value, "ms", false); EXPECT_TRUE(pc_dict.GetString( Statistic("googEncodeUsagePercent", ssrc), &value)); - reporter.AddResult(kMetricGoogEncodeCpuUsagePercent, value); + perf_test::PrintResult("video_cpu_usage", modifier, + "goog_encode_usage_percent", value, "%", false); } static void MaybePrintResultsForVideoReceive( - const std::string& ssrc, - const base::DictionaryValue& pc_dict, - const std::string& story) { + const std::string& ssrc, const base::DictionaryValue& pc_dict, + const std::string& modifier) { std::string value; if (!pc_dict.GetString(Statistic("googFrameRateReceived", ssrc), &value)) { // Not a video receive stream. return; } - auto reporter = SetUpVideoReceiveReporter(story); - reporter.AddResult(kMetricGoogFpsRecvFps, value); + perf_test::PrintResult( + "video_fps", modifier, "goog_frame_rate_recv", value, "fps", false); EXPECT_TRUE( pc_dict.GetString(Statistic("googFrameRateOutput", ssrc), &value)); - reporter.AddResult(kMetricGoogFpsOutputFps, value); + perf_test::PrintResult( + "video_fps", modifier, "goog_frame_rate_output", value, "fps", false); EXPECT_TRUE(pc_dict.GetString(Statistic("packetsLost", ssrc), &value)); - reporter.AddResult(kMetricPacketsLostFrames, value); + perf_test::PrintResult("video_misc", modifier, "packets_lost", value, + "frames", false); EXPECT_TRUE( pc_dict.GetString(Statistic("googFrameWidthReceived", ssrc), &value)); - reporter.AddResult(kMetricGoogFrameWidthCount, value); + perf_test::PrintResult("video_resolution", modifier, "goog_frame_width_recv", + value, "pixels", false); EXPECT_TRUE( pc_dict.GetString(Statistic("googFrameHeightReceived", ssrc), &value)); - reporter.AddResult(kMetricGoogFrameHeightCount, value); + perf_test::PrintResult("video_resolution", modifier, "goog_frame_height_recv", + value, "pixels", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googCurrentDelayMs", ssrc), &value)); - reporter.AddResult(kMetricGoogActualDelayMs, value); + perf_test::PrintResult( + "video_rx", modifier, "goog_current_delay_ms", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googTargetDelayMs", ssrc), &value)); - reporter.AddResult(kMetricGoogTargetDelayMs, value); + perf_test::PrintResult( + "video_rx", modifier, "goog_target_delay_ms", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googDecodeMs", ssrc), &value)); - reporter.AddResult(kMetricGoogDecodeTimeMs, value); + perf_test::PrintResult("video_rx", modifier, "goog_decode_ms", value, "ms", + false); EXPECT_TRUE(pc_dict.GetString(Statistic("googMaxDecodeMs", ssrc), &value)); - reporter.AddResult(kMetricGoogMaxDecodeTimeMs, value); + perf_test::PrintResult( + "video_rx", modifier, "goog_max_decode_ms", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googJitterBufferMs", ssrc), &value)); - reporter.AddResult(kMetricGoogJitterBufferMs, value); + perf_test::PrintResult( + "video_rx", modifier, "goog_jitter_buffer_ms", value, "ms", false); EXPECT_TRUE(pc_dict.GetString(Statistic("googRenderDelayMs", ssrc), &value)); - reporter.AddResult(kMetricGoogRenderDelayMs, value); + perf_test::PrintResult( + "video_rx", modifier, "goog_render_delay_ms", value, "ms", false); } static std::string ExtractSsrcIdentifier(const std::string& key) { @@ -272,26 +195,30 @@ void PrintBweForVideoMetrics(const base::DictionaryValue& pc_dict, const std::string& modifier, const std::string& video_codec) { - std::string story = video_codec.empty() ? "baseline_story" : video_codec; - story += modifier; + std::string video_modifier = + video_codec.empty() ? modifier : modifier + "_" + video_codec; const std::string kBweStatsKey = "bweforvideo"; std::string value; - auto reporter = SetUpBweReporter(story); ASSERT_TRUE(pc_dict.GetString( Statistic("googAvailableSendBandwidth", kBweStatsKey), &value)); - reporter.AddResult(kMetricAvailableSendBandwidthBitsPerS, value); + perf_test::PrintResult("bwe_stats", video_modifier, "available_send_bw", + value, "bit/s", false); ASSERT_TRUE(pc_dict.GetString( Statistic("googAvailableReceiveBandwidth", kBweStatsKey), &value)); - reporter.AddResult(kMetricAvailableRecvBandwidthBitsPerS, value); + perf_test::PrintResult("bwe_stats", video_modifier, "available_recv_bw", + value, "bit/s", false); ASSERT_TRUE(pc_dict.GetString( Statistic("googTargetEncBitrate", kBweStatsKey), &value)); - reporter.AddResult(kMetricTargetEncodeBitrateBitsPerS, value); + perf_test::PrintResult("bwe_stats", video_modifier, "target_enc_bitrate", + value, "bit/s", false); ASSERT_TRUE(pc_dict.GetString( Statistic("googActualEncBitrate", kBweStatsKey), &value)); - reporter.AddResult(kMetricActualEncodeBitrateBitsPerS, value); + perf_test::PrintResult("bwe_stats", video_modifier, "actual_enc_bitrate", + value, "bit/s", false); ASSERT_TRUE(pc_dict.GetString( Statistic("googTransmitBitrate", kBweStatsKey), &value)); - reporter.AddResult(kMetricTransmitBitrateBitsPerS, value); + perf_test::PrintResult("bwe_stats", video_modifier, "transmit_bitrate", value, + "bit/s", false); } void PrintMetricsForAllStreams(const base::DictionaryValue& pc_dict, @@ -304,8 +231,8 @@ void PrintMetricsForSendStreams(const base::DictionaryValue& pc_dict, const std::string& modifier, const std::string& video_codec) { - std::string story = video_codec.empty() ? "baseline_story" : video_codec; - story += modifier; + std::string video_modifier = + video_codec.empty() ? modifier : modifier + "_" + video_codec; const base::DictionaryValue* stats_dict; ASSERT_TRUE(pc_dict.GetDictionary("stats", &stats_dict)); std::set<std::string> ssrc_identifiers = FindAllSsrcIdentifiers(*stats_dict); @@ -313,16 +240,16 @@ auto ssrc_iterator = ssrc_identifiers.begin(); for (; ssrc_iterator != ssrc_identifiers.end(); ++ssrc_iterator) { const std::string& ssrc = *ssrc_iterator; - MaybePrintResultsForAudioSend(ssrc, pc_dict, story); - MaybePrintResultsForVideoSend(ssrc, pc_dict, story); + MaybePrintResultsForAudioSend(ssrc, pc_dict, modifier); + MaybePrintResultsForVideoSend(ssrc, pc_dict, video_modifier); } } void PrintMetricsForRecvStreams(const base::DictionaryValue& pc_dict, const std::string& modifier, const std::string& video_codec) { - std::string story = video_codec.empty() ? "baseline_story" : video_codec; - story += modifier; + std::string video_modifier = + video_codec.empty() ? modifier : modifier + "_" + video_codec; const base::DictionaryValue* stats_dict; ASSERT_TRUE(pc_dict.GetDictionary("stats", &stats_dict)); std::set<std::string> ssrc_identifiers = FindAllSsrcIdentifiers(*stats_dict); @@ -330,8 +257,8 @@ auto ssrc_iterator = ssrc_identifiers.begin(); for (; ssrc_iterator != ssrc_identifiers.end(); ++ssrc_iterator) { const std::string& ssrc = *ssrc_iterator; - MaybePrintResultsForAudioReceive(ssrc, pc_dict, story); - MaybePrintResultsForVideoReceive(ssrc, pc_dict, story); + MaybePrintResultsForAudioReceive(ssrc, pc_dict, modifier); + MaybePrintResultsForVideoReceive(ssrc, pc_dict, video_modifier); } }
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc index 17f542e..b095a44 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
@@ -16,6 +16,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/load_flags.h" #include "net/base/mime_util.h" #include "net/http/http_status_code.h" @@ -280,10 +281,11 @@ // Create a new mojo pipe. It's safe to pass this around and use // immediately, even though it needs to finish initialization on the UI // thread. - network::mojom::URLLoaderFactoryPtr url_loader_factory_ptr; - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(BindURLLoaderFactoryReceiver, - mojo::MakeRequest(&url_loader_factory_ptr))); + mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_remote; + base::PostTask( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(BindURLLoaderFactoryReceiver, + url_loader_factory_remote.BindNewPipeAndPassReceiver())); url_loader_ = network::SimpleURLLoader::Create( std::move(resource_request), kWebrtcEventLogUploaderTrafficAnnotation); @@ -294,7 +296,7 @@ // See comment in destructor for an explanation about why using // base::Unretained(this) is safe here. url_loader_->DownloadToString( - url_loader_factory_ptr.get(), + url_loader_factory_remote.get(), base::BindOnce(&WebRtcEventLogUploaderImpl::OnURLLoadComplete, base::Unretained(this)), kWebRtcEventLogMaxUploadIdBytes);
diff --git a/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc index 049fc2ce..133b9fa 100644 --- a/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
@@ -14,7 +14,7 @@ #include "chrome/browser/media/webrtc/webrtc_browsertest_common.h" #include "content/public/common/content_switches.h" #include "media/base/media_switches.h" -#include "testing/perf/perf_result_reporter.h" +#include "testing/perf/perf_test.h" #include "third_party/blink/public/common/features.h" namespace content { @@ -26,35 +26,6 @@ const char kInboundRtp[] = "inbound-rtp"; const char kOutboundRtp[] = "outbound-rtp"; -constexpr int kBitsPerByte = 8; - -constexpr char kMetricPrefixAudioStats[] = "WebRtcAudioStats."; -constexpr char kMetricPrefixVideoStats[] = "WebRtcVideoStats."; -constexpr char kMetricPrefixGetStats[] = "WebRtcGetStats."; -constexpr char kMetricSendRateBitsPerS[] = "send_rate"; -constexpr char kMetricReceiveRateBitsPerS[] = "receive_rate"; -constexpr char kMetricInvocationTimeMs[] = "invocation_time"; - -perf_test::PerfResultReporter SetUpAudioReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixAudioStats, story); - reporter.RegisterFyiMetric(kMetricSendRateBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricReceiveRateBitsPerS, "bits/s"); - return reporter; -} - -perf_test::PerfResultReporter SetUpVideoReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixVideoStats, story); - reporter.RegisterFyiMetric(kMetricSendRateBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricReceiveRateBitsPerS, "bits/s"); - return reporter; -} - -perf_test::PerfResultReporter SetUpGetStatsReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixGetStats, story); - reporter.RegisterFyiMetric(kMetricInvocationTimeMs, "ms"); - return reporter; -} - enum class GetStatsVariation { PROMISE_BASED, CALLBACK_BASED @@ -229,11 +200,13 @@ (audio_bytes_received_after - audio_bytes_received_before) / measure_duration_seconds; - auto reporter = SetUpAudioReporter(audio_codec); - reporter.AddResult(kMetricSendRateBitsPerS, - audio_send_rate * kBitsPerByte); - reporter.AddResult(kMetricReceiveRateBitsPerS, - audio_receive_rate * kBitsPerByte); + std::string audio_codec_modifier = "_" + audio_codec; + perf_test::PrintResult( + "audio", audio_codec_modifier, "send_rate", audio_send_rate, + "bytes/second", false); + perf_test::PrintResult( + "audio", audio_codec_modifier, "receive_rate", audio_receive_rate, + "bytes/second", false); } if (video_codec != kUseDefaultVideoCodec) { double video_bytes_sent_after = GetVideoBytesSent(report.get()); @@ -246,14 +219,15 @@ (video_bytes_received_after - video_bytes_received_before) / measure_duration_seconds; - std::string story = - (video_codec_print_modifier.empty() ? video_codec - : video_codec_print_modifier); - auto reporter = SetUpVideoReporter(story); - reporter.AddResult(kMetricSendRateBitsPerS, - video_send_rate * kBitsPerByte); - reporter.AddResult(kMetricReceiveRateBitsPerS, - video_receive_rate * kBitsPerByte); + std::string video_codec_modifier = + "_" + (video_codec_print_modifier.empty() + ? video_codec + : video_codec_print_modifier); + perf_test::PrintResult("video", video_codec_modifier, "send_rate", + video_send_rate, "bytes/second", false); + perf_test::PrintResult( + "video", video_codec_modifier, "receive_rate", video_receive_rate, + "bytes/second", false); } EndCall(); @@ -278,9 +252,14 @@ MeasureGetStatsCallbackPerformance(right_tab_)) / 2.0; break; } - auto reporter = SetUpGetStatsReporter( - variation == GetStatsVariation::PROMISE_BASED ? "promise" : "callback"); - reporter.AddResult(kMetricInvocationTimeMs, invocation_time); + perf_test::PrintResult( + "getStats", + (variation == GetStatsVariation::PROMISE_BASED) ? + "_promise" : "_callback", + "invocation_time", + invocation_time, + "milliseconds", + false); EndCall(); }
diff --git a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc index 1b90baa..59e65740 100644 --- a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -21,7 +21,7 @@ #include "content/public/test/browser_test_utils.h" #include "media/base/media_switches.h" #include "net/test/embedded_test_server/embedded_test_server.h" -#include "testing/perf/perf_result_reporter.h" +#include "testing/perf/perf_test.h" #include "third_party/blink/public/common/features.h" #include "ui/gl/gl_switches.h" @@ -49,42 +49,10 @@ static const char kVideoFrameSubmitterEventName[] = "VideoFrameSubmitter"; static const char kEventMatchKey[] = "Timestamp"; +static const char kTestResultString[] = "TestVideoDisplayPerf"; static const char kMainWebrtcTestHtmlPage[] = "/webrtc/webrtc_video_display_perf_test.html"; -constexpr char kMetricPrefixVideoDisplayPerf[] = "WebRtcVideoDisplayPerf."; -constexpr char kMetricSkippedFramesPercent[] = "skipped_frames"; -constexpr char kMetricPassingToRenderAlgoLatencyUs[] = - "passing_to_render_algorithm_latency"; -constexpr char kMetricRenderAlgoLatencyUs[] = "render_algorithm_latency"; -constexpr char kMetricCompositorPickingFrameLatencyUs[] = - "compositor_picking_frame_latency"; -constexpr char kMetricCompositorResourcePreparationLatencyUs[] = - "compositor_resource_preparation_latency"; -constexpr char kMetricVsyncLatencyUs[] = "vsync_latency"; -constexpr char kMetricTotalControlledLatencyUs[] = "total_controlled_latency"; -constexpr char kMetricTotalLatencyUs[] = "total_latency"; -constexpr char kMetricPostDecodeToRasterLatencyUs[] = - "post_decode_to_raster_latency"; -constexpr char kMetricWebRtcDecodeLatencyUs[] = "webrtc_decode_latency"; - -perf_test::PerfResultReporter SetUpReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixVideoDisplayPerf, story); - reporter.RegisterImportantMetric(kMetricSkippedFramesPercent, "percent"); - reporter.RegisterImportantMetric(kMetricPassingToRenderAlgoLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricRenderAlgoLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricCompositorPickingFrameLatencyUs, - "us"); - reporter.RegisterImportantMetric( - kMetricCompositorResourcePreparationLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricVsyncLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricTotalControlledLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricTotalLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricPostDecodeToRasterLatencyUs, "us"); - reporter.RegisterImportantMetric(kMetricWebRtcDecodeLatencyUs, "us"); - return reporter; -} - struct VideoDisplayPerfTestConfig { int width; int height; @@ -92,13 +60,36 @@ bool disable_render_smoothness_algorithm; }; -std::string VectorToString(const std::vector<double>& values) { - std::string ret = ""; - for (double val : values) { - ret += base::StringPrintf("%.0lf,", val); +void CalculateMeanAndMax(const std::vector<double>& inputs, + double* mean, + double* std_dev, + double* max) { + double sum = 0.0; + double sqr_sum = 0.0; + double max_so_far = 0.0; + size_t count = inputs.size(); + for (const auto& input : inputs) { + sum += input; + sqr_sum += input * input; + max_so_far = std::max(input, max_so_far); } - // Strip of trailing comma. - return ret.substr(0, ret.length() - 1); + *max = max_so_far; + *mean = sum / count; + *std_dev = sqrt(std::max(0.0, count * sqr_sum - sum * sum)) / count; +} + +void PrintMeanAndMax(const std::string& var_name, + const std::string& name_modifier, + const std::vector<double>& vars) { + double mean = 0.0; + double std_dev = 0.0; + double max = 0.0; + CalculateMeanAndMax(vars, &mean, &std_dev, &max); + perf_test::PrintResultMeanAndError( + kTestResultString, name_modifier, var_name + " Mean", + base::StringPrintf("%.0lf,%.0lf", mean, std_dev), "μs", true); + perf_test::PrintResult(kTestResultString, name_modifier, var_name + " Max", + base::StringPrintf("%.0lf", max), "μs", true); } void FindEvents(trace_analyzer::TraceAnalyzer* analyzer, @@ -411,36 +402,35 @@ std::string smoothness_indicator = test_config_.disable_render_smoothness_algorithm ? "_DisableSmoothness" : ""; - std::string story = base::StringPrintf( + std::string name_modifier = base::StringPrintf( "%s_%dp%df%s", video_codec.c_str(), test_config_.height, test_config_.fps, smoothness_indicator.c_str()); - auto reporter = SetUpReporter(story); - reporter.AddResult(kMetricSkippedFramesPercent, - base::StringPrintf("%.2lf", skipped_frame_percentage_)); + perf_test::PrintResult( + kTestResultString, name_modifier, "Skipped frames", + base::StringPrintf("%.2lf", skipped_frame_percentage_), "percent", + true); // We identify intervals in a way that can help us easily bisect the source // of added latency in case of a regression. From these intervals, "Render // Algorithm" can take random amount of times based on the vsync cycle it is // closest to. Therefore, "Total Controlled Latency" refers to the total // times without that section for semi-consistent results. - reporter.AddResultList(kMetricPassingToRenderAlgoLatencyUs, - VectorToString(enqueue_frame_durations_)); - reporter.AddResultList(kMetricRenderAlgoLatencyUs, - VectorToString(set_frame_durations_)); - reporter.AddResultList(kMetricCompositorPickingFrameLatencyUs, - VectorToString(get_frame_durations_)); - reporter.AddResultList(kMetricCompositorResourcePreparationLatencyUs, - VectorToString(resource_ready_durations_)); - reporter.AddResultList(kMetricVsyncLatencyUs, - VectorToString(vsync_durations_)); - reporter.AddResultList(kMetricTotalControlledLatencyUs, - VectorToString(total_controlled_durations_)); - reporter.AddResultList(kMetricTotalLatencyUs, - VectorToString(total_durations_)); + PrintMeanAndMax("Passing to Render Algorithm Latency", name_modifier, + enqueue_frame_durations_); + PrintMeanAndMax("Render Algorithm Latency", name_modifier, + set_frame_durations_); + PrintMeanAndMax("Compositor Picking Frame Latency", name_modifier, + get_frame_durations_); + PrintMeanAndMax("Compositor Resource Preparation Latency", name_modifier, + resource_ready_durations_); + PrintMeanAndMax("Vsync Latency", name_modifier, vsync_durations_); + PrintMeanAndMax("Total Controlled Latency", name_modifier, + total_controlled_durations_); + PrintMeanAndMax("Total Latency", name_modifier, total_durations_); - reporter.AddResultList(kMetricPostDecodeToRasterLatencyUs, - VectorToString(video_frame_submmitter_latencies_)); - reporter.AddResultList(kMetricWebRtcDecodeLatencyUs, - VectorToString(webrtc_decode_latencies_)); + PrintMeanAndMax("Post-decode-to-raster latency", name_modifier, + video_frame_submmitter_latencies_); + PrintMeanAndMax("WebRTC decode latency", name_modifier, + webrtc_decode_latencies_); } VideoDisplayPerfTestConfig test_config_;
diff --git a/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc index a8eebc6..535da41 100644 --- a/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_video_high_bitrate_browsertest.cc
@@ -12,7 +12,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "media/base/media_switches.h" -#include "testing/perf/perf_result_reporter.h" +#include "testing/perf/perf_test.h" #include "ui/gl/gl_switches.h" namespace { @@ -22,19 +22,6 @@ static const char kInboundRtp[] = "inbound-rtp"; static const char kOutboundRtp[] = "outbound-rtp"; -constexpr int kBitsPerByte = 8; - -constexpr char kMetricPrefixHighBitrate[] = "WebRtcHighBitrateVideo."; -constexpr char kMetricSendRateBitsPerS[] = "send_rate"; -constexpr char kMetricReceiveRateBitsPerS[] = "receive_rate"; - -perf_test::PerfResultReporter SetUpReporter(const std::string& story) { - perf_test::PerfResultReporter reporter(kMetricPrefixHighBitrate, story); - reporter.RegisterFyiMetric(kMetricSendRateBitsPerS, "bits/s"); - reporter.RegisterFyiMetric(kMetricReceiveRateBitsPerS, "bits/s"); - return reporter; -} - // Sums up "RTC[In/Out]boundRTPStreamStats.bytes_[received/sent]" values. double GetTotalRTPStreamBytes(content::TestStatsReportDictionary* report, const char* type, @@ -151,10 +138,10 @@ (video_bytes_received_after - video_bytes_received_before) / duration_in_seconds; - auto reporter = SetUpReporter("baseline_story"); - reporter.AddResult(kMetricSendRateBitsPerS, video_send_rate * kBitsPerByte); - reporter.AddResult(kMetricReceiveRateBitsPerS, - video_receive_rate * kBitsPerByte); + perf_test::PrintResult("video", "", "send_rate", video_send_rate, + "bytes/second", false); + perf_test::PrintResult("video", "", "receive_rate", video_receive_rate, + "bytes/second", false); HangUp(left_tab); HangUp(right_tab);
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc index f56f5d9..53fb7b9 100644 --- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -64,7 +64,6 @@ #if defined(OS_WIN) #include "base/win/windows_version.h" -#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/shell_integration_win.h" #include "printing/backend/win_helper.h" #endif // defined(OS_WIN) @@ -549,24 +548,6 @@ flags_ui::PrefServiceFlagsStorage flags_storage( g_browser_process->local_state()); about_flags::RecordUMAStatistics(&flags_storage); - -#if defined(OS_WIN) - ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial("ChromeWinClang", -#if defined(__clang__) - "Enabled" -#else - "Disabled" -#endif - ); - // Log once here at browser start rather than at each renderer launch. - ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial("ChromeWinMultiDll", -#if defined(CHROME_MULTIPLE_DLL_BROWSER) - "Enabled" -#else - "Disabled" -#endif - ); -#endif // defined(OS_WIN) } void ChromeBrowserMainExtraPartsMetrics::PostBrowserStart() {
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.h b/chrome/browser/metrics/chrome_metrics_service_accessor.h index 6ed483c2..9d67004 100644 --- a/chrome/browser/metrics/chrome_metrics_service_accessor.h +++ b/chrome/browser/metrics/chrome_metrics_service_accessor.h
@@ -86,8 +86,6 @@ friend class ::FlashDOMHandler; friend void chrome::AttemptRestart(); friend class ChromeBrowserFieldTrials; - // For ChromeWinClang. - friend class ChromeBrowserMainExtraPartsMetrics; // For StackSamplingConfiguration. friend class ChromeBrowserMainParts; friend class ChromeMetricsServicesManagerClient;
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index 0c766f29a..e5ac9539 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc
@@ -343,7 +343,7 @@ network::mojom::URLLoaderFactory* SystemNetworkContextManager::GetURLLoaderFactory() { // Create the URLLoaderFactory as needed. - if (url_loader_factory_ && !url_loader_factory_.encountered_error()) { + if (url_loader_factory_ && url_loader_factory_.is_connected()) { return url_loader_factory_.get(); } @@ -352,8 +352,9 @@ params->process_id = network::mojom::kBrowserProcessId; params->is_corb_enabled = false; params->is_trusted = true; - GetContext()->CreateURLLoaderFactory(mojo::MakeRequest(&url_loader_factory_), - std::move(params)); + url_loader_factory_.reset(); + GetContext()->CreateURLLoaderFactory( + url_loader_factory_.BindNewPipeAndPassReceiver(), std::move(params)); return url_loader_factory_.get(); }
diff --git a/chrome/browser/net/system_network_context_manager.h b/chrome/browser/net/system_network_context_manager.h index ba3804e..be3f37d 100644 --- a/chrome/browser/net/system_network_context_manager.h +++ b/chrome/browser/net/system_network_context_manager.h
@@ -178,7 +178,7 @@ // URLLoaderFactory backed by the NetworkContext returned by GetContext(), so // consumers don't all need to create their own factory. scoped_refptr<URLLoaderFactoryForSystem> shared_url_loader_factory_; - network::mojom::URLLoaderFactoryPtr url_loader_factory_; + mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_; bool is_quic_allowed_ = true;
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 1707d598..ac0ac8cf 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
@@ -31,6 +31,8 @@ #include "components/subresource_filter/core/common/test_ruleset_utils.h" #include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" #include "components/ukm/test_ukm_recorder.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/common/content_features.h" #include "content/public/common/url_constants.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" @@ -98,9 +100,7 @@ : public subresource_filter::SubresourceFilterBrowserTest { public: AdsPageLoadMetricsObserverBrowserTest() - : subresource_filter::SubresourceFilterBrowserTest() { - scoped_feature_list_.InitAndEnableFeature(subresource_filter::kAdTagging); - } + : subresource_filter::SubresourceFilterBrowserTest() {} ~AdsPageLoadMetricsObserverBrowserTest() override {} std::unique_ptr<page_load_metrics::PageLoadMetricsTestWaiter> @@ -111,6 +111,20 @@ web_contents); } + void SetUp() override { + std::vector<base::Feature> enabled = {subresource_filter::kAdTagging, + features::kSitePerProcess}; + std::vector<base::Feature> disabled = {}; + + if (use_process_priority_) { + enabled.push_back(features::kUseFramePriorityInRenderProcessHost); + } else { + disabled.push_back(features::kUseFramePriorityInRenderProcessHost); + } + scoped_feature_list_.InitWithFeatures(enabled, disabled); + subresource_filter::SubresourceFilterBrowserTest::SetUp(); + } + void SetUpOnMainThread() override { SubresourceFilterBrowserTest::SetUpOnMainThread(); SetRulesetWithRules( @@ -120,6 +134,9 @@ "expensive_animation_frame.html*")}); } + protected: + bool use_process_priority_ = false; + private: base::test::ScopedFeatureList scoped_feature_list_; @@ -1430,3 +1447,156 @@ histogram_tester.ExpectTotalCount( "PageLoad.Clients.Ads.FrameCounts.AdFrames.Total", 0); } + +IN_PROC_BROWSER_TEST_F( + AdsPageLoadMetricsObserverBrowserTest, + RenderProcessHostNotBackgroundedWhenFramePriorityDisabled) { + // Used for assignment during testing. + auto frame1_pred = base::BindRepeating(&content::FrameMatchesName, "iframe1"); + auto frame2_pred = base::BindRepeating(&content::FrameMatchesName, "iframe2"); + + // Navigate to a page with an iframe. Make sure the two frames share a + // process and that process is not low priority. + ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("/two_iframes_blank.html")); + content::RenderFrameHost* main_frame = web_contents()->GetMainFrame(); + content::RenderFrameHost* frame1 = + content::FrameMatchingPredicate(web_contents(), frame1_pred); + content::RenderFrameHost* frame2 = + content::FrameMatchingPredicate(web_contents(), frame2_pred); + EXPECT_EQ(main_frame->GetProcess(), frame1->GetProcess()); + EXPECT_EQ(main_frame->GetProcess(), frame2->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + + // Navigate iframe1 to a cross-origin non-ad frame. It should be on a + // different process, but still not be low priority. + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL("a.com", "/iframe_blank.html")); + frame1 = content::FrameMatchingPredicate(web_contents(), frame1_pred); + EXPECT_NE(main_frame->GetProcess(), frame1->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_FALSE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Navigate iframe1 to an ad on its current domain. It should have the same + // process host but because the feature is turned off, not be low priority. + content::DOMMessageQueue message_queue1(web_contents()); + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL( + "a.com", "/ads_observer/expensive_animation_frame.html?delay=0")); + WaitForRAF(&message_queue1); + EXPECT_EQ(frame1->GetProcess(), + content::FrameMatchingPredicate(web_contents(), frame1_pred) + ->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_FALSE(frame1->GetProcess()->IsProcessBackgrounded()); +} + +class AdsPageLoadMetricsObserverWithBackgroundingBrowserTest + : public AdsPageLoadMetricsObserverBrowserTest { + public: + AdsPageLoadMetricsObserverWithBackgroundingBrowserTest() + : AdsPageLoadMetricsObserverBrowserTest() { + use_process_priority_ = true; + } + ~AdsPageLoadMetricsObserverWithBackgroundingBrowserTest() override {} +}; + +IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverWithBackgroundingBrowserTest, + RenderProcessHostBackgroundedForAd) { + // Used for assignment during testing. + auto frame1_pred = base::BindRepeating(&content::FrameMatchesName, "iframe1"); + auto frame2_pred = base::BindRepeating(&content::FrameMatchesName, "iframe2"); + + // Navigate to a page with an iframe. Make sure the two frames share a + // process and that process is not low priority. + ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("/two_iframes_blank.html")); + content::RenderFrameHost* main_frame = web_contents()->GetMainFrame(); + content::RenderFrameHost* frame1 = + content::FrameMatchingPredicate(web_contents(), frame1_pred); + content::RenderFrameHost* frame2 = + content::FrameMatchingPredicate(web_contents(), frame2_pred); + EXPECT_EQ(main_frame->GetProcess(), frame1->GetProcess()); + EXPECT_EQ(main_frame->GetProcess(), frame2->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + + // Navigate iframe1 to a cross-origin non-ad frame. It should be on a + // different process, but still not be low priority. + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL("a.com", "/iframe_blank.html")); + frame1 = content::FrameMatchingPredicate(web_contents(), frame1_pred); + EXPECT_NE(main_frame->GetProcess(), frame1->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_FALSE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Navigate iframe1 to an ad on its current domain. It should have the + // same process host but now be low priority. + content::DOMMessageQueue message_queue1(web_contents()); + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL( + "a.com", "/ads_observer/expensive_animation_frame.html?delay=0")); + WaitForRAF(&message_queue1); + EXPECT_EQ(frame1->GetProcess(), + content::FrameMatchingPredicate(web_contents(), frame1_pred) + ->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_TRUE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Navigate the iframe2 to a non-ad on the same domain as iframe1. Make sure + // that they get assigned the same process and that it's not low priority. + NavigateIframeToURL( + web_contents(), "iframe2", + embedded_test_server()->GetURL("a.com", "/iframe_blank.html")); + frame2 = content::FrameMatchingPredicate(web_contents(), frame2_pred); + EXPECT_EQ(frame1->GetProcess(), frame2->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_FALSE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Delete iframe2, make sure that iframe1 is now low priority, as it now only + // has ads assigned to it. + EXPECT_TRUE(content::ExecuteScriptWithoutUserGesture( + web_contents(), + "var frame = document.getElementById('iframe2'); " + "frame.parentNode.removeChild(frame);")); + EXPECT_TRUE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Navigate the subframe to a non-ad on its current domain. Even though this + // is a non-ad, the frame is still identified as an ad because it was + // previously identified as an ad by SubresourceFilterThrottle. + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL("a.com", "/iframe_blank.html")); + EXPECT_EQ(frame1->GetProcess(), + content::FrameMatchingPredicate(web_contents(), frame1_pred) + ->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_TRUE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Navigate the subframe to an ad on the original domain. It should now have + // the same process as the main frame, but not be low priority because it + // shares a process with a non-ad frame (the main frame). + content::DOMMessageQueue message_queue2(web_contents()); + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL( + "/ads_observer/expensive_animation_frame.html?delay=0")); + WaitForRAF(&message_queue2); + frame1 = content::FrameMatchingPredicate(web_contents(), frame1_pred); + EXPECT_EQ(main_frame->GetProcess(), frame1->GetProcess()); + EXPECT_FALSE(frame1->GetProcess()->IsProcessBackgrounded()); + + // Navigate the subframe to a non-ad on a different domain. Even though this + // is a non-ad, the frame is still identified as an ad because it was + // previously identified as an ad by SubresourceFilterThrottle. + NavigateIframeToURL( + web_contents(), "iframe1", + embedded_test_server()->GetURL("b.com", "/iframe_blank.html")); + frame1 = content::FrameMatchingPredicate(web_contents(), frame1_pred); + EXPECT_NE(main_frame->GetProcess(), frame1->GetProcess()); + EXPECT_FALSE(main_frame->GetProcess()->IsProcessBackgrounded()); + EXPECT_TRUE(frame1->GetProcess()->IsProcessBackgrounded()); +}
diff --git a/chrome/browser/page_load_metrics/observers/security_state_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/security_state_page_load_metrics_observer.cc index 586a45d..1309bbe 100644 --- a/chrome/browser/page_load_metrics/observers/security_state_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/security_state_page_load_metrics_observer.cc
@@ -133,7 +133,8 @@ return; security_state::SafetyTipStatus safety_tip_status = - security_state_tab_helper_->GetVisibleSecurityState()->safety_tip_status; + security_state_tab_helper_->GetVisibleSecurityState() + ->safety_tip_info.status; if (engagement_service_) { double final_engagement_score =
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index 460e921..e2fd2e7 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -612,8 +612,8 @@ TouchToFillController* ChromePasswordManagerClient::GetOrCreateTouchToFillController() { if (!touch_to_fill_controller_) { - touch_to_fill_controller_ = std::make_unique<TouchToFillController>( - web_contents(), GetFaviconService()); + touch_to_fill_controller_ = + std::make_unique<TouchToFillController>(this, GetFaviconService()); } return touch_to_fill_controller_.get();
diff --git a/chrome/browser/password_manager/touch_to_fill_controller.cc b/chrome/browser/password_manager/touch_to_fill_controller.cc index 1431e267..dc02e3d4 100644 --- a/chrome/browser/password_manager/touch_to_fill_controller.cc +++ b/chrome/browser/password_manager/touch_to_fill_controller.cc
@@ -7,14 +7,16 @@ #include <utility> #include "base/logging.h" +#include "base/metrics/field_trial_params.h" +#include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/touch_to_fill/touch_to_fill_view.h" +#include "components/autofill/core/common/autofill_features.h" #include "components/favicon/core/favicon_service.h" #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/origin_credential_store.h" #include "components/password_manager/core/browser/password_manager_driver.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/url_formatter/elide_url.h" -#include "content/public/browser/web_contents.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" using password_manager::CredentialPair; @@ -33,26 +35,35 @@ } // namespace TouchToFillController::TouchToFillController( - content::WebContents* web_contents, + ChromePasswordManagerClient* password_client, favicon::FaviconService* favicon_service) - : web_contents_(web_contents), favicon_service_(favicon_service) {} + : password_client_(password_client), favicon_service_(favicon_service) {} TouchToFillController::~TouchToFillController() = default; void TouchToFillController::Show(base::span<const CredentialPair> credentials, base::WeakPtr<PasswordManagerDriver> driver) { + // Disable Touch To Fill for secure origins if specified by the server. + const GURL& url = driver->GetLastCommittedURL(); + const TouchToFillView::IsOriginSecure is_origin_secure( + network::IsUrlPotentiallyTrustworthy(url)); + if (base::GetFieldTrialParamByFeatureAsBool( + autofill::features::kTouchToFillAndroid, "insecure-origins-only", + /*default_value=*/false) && + is_origin_secure) { + driver->TouchToFillDismissed(); + return; + } + DCHECK(!driver_ || driver_.get() == driver.get()); driver_ = std::move(driver); if (!view_) view_ = TouchToFillViewFactory::Create(this); - const GURL& url = driver_->GetLastCommittedURL(); view_->Show(url_formatter::FormatUrlForSecurityDisplay( url, url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS), - TouchToFillView::IsOriginSecure( - network::IsUrlPotentiallyTrustworthy(url)), - credentials); + is_origin_secure, credentials); } void TouchToFillController::OnCredentialSelected( @@ -67,6 +78,11 @@ ->FillSuggestion(credential.username, credential.password); } +void TouchToFillController::OnManagePasswordsSelected() { + password_client_->NavigateToManagePasswordsPage( + password_manager::ManagePasswordsReferrer::kTouchToFill); +} + void TouchToFillController::OnDismiss() { if (!driver_) return; @@ -75,7 +91,7 @@ } gfx::NativeView TouchToFillController::GetNativeView() { - return web_contents_->GetNativeView(); + return password_client_->web_contents()->GetNativeView(); } void TouchToFillController::FetchFavicon(
diff --git a/chrome/browser/password_manager/touch_to_fill_controller.h b/chrome/browser/password_manager/touch_to_fill_controller.h index af8d850..ef64663 100644 --- a/chrome/browser/password_manager/touch_to_fill_controller.h +++ b/chrome/browser/password_manager/touch_to_fill_controller.h
@@ -17,10 +17,6 @@ #include "components/favicon_base/favicon_types.h" #include "ui/gfx/native_widget_types.h" -namespace content { -class WebContents; -} // namespace content - namespace favicon { class FaviconService; } // namespace favicon @@ -30,9 +26,11 @@ struct CredentialPair; } // namespace password_manager +class ChromePasswordManagerClient; + class TouchToFillController { public: - TouchToFillController(content::WebContents* web_contents, + TouchToFillController(ChromePasswordManagerClient* web_contents, favicon::FaviconService* favicon_service); TouchToFillController(const TouchToFillController&) = delete; TouchToFillController& operator=(const TouchToFillController&) = delete; @@ -47,6 +45,10 @@ // repeatedly. void OnCredentialSelected(const password_manager::CredentialPair& credential); + // Informs the controller that the user has tapped the "Manage Passwords" + // button. This will open the password preferences. + void OnManagePasswordsSelected(); + // Informs the controller that the user has dismissed the sheet. Invokes // TouchToFillDismissed() on |driver_|. No-op if invoked repeatedly. void OnDismiss(); @@ -67,10 +69,8 @@ #endif private: - // Weak pointer to the current WebContents. This is safe because the lifetime - // of this class is tied to ChromePasswordManagerClient, which implements - // WebContentsUserData. - content::WebContents* web_contents_ = nullptr; + // Weak pointer to the ChromePasswordManagerClient this class is tied to. + ChromePasswordManagerClient* password_client_ = nullptr; // Driver passed to the latest invocation of Show(). Gets cleared when // OnCredentialSelected() or OnDismissed() gets called.
diff --git a/chrome/browser/password_manager/touch_to_fill_controller_unittest.cc b/chrome/browser/password_manager/touch_to_fill_controller_unittest.cc index 88a46b2c..c44691b 100644 --- a/chrome/browser/password_manager/touch_to_fill_controller_unittest.cc +++ b/chrome/browser/password_manager/touch_to_fill_controller_unittest.cc
@@ -9,6 +9,8 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" +#include "components/autofill/core/common/autofill_features.h" #include "components/password_manager/core/browser/origin_credential_store.h" #include "components/password_manager/core/browser/stub_password_manager_driver.h" #include "testing/gmock/include/gmock/gmock.h" @@ -141,3 +143,16 @@ EXPECT_CALL(driver(), TouchToFillDismissed); touch_to_fill_controller().OnDismiss(); } + +TEST_F(TouchToFillControllerTest, CanDisableOnHttps) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters( + autofill::features::kTouchToFillAndroid, + { + {"insecure-origins-only", "true"}, + }); + + EXPECT_CALL(driver(), TouchToFillDismissed); + EXPECT_CALL(view(), Show).Times(0); + touch_to_fill_controller().Show({}, driver().AsWeakPtr()); +}
diff --git a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc b/chrome/browser/policy/chrome_browser_cloud_management_controller.cc similarity index 86% rename from chrome/browser/policy/machine_level_user_cloud_policy_controller.cc rename to chrome/browser/policy/chrome_browser_cloud_management_controller.cc index 2f219b7..8c10689c 100644 --- a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc +++ b/chrome/browser/policy/chrome_browser_cloud_management_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/policy/machine_level_user_cloud_policy_controller.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include <utility> @@ -28,9 +28,9 @@ #include "chrome/browser/policy/cloud/chrome_browser_cloud_management_helper.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" +#include "components/policy/core/common/cloud/chrome_browser_cloud_management_metrics.h" #include "components/policy/core/common/cloud/cloud_external_data_manager.h" #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h" -#include "components/policy/core/common/cloud/machine_level_user_cloud_policy_metrics.h" #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_store.h" #include "components/policy/core/common/configuration_policy_provider.h" #include "components/policy/core/common/policy_types.h" @@ -57,7 +57,7 @@ namespace { void RecordEnrollmentResult( - MachineLevelUserCloudPolicyEnrollmentResult result) { + ChromeBrowserCloudManagementEnrollmentResult result) { UMA_HISTOGRAM_ENUMERATION( "Enterprise.MachineLevelUserCloudPolicyEnrollment.Result", result); } @@ -83,10 +83,10 @@ } // namespace const base::FilePath::CharType - MachineLevelUserCloudPolicyController::kPolicyDir[] = + ChromeBrowserCloudManagementController::kPolicyDir[] = FILE_PATH_LITERAL("Policy"); -bool MachineLevelUserCloudPolicyController:: +bool ChromeBrowserCloudManagementController:: IsMachineLevelUserCloudPolicyEnabled() { #if BUILDFLAG(GOOGLE_CHROME_BRANDING) return true; @@ -96,14 +96,14 @@ #endif } -MachineLevelUserCloudPolicyController::MachineLevelUserCloudPolicyController() { -} -MachineLevelUserCloudPolicyController:: - ~MachineLevelUserCloudPolicyController() {} +ChromeBrowserCloudManagementController:: + ChromeBrowserCloudManagementController() {} +ChromeBrowserCloudManagementController:: + ~ChromeBrowserCloudManagementController() {} // static std::unique_ptr<MachineLevelUserCloudPolicyManager> -MachineLevelUserCloudPolicyController::CreatePolicyManager( +ChromeBrowserCloudManagementController::CreatePolicyManager( ConfigurationPolicyProvider* platform_provider) { if (!IsMachineLevelUserCloudPolicyEnabled()) return nullptr; @@ -124,7 +124,7 @@ if (!base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) return nullptr; - DVLOG(1) << "Creating machine level cloud policy manager"; + DVLOG(1) << "Creating machine level user cloud policy manager"; bool cloud_policy_has_priority = DoesCloudPolicyHasPriority(platform_provider); @@ -134,7 +134,7 @@ } base::FilePath policy_dir = - user_data_dir.Append(MachineLevelUserCloudPolicyController::kPolicyDir); + user_data_dir.Append(ChromeBrowserCloudManagementController::kPolicyDir); std::unique_ptr<MachineLevelUserCloudPolicyStore> policy_store = MachineLevelUserCloudPolicyStore::Create( dm_token, client_id, policy_dir, cloud_policy_has_priority, @@ -150,10 +150,9 @@ base::BindRepeating(&content::GetNetworkConnectionTracker)); } -void MachineLevelUserCloudPolicyController::Init( +void ChromeBrowserCloudManagementController::Init( PrefService* local_state, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) { - if (!IsMachineLevelUserCloudPolicyEnabled()) return; @@ -162,7 +161,7 @@ {base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, base::ThreadPool()}, base::BindOnce( - &MachineLevelUserCloudPolicyController::CreateReportSchedulerAsync, + &ChromeBrowserCloudManagementController::CreateReportSchedulerAsync, base::Unretained(this), base::ThreadTaskRunnerHandle::Get())); MachineLevelUserCloudPolicyManager* policy_manager = @@ -212,7 +211,7 @@ // Not registered already, so do it now. cloud_management_registrar_->RegisterForCloudManagementWithEnrollmentToken( enrollment_token, client_id, - base::Bind(&MachineLevelUserCloudPolicyController:: + base::Bind(&ChromeBrowserCloudManagementController:: RegisterForCloudManagementWithEnrollmentTokenCallback, base::Unretained(this))); #if defined(OS_WIN) @@ -228,7 +227,7 @@ } } -bool MachineLevelUserCloudPolicyController:: +bool ChromeBrowserCloudManagementController:: WaitUntilPolicyEnrollmentFinished() { if (cloud_management_register_watcher_) { switch (cloud_management_register_watcher_ @@ -254,27 +253,29 @@ return true; } -void MachineLevelUserCloudPolicyController::AddObserver(Observer* observer) { +void ChromeBrowserCloudManagementController::AddObserver(Observer* observer) { observers_.AddObserver(observer); } -void MachineLevelUserCloudPolicyController::RemoveObserver(Observer* observer) { +void ChromeBrowserCloudManagementController::RemoveObserver( + Observer* observer) { observers_.RemoveObserver(observer); } -bool MachineLevelUserCloudPolicyController::IsEnterpriseStartupDialogShowing() { +bool ChromeBrowserCloudManagementController:: + IsEnterpriseStartupDialogShowing() { return cloud_management_register_watcher_ && cloud_management_register_watcher_->IsDialogShowing(); } -void MachineLevelUserCloudPolicyController::NotifyPolicyRegisterFinished( +void ChromeBrowserCloudManagementController::NotifyPolicyRegisterFinished( bool succeeded) { for (auto& observer : observers_) { observer.OnPolicyRegisterFinished(succeeded); } } -bool MachineLevelUserCloudPolicyController::GetEnrollmentTokenAndClientId( +bool ChromeBrowserCloudManagementController::GetEnrollmentTokenAndClientId( std::string* enrollment_token, std::string* client_id) { *client_id = BrowserDMTokenStorage::Get()->RetrieveClientId(); @@ -285,7 +286,7 @@ return !enrollment_token->empty(); } -void MachineLevelUserCloudPolicyController:: +void ChromeBrowserCloudManagementController:: RegisterForCloudManagementWithEnrollmentTokenCallback( const std::string& dm_token, const std::string& client_id) { @@ -294,7 +295,7 @@ if (dm_token.empty()) { VLOG(1) << "No DM token returned from browser registration."; RecordEnrollmentResult( - MachineLevelUserCloudPolicyEnrollmentResult::kFailedToFetch); + ChromeBrowserCloudManagementEnrollmentResult::kFailedToFetch); UMA_HISTOGRAM_TIMES( "Enterprise.MachineLevelUserCloudPolicyEnrollment.RequestFailureTime", enrollment_time); @@ -319,11 +320,11 @@ if (!success) { DVLOG(1) << "Failed to store the DM token"; RecordEnrollmentResult( - MachineLevelUserCloudPolicyEnrollmentResult::kFailedToStore); + ChromeBrowserCloudManagementEnrollmentResult::kFailedToStore); } else { DVLOG(1) << "Successfully stored the DM token"; RecordEnrollmentResult( - MachineLevelUserCloudPolicyEnrollmentResult::kSuccess); + ChromeBrowserCloudManagementEnrollmentResult::kSuccess); } })); @@ -337,16 +338,16 @@ NotifyPolicyRegisterFinished(true); } -void MachineLevelUserCloudPolicyController::CreateReportSchedulerAsync( +void ChromeBrowserCloudManagementController::CreateReportSchedulerAsync( scoped_refptr<base::SequencedTaskRunner> task_runner) { task_runner->PostTask( FROM_HERE, base::BindOnce( - &MachineLevelUserCloudPolicyController::CreateReportScheduler, + &ChromeBrowserCloudManagementController::CreateReportScheduler, base::Unretained(this))); } -void MachineLevelUserCloudPolicyController::CreateReportScheduler() { +void ChromeBrowserCloudManagementController::CreateReportScheduler() { if (!base::FeatureList::IsEnabled(features::kEnterpriseReportingInBrowser)) return;
diff --git a/chrome/browser/policy/machine_level_user_cloud_policy_controller.h b/chrome/browser/policy/chrome_browser_cloud_management_controller.h similarity index 84% rename from chrome/browser/policy/machine_level_user_cloud_policy_controller.h rename to chrome/browser/policy/chrome_browser_cloud_management_controller.h index d59814f..e53cf94 100644 --- a/chrome/browser/policy/machine_level_user_cloud_policy_controller.h +++ b/chrome/browser/policy/chrome_browser_cloud_management_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_POLICY_MACHINE_LEVEL_USER_CLOUD_POLICY_CONTROLLER_H_ -#define CHROME_BROWSER_POLICY_MACHINE_LEVEL_USER_CLOUD_POLICY_CONTROLLER_H_ +#ifndef CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_ +#define CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_ #include <memory> #include <string> @@ -31,10 +31,10 @@ class MachineLevelUserCloudPolicyFetcher; class ChromeBrowserCloudManagementRegisterWatcher; -// A class that setups and manages MachineLevelUserCloudPolicy. -class MachineLevelUserCloudPolicyController { +// A class that setups and manages all CBCM related features. +class ChromeBrowserCloudManagementController { public: - // Machine level user cloud policy enrollment result. + // Chrome browser cloud management enrollment result. enum class RegisterResult { kNoEnrollmentNeeded, // The device won't be enrolled without an enrollment // token. @@ -66,13 +66,13 @@ // Directory name under the user-data-dir where the policy data is stored. static const base::FilePath::CharType kPolicyDir[]; - // The MachineLevelUserCloudPolicy is only enabled on Chrome by default. + // The Chrome browser cloud management is only enabled on Chrome by default. // However, it can be enabled on Chromium by command line switch for test and // development purpose. static bool IsMachineLevelUserCloudPolicyEnabled(); - MachineLevelUserCloudPolicyController(); - virtual ~MachineLevelUserCloudPolicyController(); + ChromeBrowserCloudManagementController(); + virtual ~ChromeBrowserCloudManagementController(); static std::unique_ptr<MachineLevelUserCloudPolicyManager> CreatePolicyManager(ConfigurationPolicyProvider* platform_provider); @@ -107,8 +107,8 @@ std::unique_ptr<ChromeBrowserCloudManagementRegistrar> cloud_management_registrar_; std::unique_ptr<MachineLevelUserCloudPolicyFetcher> policy_fetcher_; - // This is an observer of the controller and needs to be declared after the - // |observers_|. + // This is an observer of the controller and needs to be declared after the + // |observers_|. std::unique_ptr<ChromeBrowserCloudManagementRegisterWatcher> cloud_management_register_watcher_; @@ -117,9 +117,9 @@ std::unique_ptr<enterprise_reporting::ReportScheduler> report_scheduler_; - DISALLOW_COPY_AND_ASSIGN(MachineLevelUserCloudPolicyController); + DISALLOW_COPY_AND_ASSIGN(ChromeBrowserCloudManagementController); }; } // namespace policy -#endif // CHROME_BROWSER_POLICY_MACHINE_LEVEL_USER_CLOUD_POLICY_CONTROLLER_H_ +#endif // CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.cc b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.cc index b5fba59..d57eeb1 100644 --- a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.cc +++ b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.cc
@@ -17,7 +17,7 @@ namespace policy { -using RegisterResult = MachineLevelUserCloudPolicyController::RegisterResult; +using RegisterResult = ChromeBrowserCloudManagementController::RegisterResult; const char ChromeBrowserCloudManagementRegisterWatcher::kStartupDialogHistogramName[] = @@ -25,7 +25,7 @@ ChromeBrowserCloudManagementRegisterWatcher:: ChromeBrowserCloudManagementRegisterWatcher( - MachineLevelUserCloudPolicyController* controller) + ChromeBrowserCloudManagementController* controller) : controller_(controller) { controller_->AddObserver(this); }
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h index af8ed9a..9c61615f 100644 --- a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h +++ b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h
@@ -14,7 +14,7 @@ #include "base/optional.h" #include "base/run_loop.h" #include "base/time/time.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include "chrome/browser/ui/enterprise_startup_dialog.h" class ChromeBrowserCloudManagementRegisterWatcherTest; @@ -24,19 +24,19 @@ // Watches the status of chrome browser cloud management enrollment. // Shows the blocking dialog for ongoing enrollment and failed enrollment. class ChromeBrowserCloudManagementRegisterWatcher - : public MachineLevelUserCloudPolicyController::Observer { + : public ChromeBrowserCloudManagementController::Observer { public: using DialogCreationCallback = base::OnceCallback<std::unique_ptr<EnterpriseStartupDialog>( EnterpriseStartupDialog::DialogResultCallback)>; explicit ChromeBrowserCloudManagementRegisterWatcher( - MachineLevelUserCloudPolicyController* controller); + ChromeBrowserCloudManagementController* controller); ~ChromeBrowserCloudManagementRegisterWatcher() override; // Blocks until the chrome browser cloud management enrollment process // finishes. Returns the result of enrollment. - MachineLevelUserCloudPolicyController::RegisterResult + ChromeBrowserCloudManagementController::RegisterResult WaitUntilCloudPolicyEnrollmentFinished(); // Returns whether the dialog is being displayed. @@ -99,7 +99,7 @@ static void RecordEnrollmentStartDialog( EnrollmentStartupDialog dialog_startup); - // MachineLevelUserCloudPolicyController::Observer + // ChromeBrowserCloudManagementController::Observer void OnPolicyRegisterFinished(bool succeeded) override; // EnterpriseStartupDialog callback. @@ -107,7 +107,7 @@ void DisplayErrorMessage(); - MachineLevelUserCloudPolicyController* controller_; + ChromeBrowserCloudManagementController* controller_; base::RunLoop run_loop_; std::unique_ptr<EnterpriseStartupDialog> dialog_;
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc index e869223e..e57f353 100644 --- a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc +++ b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc
@@ -21,7 +21,7 @@ using ::testing::InvokeWithoutArgs; using ::testing::Return; using RegisterResult = - policy::MachineLevelUserCloudPolicyController::RegisterResult; + policy::ChromeBrowserCloudManagementController::RegisterResult; namespace policy { @@ -31,18 +31,18 @@ constexpr char kDMToken[] = "dm-token"; constexpr char kClientId[] = "client-id"; -// A fake MachineLevelUserCloudPolicyController that notifies all observers the -// machine level user cloud policy enrollment process has been finished. -class FakeMachineLevelUserCloudPolicyController - : public MachineLevelUserCloudPolicyController { +// A fake ChromeBrowserCloudManagementController that notifies all observers the +// chrome browser cloud management enrollment process has been finished. +class FakeChromeBrowserCloudManagementController + : public ChromeBrowserCloudManagementController { public: - FakeMachineLevelUserCloudPolicyController() = default; + FakeChromeBrowserCloudManagementController() = default; void FireNotification(bool succeeded) { NotifyPolicyRegisterFinished(succeeded); } private: - DISALLOW_COPY_AND_ASSIGN(FakeMachineLevelUserCloudPolicyController); + DISALLOW_COPY_AND_ASSIGN(FakeChromeBrowserCloudManagementController); }; // A mock EnterpriseStartDialog to mimic the behavior of real dialog. @@ -100,7 +100,7 @@ protected: FakeBrowserDMTokenStorage* storage() { return &storage_; } - FakeMachineLevelUserCloudPolicyController* controller() { + FakeChromeBrowserCloudManagementController* controller() { return &controller_; } ChromeBrowserCloudManagementRegisterWatcher* watcher() { return &watcher_; } @@ -115,7 +115,7 @@ private: content::BrowserTaskEnvironment task_environment_; - FakeMachineLevelUserCloudPolicyController controller_; + FakeChromeBrowserCloudManagementController controller_; ChromeBrowserCloudManagementRegisterWatcher watcher_; FakeBrowserDMTokenStorage storage_; std::unique_ptr<MockEnterpriseStartupDialog> dialog_; @@ -147,7 +147,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce( - &FakeMachineLevelUserCloudPolicyController::FireNotification, + &FakeChromeBrowserCloudManagementController::FireNotification, base::Unretained(controller()), true)); EXPECT_EQ(RegisterResult::kEnrollmentSuccess, watcher()->WaitUntilCloudPolicyEnrollmentFinished()); @@ -173,7 +173,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce( - &FakeMachineLevelUserCloudPolicyController::FireNotification, + &FakeChromeBrowserCloudManagementController::FireNotification, base::Unretained(controller()), true)); EXPECT_EQ(RegisterResult::kEnrollmentSuccess, watcher()->WaitUntilCloudPolicyEnrollmentFinished()); @@ -201,7 +201,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce( - &FakeMachineLevelUserCloudPolicyController::FireNotification, + &FakeChromeBrowserCloudManagementController::FireNotification, base::Unretained(controller()), false)); EXPECT_EQ(RegisterResult::kQuitDueToFailure, watcher()->WaitUntilCloudPolicyEnrollmentFinished()); @@ -229,7 +229,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce( - &FakeMachineLevelUserCloudPolicyController::FireNotification, + &FakeChromeBrowserCloudManagementController::FireNotification, base::Unretained(controller()), false)); EXPECT_EQ(RegisterResult::kRestartDueToFailure, watcher()->WaitUntilCloudPolicyEnrollmentFinished()); @@ -325,7 +325,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce( - &FakeMachineLevelUserCloudPolicyController::FireNotification, + &FakeChromeBrowserCloudManagementController::FireNotification, base::Unretained(controller()), false)); EXPECT_EQ(RegisterResult::kEnrollmentFailedSilently, watcher()->WaitUntilCloudPolicyEnrollmentFinished());
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc index d02f19bf..637c861be 100644 --- a/chrome/browser/policy/chrome_browser_policy_connector.cc +++ b/chrome/browser/policy/chrome_browser_policy_connector.cc
@@ -48,7 +48,7 @@ #endif #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h" #endif @@ -82,8 +82,8 @@ ChromeBrowserPolicyConnector::ChromeBrowserPolicyConnector() : BrowserPolicyConnector(base::Bind(&BuildHandlerList)) { #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) - machine_level_user_cloud_policy_controller_ = - std::make_unique<MachineLevelUserCloudPolicyController>(); + chrome_browser_cloud_management_controller_ = + std::make_unique<ChromeBrowserCloudManagementController>(); #endif } @@ -127,7 +127,7 @@ #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) // Reset the controller before calling base class so that // shutdown occurs in correct sequence. - machine_level_user_cloud_policy_controller_.reset(); + chrome_browser_cloud_management_controller_.reset(); #endif BrowserPolicyConnector::Shutdown(); @@ -155,7 +155,7 @@ #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) std::unique_ptr<MachineLevelUserCloudPolicyManager> machine_level_user_cloud_policy_manager = - MachineLevelUserCloudPolicyController::CreatePolicyManager( + ChromeBrowserCloudManagementController::CreatePolicyManager( platform_provider_); if (machine_level_user_cloud_policy_manager) { AddMigrators(machine_level_user_cloud_policy_manager.get());
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.h b/chrome/browser/policy/chrome_browser_policy_connector.h index 4a9efb1..c1d13b9 100644 --- a/chrome/browser/policy/chrome_browser_policy_connector.h +++ b/chrome/browser/policy/chrome_browser_policy_connector.h
@@ -21,7 +21,7 @@ class ConfigurationPolicyProvider; #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) -class MachineLevelUserCloudPolicyController; +class ChromeBrowserCloudManagementController; class MachineLevelUserCloudPolicyManager; #endif @@ -56,9 +56,9 @@ ConfigurationPolicyProvider* GetPlatformProvider(); #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) - MachineLevelUserCloudPolicyController* - machine_level_user_cloud_policy_controller() { - return machine_level_user_cloud_policy_controller_.get(); + ChromeBrowserCloudManagementController* + chrome_browser_cloud_management_controller() { + return chrome_browser_cloud_management_controller_.get(); } MachineLevelUserCloudPolicyManager* machine_level_user_cloud_policy_manager() { @@ -78,8 +78,8 @@ ConfigurationPolicyProvider* platform_provider_ = nullptr; #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) - std::unique_ptr<MachineLevelUserCloudPolicyController> - machine_level_user_cloud_policy_controller_; + std::unique_ptr<ChromeBrowserCloudManagementController> + chrome_browser_cloud_management_controller_; // Owned by base class. MachineLevelUserCloudPolicyManager* machine_level_user_cloud_policy_manager_ = nullptr;
diff --git a/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc index 2837713..32e737a 100644 --- a/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc +++ b/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
@@ -24,19 +24,19 @@ #include "chrome/browser/chrome_browser_main.h" #include "chrome/browser/chrome_browser_main_extra_parts.h" #include "chrome/browser/net/system_network_context_manager.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" #include "chrome/browser/policy/fake_browser_dm_token_storage.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_result_codes.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" +#include "components/policy/core/common/cloud/chrome_browser_cloud_management_metrics.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/cloud/dm_auth.h" #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h" -#include "components/policy/core/common/cloud/machine_level_user_cloud_policy_metrics.h" #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_store.h" #include "components/policy/core/common/cloud/mock_cloud_external_data_manager.h" #include "components/policy/core/common/cloud/mock_device_management_service.h" @@ -83,8 +83,8 @@ } )"; -class MachineLevelUserCloudPolicyControllerObserver - : public MachineLevelUserCloudPolicyController::Observer { +class ChromeBrowserCloudManagementControllerObserver + : public ChromeBrowserCloudManagementController::Observer { public: void OnPolicyRegisterFinished(bool succeeded) override { if (!succeeded && should_display_error_message_) { @@ -99,7 +99,7 @@ EXPECT_EQ(should_succeed_, succeeded); is_finished_ = true; g_browser_process->browser_policy_connector() - ->machine_level_user_cloud_policy_controller() + ->chrome_browser_cloud_management_controller() ->RemoveObserver(this); // If enrollment fails, the manager should be marked as initialized // immediately. Otherwise, this will be done after the policy data is @@ -129,16 +129,16 @@ class ChromeBrowserExtraSetUp : public ChromeBrowserMainExtraParts { public: explicit ChromeBrowserExtraSetUp( - MachineLevelUserCloudPolicyControllerObserver* observer) + ChromeBrowserCloudManagementControllerObserver* observer) : observer_(observer) {} void PreMainMessageLoopStart() override { g_browser_process->browser_policy_connector() - ->machine_level_user_cloud_policy_controller() + ->chrome_browser_cloud_management_controller() ->AddObserver(observer_); } private: - MachineLevelUserCloudPolicyControllerObserver* observer_; + ChromeBrowserCloudManagementControllerObserver* observer_; DISALLOW_COPY_AND_ASSIGN(ChromeBrowserExtraSetUp); }; @@ -394,8 +394,8 @@ base::TaskPriority::BEST_EFFORT})); policy_store->AddObserver(&observer); - base::FilePath policy_dir = - user_data_dir.Append(MachineLevelUserCloudPolicyController::kPolicyDir); + base::FilePath policy_dir = user_data_dir.Append( + ChromeBrowserCloudManagementController::kPolicyDir); std::unique_ptr<MachineLevelUserCloudPolicyManager> manager = std::make_unique<MachineLevelUserCloudPolicyManager>( @@ -476,15 +476,15 @@ BrowserDMTokenStorage::Get()->RetrieveDMToken()); // Verify the enrollment result. - MachineLevelUserCloudPolicyEnrollmentResult expected_result; + ChromeBrowserCloudManagementEnrollmentResult expected_result; if (is_enrollment_token_valid() && storage_enabled()) { - expected_result = MachineLevelUserCloudPolicyEnrollmentResult::kSuccess; + expected_result = ChromeBrowserCloudManagementEnrollmentResult::kSuccess; } else if (is_enrollment_token_valid() && !storage_enabled()) { expected_result = - MachineLevelUserCloudPolicyEnrollmentResult::kFailedToStore; + ChromeBrowserCloudManagementEnrollmentResult::kFailedToStore; } else { expected_result = - MachineLevelUserCloudPolicyEnrollmentResult::kFailedToFetch; + ChromeBrowserCloudManagementEnrollmentResult::kFailedToFetch; } // Verify the metrics. @@ -503,7 +503,7 @@ private: LocalPolicyTestServer test_server_; FakeBrowserDMTokenStorage storage_; - MachineLevelUserCloudPolicyControllerObserver observer_; + ChromeBrowserCloudManagementControllerObserver observer_; DISALLOW_COPY_AND_ASSIGN(MachineLevelUserCloudPolicyEnrollmentTest); };
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 74c322a..674e90b 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -309,7 +309,6 @@ #include "chromeos/network/fast_transition_observer.h" #include "chromeos/network/proxy/proxy_config_handler.h" #include "chromeos/services/assistant/public/cpp/assistant_prefs.h" -#include "chromeos/services/device_sync/device_sync_impl.h" #include "chromeos/services/multidevice_setup/multidevice_setup_service.h" #include "chromeos/timezone/timezone_resolver.h" #include "components/arc/arc_prefs.h" @@ -916,7 +915,6 @@ chromeos::AccountManager::RegisterPrefs(registry); chromeos::assistant::prefs::RegisterProfilePrefsForBrowser(registry); chromeos::CupsPrintersManager::RegisterProfilePrefs(registry); - chromeos::device_sync::DeviceSyncImpl::RegisterProfilePrefs(registry); chromeos::first_run::RegisterProfilePrefs(registry); chromeos::file_system_provider::RegisterProfilePrefs(registry); chromeos::KerberosCredentialsManager::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc b/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc index 36b0a76..86b12d40 100644 --- a/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc +++ b/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc
@@ -102,10 +102,16 @@ // after a tab being loaded. // - Ignore the audio events happening during the first fews seconds after a // tab being backgrounded. +// - 2: +// - Ignore events that happen shortly after a tab is backgrounded. This is +// because such events are likely a response to a recent user action +// rather than an attempt from the tab to communicate in background. +// See https://crbug.com/1865601. // // Transform logic: -// - From {no version} to v1: The database is erased entirely. -const size_t LevelDBSiteCharacteristicsDatabase::kDbVersion = 1U; +// - From any version to v1: The database is erased entirely. +// - From any version to v2: The database is erased entirely. +const size_t LevelDBSiteCharacteristicsDatabase::kDbVersion = 2U; const char LevelDBSiteCharacteristicsDatabase::kDbMetadataKey[] = "database_metadata";
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc index d64fd05d..da00b53 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc
@@ -68,8 +68,8 @@ base::TimeDelta GetLongestGracePeriod() { const SiteCharacteristicsDatabaseParams& params = GetStaticSiteCharacteristicsDatabaseParams(); - return std::max({params.title_or_favicon_change_grace_period, - params.audio_usage_grace_period}); + return std::max({params.title_or_favicon_change_post_load_grace_period, + params.feature_usage_post_background_grace_period}); } // Returns the LocalSiteCharacteristicsDataImpl that backs |reader|. @@ -226,8 +226,8 @@ // Background the tab and reload it so the audio will stop playing if it's // still playing. GetActiveWebContents()->WasHidden(); - test_clock_.Advance( - GetStaticSiteCharacteristicsDatabaseParams().audio_usage_grace_period); + test_clock_.Advance(GetStaticSiteCharacteristicsDatabaseParams() + .feature_usage_post_background_grace_period); } // Ensure that the current tab is allowed to display non-persistent @@ -243,7 +243,7 @@ void ExpireTitleOrFaviconGracePeriod() { test_clock_.Advance(GetStaticSiteCharacteristicsDatabaseParams() - .title_or_favicon_change_grace_period); + .title_or_favicon_change_post_load_grace_period); } base::SimpleTestTickClock& test_clock() { return test_clock_; }
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc index 04307b9..88421d0 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc
@@ -259,16 +259,20 @@ if (feature_type == FeatureType::kTitleChange || feature_type == FeatureType::kFaviconChange) { DCHECK(!loaded_time_.is_null()); - if (NowTicks() - loaded_time_ < GetStaticSiteCharacteristicsDatabaseParams() - .title_or_favicon_change_grace_period) { + if (NowTicks() - loaded_time_ < + GetStaticSiteCharacteristicsDatabaseParams() + .title_or_favicon_change_post_load_grace_period) { return true; } - } else if (feature_type == FeatureType::kAudioUsage) { - DCHECK(!backgrounded_time_.is_null()); - if (NowTicks() - backgrounded_time_ < - GetStaticSiteCharacteristicsDatabaseParams().audio_usage_grace_period) { - return true; - } + } + + // Ignore events happening shortly after the tab being backgrounded, they're + // usually false positives. + DCHECK(!backgrounded_time_.is_null()); + if (NowTicks() - backgrounded_time_ < + GetStaticSiteCharacteristicsDatabaseParams() + .feature_usage_post_background_grace_period) { + return true; } return false;
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc index 399339e..5690bd7f 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer_unittest.cc
@@ -211,18 +211,13 @@ web_contents()->WasHidden(); ::testing::Mock::VerifyAndClear(mock_writer); - // Notification usage events always get forwarded. - EXPECT_CALL(*mock_writer, NotifyUsesNotificationsInBackground()); - observer()->OnNonPersistentNotificationCreated(); - ::testing::Mock::VerifyAndClear(mock_writer); - auto params = GetStaticSiteCharacteristicsDatabaseParams(); // Title and Favicon should be ignored during the post-loading grace period. observer()->DidUpdateFaviconURL({}); observer()->TitleWasSet(nullptr); ::testing::Mock::VerifyAndClear(mock_writer); - test_clock().Advance(params.title_or_favicon_change_grace_period); + test_clock().Advance(params.title_or_favicon_change_post_load_grace_period); EXPECT_CALL(*mock_writer, NotifyUpdatesFaviconInBackground()); observer()->DidUpdateFaviconURL({}); @@ -242,14 +237,22 @@ web_contents()->WasHidden(); ::testing::Mock::VerifyAndClear(mock_writer); - // Audio usage events should be ignored during the post-background grace - // period. + // Events should be ignored during the post-background grace period. observer()->OnAudioStateChanged(true); + observer()->DidUpdateFaviconURL({}); + observer()->TitleWasSet(nullptr); + observer()->OnNonPersistentNotificationCreated(); ::testing::Mock::VerifyAndClear(mock_writer); - test_clock().Advance(params.audio_usage_grace_period); + test_clock().Advance(params.feature_usage_post_background_grace_period); EXPECT_CALL(*mock_writer, NotifyUsesAudioInBackground()); + EXPECT_CALL(*mock_writer, NotifyUpdatesFaviconInBackground()); + EXPECT_CALL(*mock_writer, NotifyUpdatesTitleInBackground()); + EXPECT_CALL(*mock_writer, NotifyUsesNotificationsInBackground()); observer()->OnAudioStateChanged(true); + observer()->DidUpdateFaviconURL({}); + observer()->TitleWasSet(nullptr); + observer()->OnNonPersistentNotificationCreated(); ::testing::Mock::VerifyAndClear(mock_writer); EXPECT_CALL(*mock_writer, OnDestroy()); @@ -296,6 +299,12 @@ web_contents()->WasHidden(); ::testing::Mock::VerifyAndClear(mock_writer); + // Events should be ignored during the post-background grace period. + observer()->OnNonPersistentNotificationCreated(); + ::testing::Mock::VerifyAndClear(mock_writer); + test_clock().Advance(GetStaticSiteCharacteristicsDatabaseParams() + .feature_usage_post_background_grace_period); + EXPECT_CALL(*mock_writer, NotifyUsesNotificationsInBackground()); observer()->OnNonPersistentNotificationCreated(); ::testing::Mock::VerifyAndClear(mock_writer);
diff --git a/chrome/browser/resource_coordinator/tab_manager_features.cc b/chrome/browser/resource_coordinator/tab_manager_features.cc index 22dcc4f5..ab9dabae 100644 --- a/chrome/browser/resource_coordinator/tab_manager_features.cc +++ b/chrome/browser/resource_coordinator/tab_manager_features.cc
@@ -121,9 +121,9 @@ constexpr base::FeatureParam<int> SiteCharacteristicsDatabaseParams::kNotificationsUsageObservationWindow; constexpr base::FeatureParam<int> - SiteCharacteristicsDatabaseParams::kTitleOrFaviconChangeGracePeriod; + SiteCharacteristicsDatabaseParams::kTitleOrFaviconChangePostLoadGracePeriod; constexpr base::FeatureParam<int> - SiteCharacteristicsDatabaseParams::kAudioUsageGracePeriod; + SiteCharacteristicsDatabaseParams::kFeatureUsagePostBackgroundGracePeriod; ProactiveTabFreezeAndDiscardParams::ProactiveTabFreezeAndDiscardParams() = default; @@ -235,12 +235,15 @@ SiteCharacteristicsDatabaseParams::kNotificationsUsageObservationWindow .Get()); - params.title_or_favicon_change_grace_period = base::TimeDelta::FromSeconds( - SiteCharacteristicsDatabaseParams::kTitleOrFaviconChangeGracePeriod - .Get()); + params.title_or_favicon_change_post_load_grace_period = + base::TimeDelta::FromSeconds( + SiteCharacteristicsDatabaseParams:: + kTitleOrFaviconChangePostLoadGracePeriod.Get()); - params.audio_usage_grace_period = base::TimeDelta::FromSeconds( - SiteCharacteristicsDatabaseParams::kAudioUsageGracePeriod.Get()); + params.feature_usage_post_background_grace_period = + base::TimeDelta::FromSeconds( + SiteCharacteristicsDatabaseParams:: + kFeatureUsagePostBackgroundGracePeriod.Get()); return params; }
diff --git a/chrome/browser/resource_coordinator/tab_manager_features.h b/chrome/browser/resource_coordinator/tab_manager_features.h index dc061ce..763c155 100644 --- a/chrome/browser/resource_coordinator/tab_manager_features.h +++ b/chrome/browser/resource_coordinator/tab_manager_features.h
@@ -210,12 +210,14 @@ static constexpr base::FeatureParam<int> kNotificationsUsageObservationWindow{ &features::kSiteCharacteristicsDatabase, "NotificationsUsageObservationWindow", 2 * base::Time::kSecondsPerHour}; - static constexpr base::FeatureParam<int> kTitleOrFaviconChangeGracePeriod{ - &features::kSiteCharacteristicsDatabase, - "TitleOrFaviconChangeGracePeriod", 20 /* 20 seconds */}; - static constexpr base::FeatureParam<int> kAudioUsageGracePeriod{ - &features::kSiteCharacteristicsDatabase, "AudioUsageGracePeriod", - 10 /* 10 seconds */}; + static constexpr base::FeatureParam<int> + kTitleOrFaviconChangePostLoadGracePeriod{ + &features::kSiteCharacteristicsDatabase, + "TitleOrFaviconChangePostLoadGracePeriod", 20 /* 20 seconds */}; + static constexpr base::FeatureParam<int> + kFeatureUsagePostBackgroundGracePeriod{ + &features::kSiteCharacteristicsDatabase, + "FeatureUsagePostBackgroundGracePeriod", 10 /* 10 seconds */}; // Minimum observation window before considering that this website doesn't // update its favicon while in background. @@ -233,12 +235,18 @@ // change events. It's possible for some site that are loaded in background to // use some of these features without this being an attempt to communicate // with the user (e.g. the tab is just really finishing to load). - base::TimeDelta title_or_favicon_change_grace_period; - // The period of time during which we ignore audio usage gets ignored after a - // tab gets backgrounded. It's necessary because there might be a delay - // between a media request gets initiated and the time the audio actually - // starts. - base::TimeDelta audio_usage_grace_period; + base::TimeDelta title_or_favicon_change_post_load_grace_period; + // The period of time during which we ignore events after a tab gets + // backgrounded. It's necessary because some events might happen shortly after + // backgrounding a tab without this being an attempt to communicate with the + // user: + // - There might be a delay between a media request gets initiated and the + // time the audio actually starts. + // - Same-document navigation can cause the title or favicon to change, if + // the user switch tab before this completes this will be recorded as a + // background communication event while in reality it's just a navigation + // event. + base::TimeDelta feature_usage_post_background_grace_period; }; // Gets parameters for the proactive tab discarding feature. This does no
diff --git a/chrome/browser/resource_coordinator/tab_manager_features_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_features_unittest.cc index 17939e9..94724f9 100644 --- a/chrome/browser/resource_coordinator/tab_manager_features_unittest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_features_unittest.cc
@@ -85,8 +85,8 @@ base::TimeDelta title_update_observation_window, base::TimeDelta audio_usage_observation_window, base::TimeDelta notifications_usage_observation_window, - base::TimeDelta title_or_favicon_change_grace_period, - base::TimeDelta audio_usage_grace_period) { + base::TimeDelta title_or_favicon_change_post_load_grace_period, + base::TimeDelta feature_usage_post_background_grace_period) { SiteCharacteristicsDatabaseParams params = GetSiteCharacteristicsDatabaseParams(); @@ -98,9 +98,10 @@ params.audio_usage_observation_window); EXPECT_EQ(notifications_usage_observation_window, params.notifications_usage_observation_window); - EXPECT_EQ(title_or_favicon_change_grace_period, - params.title_or_favicon_change_grace_period); - EXPECT_EQ(audio_usage_grace_period, params.audio_usage_grace_period); + EXPECT_EQ(title_or_favicon_change_post_load_grace_period, + params.title_or_favicon_change_post_load_grace_period); + EXPECT_EQ(feature_usage_post_background_grace_period, + params.feature_usage_post_background_grace_period); } void ExpectDefaultProactiveTabFreezeAndDiscardParams() { @@ -152,11 +153,11 @@ SiteCharacteristicsDatabaseParams:: kNotificationsUsageObservationWindow.default_value), base::TimeDelta::FromSeconds( - SiteCharacteristicsDatabaseParams::kTitleOrFaviconChangeGracePeriod - .default_value), + SiteCharacteristicsDatabaseParams:: + kTitleOrFaviconChangePostLoadGracePeriod.default_value), base::TimeDelta::FromSeconds( - SiteCharacteristicsDatabaseParams::kAudioUsageGracePeriod - .default_value)); + SiteCharacteristicsDatabaseParams:: + kFeatureUsagePostBackgroundGracePeriod.default_value)); } private: @@ -286,11 +287,13 @@ SiteCharacteristicsDatabaseParams::kNotificationsUsageObservationWindow .name, "abc"); + SetParam(SiteCharacteristicsDatabaseParams:: + kTitleOrFaviconChangePostLoadGracePeriod.name, + "bleh"); SetParam( - SiteCharacteristicsDatabaseParams::kTitleOrFaviconChangeGracePeriod.name, - "bleh"); - SetParam(SiteCharacteristicsDatabaseParams::kAudioUsageGracePeriod.name, - "!!!"); + SiteCharacteristicsDatabaseParams::kFeatureUsagePostBackgroundGracePeriod + .name, + "!!!"); EnableSiteCharacteristicsDatabase(); ExpectDefaultSiteCharacteristicsDatabaseParams(); } @@ -308,11 +311,13 @@ SiteCharacteristicsDatabaseParams::kNotificationsUsageObservationWindow .name, "3600000"); + SetParam(SiteCharacteristicsDatabaseParams:: + kTitleOrFaviconChangePostLoadGracePeriod.name, + "42"); SetParam( - SiteCharacteristicsDatabaseParams::kTitleOrFaviconChangeGracePeriod.name, - "42"); - SetParam(SiteCharacteristicsDatabaseParams::kAudioUsageGracePeriod.name, - "43"); + SiteCharacteristicsDatabaseParams::kFeatureUsagePostBackgroundGracePeriod + .name, + "43"); EnableSiteCharacteristicsDatabase();
diff --git a/chrome/browser/resources/chromeos/BUILD.gn b/chrome/browser/resources/chromeos/BUILD.gn index 8de13aa3..e70bbd22 100644 --- a/chrome/browser/resources/chromeos/BUILD.gn +++ b/chrome/browser/resources/chromeos/BUILD.gn
@@ -66,6 +66,7 @@ "braille_ime:closure_compile", "camera/src/js:closure_compile", "crostini_installer:closure_compile", + "emulator:closure_compile", "internet_config_dialog:closure_compile", "internet_detail_dialog:closure_compile", "login:closure_compile",
diff --git a/chrome/browser/resources/chromeos/camera/src/js/metrics.js b/chrome/browser/resources/chromeos/camera/src/js/metrics.js index 601def3..6f36402 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/metrics.js +++ b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
@@ -90,14 +90,26 @@ }; /** + * Types of intent result dimension. + * @enum {string} + */ +cca.metrics.IntentResultType = { + NOT_INTENT: '', + CANCELED: 'canceled', + CONFIRMED: 'confirmed', +}; + +/** * Returns event builder for the metrics type: capture. * @param {?string} facingMode Camera facing-mode of the capture. * @param {number} length Length of 1 minute buckets for captured video. * @param {!{width: number, height: number}} resolution Capture resolution. + * @param {!cca.metrics.IntentResultType} intentResult * @return {!analytics.EventBuilder} * @private */ -cca.metrics.captureType_ = function(facingMode, length, {width, height}) { +cca.metrics.captureType_ = function( + facingMode, length, {width, height}, intentResult) { var condState = (states, cond = undefined, strict = undefined) => { // Return the first existing state among the given states only if there is // no gate condition or the condition is met. @@ -122,6 +134,7 @@ .dimen(9, condState(['tall'])) .dimen(10, `${width}x${height}`) .dimen(11, condState(['_30fps', '_60fps'], 'video-mode', true)) + .dimen(12, intentResult) .value(length || 0); };
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js index d21b3f9..a7b1e80 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js +++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
@@ -29,10 +29,10 @@ /** * Creates the camera-view controller. - * @param {cca.models.ResultSaver} resultSaver - * @param {cca.device.DeviceInfoUpdater} infoUpdater - * @param {cca.device.PhotoResolPreferrer} photoPreferrer - * @param {cca.device.VideoConstraintsPreferrer} videoPreferrer + * @param {!cca.models.ResultSaver} resultSaver + * @param {!cca.device.DeviceInfoUpdater} infoUpdater + * @param {!cca.device.PhotoResolPreferrer} photoPreferrer + * @param {!cca.device.VideoConstraintsPreferrer} videoPreferrer * @constructor */ cca.views.Camera = function( @@ -67,28 +67,13 @@ this.options_ = new cca.views.camera.Options(infoUpdater, this.restart.bind(this)); - const doSavePhoto = async (result, name) => { - cca.metrics.log( - cca.metrics.Type.CAPTURE, this.facingMode_, 0, result.resolution); - try { - await resultSaver.savePhoto(result.blob, name); - } catch (e) { - cca.toast.show('error_msg_save_file_failed'); - throw e; - } - }; + /** + * @type {!cca.models.ResultSaver} + * @protected + */ + this.resultSaver_ = resultSaver; + const createVideoSaver = async () => resultSaver.startSaveVideo(); - const doSaveVideo = async (result, name) => { - cca.metrics.log( - cca.metrics.Type.CAPTURE, this.facingMode_, result.duration, - result.resolution); - try { - await resultSaver.finishSaveVideo(result.videoSaver, name); - } catch (e) { - cca.toast.show('error_msg_save_file_failed'); - throw e; - } - }; /** * Modes for the camera. @@ -97,7 +82,8 @@ */ this.modes_ = new cca.views.camera.Modes( this.defaultMode, photoPreferrer, videoPreferrer, this.restart.bind(this), - doSavePhoto, createVideoSaver, doSaveVideo); + this.doSavePhoto_.bind(this), createVideoSaver, + this.doSaveVideo_.bind(this)); /** * @type {?string} @@ -228,6 +214,44 @@ }; /** + * Handles captured photo result. + * @param {!cca.views.camera.PhotoResult} result Captured photo result. + * @param {string} name Name of the photo result to be saved as. + * @return {!Promise} Promise for the operation. + * @protected + */ +cca.views.Camera.prototype.doSavePhoto_ = async function(result, name) { + cca.metrics.log( + cca.metrics.Type.CAPTURE, this.facingMode_, /* length= */ 0, + result.resolution, cca.metrics.IntentResultType.NOT_INTENT); + try { + await this.resultSaver_.savePhoto(result.blob, name); + } catch (e) { + cca.toast.show('error_msg_save_file_failed'); + throw e; + } +}; + +/** + * Handles captured video result. + * @param {!cca.views.camera.VideoResult} result Captured video result. + * @param {string} name Name of the video result to be saved as. + * @return {!Promise} Promise for the operation. + * @protected + */ +cca.views.Camera.prototype.doSaveVideo_ = async function(result, name) { + cca.metrics.log( + cca.metrics.Type.CAPTURE, this.facingMode_, result.duration, + result.resolution, cca.metrics.IntentResultType.NOT_INTENT); + try { + await this.resultSaver_.finishSaveVideo(result.videoSaver, name); + } catch (e) { + cca.toast.show('error_msg_save_file_failed'); + throw e; + } +}; + +/** * @override */ cca.views.Camera.prototype.layout = function() {
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera_intent.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera_intent.js index 0cb5c8cb..5dffa34 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/views/camera_intent.js +++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera_intent.js
@@ -35,7 +35,6 @@ constructor(intent, infoUpdater, photoPreferrer, videoPreferrer) { const resultSaver = { savePhoto: async (blob) => { - this.photoResult_ = blob; if (intent.shouldDownScale) { const image = await cca.util.blobToImage(blob); const ratio = Math.sqrt( @@ -52,7 +51,7 @@ return await cca.models.IntentVideoSaver.create(intent); }, finishSaveVideo: async (video, savedName) => { - this.videoResult_ = await video.endWrite(); + this.videoResultFile_ = await video.endWrite(); }, }; super(resultSaver, infoUpdater, photoPreferrer, videoPreferrer); @@ -64,18 +63,24 @@ this.intent_ = intent; /** - * @type {?Blob} + * @type {?cca.views.camera.PhotoResult} * @private */ this.photoResult_ = null; /** - * @type {?FileEntry} + * @type {?cca.views.camera.VideoResult} * @private */ this.videoResult_ = null; /** + * @type {?FileEntry} + * @private + */ + this.videoResultFile_ = null; + + /** * @type {!cca.views.camera.ReviewResult} * @private */ @@ -85,9 +90,35 @@ /** * @override */ + async doSavePhoto_(result, name) { + this.photoResult_ = result; + try { + await this.resultSaver_.savePhoto(result.blob, name); + } catch (e) { + cca.toast.show('error_msg_save_file_failed'); + throw e; + } + } + + /** + * @override + */ + async doSaveVideo_(result, name) { + this.videoResult_ = result; + try { + await this.resultSaver_.finishSaveVideo(result.videoSaver, name); + } catch (e) { + cca.toast.show('error_msg_save_file_failed'); + throw e; + } + } + + /** + * @override + */ beginTake_() { if (this.photoResult_ !== null) { - URL.revokeObjectURL(this.photoResult_); + URL.revokeObjectURL(this.photoResult_.blob); } this.photoResult_ = null; this.videoResult_ = null; @@ -107,8 +138,14 @@ await this.restart(); const confirmed = await ( this.photoResult_ !== null ? - this.reviewResult_.openPhoto(this.photoResult_) : - this.reviewResult_.openVideo(this.videoResult_)); + this.reviewResult_.openPhoto(this.photoResult_.blob) : + this.reviewResult_.openVideo(this.videoResultFile_)); + const result = this.photoResult_ || this.videoResult_; + cca.metrics.log( + cca.metrics.Type.CAPTURE, this.facingMode_, result.duration || 0, + result.resolution, + confirmed ? cca.metrics.IntentResultType.CONFIRMED : + cca.metrics.IntentResultType.CANCELED); if (confirmed) { await this.intent_.finish(); window.close();
diff --git a/chrome/browser/resources/chromeos/emulator/BUILD.gn b/chrome/browser/resources/chromeos/emulator/BUILD.gn new file mode 100644 index 0000000..a48f3e5 --- /dev/null +++ b/chrome/browser/resources/chromeos/emulator/BUILD.gn
@@ -0,0 +1,38 @@ +# Copyright 2018 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//third_party/closure_compiler/compile_js.gni") + +js_type_check("closure_compile") { + deps = [ + ":audio_settings", + ":battery_settings", + ":bluetooth_settings", + ":device_emulator_pages", + ":input_device_settings", + ] +} + +js_library("audio_settings") { + externs_list = [ "$externs_path/chrome_send.js" ] +} + +js_library("bluetooth_settings") { + externs_list = [ "$externs_path/chrome_send.js" ] +} + +js_library("battery_settings") { + externs_list = [ "$externs_path/chrome_send.js" ] +} + +js_library("input_device_settings") { + externs_list = [ "$externs_path/chrome_send.js" ] +} + +js_library("device_emulator_pages") { + deps = [ + "//ui/webui/resources/js:cr", + ] + externs_list = [ "$externs_path/chrome_send.js" ] +}
diff --git a/chrome/browser/resources/chromeos/emulator/audio_settings.js b/chrome/browser/resources/chromeos/emulator/audio_settings.js index a9a62e0..6e056b1 100644 --- a/chrome/browser/resources/chromeos/emulator/audio_settings.js +++ b/chrome/browser/resources/chromeos/emulator/audio_settings.js
@@ -20,6 +20,7 @@ /** * An audio node. Based on the struct AudioNode found in audio_node.h. * @constructor + * @suppress {checkTypes} */ var AudioNode = function() { // Whether node will input or output audio. @@ -52,13 +53,11 @@ properties: { /** * An AudioNode which is currently being edited. - * @type {AudioNode} + * @type {?AudioNode} */ currentEditableObject: { type: Object, - value: function() { - return {}; - } + value: null, }, /** @@ -138,7 +137,7 @@ /** * This adds or modifies an audio node to the AudioNodeList. - * @param {model: {index: number}} e Event with a model containing + * @param {{model: {index: number}}} e Event with a model containing * the index in |nodes| to add. */ insertAudioNode: function(e) { @@ -150,10 +149,8 @@ /** * This adds/modifies the audio node |nodes[currentEditIndex]| to/from the * AudioNodeList. - * @param {model: {index: number}} e Event with a model containing - * the index in |nodes| to add. */ - insertEditedAudioNode: function(e) { + insertEditedAudioNode: function() { // Insert a new node or update an existing node using all the properties // in |node|. var node = this.nodes[this.currentEditIndex]; @@ -163,8 +160,8 @@ /** * Removes the audio node with id |id|. - * @param {model: {index: number}} e Event with a model containing - * the index in |nodes| to add. + * @param {{model: {index: number}}} e Event with a model containing + * the index in |nodes| to remove. */ removeAudioNode: function(e) { var info = this.nodes[e.model.index];
diff --git a/chrome/browser/resources/chromeos/emulator/battery_settings.js b/chrome/browser/resources/chromeos/emulator/battery_settings.js index c9132839fb..48ee08ef 100644 --- a/chrome/browser/resources/chromeos/emulator/battery_settings.js +++ b/chrome/browser/resources/chromeos/emulator/battery_settings.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var BatterySettings = Polymer({ +Polymer({ is: 'battery-settings', properties: { @@ -115,11 +115,11 @@ /** The ID of the current power source, or the empty string. */ selectedPowerSourceId: String, - /** A string representing the time left until the battery is discharged. */ - timeUntilEmpty: String, + /** A number representing the time left until the battery is discharged. */ + timeUntilEmpty: Number, - /** A string representing the time left until the battery is at 100%. */ - timeUntilFull: String, + /** A number representing the time left until the battery is at 100%. */ + timeUntilFull: Number, }, observers: [ @@ -131,7 +131,7 @@ }, onBatteryPercentChange: function(e) { - this.percent = parseInt(e.target.value); + this.percent = parseInt(e.target.value, 10); if (!isNaN(this.percent)) chrome.send('updateBatteryPercent', [this.percent]); }, @@ -161,13 +161,13 @@ }, onTimeUntilEmptyChange: function(e) { - this.timeUntilEmpty = parseInt(e.target.value); + this.timeUntilEmpty = parseInt(e.target.value, 10); if (!isNaN(this.timeUntilEmpty)) chrome.send('updateTimeToEmpty', [this.timeUntilEmpty]); }, onTimeUntilFullChange: function(e) { - this.timeUntilFull = parseInt(e.target.value); + this.timeUntilFull = parseInt(e.target.value, 10); if (!isNaN(this.timeUntilFull)) chrome.send('updateTimeToFull', [this.timeUntilFull]); }, @@ -176,13 +176,21 @@ e.model.set('item.power', e.target.value); }, - updatePowerProperties: function(power_properties) { - this.batteryPercent = power_properties.battery_percent; - this.batteryState = - this.batteryStateOptions[power_properties.battery_state]; - this.timeUntilEmpty = power_properties.battery_time_to_empty_sec; - this.timeUntilFull = power_properties.battery_time_to_full_sec; - this.selectedPowerSourceId = power_properties.external_power_source_id; + /** + * @param {{ + * battery_percent: number, + * battery_state: number, + * battery_time_to_empty_sec: number, + * battery_time_to_full_sec: number, + * external_power_source_id: string, + * }} properties + */ + updatePowerProperties: function(properties) { + this.batteryPercent = properties.battery_percent; + this.batteryState = this.batteryStateOptions[properties.battery_state]; + this.timeUntilEmpty = properties.battery_time_to_empty_sec; + this.timeUntilFull = properties.battery_time_to_full_sec; + this.selectedPowerSourceId = properties.external_power_source_id; }, isBatteryPresent: function() {
diff --git a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js index 1c36a83..bd7a2c4 100644 --- a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js +++ b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js
@@ -68,7 +68,7 @@ /** * A set of predefined bluetooth devices. - * @type !Array<!Bluetooth> + * @type !Array<!BluetoothDevice> */ predefinedDevices: { type: Array, @@ -79,13 +79,11 @@ /** * A bluetooth device object which is currently being edited. - * @type {BluetoothDevice} + * @type {?BluetoothDevice} */ currentEditableObject: { type: Object, - value: function() { - return {}; - } + value: null, }, /** @@ -104,7 +102,7 @@ * A set of options for the possible bluetooth device classes/types. * Object |value| attribute comes from values in the WebUI, set in * setDeviceClassOptions. - * @type !Array<! {text: string, value: int} > + * @type !Array<!{text: string, value: number}> */ deviceClassOptions: { type: Array, @@ -270,13 +268,17 @@ * @return {boolean} Whether the PIN/passkey input field should be shown. */ showAuthToken: function(pairMethod) { - return pairMethod && pairMethod != 'None'; + return !!pairMethod && pairMethod != 'None'; }, /** * Called by the WebUI which provides a list of devices which are connected * to the main adapter. - * @param {!Array<!BluetoothDevice>} devices A list of bluetooth devices. + * @param {!Array<!BluetoothDevice>} predefinedDevices A list of bluetooth + * devices. + * @param {!Array<!BluetoothDevice>} loadedCustomDevices + * @param {!Array<string>} pairingMethodOptions + * @param {!Array<string>} pairingActionOptions */ updateBluetoothInfo: function( predefinedDevices, loadedCustomDevices, pairingMethodOptions, @@ -289,7 +291,7 @@ /** * Builds complete BluetoothDevice objects for each element in |devices_list|. - * @param {!Array<!BluetoothDevice>} devices_list A list of incomplete + * @param {!Array<!BluetoothDevice>} devices A list of incomplete * BluetoothDevice provided by the C++ WebUI. * @param {boolean} predefined Whether or not the device is a predefined one. */ @@ -522,6 +524,7 @@ if (this.deviceClassOptions[i].value == classValue) return this.deviceClassOptions[i].text; } + return ''; }, /**
diff --git a/chrome/browser/resources/chromeos/login/app_downloading.css b/chrome/browser/resources/chromeos/login/app_downloading.css index 01cd896e..d082a20 100644 --- a/chrome/browser/resources/chromeos/login/app_downloading.css +++ b/chrome/browser/resources/chromeos/login/app_downloading.css
@@ -4,8 +4,6 @@ :root { color: #333; - font: 13px Roboto, sans-serif; - font-weight: 400; /* roboto-regular */ } #app-downloading-video-container {
diff --git a/chrome/browser/resources/chromeos/login/arc_terms_of_service.css b/chrome/browser/resources/chromeos/login/arc_terms_of_service.css index 50c01a4..5285859 100644 --- a/chrome/browser/resources/chromeos/login/arc_terms_of_service.css +++ b/chrome/browser/resources/chromeos/login/arc_terms_of_service.css
@@ -4,17 +4,11 @@ a { color: var(--google-blue-500); - font-family: 'Roboto'; - font-size: 13px; - font-weight: 400; text-decoration: none; } p { color: rgba(0, 0, 0, 0.54); - font-family: 'Roboto'; - font-size: 13px; - font-weight: 400; line-height: 16px; margin: 0; padding: 0;
diff --git a/chrome/browser/resources/chromeos/login/demo_preferences.css b/chrome/browser/resources/chromeos/login/demo_preferences.css index a48ff77..b416d25b 100644 --- a/chrome/browser/resources/chromeos/login/demo_preferences.css +++ b/chrome/browser/resources/chromeos/login/demo_preferences.css
@@ -18,5 +18,4 @@ .language-selection-title { color: rgba(0, 0, 0, 0.87); - font: 13px Roboto, sans-serif; }
diff --git a/chrome/browser/resources/chromeos/login/discover/discover_card.css b/chrome/browser/resources/chromeos/login/discover/discover_card.css index 07ba3ed1..64fc870 100644 --- a/chrome/browser/resources/chromeos/login/discover/discover_card.css +++ b/chrome/browser/resources/chromeos/login/discover/discover_card.css
@@ -7,11 +7,11 @@ box-shadow: 0 2px 10px rgba(0,0,0,0.18); display: flex; flex-direction: row; - font-family: var(--oobe-title-font-family); height: 208px; min-height: 0; position: relative; width: 312px; + @apply --oobe-default-font; } :host([highlight]) { @@ -46,6 +46,7 @@ #title { color: rgb(32, 33, 36); + font-family: var(--oobe-header-font-family); font-size: 18sp; line-height: 24px; }
diff --git a/chrome/browser/resources/chromeos/login/gaia_card_parameters.css b/chrome/browser/resources/chromeos/login/gaia_card_parameters.css index 891647a8..8f5d7ce 100644 --- a/chrome/browser/resources/chromeos/login/gaia_card_parameters.css +++ b/chrome/browser/resources/chromeos/login/gaia_card_parameters.css
@@ -14,14 +14,13 @@ } gaia-card p.enterprise-info { + @apply --oobe-default-font; color: white; - font-size: 15px; margin: 8px 0 0 0; } gaia-card h1.welcome-message { color: white; - font-size: 20px; - font-weight: normal; margin-bottom: 0; + @apply --oobe-header-font; }
diff --git a/chrome/browser/resources/chromeos/login/marketing_opt_in.css b/chrome/browser/resources/chromeos/login/marketing_opt_in.css index 05f3732..834d90d1 100644 --- a/chrome/browser/resources/chromeos/login/marketing_opt_in.css +++ b/chrome/browser/resources/chromeos/login/marketing_opt_in.css
@@ -9,7 +9,6 @@ .marketing-option { border-top: var(--marketing-opt-in-dialog-list-item-border); color: var(--google-grey-900); - font-size: 13px; line-height: 20px; min-height: 48px; }
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.css b/chrome/browser/resources/chromeos/login/offline_ad_login.css index 2850df4a..c6c941d6 100644 --- a/chrome/browser/resources/chromeos/login/offline_ad_login.css +++ b/chrome/browser/resources/chromeos/login/offline_ad_login.css
@@ -22,7 +22,6 @@ .encryption-subtitle { color: --google-grey-600; - font: 13px Roboto, sans-serif; padding-bottom: 9px; padding-top: 9px; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog.css b/chrome/browser/resources/chromeos/login/oobe_dialog.css index 81c59b8..620a75a 100644 --- a/chrome/browser/resources/chromeos/login/oobe_dialog.css +++ b/chrome/browser/resources/chromeos/login/oobe_dialog.css
@@ -3,13 +3,12 @@ * found in the LICENSE file. */ :host { - --title-font-size: 28px; --title-font-distance-to-baseline: 7px; - --subtitle-font-size: 13px; + --subtitle-font-size: --oobe-default-font-size; --subtitle-font-distance-to-baseline: 3px; --subtitle-line-height: 18px; --offline-gaia-dialog-width: 768px; - font-family: var(--oobe-default-font-family); + @apply --oobe-default-font; } #header-container { @@ -28,10 +27,8 @@ } #oobe-title ::slotted(h1) { - color: var(--google-grey-900); - font-family: var(--oobe-title-font-family); - font-size: var(--title-font-size); - font-weight: normal; + color: var(--oobe-header-text-color); + @apply --oobe-header-font; margin: 0; } @@ -40,8 +37,7 @@ } #oobe-subtitle ::slotted(*) { - color: var(--google-grey-700); - font-size: var(--subtitle-font-size); + color: var(--oobe-subheader-text-color); line-height: var(--subtitle-line-height); /* margin 12px = 32 - line-height - 5 (line height - font size)
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.css b/chrome/browser/resources/chromeos/login/oobe_eula.css index 548c85d..80537de 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.css +++ b/chrome/browser/resources/chromeos/login/oobe_eula.css
@@ -59,7 +59,7 @@ .password-row div { color: rgb(66, 133, 244); - font: 24px Roboto; + font-size: 24px; margin-top: 82px; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_fonts.css b/chrome/browser/resources/chromeos/login/oobe_fonts.css index 1f815b7..1b63b5f 100644 --- a/chrome/browser/resources/chromeos/login/oobe_fonts.css +++ b/chrome/browser/resources/chromeos/login/oobe_fonts.css
@@ -5,5 +5,26 @@ :host { --oobe-button-font-family: "Google Sans", Roboto, sans-serif; --oobe-default-font-family: Roboto, sans-serif; - --oobe-title-font-family: "Google Sans", Roboto, sans-serif; + --oobe-header-font-family: "Google Sans", Roboto, sans-serif; + + --oobe-header-font-size: 28px; + --oobe-default-font-size: 13px; + + --oobe-default-font-weight: 400; /* regular */ + --oobe-header-font-weight: 400; /* regular */ + + --oobe-header-text-color: var(--google-grey-900); + --oobe-subheader-text-color: var(--google-grey-700); + + --oobe-default-font: { + font-family: var(--oobe-default-font-family); + font-size: var(--oobe-default-font-size); + font-weight: var(--oobe-default-font-weight); + }; + + --oobe-header-font: { + font-family: var(--oobe-header-font-family); + font-size: var(--oobe-header-font-size); + font-weight: var(--oobe-default-font-weight); + }; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_reset.css b/chrome/browser/resources/chromeos/login/oobe_reset.css index 99415e93..ef1d19f 100644 --- a/chrome/browser/resources/chromeos/login/oobe_reset.css +++ b/chrome/browser/resources/chromeos/login/oobe_reset.css
@@ -19,7 +19,6 @@ } #tpmFirmwareUpdate { - font: 13px Roboto, sans-serif; margin-bottom: 20px; margin-inline-start: 20px; margin-top: 23px; /* = 36 - font size */
diff --git a/chrome/browser/resources/chromeos/login/oobe_reset_confirmation_overlay.css b/chrome/browser/resources/chromeos/login/oobe_reset_confirmation_overlay.css index dae595e..7df54e0 100644 --- a/chrome/browser/resources/chromeos/login/oobe_reset_confirmation_overlay.css +++ b/chrome/browser/resources/chromeos/login/oobe_reset_confirmation_overlay.css
@@ -24,8 +24,8 @@ } .reset-popup-content-area { + @apply --oobe-default-font; color: rgba(0, 0, 0, .54); - font: 13px Roboto, sans-serif; line-height: 20px; padding: 0 20px 20.5px; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.css b/chrome/browser/resources/chromeos/login/oobe_update.css index faaa000..17ee241 100644 --- a/chrome/browser/resources/chromeos/login/oobe_update.css +++ b/chrome/browser/resources/chromeos/login/oobe_update.css
@@ -4,7 +4,6 @@ :host .text { color: #333; - font: 13px Roboto, sans-serif; line-height: 18px; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css index 16f2aae7b..4fb78244 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.css
@@ -5,12 +5,10 @@ #title { align-self: center; - color: var(--google-grey-900); - font-family: var(--oobe-button-font-family); - font-size: 28px; - font-weight: 400; /* regular */ + color: var(--oobe-header-text-color); margin: 0; user-select: none; + @apply --oobe-header-font; } .welcome-illustration {
diff --git a/chrome/browser/resources/chromeos/login/sync_consent.css b/chrome/browser/resources/chromeos/login/sync_consent.css index 18a771b..bfb1476 100644 --- a/chrome/browser/resources/chromeos/login/sync_consent.css +++ b/chrome/browser/resources/chromeos/login/sync_consent.css
@@ -4,8 +4,6 @@ :root { color: #333; - font: 13px Roboto, sans-serif; - font-weight: 400; /* roboto-regular */ } .overview-list-item { @@ -83,6 +81,5 @@ #syncConsentMakeChromeSyncOptionsDialog .sync-option-subtitle { color: rgba(0, 0, 0, 0.54); - font: 13px Roboto, sans-serif; padding-inline-start: 8px; }
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index 9b9618c..54b34cb 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -556,21 +556,19 @@ </chooser-exception-list> </settings-subpage> </template> - <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]"> - <template is="dom-if" route-path="/content/serialPorts" no-search> - <settings-subpage page-title="$i18n{siteSettingsSerialPorts}"> - <category-default-setting - toggle-off-label="$i18n{siteSettingsSerialPortsBlock}" - toggle-on-label= - "$i18n{siteSettingsSerialPortsAskRecommended}" - category="{{ContentSettingsTypes.SERIAL_PORTS}}"> - </category-default-setting> - <chooser-exception-list - category="{{ContentSettingsTypes.SERIAL_PORTS}}" - chooser-type="{{ChooserType.SERIAL_PORTS}}"> - </chooser-exception-list> - </settings-subpage> - </template> + <template is="dom-if" route-path="/content/serialPorts" no-search> + <settings-subpage page-title="$i18n{siteSettingsSerialPorts}"> + <category-default-setting + toggle-off-label="$i18n{siteSettingsSerialPortsBlock}" + toggle-on-label= + "$i18n{siteSettingsSerialPortsAskRecommended}" + category="{{ContentSettingsTypes.SERIAL_PORTS}}"> + </category-default-setting> + <chooser-exception-list + category="{{ContentSettingsTypes.SERIAL_PORTS}}" + chooser-type="{{ChooserType.SERIAL_PORTS}}"> + </chooser-exception-list> + </settings-subpage> </template> <template is="dom-if" if="[[enableNativeFileSystemWriteContentSetting_]]"> <template is="dom-if" route-path="/content/filesystem" no-search>
diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html index fb24557..0e783bf 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.html +++ b/chrome/browser/resources/settings/site_settings/site_details.html
@@ -171,13 +171,11 @@ category="{{ContentSettingsTypes.USB_DEVICES}}" icon="settings:usb" id="usbDevices" label="$i18n{siteSettingsUsbDevices}"> </site-details-permission> - <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]"> - <site-details-permission - category="{{ContentSettingsTypes.SERIAL_PORTS}}" - icon="settings:serial-port" id="serialPorts" - label="$i18n{siteSettingsSerialPorts}"> - </site-details-permission> - </template> + <site-details-permission + category="{{ContentSettingsTypes.SERIAL_PORTS}}" + icon="settings:serial-port" id="serialPorts" + label="$i18n{siteSettingsSerialPorts}"> + </site-details-permission> <template is="dom-if" if="[[enableNativeFileSystemWriteContentSetting_]]"> <site-details-permission category="{{ContentSettingsTypes.NATIVE_FILE_SYSTEM_WRITE}}"
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js index 545c49a..82895a4f 100644 --- a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js +++ b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
@@ -193,9 +193,6 @@ }; // These categories are gated behind flags. addOrRemoveSettingWithFlag( - settings.ContentSettingsTypes.SERIAL_PORTS, - 'enableExperimentalWebPlatformFeatures'); - addOrRemoveSettingWithFlag( settings.ContentSettingsTypes.BLUETOOTH_SCANNING, 'enableExperimentalWebPlatformFeatures'); addOrRemoveSettingWithFlag(
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html index 3db16d2..6b80d2a 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
@@ -189,21 +189,19 @@ '$i18nPolymer{siteSettingsUsbDevicesAsk}', '$i18nPolymer{siteSettingsUsbDevicesBlock}')]]"></cr-link-row> - <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]"> - <cr-link-row - class="hr two-line" - data-route="SITE_SETTINGS_SERIAL_PORTS" - icon-class="subpage-arrow" - id="serial-ports" - label="$i18n{siteSettingsSerialPorts}" - on-click="onTapNavigate_" - start-icon="settings:serial-port" - sub-label="[[defaultSettingLabel_( - default_.serialPorts, - '$i18nPolymer{siteSettingsSerialPortsAsk}', - '$i18nPolymer{siteSettingsSerialPortsBlock}')]]"> - </cr-link-row> - </template> + <cr-link-row + class="hr two-line" + data-route="SITE_SETTINGS_SERIAL_PORTS" + icon-class="subpage-arrow" + id="serial-ports" + label="$i18n{siteSettingsSerialPorts}" + on-click="onTapNavigate_" + start-icon="settings:serial-port" + sub-label="[[defaultSettingLabel_( + default_.serialPorts, + '$i18nPolymer{siteSettingsSerialPortsAsk}', + '$i18nPolymer{siteSettingsSerialPortsBlock}')]]"> + </cr-link-row> <template is="dom-if" if="[[enableNativeFileSystemWriteContentSetting_]]"> <cr-link-row class="hr two-line"
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc index f2213276..e681532 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h" #include "chrome/browser/policy/browser_dm_token_storage.h" -#include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h" +#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/download_protection/check_client_download_request.h" #include "chrome/grit/generated_resources.h" @@ -35,7 +35,7 @@ namespace safe_browsing { const base::Feature kDeepScanningOfUploads{"DeepScanningOfUploads", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // TODO(rogerta): keeping this disabled by default until UX is finalized. const base::Feature kDeepScanningOfUploadsUI{"DeepScanningOfUploadsUI", @@ -430,11 +430,11 @@ #if !defined(OS_CHROMEOS) // This is not compiled on chromeos because - // MachineLevelUserCloudPolicyController does not exist. Also, + // ChromeBrowserCloudManagementController does not exist. Also, // policy::BrowserDMTokenStorage::Get()->RetrieveDMToken() does not return a // valid token either. Once these are fixed the #if !defined can be removed. - if (dm_token.empty() && policy::MachineLevelUserCloudPolicyController:: + if (dm_token.empty() && policy::ChromeBrowserCloudManagementController:: IsMachineLevelUserCloudPolicyEnabled()) { dm_token = policy::BrowserDMTokenStorage::Get()->RetrieveDMToken(); }
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc index 23e3fb39..6789182 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -29,6 +29,7 @@ #include "base/task/post_task.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/test/bind_test_util.h" +#include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" @@ -67,6 +68,7 @@ #include "components/safe_browsing/db/database_manager.h" #include "components/safe_browsing/db/test_database_manager.h" #include "components/safe_browsing/db/v4_protocol_manager_util.h" +#include "components/safe_browsing/features.h" #include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/download_item_utils.h" @@ -226,6 +228,11 @@ void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); + // Enable the feature early to prevent race condition trying to access + // the enabled features set. This happens for example when the history + // service is started below. + EnableFeature(kDeepScanningOfDownloads); + in_process_utility_thread_helper_ = std::make_unique<content::InProcessUtilityThreadHelper>(); @@ -313,6 +320,11 @@ ChromeRenderViewHostTestHarness::TearDown(); } + void EnableFeature(const base::Feature& feature) { + scoped_feature_list_.Reset(); + scoped_feature_list_.InitAndEnableFeature(feature); + } + void SetWhitelistedDownloadSampleRate(double target_rate) { download_service_->whitelist_sample_rate_ = target_rate; } @@ -617,6 +629,8 @@ void CheckClientDownloadReportCorruptArchive(ArchiveType type); protected: + base::test::ScopedFeatureList scoped_feature_list_; + // This will effectively mask the global Singleton while this is in scope. FileTypePoliciesTestOverlay policies_;
diff --git a/chrome/browser/sharing/proto/sharing_message.proto b/chrome/browser/sharing/proto/sharing_message.proto index d6cc93c..a97e715 100644 --- a/chrome/browser/sharing/proto/sharing_message.proto +++ b/chrome/browser/sharing/proto/sharing_message.proto
@@ -26,7 +26,7 @@ // Message for sending between devices in Sharing. message SharingMessage { - // Identifier of sender. required. + // Identifier of sender. required except for AckMessage. string sender_guid = 1; // Payload of the message, contains one of the messages below. required.
diff --git a/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller.cc b/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller.cc index 4ca432f..96aa88d 100644 --- a/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller.cc +++ b/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller.cc
@@ -11,6 +11,7 @@ #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/sharing/sharing_constants.h" #include "chrome/browser/sharing/sharing_dialog.h" +#include "chrome/grit/generated_resources.h" #include "components/sync_device_info/device_info.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" @@ -96,8 +97,7 @@ base::string16 SharedClipboardUiController::GetTextForTooltipAndAccessibleName() const { - // There is no left click dialog and no dialog title for shared clipboard. - return base::string16(); + return l10n_util::GetStringUTF16(IDS_OMNIBOX_TOOLTIP_SHARED_CLIPBOARD); } SharingFeatureName SharedClipboardUiController::GetFeatureMetricsPrefix()
diff --git a/chrome/browser/sharing/sharing_fcm_handler.cc b/chrome/browser/sharing/sharing_fcm_handler.cc index ccf11c78..5328edf 100644 --- a/chrome/browser/sharing/sharing_fcm_handler.cc +++ b/chrome/browser/sharing/sharing_fcm_handler.cc
@@ -178,6 +178,7 @@ sharing_fcm_sender_->SendMessageToDevice( std::move(*sharing_info), kAckTimeToLive, std::move(ack_message), + /*sender_device_info=*/nullptr, base::BindOnce(&SharingFCMHandler::OnAckMessageSent, weak_ptr_factory_.GetWeakPtr(), original_message_id, original_message_type));
diff --git a/chrome/browser/sharing/sharing_fcm_handler_unittest.cc b/chrome/browser/sharing/sharing_fcm_handler_unittest.cc index 3aae1a10..d5ce3fb6 100644 --- a/chrome/browser/sharing/sharing_fcm_handler_unittest.cc +++ b/chrome/browser/sharing/sharing_fcm_handler_unittest.cc
@@ -44,13 +44,16 @@ class MockSharingFCMSender : public SharingFCMSender { public: MockSharingFCMSender() - : SharingFCMSender(nullptr, nullptr, nullptr, nullptr) {} + : SharingFCMSender(/*gcm_driver=*/nullptr, + /*sync_preference=*/nullptr, + /*vapid_key_manager=*/nullptr) {} ~MockSharingFCMSender() override {} - MOCK_METHOD4(SendMessageToDevice, + MOCK_METHOD5(SendMessageToDevice, void(syncer::DeviceInfo::SharingInfo target, base::TimeDelta time_to_live, SharingMessage message, + std::unique_ptr<syncer::DeviceInfo> sender_device_info, SendMessageCallback callback)); }; @@ -121,7 +124,7 @@ EXPECT_CALL(mock_sharing_message_handler_, OnMessage(ProtoEquals(sharing_message))); - EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _)) + EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _)) .Times(0); sharing_fcm_handler_->AddSharingHandler(SharingMessage::kAckMessage, &mock_sharing_message_handler_); @@ -147,7 +150,7 @@ // Tests OnMessage flow in SharingFCMHandler when no handler is registered. EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_)).Times(0); - EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _)) + EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _)) .Times(0); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message); @@ -156,7 +159,8 @@ OnMessage(ProtoEquals(sharing_message))); EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive), - ProtoEquals(sharing_ack_message), _)); + ProtoEquals(sharing_ack_message), + testing::Eq(nullptr), _)); sharing_fcm_handler_->AddSharingHandler(SharingMessage::kPingMessage, &mock_sharing_message_handler_); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message); @@ -164,7 +168,7 @@ // Tests OnMessage flow in SharingFCMHandler after registered handler is // removed. EXPECT_CALL(mock_sharing_message_handler_, OnMessage(_)).Times(0); - EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _)) + EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(_, _, _, _, _)) .Times(0); sharing_fcm_handler_->RemoveSharingHandler(SharingMessage::kPingMessage); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message); @@ -193,7 +197,8 @@ OnMessage(ProtoEquals(sharing_message))); EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive), - ProtoEquals(sharing_ack_message), _)); + ProtoEquals(sharing_ack_message), + testing::Eq(nullptr), _)); sharing_fcm_handler_->AddSharingHandler(SharingMessage::kPingMessage, &mock_sharing_message_handler_); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message); @@ -223,7 +228,8 @@ OnMessage(ProtoEquals(sharing_message))); EXPECT_CALL(mock_sharing_fcm_sender_, SendMessageToDevice(DeviceMatcher(), testing::Eq(kAckTimeToLive), - ProtoEquals(sharing_ack_message), _)); + ProtoEquals(sharing_ack_message), + testing::Eq(nullptr), _)); sharing_fcm_handler_->AddSharingHandler(SharingMessage::kPingMessage, &mock_sharing_message_handler_); sharing_fcm_handler_->OnMessage(kTestAppId, incoming_message);
diff --git a/chrome/browser/sharing/sharing_fcm_sender.cc b/chrome/browser/sharing/sharing_fcm_sender.cc index c9e8841..47106b19 100644 --- a/chrome/browser/sharing/sharing_fcm_sender.cc +++ b/chrome/browser/sharing/sharing_fcm_sender.cc
@@ -13,13 +13,10 @@ #include "components/gcm_driver/gcm_driver.h" #include "components/sync_device_info/device_info.h" -SharingFCMSender::SharingFCMSender( - gcm::GCMDriver* gcm_driver, - syncer::LocalDeviceInfoProvider* device_info_provider, - SharingSyncPreference* sync_preference, - VapidKeyManager* vapid_key_manager) +SharingFCMSender::SharingFCMSender(gcm::GCMDriver* gcm_driver, + SharingSyncPreference* sync_preference, + VapidKeyManager* vapid_key_manager) : gcm_driver_(gcm_driver), - device_info_provider_(device_info_provider), sync_preference_(sync_preference), vapid_key_manager_(vapid_key_manager) {} @@ -29,45 +26,12 @@ syncer::DeviceInfo::SharingInfo target, base::TimeDelta time_to_live, SharingMessage message, - SendMessageCallback callback) { - auto send_message_closure = base::BindOnce( - &SharingFCMSender::DoSendMessageToDevice, weak_ptr_factory_.GetWeakPtr(), - std::move(target), time_to_live, std::move(message), std::move(callback)); - - if (device_info_provider_->GetLocalDeviceInfo()) { - std::move(send_message_closure).Run(); - return; - } - - if (!local_device_info_ready_subscription_) { - local_device_info_ready_subscription_ = - device_info_provider_->RegisterOnInitializedCallback( - base::AdaptCallbackForRepeating( - base::BindOnce(&SharingFCMSender::OnLocalDeviceInfoInitialized, - weak_ptr_factory_.GetWeakPtr()))); - } - - send_message_queue_.emplace_back(std::move(send_message_closure)); -} - -void SharingFCMSender::OnLocalDeviceInfoInitialized() { - for (auto& closure : send_message_queue_) - std::move(closure).Run(); - send_message_queue_.clear(); - local_device_info_ready_subscription_.reset(); -} - -void SharingFCMSender::DoSendMessageToDevice( - syncer::DeviceInfo::SharingInfo target, - base::TimeDelta time_to_live, - SharingMessage message, + std::unique_ptr<syncer::DeviceInfo> sender_device_info, SendMessageCallback callback) { base::Optional<SharingSyncPreference::FCMRegistration> fcm_registration = sync_preference_->GetFCMRegistration(); - base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info = - sync_preference_->GetLocalSharingInfo(); - if (!fcm_registration || !sharing_info) { - LOG(ERROR) << "Unable to retrieve FCM registration or sharing info"; + if (!fcm_registration) { + LOG(ERROR) << "Unable to retrieve FCM registration"; std::move(callback).Run(SharingSendMessageResult::kInternalError, base::nullopt); return; @@ -81,12 +45,16 @@ return; } - const syncer::DeviceInfo* local_device_info = - device_info_provider_->GetLocalDeviceInfo(); - message.set_sender_guid(local_device_info->guid()); - if (message.payload_case() != SharingMessage::kAckMessage) { - message.set_sender_device_name(local_device_info->client_name()); + DCHECK(sender_device_info); + + message.set_sender_guid(sender_device_info->guid()); + message.set_sender_device_name(sender_device_info->client_name()); + + base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info = + sender_device_info->sharing_info(); + DCHECK(sharing_info); + auto* sender_info = message.mutable_sender_info(); sender_info->set_fcm_token(sharing_info->fcm_token); sender_info->set_p256dh(sharing_info->p256dh);
diff --git a/chrome/browser/sharing/sharing_fcm_sender.h b/chrome/browser/sharing/sharing_fcm_sender.h index f1fb240..c196d2f 100644 --- a/chrome/browser/sharing/sharing_fcm_sender.h +++ b/chrome/browser/sharing/sharing_fcm_sender.h
@@ -18,13 +18,16 @@ #include "chrome/browser/sharing/sharing_send_message_result.h" #include "components/gcm_driver/web_push_common.h" #include "components/sync_device_info/device_info.h" -#include "components/sync_device_info/local_device_info_provider.h" namespace gcm { class GCMDriver; enum class SendWebPushMessageResult; } // namespace gcm +namespace syncer { +class DeviceInfo; +} // namespace syncer + class SharingSyncPreference; class VapidKeyManager; @@ -37,7 +40,6 @@ base::Optional<std::string>)>; SharingFCMSender(gcm::GCMDriver* gcm_driver, - syncer::LocalDeviceInfoProvider* device_info_provider, SharingSyncPreference* sync_preference, VapidKeyManager* vapid_key_manager); virtual ~SharingFCMSender(); @@ -45,40 +47,23 @@ // Sends a |message| to device identified by |target|, which expires // after |time_to_live| seconds. |callback| will be invoked with message_id if // asynchronous operation succeeded, or base::nullopt if operation failed. - // If |recipient_info| is provided, it will be used for encryption and message - // delivery instead of looking up sync preference. - virtual void SendMessageToDevice(syncer::DeviceInfo::SharingInfo target, - base::TimeDelta time_to_live, - SharingMessage message, - SendMessageCallback callback); + // |sender_device_info| must be provided except for sending ack messages. + virtual void SendMessageToDevice( + syncer::DeviceInfo::SharingInfo target, + base::TimeDelta time_to_live, + SharingMessage message, + std::unique_ptr<syncer::DeviceInfo> sender_device_info, + SendMessageCallback callback); private: - // Called once after the local device info is ready. This will only be used if - // we tried to send a message before the local device info was ready. - void OnLocalDeviceInfoInitialized(); - - // Actually sends the |message| to |target|. This will be called when our - // local device info is ready. - void DoSendMessageToDevice(syncer::DeviceInfo::SharingInfo target, - base::TimeDelta time_to_live, - SharingMessage message, - SendMessageCallback callback); - void OnMessageSent(SendMessageCallback callback, gcm::SendWebPushMessageResult result, base::Optional<std::string> message_id); gcm::GCMDriver* gcm_driver_; - syncer::LocalDeviceInfoProvider* device_info_provider_; SharingSyncPreference* sync_preference_; VapidKeyManager* vapid_key_manager_; - // Subscription for the case when the local device info is not ready yet. - std::unique_ptr<syncer::LocalDeviceInfoProvider::Subscription> - local_device_info_ready_subscription_; - // Queued messages to be sent in OnLocalDeviceInfoInitialized. - std::vector<base::OnceClosure> send_message_queue_; - base::WeakPtrFactory<SharingFCMSender> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(SharingFCMSender);
diff --git a/chrome/browser/sharing/sharing_fcm_sender_unittest.cc b/chrome/browser/sharing/sharing_fcm_sender_unittest.cc index e8fb9ad..4aceb97 100644 --- a/chrome/browser/sharing/sharing_fcm_sender_unittest.cc +++ b/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
@@ -29,6 +29,8 @@ const char kSenderP256dh[] = "sender_p256dh"; const char kSenderAuthSecret[] = "sender_auth_secret"; const char kAuthorizedEntity[] = "authorized_entity"; +const char kLocalGuid[] = "id"; +const char kLocalClientName[] = "name"; const int kTtlSeconds = 10; class FakeGCMDriver : public gcm::FakeGCMDriver { @@ -97,11 +99,9 @@ protected: SharingFCMSenderTest() : sync_prefs_(&prefs_, &fake_device_info_sync_service), - sharing_fcm_sender_( - &fake_gcm_driver_, - fake_device_info_sync_service.GetLocalDeviceInfoProvider(), - &sync_prefs_, - &vapid_key_manager_) { + sharing_fcm_sender_(&fake_gcm_driver_, + &sync_prefs_, + &vapid_key_manager_) { SharingSyncPreference::RegisterProfilePrefs(prefs_.registry()); } @@ -120,13 +120,6 @@ TEST_F(SharingFCMSenderTest, NoFcmRegistration) { sync_prefs_.ClearFCMRegistration(); - syncer::DeviceInfo* local_device_info = - fake_device_info_sync_service.GetLocalDeviceInfoProvider() - ->GetMutableDeviceInfo(); - local_device_info->set_sharing_info(syncer::DeviceInfo::SharingInfo( - kSenderFcmToken, kSenderP256dh, kSenderAuthSecret, - std::set<sync_pb::SharingSpecificFields::EnabledFeatures>())); - fake_device_info_sync_service.GetLocalDeviceInfoProvider()->SetReady(true); std::unique_ptr<crypto::ECPrivateKey> vapid_key = crypto::ECPrivateKey::Create(); @@ -140,10 +133,10 @@ SharingSendMessageResult result; base::Optional<std::string> message_id; chrome_browser_sharing::SharingMessage sharing_message; - sharing_message.mutable_ping_message(); + sharing_message.mutable_ack_message(); sharing_fcm_sender_.SendMessageToDevice( std::move(target), base::TimeDelta::FromSeconds(kTtlSeconds), - std::move(sharing_message), + std::move(sharing_message), /*sender_device_info=*/nullptr, base::BindOnce(&SharingFCMSenderTest::OnMessageSent, base::Unretained(this), &result, &message_id)); @@ -153,13 +146,6 @@ TEST_F(SharingFCMSenderTest, NoVapidKey) { sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration( kAuthorizedEntity, base::Time::Now())); - syncer::DeviceInfo* local_device_info = - fake_device_info_sync_service.GetLocalDeviceInfoProvider() - ->GetMutableDeviceInfo(); - local_device_info->set_sharing_info(syncer::DeviceInfo::SharingInfo( - kSenderFcmToken, kSenderP256dh, kSenderAuthSecret, - std::set<sync_pb::SharingSpecificFields::EnabledFeatures>())); - fake_device_info_sync_service.GetLocalDeviceInfoProvider()->SetReady(true); ON_CALL(vapid_key_manager_, GetOrCreateKey()) .WillByDefault(testing::Return(nullptr)); @@ -171,10 +157,10 @@ SharingSendMessageResult result; base::Optional<std::string> message_id; chrome_browser_sharing::SharingMessage sharing_message; - sharing_message.mutable_ping_message(); + sharing_message.mutable_ack_message(); sharing_fcm_sender_.SendMessageToDevice( std::move(target), base::TimeDelta::FromSeconds(kTtlSeconds), - std::move(sharing_message), + std::move(sharing_message), /*sender_device_info=*/nullptr, base::BindOnce(&SharingFCMSenderTest::OnMessageSent, base::Unretained(this), &result, &message_id)); @@ -184,38 +170,27 @@ struct SharingFCMSenderResultTestData { const gcm::SendWebPushMessageResult web_push_result; const SharingSendMessageResult expected_result; - const bool ready_before_send_message; } kSharingFCMSenderResultTestData[] = { {gcm::SendWebPushMessageResult::kSuccessful, - SharingSendMessageResult::kSuccessful, - /*ready_before_send_message=*/false}, + SharingSendMessageResult::kSuccessful}, {gcm::SendWebPushMessageResult::kSuccessful, - SharingSendMessageResult::kSuccessful, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kSuccessful}, {gcm::SendWebPushMessageResult::kDeviceGone, - SharingSendMessageResult::kDeviceNotFound, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kDeviceNotFound}, {gcm::SendWebPushMessageResult::kNetworkError, - SharingSendMessageResult::kNetworkError, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kNetworkError}, {gcm::SendWebPushMessageResult::kPayloadTooLarge, - SharingSendMessageResult::kPayloadTooLarge, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kPayloadTooLarge}, {gcm::SendWebPushMessageResult::kEncryptionFailed, - SharingSendMessageResult::kInternalError, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kInternalError}, {gcm::SendWebPushMessageResult::kCreateJWTFailed, - SharingSendMessageResult::kInternalError, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kInternalError}, {gcm::SendWebPushMessageResult::kServerError, - SharingSendMessageResult::kInternalError, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kInternalError}, {gcm::SendWebPushMessageResult::kParseResponseFailed, - SharingSendMessageResult::kInternalError, - /*ready_before_send_message=*/true}, + SharingSendMessageResult::kInternalError}, {gcm::SendWebPushMessageResult::kVapidKeyInvalid, - SharingSendMessageResult::kInternalError, - /*ready_before_send_message=*/true}}; + SharingSendMessageResult::kInternalError}}; class SharingFCMSenderResultTest : public SharingFCMSenderTest, @@ -224,14 +199,16 @@ TEST_P(SharingFCMSenderResultTest, ResultTest) { sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration( kAuthorizedEntity, base::Time::Now())); - syncer::DeviceInfo* local_device_info = - fake_device_info_sync_service.GetLocalDeviceInfoProvider() - ->GetMutableDeviceInfo(); - local_device_info->set_sharing_info(syncer::DeviceInfo::SharingInfo( - kSenderFcmToken, kSenderP256dh, kSenderAuthSecret, - std::set<sync_pb::SharingSpecificFields::EnabledFeatures>())); - fake_device_info_sync_service.GetLocalDeviceInfoProvider()->SetReady( - GetParam().ready_before_send_message); + std::unique_ptr<syncer::DeviceInfo> sender_device_info = + std::make_unique<syncer::DeviceInfo>( + "id", "name", "chrome_version", "user_agent", + sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id", + base::SysInfo::HardwareInfo{"model", "manufacturer", "serial"}, + /*last_updated_timestamp=*/base::Time::Now(), + /*send_tab_to_self_receiving_enabled=*/false, + syncer::DeviceInfo::SharingInfo( + kSenderFcmToken, kSenderP256dh, kSenderAuthSecret, + std::set<sync_pb::SharingSpecificFields::EnabledFeatures>())); fake_gcm_driver_.set_result(GetParam().web_push_result); std::unique_ptr<crypto::ECPrivateKey> vapid_key = @@ -249,7 +226,7 @@ sharing_message.mutable_ping_message(); sharing_fcm_sender_.SendMessageToDevice( std::move(target), base::TimeDelta::FromSeconds(kTtlSeconds), - std::move(sharing_message), + std::move(sharing_message), std::move(sender_device_info), base::BindOnce(&SharingFCMSenderTest::OnMessageSent, base::Unretained(this), &result, &message_id)); @@ -267,10 +244,9 @@ fake_gcm_driver_.message().urgency); chrome_browser_sharing::SharingMessage message_sent; message_sent.ParseFromString(fake_gcm_driver_.message().payload); - EXPECT_EQ(local_device_info->guid(), message_sent.sender_guid()); EXPECT_TRUE(message_sent.has_ping_message()); - EXPECT_EQ(local_device_info->client_name(), - message_sent.sender_device_name()); + EXPECT_EQ(kLocalGuid, message_sent.sender_guid()); + EXPECT_EQ(kLocalClientName, message_sent.sender_device_name()); EXPECT_TRUE(message_sent.has_sender_info()); EXPECT_EQ(kSenderFcmToken, message_sent.sender_info().fcm_token()); EXPECT_EQ(kSenderP256dh, message_sent.sender_info().p256dh());
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc index 85c94be0..2b72ca3 100644 --- a/chrome/browser/sharing/sharing_service.cc +++ b/chrome/browser/sharing/sharing_service.cc
@@ -216,7 +216,10 @@ if (!IsSyncEnabled()) return nullptr; - return device_info_tracker_->GetDeviceInfo(guid); + std::unique_ptr<syncer::DeviceInfo> device_info = + device_info_tracker_->GetDeviceInfo(guid); + return CloneDevice(device_info.get(), + GetDeviceNames(device_info.get()).full_name); } SharingService::SharingDeviceList SharingService::GetDeviceCandidates( @@ -278,16 +281,40 @@ SharingSendMessageResult::kAckTimeout), kSendMessageTimeout); - base::Optional<syncer::DeviceInfo::SharingInfo> sharing_info = + // TODO(crbug/1015411): Here we assume caller gets |device_guid| from + // GetDeviceCandidates, so both DeviceInfoTracker and LocalDeviceInfoProvider + // are already ready. It's better to queue up the message and wait until + // DeviceInfoTracker and LocalDeviceInfoProvider are ready. + base::Optional<syncer::DeviceInfo::SharingInfo> target_sharing_info = sync_prefs_->GetSharingInfo(device_guid); - if (!sharing_info) { + if (!target_sharing_info) { InvokeSendMessageCallback(message_guid, message_type, SharingSendMessageResult::kDeviceNotFound); return; } + const syncer::DeviceInfo* local_device_info = + local_device_info_provider_->GetLocalDeviceInfo(); + if (!local_device_info) { + InvokeSendMessageCallback(message_guid, message_type, + SharingSendMessageResult::kInternalError); + return; + } + + std::unique_ptr<syncer::DeviceInfo> sender_device_info = CloneDevice( + local_device_info, GetDeviceNames(local_device_info).full_name); + sender_device_info->set_sharing_info( + sync_prefs_->GetLocalSharingInfo(local_device_info)); + + if (!sender_device_info->sharing_info()) { + InvokeSendMessageCallback(message_guid, message_type, + SharingSendMessageResult::kInternalError); + return; + } + fcm_sender_->SendMessageToDevice( - std::move(*sharing_info), time_to_live, std::move(message), + std::move(*target_sharing_info), time_to_live, std::move(message), + std::move(sender_device_info), base::BindOnce(&SharingService::OnMessageSent, weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), message_guid, message_type));
diff --git a/chrome/browser/sharing/sharing_service_factory.cc b/chrome/browser/sharing/sharing_service_factory.cc index 5e673c5a..b284cc5 100644 --- a/chrome/browser/sharing/sharing_service_factory.cc +++ b/chrome/browser/sharing/sharing_service_factory.cc
@@ -93,8 +93,7 @@ profile->GetPrefs(), sync_prefs.get(), instance_id_service->driver(), vapid_key_manager.get()); std::unique_ptr<SharingFCMSender> fcm_sender = - std::make_unique<SharingFCMSender>(gcm_driver, local_device_info_provider, - sync_prefs.get(), + std::make_unique<SharingFCMSender>(gcm_driver, sync_prefs.get(), vapid_key_manager.get()); std::unique_ptr<SharingFCMHandler> fcm_handler = std::make_unique<SharingFCMHandler>(gcm_driver, fcm_sender.get(),
diff --git a/chrome/browser/sharing/sharing_service_unittest.cc b/chrome/browser/sharing/sharing_service_unittest.cc index 856ca010..2d729f16 100644 --- a/chrome/browser/sharing/sharing_service_unittest.cc +++ b/chrome/browser/sharing/sharing_service_unittest.cc
@@ -63,6 +63,7 @@ p256dh_ = p256dh; auth_secret_ = auth_secret; fcm_token_ = fcm_token; + message_ = std::move(message); if (should_respond_) std::move(callback).Run(gcm::SendWebPushMessageResult::kSuccessful, base::make_optional(kMessageId)); @@ -79,9 +80,11 @@ const std::string& p256dh() { return p256dh_; } const std::string& auth_secret() { return auth_secret_; } const std::string& fcm_token() { return fcm_token_; } + const gcm::WebPushMessage& message() { return message_; } private: std::string p256dh_, auth_secret_, fcm_token_; + gcm::WebPushMessage message_; bool should_respond_ = true; }; @@ -185,10 +188,8 @@ /* pref_service= */ nullptr, sync_prefs_, &mock_instance_id_driver_, vapid_key_manager_, fake_device_info_sync_service.GetLocalDeviceInfoProvider()); - fcm_sender_ = new SharingFCMSender( - &fake_gcm_driver_, - fake_device_info_sync_service.GetLocalDeviceInfoProvider(), sync_prefs_, - vapid_key_manager_); + fcm_sender_ = new SharingFCMSender(&fake_gcm_driver_, sync_prefs_, + vapid_key_manager_); fcm_handler_ = new testing::NiceMock<MockSharingFCMHandler>(); SharingSyncPreference::RegisterProfilePrefs(prefs_.registry()); } @@ -407,6 +408,13 @@ EXPECT_EQ(kAuthSecret, fake_gcm_driver_.auth_secret()); EXPECT_EQ(kFcmToken, fake_gcm_driver_.fcm_token()); + chrome_browser_sharing::SharingMessage sharing_message; + ASSERT_TRUE( + sharing_message.ParseFromString(fake_gcm_driver_.message().payload)); + EXPECT_EQ("id", sharing_message.sender_guid()); + EXPECT_EQ("model Computer manufacturer", + sharing_message.sender_device_name()); + // Simulate ack message received by AckMessageHandler. SharingMessageHandler* ack_message_handler = fcm_handler_->GetSharingHandler( chrome_browser_sharing::SharingMessage::kAckMessage); @@ -901,3 +909,15 @@ EXPECT_EQ("HP Chromebook", candidates[0]->client_name()); EXPECT_EQ("Dell Chromebook", candidates[1]->client_name()); } + +TEST_F(SharingServiceTest, GetDeviceByGuid) { + std::string guid = base::GenerateGUID(); + std::unique_ptr<syncer::DeviceInfo> computer1 = CreateFakeDeviceInfo( + guid, "Fake device 1", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, + {"Dell", "sno one", "serial no"}); + fake_device_info_sync_service.GetDeviceInfoTracker()->Add(computer1.get()); + + std::unique_ptr<syncer::DeviceInfo> device_info = + GetSharingService()->GetDeviceByGuid(guid); + EXPECT_EQ("Dell Computer sno one", device_info->client_name()); +}
diff --git a/chrome/browser/sharing/sharing_sync_preference.cc b/chrome/browser/sharing/sharing_sync_preference.cc index a433554..da404bec 100644 --- a/chrome/browser/sharing/sharing_sync_preference.cc +++ b/chrome/browser/sharing/sharing_sync_preference.cc
@@ -193,7 +193,12 @@ base::Optional<syncer::DeviceInfo::SharingInfo> SharingSyncPreference::GetLocalSharingInfo() const { - auto* device_info = local_device_info_provider_->GetLocalDeviceInfo(); + return GetLocalSharingInfo(local_device_info_provider_->GetLocalDeviceInfo()); +} + +base::Optional<syncer::DeviceInfo::SharingInfo> +SharingSyncPreference::GetLocalSharingInfo( + const syncer::DeviceInfo* device_info) const { if (!device_info) return base::nullopt;
diff --git a/chrome/browser/sharing/sharing_sync_preference.h b/chrome/browser/sharing/sharing_sync_preference.h index 4d0e3e8..9d21c47 100644 --- a/chrome/browser/sharing/sharing_sync_preference.h +++ b/chrome/browser/sharing/sharing_sync_preference.h
@@ -92,6 +92,9 @@ base::Optional<syncer::DeviceInfo::SharingInfo> GetLocalSharingInfo() const; + base::Optional<syncer::DeviceInfo::SharingInfo> GetLocalSharingInfo( + const syncer::DeviceInfo* device_info) const; + void SetLocalSharingInfo(syncer::DeviceInfo::SharingInfo sharing_info); void ClearLocalSharingInfo();
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc index e016dd1..ae09855 100644 --- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc +++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
@@ -39,7 +39,7 @@ Profile* profile, content::WebContents::Getter web_contents_getter, mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory) { + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory) { auto* self = static_cast<BrowserContextData*>( profile->GetUserData(kBrowserContextUserDataKey)); if (!self) { @@ -398,7 +398,7 @@ std::unique_ptr<HeaderModificationDelegate> delegate, content::WebContents::Getter web_contents_getter, mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory, + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory, DisconnectCallback on_disconnect) { DCHECK(proxy_receivers_.empty()); DCHECK(!target_factory_.is_bound()); @@ -411,7 +411,7 @@ on_disconnect_ = std::move(on_disconnect); target_factory_.Bind(std::move(target_factory)); - target_factory_.set_connection_error_handler(base::BindOnce( + target_factory_.set_disconnect_handler(base::BindOnce( &ProxyingURLLoaderFactory::OnTargetFactoryError, base::Unretained(this))); proxy_receivers_.Add(this, std::move(loader_receiver)); @@ -461,8 +461,8 @@ auto proxied_receiver = std::move(*factory_receiver); // TODO(crbug.com/955171): Replace this with PendingRemote. - network::mojom::URLLoaderFactoryPtrInfo target_factory_info; - *factory_receiver = mojo::MakeRequest(&target_factory_info); + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory_remote; + *factory_receiver = target_factory_remote.InitWithNewPipeAndPassReceiver(); auto web_contents_getter = base::BindRepeating(&content::WebContents::FromFrameTreeNodeId, @@ -470,7 +470,7 @@ BrowserContextData::StartProxying(profile, std::move(web_contents_getter), std::move(proxied_receiver), - std::move(target_factory_info)); + std::move(target_factory_remote)); return true; }
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h index f907bc8..a61eaec4 100644 --- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h +++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h
@@ -11,7 +11,9 @@ #include "base/memory/ref_counted_delete_on_sequence.h" #include "content/public/browser/web_contents.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include <memory> @@ -40,7 +42,7 @@ std::unique_ptr<HeaderModificationDelegate> delegate, content::WebContents::Getter web_contents_getter, mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory, + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory, DisconnectCallback on_disconnect); ~ProxyingURLLoaderFactory() override; @@ -86,7 +88,7 @@ mojo::ReceiverSet<network::mojom::URLLoaderFactory> proxy_receivers_; std::set<std::unique_ptr<InProgressRequest>, base::UniquePtrComparator> requests_; - network::mojom::URLLoaderFactoryPtr target_factory_; + mojo::Remote<network::mojom::URLLoaderFactory> target_factory_; DisconnectCallback on_disconnect_; DISALLOW_COPY_AND_ASSIGN(ProxyingURLLoaderFactory);
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc index bc98f0b..cfb7a31 100644 --- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc +++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/signin/chrome_signin_helper.h" #include "chrome/browser/signin/header_modification_delegate.h" #include "content/public/test/browser_task_environment.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/test/test_url_loader_factory.h" @@ -62,7 +62,7 @@ class ChromeSigninProxyingURLLoaderFactoryTest : public testing::Test { public: ChromeSigninProxyingURLLoaderFactoryTest() - : test_factory_binding_(&test_factory_) {} + : test_factory_receiver_(&test_factory_) {} ~ChromeSigninProxyingURLLoaderFactoryTest() override {} base::WeakPtr<MockDelegate> StartRequest( @@ -70,30 +70,28 @@ loader_ = network::SimpleURLLoader::Create(std::move(request), TRAFFIC_ANNOTATION_FOR_TESTS); - network::mojom::URLLoaderFactoryPtr factory_ptr; - auto factory_request = mojo::MakeRequest(&factory_ptr); + mojo::Remote<network::mojom::URLLoaderFactory> factory_remote; + auto factory_request = factory_remote.BindNewPipeAndPassReceiver(); loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( - factory_ptr.get(), + factory_remote.get(), base::BindOnce( &ChromeSigninProxyingURLLoaderFactoryTest::OnDownloadComplete, base::Unretained(this))); - network::mojom::URLLoaderFactoryPtrInfo test_factory_ptr_info; - test_factory_binding_.Bind(mojo::MakeRequest(&test_factory_ptr_info)); - auto delegate = std::make_unique<MockDelegate>(); base::WeakPtr<MockDelegate> delegate_weak = delegate->GetWeakPtr(); proxying_factory_ = std::make_unique<ProxyingURLLoaderFactory>( std::move(delegate), NullWebContentsGetter(), - std::move(factory_request), std::move(test_factory_ptr_info), + std::move(factory_request), + test_factory_receiver_.BindNewPipeAndPassRemote(), base::BindOnce(&ChromeSigninProxyingURLLoaderFactoryTest::OnDisconnect, base::Unretained(this))); return delegate_weak; } - void CloseFactoryBinding() { test_factory_binding_.Close(); } + void CloseFactoryReceiver() { test_factory_receiver_.reset(); } network::TestURLLoaderFactory* factory() { return &test_factory_; } network::SimpleURLLoader* loader() { return loader_.get(); } @@ -113,7 +111,7 @@ std::unique_ptr<network::SimpleURLLoader> loader_; std::unique_ptr<ProxyingURLLoaderFactory> proxying_factory_; network::TestURLLoaderFactory test_factory_; - mojo::Binding<network::mojom::URLLoaderFactory> test_factory_binding_; + mojo::Receiver<network::mojom::URLLoaderFactory> test_factory_receiver_; std::unique_ptr<std::string> response_body_; DISALLOW_COPY_AND_ASSIGN(ChromeSigninProxyingURLLoaderFactoryTest); @@ -290,22 +288,25 @@ } TEST_F(ChromeSigninProxyingURLLoaderFactoryTest, TargetFactoryFailure) { - network::mojom::URLLoaderFactoryPtr factory_ptr; - auto factory_request = mojo::MakeRequest(&factory_ptr); - network::mojom::URLLoaderFactoryPtrInfo target_factory_ptr_info; - auto target_factory_request = mojo::MakeRequest(&target_factory_ptr_info); + mojo::Remote<network::mojom::URLLoaderFactory> factory_remote; + mojo::PendingRemote<network::mojom::URLLoaderFactory> + pending_target_factory_remote; + auto target_factory_receiver = + pending_target_factory_remote.InitWithNewPipeAndPassReceiver(); // Without a target factory the proxy will process no requests. auto delegate = std::make_unique<MockDelegate>(); EXPECT_CALL(*delegate, ProcessRequest(_, _)).Times(0); auto proxying_factory = std::make_unique<ProxyingURLLoaderFactory>( - std::move(delegate), NullWebContentsGetter(), std::move(factory_request), - std::move(target_factory_ptr_info), base::DoNothing()); + std::move(delegate), NullWebContentsGetter(), + factory_remote.BindNewPipeAndPassReceiver(), + std::move(pending_target_factory_remote), base::DoNothing()); - // Close |target_factory_request| instead of binding it to a URLLoaderFactory. - // Spin the message loop so that the connection error handler can run. - target_factory_request = nullptr; + // Close |target_factory_receiver| instead of binding it to a + // URLLoaderFactory. Spin the message loop so that the connection error + // handler can run. + target_factory_receiver = mojo::NullReceiver(); base::RunLoop().RunUntilIdle(); auto request = std::make_unique<network::ResourceRequest>(); @@ -313,7 +314,7 @@ auto loader = network::SimpleURLLoader::Create(std::move(request), TRAFFIC_ANNOTATION_FOR_TESTS); loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie( - factory_ptr.get(), + factory_remote.get(), base::BindOnce( &ChromeSigninProxyingURLLoaderFactoryTest::OnDownloadComplete, base::Unretained(this))); @@ -330,9 +331,9 @@ base::WeakPtr<MockDelegate> delegate = StartRequest(std::move(request)); base::RunLoop().RunUntilIdle(); - // Close the factory binding and spin the message loop again to allow the + // Close the factory receiver and spin the message loop again to allow the // connection error handler to be called. - CloseFactoryBinding(); + CloseFactoryReceiver(); base::RunLoop().RunUntilIdle(); // The ProxyingURLLoaderFactory should not have been destroyed yet because
diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ssl/security_state_tab_helper.cc index e82a44fa..9759e20 100644 --- a/chrome/browser/ssl/security_state_tab_helper.cc +++ b/chrome/browser/ssl/security_state_tab_helper.cc
@@ -161,11 +161,12 @@ safety_tips::ReputationWebContentsObserver* reputation_web_contents_observer = safety_tips::ReputationWebContentsObserver::FromWebContents( web_contents()); - state->safety_tip_status = + state->safety_tip_info = reputation_web_contents_observer ? reputation_web_contents_observer - ->GetSafetyTipStatusForVisibleNavigation() - : security_state::SafetyTipStatus::kUnknown; + ->GetSafetyTipInfoForVisibleNavigation() + : security_state::SafetyTipInfo( + {security_state::SafetyTipStatus::kUnknown, GURL()}); return state; } @@ -175,8 +176,9 @@ UMA_HISTOGRAM_ENUMERATION("Security.SecurityLevel.FormSubmission", GetSecurityLevel(), security_state::SECURITY_LEVEL_COUNT); - UMA_HISTOGRAM_ENUMERATION("Security.SafetyTips.FormSubmission", - GetVisibleSecurityState()->safety_tip_status); + UMA_HISTOGRAM_ENUMERATION( + "Security.SafetyTips.FormSubmission", + GetVisibleSecurityState()->safety_tip_info.status); } }
diff --git a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc index aee0592..d12d05a0 100644 --- a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc +++ b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
@@ -2301,11 +2301,15 @@ browser()->tab_strip_model()->GetActiveWebContents(), "document.getElementById('submit').click();")); navigation_observer.Wait(); - ASSERT_EQ(security_state::SafetyTipStatus::kNone, - SecurityStateTabHelper::FromWebContents( - browser()->tab_strip_model()->GetActiveWebContents()) - ->GetVisibleSecurityState() - ->safety_tip_status); + + const security_state::SafetyTipInfo safety_tip_info = + SecurityStateTabHelper::FromWebContents( + browser()->tab_strip_model()->GetActiveWebContents()) + ->GetVisibleSecurityState() + ->safety_tip_info; + ASSERT_EQ(security_state::SafetyTipStatus::kNone, safety_tip_info.status); + ASSERT_EQ(GURL(), safety_tip_info.safe_url); + // Check that the histogram count logs the safety tip status of the page // containing the form, not of the form target page. histograms.ExpectUniqueSample(
diff --git a/chrome/browser/supervised_user/supervised_user_error_page/resources/supervised_user_block_interstitial.js b/chrome/browser/supervised_user/supervised_user_error_page/resources/supervised_user_block_interstitial.js index 33e41fb..a0c0699c 100644 --- a/chrome/browser/supervised_user/supervised_user_error_page/resources/supervised_user_block_interstitial.js +++ b/chrome/browser/supervised_user/supervised_user_error_page/resources/supervised_user_block_interstitial.js
@@ -125,8 +125,10 @@ /** * Updates the interstitial to show that the request failed or was sent. * @param {boolean} isSuccessful Whether the request was successful or not. + * @param {boolean} isMainFrame Whether the interstitial is being shown in main + * frame. */ -function setRequestStatus(isSuccessful) { +function setRequestStatus(isSuccessful, isMainFrame) { console.log('setRequestStatus(' + isSuccessful +')'); $('block-page-header').hidden = true; $('block-page-message').hidden = true; @@ -137,7 +139,7 @@ if (isSuccessful) { $('request-failed-message').hidden = true; $('request-sent-message').hidden = false; - $('back-button').hidden = false; + $('back-button').hidden = !isMainFrame; $('request-access-button').hidden = true; $('show-details-link').hidden = true; } else {
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc index d661581..42bf04d 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
@@ -463,6 +463,69 @@ DCHECK_EQ(GetBlockedFrames().size(), 0u); } +IN_PROC_BROWSER_TEST_F(SupervisedUserIframeFilterTest, TestBackButton) { + BlockHost(kIframeHost1); + + GURL allowed_url_with_iframes = embedded_test_server()->GetURL( + kExampleHost, "/supervised_user/with_iframes.html"); + ui_test_utils::NavigateToURL(browser(), allowed_url_with_iframes); + EXPECT_FALSE(IsInterstitialBeingShown(browser())); + + auto blocked = GetBlockedFrames(); + EXPECT_EQ(blocked.size(), 1u); + + permission_creator()->SetPermissionResult(true); + permission_creator()->DelayHandlingForNextRequests(); + + RequestPermissionFromFrame(blocked[0]); + + std::string command = + "domAutomationController.send(" + "(document.getElementById('back-button').hidden));"; + + auto* render_frame_host = tracker()->GetHost(blocked[0]); + DCHECK(render_frame_host->IsRenderFrameLive()); + bool value = false; + auto target = content::ToRenderFrameHost(render_frame_host); + EXPECT_TRUE(content::ExecuteScriptWithoutUserGestureAndExtractBool( + target, command, &value)); + + // Back button should be hidden in iframes. + EXPECT_TRUE(value); +} + +IN_PROC_BROWSER_TEST_F(SupervisedUserIframeFilterTest, + TestBackButtonMainFrame) { + BlockHost(kExampleHost); + + GURL allowed_url_with_iframes = embedded_test_server()->GetURL( + kExampleHost, "/supervised_user/with_iframes.html"); + ui_test_utils::NavigateToURL(browser(), allowed_url_with_iframes); + EXPECT_TRUE(IsInterstitialBeingShown(browser())); + + auto blocked = GetBlockedFrames(); + EXPECT_EQ(blocked.size(), 1u); + + permission_creator()->SetPermissionResult(true); + permission_creator()->DelayHandlingForNextRequests(); + + RequestPermissionFromFrame(blocked[0]); + + std::string command = + "domAutomationController.send(" + "(document.getElementById('back-button').hidden));"; + auto* render_frame_host = tracker()->GetHost(blocked[0]); + DCHECK(render_frame_host->IsRenderFrameLive()); + + bool value = false; + auto target = content::ToRenderFrameHost(render_frame_host); + EXPECT_TRUE(content::ExecuteScriptWithoutUserGestureAndExtractBool( + target, command, &value)); + + // Back button should not be hidden in main frame. + EXPECT_FALSE(value); +} + class SupervisedUserNavigationThrottleNotSupervisedTest : public SupervisedUserNavigationThrottleTest { protected:
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_header_item.xml b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_header_item.xml index b628745..0cff910 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_header_item.xml +++ b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_header_item.xml
@@ -17,18 +17,24 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" + android:layout_marginEnd="@dimen/touch_to_fill_sheet_margin" + android:layout_marginStart="@dimen/touch_to_fill_sheet_margin" android:importantForAccessibility="no" app:srcCompat="@drawable/touch_to_fill_header_image" /> <org.chromium.ui.widget.TextViewWithLeading android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/touch_to_fill_sheet_margin" + android:layout_marginStart="@dimen/touch_to_fill_sheet_margin" android:layout_gravity="center_horizontal" android:text="@string/touch_to_fill_sheet_title" android:textAppearance="@style/TextAppearance.BlackHeadline" /> <org.chromium.ui.widget.TextViewWithLeading android:id="@+id/touch_to_fill_sheet_subtitle" + android:layout_marginEnd="@dimen/touch_to_fill_sheet_margin" + android:layout_marginStart="@dimen/touch_to_fill_sheet_margin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_sheet.xml b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_sheet.xml index d1b527b..67aba53 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_sheet.xml +++ b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_sheet.xml
@@ -10,15 +10,15 @@ android:layout_height="match_parent" android:layout_width="match_parent" android:minHeight="340dp" - android:orientation="vertical" - android:paddingStart="16dp" - android:paddingEnd="16dp"> + android:orientation="vertical"> <ImageView android:id="@+id/drag_handlebar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" + android:layout_marginEnd="@dimen/touch_to_fill_sheet_margin" + android:layout_marginStart="@dimen/touch_to_fill_sheet_margin" android:layout_marginTop="6dp" android:layout_marginBottom="6dp" android:importantForAccessibility="no" @@ -27,11 +27,31 @@ <android.support.v7.widget.RecyclerView android:id="@+id/sheet_item_list" android:layout_width="match_parent" - android:layout_height="match_parent" - android:minHeight="200dp" - android:layout_marginTop="24dp" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_marginTop="16dp" + android:layout_marginEnd="@dimen/touch_to_fill_sheet_margin" + android:layout_marginStart="@dimen/touch_to_fill_sheet_margin" android:clipToPadding="false" android:paddingBottom="16dp" android:divider="@null" tools:listitem="@layout/touch_to_fill_credential_item"/> + + <View style="@style/HorizontalDivider" + android:layout_height="@dimen/divider_height" + android:layout_marginBottom="8dp" + android:layout_width="match_parent"/> + + <TextView + android:id="@+id/touch_to_fill_sheet_manage_passwords" + android:text="@string/manage_passwords" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="24dp" + android:paddingStart="@dimen/touch_to_fill_sheet_margin" + android:paddingEnd="@dimen/touch_to_fill_sheet_margin" + android:minHeight="48dp" + android:gravity="center_vertical|start" + android:textAppearance="@style/TextAppearance.BlackTitle1" + android:background="?android:attr/selectableItemBackground"/> </LinearLayout>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml b/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml index d41f1d4..249a6ea 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml +++ b/chrome/browser/touch_to_fill/android/internal/java/res/values/dimens.xml
@@ -5,4 +5,5 @@ <resources> <dimen name="touch_to_fill_favicon_size">24dp</dimen> + <dimen name="touch_to_fill_sheet_margin">16dp</dimen> </resources>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java index 0a9fa5a1..a1556a70 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java
@@ -68,6 +68,12 @@ } @Override + public void onManagePasswordsSelected() { + assert mNativeView != 0 : "The native side is already dismissed"; + TouchToFillBridgeJni.get().onManagePasswordsSelected(mNativeView); + } + + @Override public void onCredentialSelected(Credential credential) { assert mNativeView != 0 : "The native side is already dismissed"; TouchToFillBridgeJni.get().onCredentialSelected(mNativeView, credential); @@ -82,6 +88,7 @@ @NativeMethods interface Natives { void onCredentialSelected(long nativeTouchToFillViewImpl, Credential credential); + void onManagePasswordsSelected(long nativeTouchToFillViewImpl); void onDismiss(long nativeTouchToFillViewImpl); void fetchFavicon(long nativeTouchToFillViewImpl, String origin, int desiredSizeInPx, Callback<Bitmap> callback);
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java index f7c46ef..718024a 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java
@@ -10,6 +10,7 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE; +import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ON_CLICK_MANAGE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; @@ -53,6 +54,7 @@ void showCredentials( String formattedUrl, boolean isOriginSecure, List<Credential> credentials) { assert credentials != null; + mModel.set(ON_CLICK_MANAGE, this::onManagePasswordSelected); mModel.set(VISIBLE, true); ListModel<ListItem> sheetItems = mModel.get(SHEET_ITEMS); @@ -99,4 +101,9 @@ UMA_TOUCH_TO_FILL_DISMISSAL_REASON, reason, StateChangeReason.MAX_VALUE + 1); mDelegate.onDismissed(); } + + private void onManagePasswordSelected() { + mModel.set(VISIBLE, false); + mDelegate.onManagePasswordsSelected(); + } }
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java index 4017518b..ffd2e062 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillProperties.java
@@ -29,9 +29,10 @@ new PropertyModel.ReadableObjectPropertyKey<>("sheet_items"); static final PropertyModel.ReadableObjectPropertyKey<Callback<Integer>> DISMISS_HANDLER = new PropertyModel.ReadableObjectPropertyKey<>("dismiss_handler"); - + static final PropertyModel.WritableObjectPropertyKey<Runnable> ON_CLICK_MANAGE = + new PropertyModel.WritableObjectPropertyKey<>("on_click_manage"); static PropertyModel createDefaultModel(Callback<Integer> handler) { - return new PropertyModel.Builder(VISIBLE, SHEET_ITEMS, DISMISS_HANDLER) + return new PropertyModel.Builder(VISIBLE, SHEET_ITEMS, DISMISS_HANDLER, ON_CLICK_MANAGE) .with(VISIBLE, false) .with(SHEET_ITEMS, new ListModel<>()) .with(DISMISS_HANDLER, handler)
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java index de6a26f3..3752bed 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java
@@ -81,6 +81,11 @@ mSheetItemListView.setAdapter(adapter); } + void setOnManagePasswordClick(Runnable runnable) { + mContentView.findViewById(R.id.touch_to_fill_sheet_manage_passwords) + .setOnClickListener((v) -> runnable.run()); + } + Context getContext() { return mContext; }
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java index abc1871d..abac267 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
@@ -11,6 +11,7 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.DISMISS_HANDLER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE; +import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ON_CLICK_MANAGE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; import static org.chromium.chrome.browser.util.UrlUtilities.stripScheme; @@ -46,6 +47,8 @@ view.setDismissHandler(model.get(DISMISS_HANDLER)); } else if (propertyKey == VISIBLE) { view.setVisible(model.get(VISIBLE)); + } else if (propertyKey == ON_CLICK_MANAGE) { + view.setOnManagePasswordClick(model.get(ON_CLICK_MANAGE)); } else if (propertyKey == SHEET_ITEMS) { view.setSheetItemListAdapter( new RecyclerViewAdapter<>(new SimpleRecyclerViewMcp<>(model.get(SHEET_ITEMS),
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd index 890840e..ef22125 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd
@@ -125,6 +125,9 @@ <message name="IDS_TOUCH_TO_FILL_SHEET_CLOSED" desc="Accessibility string read when the Touch To Fill bottom sheet showing a list of the user's credentials is closed."> List of credentials to be filled on touch is closed. </message> + <message name="IDS_MANAGE_PASSWORDS" desc="Title of the button at the end of a touch to fill sheet that will open the password preferences when tapped."> + Manage Passwords + </message> </messages> </release> </grit>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings_grd/IDS_MANAGE_PASSWORDS.png.sha1 b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings_grd/IDS_MANAGE_PASSWORDS.png.sha1 new file mode 100644 index 0000000..3acb100 --- /dev/null +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings_grd/IDS_MANAGE_PASSWORDS.png.sha1
@@ -0,0 +1 @@ +fae805a8d8c447893b4fc62ec0da44ae0fcfccc4 \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java index bc8d0ce..9852b74 100644 --- a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java +++ b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java
@@ -37,6 +37,11 @@ void onDismissed(); /** + * Called when the user selects the "Manage Passwords" option. + */ + void onManagePasswordsSelected(); + + /** * Called to fetch a favicon for one origin to display it in the UI. */ void fetchFavicon(String origin, @Px int desiredSize, Callback<Bitmap> callback);
diff --git a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java index 6423f4b..e6a0d687 100644 --- a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java +++ b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
@@ -17,6 +17,7 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.CredentialProperties.ON_CLICK_LISTENER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE; +import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ON_CLICK_MANAGE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; import static org.chromium.content_public.browser.test.util.CriteriaHelper.pollUiThread; @@ -54,6 +55,7 @@ import org.chromium.ui.modelutil.PropertyModel; import java.util.Collections; +import java.util.concurrent.atomic.AtomicBoolean; /** * View tests for the Touch To Fill component ensure that model changes are reflected in the sheet. @@ -191,6 +193,27 @@ @Test @MediumTest + public void testManagePasswordsIsClickable() { + final AtomicBoolean manageButtonClicked = new AtomicBoolean(false); + TestThreadUtils.runOnUiThreadBlocking(() -> { + mModel.set(ON_CLICK_MANAGE, () -> manageButtonClicked.set(true)); + mModel.set(VISIBLE, true); + }); + pollUiThread(() -> getBottomSheetState() == SheetState.PEEK); + + TestThreadUtils.runOnUiThreadBlocking( + () -> { getActivity().getBottomSheet().setSheetState(SheetState.FULL, false); }); + pollUiThread(() -> getBottomSheetState() == SheetState.FULL); + + TextView manageButton = mTouchToFillView.getContentView().findViewById( + R.id.touch_to_fill_sheet_manage_passwords); + TouchCommon.singleClickView(manageButton); + + pollUiThread(manageButtonClicked::get); + } + + @Test + @MediumTest public void testDismissesWhenHidden() { TestThreadUtils.runOnUiThreadBlocking(() -> mModel.set(VISIBLE, true)); pollUiThread(() -> getBottomSheetState() == SheetState.PEEK);
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java index 93d34963..c01d046 100644 --- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java +++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.touch_to_fill; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; @@ -21,6 +22,7 @@ import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.DISMISS_HANDLER; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.FORMATTED_URL; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.HeaderProperties.ORIGIN_SECURE; +import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.ON_CLICK_MANAGE; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.SHEET_ITEMS; import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE; @@ -238,6 +240,15 @@ is(1)); } + @Test + public void testHidesWhenSelectingManagePasswords() { + mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA, CARL, BOB)); + assertThat(mModel.get(ON_CLICK_MANAGE), is(notNullValue())); + mModel.get(ON_CLICK_MANAGE).run(); + verify(mMockDelegate).onManagePasswordsSelected(); + assertThat(mModel.get(VISIBLE), is(false)); + } + /** * Helper to verify formatted URLs. The real implementation calls {@link UrlFormatter}. It's not * useful to actually reimplement the formatter, so just modify the string in a trivial way.
diff --git a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc index ebe7fe2..c83af8a 100644 --- a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc +++ b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc
@@ -118,6 +118,10 @@ OnCredentialSelected(ConvertJavaCredential(env, credential)); } +void TouchToFillViewImpl::OnManagePasswordsSelected(JNIEnv* env) { + controller_->OnManagePasswordsSelected(); +} + void TouchToFillViewImpl::OnDismiss(JNIEnv* env) { OnDismiss(); }
diff --git a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.h b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.h index 506b3d2..1141208 100644 --- a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.h +++ b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.h
@@ -39,6 +39,7 @@ void OnCredentialSelected( JNIEnv* env, const base::android::JavaParamRef<jobject>& credential); + void OnManagePasswordsSelected(JNIEnv* env); void OnDismiss(JNIEnv* env); private:
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 44a0589..1739b783 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -733,6 +733,7 @@ bool IsEnabledByPolicy() const { switch (GetParam()) { case ArcState::ARC_PLAY_STORE_MANAGED_AND_ENABLED: + return true; case ArcState::ARC_PLAY_STORE_MANAGED_AND_DISABLED: case ArcState::ARC_WITHOUT_PLAY_STORE: return false; @@ -2833,8 +2834,20 @@ // There is no default app for managed users except Play Store for (const auto& app : fake_default_apps()) { const std::string app_id = ArcAppTest::GetAppId(app); - EXPECT_FALSE(prefs->IsRegistered(app_id)); - EXPECT_FALSE(prefs->GetApp(app_id)); + if (IsEnabledByPolicy()) { + // Only system apps are allowed. App from package test.app2 is declared as + // a system app. + auto app = prefs->GetApp(app_id); + if (app) { + EXPECT_EQ("test.app2", app->package_name); + EXPECT_TRUE(prefs->IsRegistered(app_id)); + } else { + EXPECT_FALSE(prefs->IsRegistered(app_id)); + } + } else { + EXPECT_FALSE(prefs->IsRegistered(app_id)); + EXPECT_FALSE(prefs->GetApp(app_id)); + } } // PlayStor exists for managed and enabled state.
diff --git a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc index a4b44fc..b10c242 100644 --- a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc +++ b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
@@ -28,6 +28,7 @@ constexpr char kName[] = "name"; constexpr char kOem[] = "oem"; constexpr char kPackageName[] = "package_name"; +constexpr char kSystem[] = "system"; constexpr char kDefaultApps[] = "arc.apps.default"; constexpr char kHidden[] = "hidden"; @@ -86,12 +87,14 @@ std::string activity; std::string app_path; bool oem = false; + bool system = false; app_info_dictionary->GetString(kName, &name); app_info_dictionary->GetString(kPackageName, &package_name); app_info_dictionary->GetString(kActivity, &activity); app_info_dictionary->GetString(kAppPath, &app_path); app_info_dictionary->GetBoolean(kOem, &oem); + app_info_dictionary->GetBoolean(kSystem, &system); if (name.empty() || package_name.empty() || activity.empty() || app_path.empty()) { @@ -103,8 +106,9 @@ const std::string app_id = ArcAppListPrefs::GetAppId(package_name, activity); std::unique_ptr<ArcDefaultAppList::AppInfo> app = - std::make_unique<ArcDefaultAppList::AppInfo>( - name, package_name, activity, oem, root_dir.Append(app_path)); + std::make_unique<ArcDefaultAppList::AppInfo>(name, package_name, + activity, oem, system, + root_dir.Append(app_path)); apps.get()->insert( std::pair<std::string, std::unique_ptr<ArcDefaultAppList::AppInfo>>( app_id, std::move(app))); @@ -206,11 +210,10 @@ registry->GetInstalledExtension(arc::kPlayStoreAppId); if (arc_host && arc::IsPlayStoreAvailable()) { std::unique_ptr<ArcDefaultAppList::AppInfo> play_store_app = - std::make_unique<ArcDefaultAppList::AppInfo>(arc_host->name(), - arc::kPlayStorePackage, - arc::kPlayStoreActivity, - false /* oem */, - base::FilePath() /* app_path */); + std::make_unique<ArcDefaultAppList::AppInfo>( + arc_host->name(), arc::kPlayStorePackage, arc::kPlayStoreActivity, + false /* oem */, true /* system */, + base::FilePath() /* app_path */); AppInfoMap& app_map = IsAppHidden(prefs, arc::kPlayStoreAppId) ? hidden_apps_ : visible_apps_; app_map.insert( @@ -223,14 +226,16 @@ const ArcDefaultAppList::AppInfo* ArcDefaultAppList::GetApp( const std::string& app_id) const { - if ((filter_level_ == FilterLevel::ALL) || - (filter_level_ == FilterLevel::OPTIONAL_APPS && - app_id != arc::kPlayStoreAppId)) { + if (filter_level_ == FilterLevel::ALL) return nullptr; - } + const auto it = visible_apps_.find(app_id); if (it == visible_apps_.end()) return nullptr; + + if (filter_level_ == FilterLevel::OPTIONAL_APPS && !it->second->system) + return nullptr; + return it->second.get(); } @@ -294,11 +299,13 @@ const std::string& package_name, const std::string& activity, bool oem, + bool system, const base::FilePath app_path) : name(name), package_name(package_name), activity(activity), oem(oem), + system(system), app_path(app_path) {} ArcDefaultAppList::AppInfo::~AppInfo() {}
diff --git a/chrome/browser/ui/app_list/arc/arc_default_app_list.h b/chrome/browser/ui/app_list/arc/arc_default_app_list.h index f111ca3c..430047b 100644 --- a/chrome/browser/ui/app_list/arc/arc_default_app_list.h +++ b/chrome/browser/ui/app_list/arc/arc_default_app_list.h
@@ -29,24 +29,26 @@ public: struct AppInfo { AppInfo(const std::string& name, - const std::string& package_name, - const std::string& activity, - bool oem, - const base::FilePath app_path); + const std::string& package_name, + const std::string& activity, + bool oem, + bool system, + const base::FilePath app_path); ~AppInfo(); std::string name; std::string package_name; std::string activity; bool oem; + bool system; base::FilePath app_path; // App folder that contains pre-installed icons. }; enum class FilterLevel { // Filter nothing. NOTHING, - // Filter out only optional apps, excluding Play Store for example. Used in - // case when Play Store is managed and enabled. + // Filter out only optional apps, leaving system apps available, Play Store + // is also system app. OPTIONAL_APPS, // Filter out everything. Used in case when Play Store is managed and // disabled.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 923f79e0a..fa58585 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -87,6 +87,7 @@ #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/ssl/security_state_tab_helper.h" +#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" #include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/task_manager/web_contents_tags.h" #include "chrome/browser/themes/theme_service.h" @@ -180,6 +181,7 @@ #include "components/sessions/core/session_types.h" #include "components/sessions/core/tab_restore_service.h" #include "components/startup_metric_utils/browser/startup_metric_utils.h" +#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" #include "components/translate/core/browser/language_state.h" #include "components/user_manager/user_manager.h" #include "components/viz/common/surfaces/surface_id.h" @@ -1385,6 +1387,15 @@ #endif // defined(OS_CHROMEOS) } +bool Browser::IsFrameLowPriority( + const content::WebContents* web_contents, + const content::RenderFrameHost* render_frame_host) { + const auto* client = + ChromeSubresourceFilterClient::FromWebContents(web_contents); + return client && + client->GetThrottleManager()->IsFrameTaggedAsAd(render_frame_host); +} + bool Browser::IsMouseLocked() const { return exclusive_access_manager_->mouse_lock_controller()->IsMouseLocked(); }
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 0b0b0cb0..8b8ec34 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -579,6 +579,9 @@ bool did_start_load, bool did_finish_load) override; bool ShouldShowStaleContentOnEviction(content::WebContents* source) override; + bool IsFrameLowPriority( + const content::WebContents* web_contents, + const content::RenderFrameHost* render_frame_host) override; bool is_type_normal() const { return type_ == TYPE_NORMAL; } bool is_type_popup() const { return type_ == TYPE_POPUP; }
diff --git a/chrome/browser/ui/page_info/page_info.cc b/chrome/browser/ui/page_info/page_info.cc index 3091208..a809670 100644 --- a/chrome/browser/ui/page_info/page_info.cc +++ b/chrome/browser/ui/page_info/page_info.cc
@@ -333,7 +333,7 @@ site_url_(url), site_identity_status_(SITE_IDENTITY_STATUS_UNKNOWN), safe_browsing_status_(SAFE_BROWSING_STATUS_NONE), - safety_tip_status_(security_state::SafetyTipStatus::kUnknown), + safety_tip_info_({security_state::SafetyTipStatus::kUnknown, GURL()}), site_connection_status_(SITE_CONNECTION_STATUS_UNKNOWN), show_ssl_decision_revoke_button_(false), content_settings_(HostContentSettingsMapFactory::GetForProfile(profile)), @@ -385,11 +385,11 @@ kPageInfoTimePrefix, security_level_), base::TimeTicks::Now() - start_time_, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromHours(1), 100); - base::UmaHistogramCustomTimes(security_state::GetSafetyTipHistogramName( - kPageInfoTimePrefix, safety_tip_status_), - base::TimeTicks::Now() - start_time_, - base::TimeDelta::FromMilliseconds(1), - base::TimeDelta::FromHours(1), 100); + base::UmaHistogramCustomTimes( + security_state::GetSafetyTipHistogramName(kPageInfoTimePrefix, + safety_tip_info_.status), + base::TimeTicks::Now() - start_time_, + base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromHours(1), 100); if (did_perform_action_) { base::UmaHistogramCustomTimes( @@ -400,7 +400,7 @@ 100); base::UmaHistogramCustomTimes( security_state::GetSafetyTipHistogramName(kPageInfoTimeActionPrefix, - safety_tip_status_), + safety_tip_info_.status), base::TimeTicks::Now() - start_time_, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromHours(1), 100); @@ -413,7 +413,7 @@ 100); base::UmaHistogramCustomTimes( security_state::GetSafetyTipHistogramName(kPageInfoTimeNoActionPrefix, - safety_tip_status_), + safety_tip_info_.status), base::TimeTicks::Now() - start_time_, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromHours(1), 100); @@ -435,7 +435,7 @@ base::UmaHistogramEnumeration( security_state::GetSafetyTipHistogramName( - "Security.SafetyTips.PageInfo.Action", safety_tip_status_), + "Security.SafetyTips.PageInfo.Action", safety_tip_info_.status), action, PAGE_INFO_COUNT); std::string histogram_name; @@ -762,10 +762,10 @@ #endif } - safety_tip_status_ = visible_security_state.safety_tip_status; - if (visible_security_state.safety_tip_status != + safety_tip_info_ = visible_security_state.safety_tip_info; + if (visible_security_state.safety_tip_info.status != security_state::SafetyTipStatus::kNone && - visible_security_state.safety_tip_status != + visible_security_state.safety_tip_info.status != security_state::SafetyTipStatus::kUnknown && base::FeatureList::IsEnabled(security_state::features::kSafetyTipUI)) { site_details_message_ = l10n_util::GetStringUTF16( @@ -985,7 +985,7 @@ info.identity_status = site_identity_status_; info.safe_browsing_status = safe_browsing_status_; if (base::FeatureList::IsEnabled(security_state::features::kSafetyTipUI)) { - info.safety_tip_status = safety_tip_status_; + info.safety_tip_info = safety_tip_info_; } info.identity_status_description = UTF16ToUTF8(site_details_message_); info.certificate = certificate_;
diff --git a/chrome/browser/ui/page_info/page_info.h b/chrome/browser/ui/page_info/page_info.h index 8ea537c5..96d6d6d 100644 --- a/chrome/browser/ui/page_info/page_info.h +++ b/chrome/browser/ui/page_info/page_info.h
@@ -271,9 +271,9 @@ // Safe Browsing status of the website. SafeBrowsingStatus safe_browsing_status_; - // Safety tip status of the website. Set regardless of whether the feature is + // Safety tip info of the website. Set regardless of whether the feature is // enabled to show the UI. - security_state::SafetyTipStatus safety_tip_status_; + security_state::SafetyTipInfo safety_tip_info_; // For secure connection |certificate_| is set to the server certificate. scoped_refptr<net::X509Certificate> certificate_;
diff --git a/chrome/browser/ui/page_info/page_info_ui.cc b/chrome/browser/ui/page_info/page_info_ui.cc index 28ab89a..48cd9c8 100644 --- a/chrome/browser/ui/page_info/page_info_ui.cc +++ b/chrome/browser/ui/page_info/page_info_ui.cc
@@ -234,7 +234,7 @@ PageInfoUI::IdentityInfo::IdentityInfo() : identity_status(PageInfo::SITE_IDENTITY_STATUS_UNKNOWN), safe_browsing_status(PageInfo::SAFE_BROWSING_STATUS_NONE), - safety_tip_status(security_state::SafetyTipStatus::kUnknown), + safety_tip_info({security_state::SafetyTipStatus::kUnknown, GURL()}), connection_status(PageInfo::SITE_CONNECTION_STATUS_UNKNOWN), show_ssl_decision_revoke_button(false), show_change_password_buttons(false) {} @@ -279,7 +279,7 @@ IDS_PAGE_INFO_BILLING_DETAILS); } - switch (identity_info.safety_tip_status) { + switch (identity_info.safety_tip_info.status) { case security_state::SafetyTipStatus::kBadReputation: return CreateSecurityDescription( SecuritySummaryColor::RED,
diff --git a/chrome/browser/ui/page_info/page_info_ui.h b/chrome/browser/ui/page_info/page_info_ui.h index 3e8bd69..ca5f09a 100644 --- a/chrome/browser/ui/page_info/page_info_ui.h +++ b/chrome/browser/ui/page_info/page_info_ui.h
@@ -112,9 +112,9 @@ PageInfo::SiteIdentityStatus identity_status; // Site's Safe Browsing status. PageInfo::SafeBrowsingStatus safe_browsing_status; - // Site's safety tip status. Only set if the feature is enabled to show the + // Site's safety tip info. Only set if the feature is enabled to show the // Safety Tip UI. - security_state::SafetyTipStatus safety_tip_status; + security_state::SafetyTipInfo safety_tip_info; // Textual description of the site's identity status that is displayed to // the user. std::string identity_status_description;
diff --git a/chrome/browser/ui/page_info/page_info_unittest.cc b/chrome/browser/ui/page_info/page_info_unittest.cc index 550f42c..1ece8bd0 100644 --- a/chrome/browser/ui/page_info/page_info_unittest.cc +++ b/chrome/browser/ui/page_info/page_info_unittest.cc
@@ -1154,24 +1154,24 @@ scoped_feature_list.InitAndEnableFeature( security_state::features::kSafetyTipUI); struct TestCase { - const security_state::SafetyTipStatus safety_tip_status; + const security_state::SafetyTipInfo safety_tip_info; const std::string histogram_name; }; const char kGenericHistogram[] = "WebsiteSettings.Action"; const TestCase kTestCases[] = { - {security_state::SafetyTipStatus::kNone, + {{security_state::SafetyTipStatus::kNone, GURL()}, "Security.SafetyTips.PageInfo.Action.SafetyTip_None"}, - {security_state::SafetyTipStatus::kBadReputation, + {{security_state::SafetyTipStatus::kBadReputation, GURL()}, "Security.SafetyTips.PageInfo.Action.SafetyTip_BadReputation"}, - {security_state::SafetyTipStatus::kLookalike, + {{security_state::SafetyTipStatus::kLookalike, GURL()}, "Security.SafetyTips.PageInfo.Action.SafetyTip_Lookalike"}, }; for (const auto& test : kTestCases) { base::HistogramTester histograms; SetURL("https://example.test"); - visible_security_state_.safety_tip_status = test.safety_tip_status; + visible_security_state_.safety_tip_info = test.safety_tip_info; ResetMockUI(); ClearPageInfo(); SetDefaultUIExpectations(mock_ui()); @@ -1225,7 +1225,7 @@ for (const auto& test : kTestCases) { base::HistogramTester histograms; SetURL("https://example.test"); - visible_security_state_.safety_tip_status = test.safety_tip_status; + visible_security_state_.safety_tip_info.status = test.safety_tip_status; ResetMockUI(); ClearPageInfo(); SetDefaultUIExpectations(mock_ui());
diff --git a/chrome/browser/ui/passwords/manage_passwords_view_utils.cc b/chrome/browser/ui/passwords/manage_passwords_view_utils.cc index 6baae5e..62d8304 100644 --- a/chrome/browser/ui/passwords/manage_passwords_view_utils.cc +++ b/chrome/browser/ui/passwords/manage_passwords_view_utils.cc
@@ -212,6 +212,7 @@ case ManagePasswordsReferrer::kProfileChooser: return "profile_chooser"; case ManagePasswordsReferrer::kPasswordsAccessorySheet: + case ManagePasswordsReferrer::kTouchToFill: NOTREACHED(); }
diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc index d73d5591..6313cf4ef 100644 --- a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc +++ b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
@@ -25,6 +25,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/resource_type.h" +#include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/referrer.mojom.h" using content::NavigationController; @@ -137,9 +138,9 @@ return; auto* frame = web_contents()->GetMainFrame(); - network::mojom::URLLoaderFactoryPtr url_loader_factory; + mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory; frame->CreateNetworkServiceDefaultFactory( - mojo::MakeRequest(&url_loader_factory)); + url_loader_factory.BindNewPipeAndPassReceiver()); // Download the OpenSearch description document. If this is successful, a // new keyword will be created when done.
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc index b398140..adbbc093 100644 --- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc +++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc
@@ -9,6 +9,7 @@ #include "base/run_loop.h" #include "base/strings/nullable_string16.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.h" #include "chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.h" @@ -39,12 +40,19 @@ return web_contents_.get(); } + void EnableFeature(const base::Feature& feature) { + scoped_feature_list_.Reset(); + scoped_feature_list_.InitAndEnableFeature(feature); + } + void EnableDeepScanning(bool enable, bool scan_succeeds) { SetScanPolicies(enable ? safe_browsing::CHECK_UPLOADS : safe_browsing::CHECK_NONE); if (!enable) return; + EnableFeature(safe_browsing::kDeepScanningOfUploads); + run_loop_.reset(new base::RunLoop()); using FakeDelegate = safe_browsing::FakeDeepScanningDialogDelegate; @@ -103,6 +111,7 @@ } content::BrowserTaskEnvironment task_environment_; + base::test::ScopedFeatureList scoped_feature_list_; TestingProfileManager profile_manager_{TestingBrowserProcess::GetGlobal()}; TestingProfile* profile_; std::unique_ptr<base::RunLoop> run_loop_;
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc index 020cd3a..0ed8f2e9 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -444,7 +444,7 @@ bool OpaqueBrowserFrameView::IsToolbarVisible() const { return browser_view()->IsToolbarVisible() && - !browser_view()->toolbar()->GetPreferredSize().IsEmpty(); + !browser_view()->toolbar()->GetPreferredSize().IsEmpty(); } int OpaqueBrowserFrameView::GetTabStripHeight() const { @@ -704,8 +704,8 @@ void OpaqueBrowserFrameView::PaintMaximizedFrameBorder( gfx::Canvas* canvas) const { - frame_background_->set_maximized_top_inset( - GetTopInset(true) - GetTopInset(false)); + frame_background_->set_maximized_top_inset(GetTopInset(true) - + GetTopInset(false)); frame_background_->PaintMaximized(canvas, this); } @@ -713,18 +713,12 @@ const bool tabstrip_visible = browser_view()->IsTabStripVisible(); const gfx::Rect client_bounds = layout_->CalculateClientAreaBounds(width(), height()); - int y = client_bounds.y(); - // If the toolbar isn't going to draw a top edge for us, draw one ourselves. - if (!tabstrip_visible) { - canvas->DrawLine(gfx::Point(client_bounds.x(), client_bounds.y() - 1), - gfx::Point(client_bounds.right(), client_bounds.y() - 1), - GetToolbarTopSeparatorColor()); - } // In maximized mode, the only edge to draw is the top one, so we're done. if (IsFrameCondensed()) return; + int y = client_bounds.y(); const gfx::Rect toolbar_bounds = browser_view()->toolbar()->bounds(); if (tabstrip_visible) { // The client edges start at the top of the toolbar.
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc index 21d8730..d3c73ea 100644 --- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
@@ -55,7 +55,7 @@ enum class UIStatus { kDisabled, kEnabled, - kEnabledWithEditDistance, + kEnabledWithAllFeatures, }; // An engagement score above MEDIUM. @@ -170,10 +170,11 @@ {{"topsites", "true"}}}}, {}); break; - case UIStatus::kEnabledWithEditDistance: + case UIStatus::kEnabledWithAllFeatures: feature_list_.InitWithFeaturesAndParameters( {{security_state::features::kSafetyTipUI, - {{"editdistance", "true"}, + {{"topsites", "true"}, + {"editdistance", "true"}, {"editdistance_siteengagement", "true"}}}, {features::kLookalikeUrlNavigationSuggestionsUI, {{"topsites", "true"}}}}, @@ -226,6 +227,11 @@ return ui_status() == UIStatus::kDisabled ? true : IsUIShowing(); } + bool IsUIShowingOnlyIfFeaturesEnabled() { + return ui_status() == UIStatus::kEnabledWithAllFeatures ? IsUIShowing() + : !IsUIShowing(); + } + void CheckPageInfoShowsSafetyTipInfo(Browser* browser) { if (ui_status() == UIStatus::kDisabled) { return; @@ -258,7 +264,7 @@ SafetyTipPageInfoBubbleViewBrowserTest, ::testing::Values(UIStatus::kDisabled, UIStatus::kEnabled, - UIStatus::kEnabledWithEditDistance)); + UIStatus::kEnabledWithAllFeatures)); // Ensure normal sites with low engagement are not blocked. IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest, @@ -453,7 +459,7 @@ const GURL kNavigatedUrl = GetURL("googlé.sk"); SetEngagementScore(browser(), kNavigatedUrl, kLowEngagement); NavigateToURL(browser(), kNavigatedUrl, WindowOpenDisposition::CURRENT_TAB); - EXPECT_TRUE(IsUIShowingIfEnabled()); + EXPECT_TRUE(IsUIShowingOnlyIfFeaturesEnabled()); ASSERT_NO_FATAL_FAILURE(CheckPageInfoDoesNotShowSafetyTipInfo(browser())); } @@ -467,7 +473,7 @@ // Ensure a Safety Tip is triggered initially... SetEngagementScore(browser(), kNavigatedUrl, kLowEngagement); NavigateToURL(browser(), kNavigatedUrl, WindowOpenDisposition::CURRENT_TAB); - EXPECT_TRUE(IsUIShowingIfEnabled()); + EXPECT_TRUE(IsUIShowingOnlyIfFeaturesEnabled()); // ...but suppressed by the allowlist. SetSafetyTipAllowlistPatterns({"xn--googl-fsa.sk/"}); @@ -484,7 +490,7 @@ const GURL kNavigatedUrl = GetURL("goooglé.com"); SetEngagementScore(browser(), kNavigatedUrl, kLowEngagement); NavigateToURL(browser(), kNavigatedUrl, WindowOpenDisposition::CURRENT_TAB); - EXPECT_EQ(IsUIShowing(), ui_status() == UIStatus::kEnabledWithEditDistance); + EXPECT_EQ(IsUIShowing(), ui_status() == UIStatus::kEnabledWithAllFeatures); } // Tests that the SafetyTipShown histogram triggers correctly. @@ -508,8 +514,9 @@ const GURL kLookalikeUrl = GetURL("googlé.sk"); SetEngagementScore(browser(), kLookalikeUrl, kLowEngagement); NavigateToURL(browser(), kLookalikeUrl, WindowOpenDisposition::CURRENT_TAB); - histograms.ExpectBucketCount(kHistogramName, - security_state::SafetyTipStatus::kLookalike, 1); + histograms.ExpectBucketCount( + kHistogramName, security_state::SafetyTipStatus::kLookalike, + ui_status() == UIStatus::kEnabledWithAllFeatures ? 1 : 0); histograms.ExpectTotalCount(kHistogramName, 3); } @@ -536,7 +543,7 @@ // These histograms are only recorded when the UI feature is enabled, so bail // out when disabled. - if (ui_status() != UIStatus::kEnabledWithEditDistance) { + if (ui_status() != UIStatus::kEnabledWithAllFeatures) { return; }
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc index 0a61cfe..b32bf5d8 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -592,12 +592,15 @@ base::Unretained(this))); } - AddFeatureButton( - ImageForMenu(kCloseAllIcon), - l10n_util::GetPluralStringFUTF16(IDS_PROFILES_CLOSE_X_WINDOWS_BUTTON, - CountBrowsersFor(profile)), - base::BindRepeating(&ProfileMenuView::OnExitProfileButtonClicked, - base::Unretained(this))); + int window_count = CountBrowsersFor(profile); + if (window_count > 1) { + AddFeatureButton( + ImageForMenu(vector_icons::kCloseIcon), + l10n_util::GetPluralStringFUTF16(IDS_PROFILES_CLOSE_X_WINDOWS_BUTTON, + window_count), + base::BindRepeating(&ProfileMenuView::OnExitProfileButtonClicked, + base::Unretained(this))); + } // The sign-out button is always at the bottom. if (has_unconsented_account && !has_primary_account) {
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index 00762b8..7624d78 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -257,8 +257,6 @@ const SkColor kBackgroundColor = ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor( ui::NativeTheme::kColorId_HighlightedMenuItemBackgroundColor); - const int kCornerRadius = - views::LayoutProvider::Get()->GetCornerRadiusMetric(views::EMPHASIS_HIGH); heading_container_->RemoveAllChildViews(/*delete_children=*/true); views::BoxLayout* heading_layout = heading_container_->SetLayoutManager( @@ -267,7 +265,7 @@ gfx::Insets(kInsidePadding))); if (!heading.empty()) { heading_container_->SetBackground( - views::CreateRoundedRectBackground(kBackgroundColor, kCornerRadius)); + views::CreateSolidBackground(kBackgroundColor)); } // Add the label even if |heading| is empty. This needs to be done so the icon
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc index a5e7860a..9cc8df7 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -809,9 +809,13 @@ PROFILE_MENU_CLICK_TEST(kActionableItems_MultipleProfiles, ProfileMenuClickTest_MultipleProfiles) { + // Add two additional profiles. ProfileManager* profile_manager = g_browser_process->profile_manager(); CreateTestingProfile(profile_manager->GenerateNextProfileDirectoryPath()); CreateTestingProfile(profile_manager->GenerateNextProfileDirectoryPath()); + // Open a second browser window for the current profile, so the + // ExitProfileButton is shown. + SetTargetBrowser(CreateBrowser(browser()->profile())); RunTest(); } @@ -824,7 +828,6 @@ ProfileMenuViewBase::ActionableItem::kAddressesButton, ProfileMenuViewBase::ActionableItem::kSyncSettingsButton, ProfileMenuViewBase::ActionableItem::kManageGoogleAccountButton, - ProfileMenuViewBase::ActionableItem::kExitProfileButton, ProfileMenuViewBase::ActionableItem::kManageProfilesButton, ProfileMenuViewBase::ActionableItem::kGuestProfileButton, ProfileMenuViewBase::ActionableItem::kAddNewProfileButton, @@ -851,7 +854,6 @@ ProfileMenuViewBase::ActionableItem::kAddressesButton, ProfileMenuViewBase::ActionableItem::kSyncErrorButton, ProfileMenuViewBase::ActionableItem::kManageGoogleAccountButton, - ProfileMenuViewBase::ActionableItem::kExitProfileButton, ProfileMenuViewBase::ActionableItem::kManageProfilesButton, ProfileMenuViewBase::ActionableItem::kGuestProfileButton, ProfileMenuViewBase::ActionableItem::kAddNewProfileButton, @@ -879,7 +881,6 @@ ProfileMenuViewBase::ActionableItem::kAddressesButton, ProfileMenuViewBase::ActionableItem::kSigninAccountButton, ProfileMenuViewBase::ActionableItem::kManageGoogleAccountButton, - ProfileMenuViewBase::ActionableItem::kExitProfileButton, ProfileMenuViewBase::ActionableItem::kSignoutButton, ProfileMenuViewBase::ActionableItem::kManageProfilesButton, ProfileMenuViewBase::ActionableItem::kGuestProfileButton, @@ -888,8 +889,10 @@ // there are no other buttons at the end. ProfileMenuViewBase::ActionableItem::kEditProfileButton}; -PROFILE_MENU_CLICK_TEST(kActionableItems_WithUnconsentedPrimaryAccount, - ProfileMenuClickTest_WithUnconsentedPrimaryAccount) { +// TODO(crbug.com/1015429): Failing on Mac 10.12. +PROFILE_MENU_CLICK_TEST( + kActionableItems_WithUnconsentedPrimaryAccount, + DISABLED_ProfileMenuClickTest_WithUnconsentedPrimaryAccount) { signin::MakeAccountAvailableWithCookies(identity_manager(), &test_url_loader_factory_, "user@example.com", "gaia_id"); @@ -928,7 +931,8 @@ Profile* guest = g_browser_process->profile_manager()->GetProfileByPath( ProfileManager::GetGuestProfilePath()); ASSERT_TRUE(guest); - SetTargetBrowser(chrome::FindAnyBrowser(guest, true)); + // Open a second guest browser window, so the ExitProfileButton is shown. + SetTargetBrowser(CreateIncognitoBrowser(guest)); RunTest(); }
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc index 6782c6d..1fcbd21 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -315,6 +315,15 @@ TabStripModel::CLOSE_CREATE_HISTORICAL_TAB); } +void BrowserTabStripController::UngroupAllTabsInGroup(TabGroupId group) { + model_->RemoveFromGroup(ListTabsInGroup(group)); +} + +void BrowserTabStripController::AddNewTabInGroup(TabGroupId group) { + const std::vector<int> tabs = ListTabsInGroup(group); + model_->delegate()->AddTabAt(GURL(), tabs.back() + 1, true, group); +} + void BrowserTabStripController::MoveTab(int start_index, int final_index) { model_->MoveWebContentsAt(start_index, final_index, false); }
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h index d6e05635..c954b03 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -61,6 +61,8 @@ void AddSelectionFromAnchorTo(int model_index) override; bool BeforeCloseTab(int model_index, CloseTabSource source) override; void CloseTab(int model_index, CloseTabSource source) override; + void UngroupAllTabsInGroup(TabGroupId group) override; + void AddNewTabInGroup(TabGroupId group) override; void MoveTab(int start_index, int final_index) override; void ShowContextMenuForTab(Tab* tab, const gfx::Point& p,
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc index 77c03cda..c0d8c3370 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
@@ -84,6 +84,10 @@ fake_group_data_ = visual_data; } +void FakeBaseTabStripController::UngroupAllTabsInGroup(TabGroupId group) {} + +void FakeBaseTabStripController::AddNewTabInGroup(TabGroupId group) {} + std::vector<int> FakeBaseTabStripController::ListTabsInGroup( TabGroupId group) const { std::vector<int> result;
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h index 44bfaf19..213a98ff 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -61,7 +61,9 @@ TabGroupId group_id) const override; void SetVisualDataForGroup(TabGroupId group, TabGroupVisualData visual_data) override; - std::vector<int> ListTabsInGroup(TabGroupId group_id) const override; + std::vector<int> ListTabsInGroup(TabGroupId group) const override; + void UngroupAllTabsInGroup(TabGroupId group) override; + void AddNewTabInGroup(TabGroupId group) override; bool IsFrameCondensed() const override; bool HasVisibleBackgroundTabShapes() const override; bool EverHasVisibleBackgroundTabShapes() const override;
diff --git a/chrome/browser/ui/views/tabs/tab_controller.h b/chrome/browser/ui/views/tabs/tab_controller.h index 8fbea38..f67d4d76 100644 --- a/chrome/browser/ui/views/tabs/tab_controller.h +++ b/chrome/browser/ui/views/tabs/tab_controller.h
@@ -191,6 +191,12 @@ virtual void SetVisualDataForGroup(TabGroupId group, TabGroupVisualData visual_data) = 0; + virtual void CloseAllTabsInGroup(TabGroupId group) = 0; + + virtual void UngroupAllTabsInGroup(TabGroupId group) = 0; + + virtual void AddNewTabInGroup(TabGroupId group) = 0; + protected: virtual ~TabController() {} };
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc index abfdb084d..c57e29f5 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -18,20 +18,33 @@ #include "chrome/browser/ui/tabs/tab_group_visual_data.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" +#include "chrome/browser/ui/views/hover_button.h" +#include "chrome/browser/ui/views/hover_button_controller.h" #include "chrome/browser/ui/views/tabs/color_picker_view.h" #include "chrome/browser/ui/views/tabs/tab_controller.h" #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" +#include "chrome/grit/generated_resources.h" #include "third_party/skia/include/core/SkColor.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/geometry/insets.h" #include "ui/views/controls/button/button.h" +#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/label.h" +#include "ui/views/controls/separator.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/layout/flex_layout.h" #include "ui/views/layout/layout_types.h" #include "ui/views/view_class_properties.h" namespace { +constexpr int TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP = 13; +constexpr int TAB_GROUP_HEADER_CXMENU_UNGROUP = 14; +constexpr int TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP = 15; + +constexpr gfx::Insets kDefaultBorderInsets = gfx::Insets(12); + // Returns our hard-coded set of colors. const std::vector<std::pair<SkColor, base::string16>>& GetColorPickerList() { static const base::NoDestructor< @@ -47,10 +60,31 @@ return *list; } +std::unique_ptr<views::LabelButton> CreateMenuItem( + int button_id, + const base::string16& name, + views::ButtonListener* listener) { + auto button = std::make_unique<views::LabelButton>( + listener, name, views::style::CONTEXT_BUTTON); + button->SetID(button_id); + button->SetButtonController(std::make_unique<HoverButtonController>( + button.get(), listener, + std::make_unique<views::Button::DefaultButtonControllerDelegate>( + button.get()))); + + // Items within a menu should not show focus rings. + button->SetInstallFocusRingOnFocus(false); + button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); + + button->SetBorder(views::CreateEmptyBorder(kDefaultBorderInsets)); + button->SetInkDropMode(views::InkDropHostView::InkDropMode::ON); + button->set_ink_drop_base_color(HoverButton::GetInkDropColor(button.get())); + return button; +} } // namespace // static -views::Widget* TabGroupEditorBubbleView::Show(views::View* anchor_view, +views::Widget* TabGroupEditorBubbleView::Show(TabGroupHeader* anchor_view, TabController* tab_controller, TabGroupId group) { views::Widget* const widget = BubbleDialogDelegateView::CreateBubble( @@ -80,20 +114,45 @@ } TabGroupEditorBubbleView::TabGroupEditorBubbleView( - views::View* anchor_view, + TabGroupHeader* anchor_view, TabController* tab_controller, TabGroupId group) : tab_controller_(tab_controller), group_(group), - title_field_controller_(this) { + title_field_controller_(this), + menu_button_listener_(tab_controller, anchor_view, group) { SetAnchorView(anchor_view); + // Title insets assume there is content (and thus have no bottom padding). Use + // dialog insets to get the bottom margin back. + set_title_margins( + ChromeLayoutProvider::Get()->GetInsetsMetric(views::INSETS_DIALOG)); + set_margins(gfx::Insets()); + const auto* layout_provider = ChromeLayoutProvider::Get(); const TabGroupVisualData* current_data = tab_controller_->GetVisualDataForGroup(group_); + // Layout vertically with margin collapsing. This allows us to use spacer + // views with |DISTANCE_UNRELATED_CONTROL_VERTICAL| margins without worrying + // about the default |DISTANCE_RELATED_CONTROL_VERTICAL| spacing. + auto container_layout = std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical, gfx::Insets(), + layout_provider->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_VERTICAL), + true /* collapse_margins_spacing */); + container_layout->set_cross_axis_alignment( + views::BoxLayout::CrossAxisAlignment::kStretch); + + views::View* group_modifier_container = + AddChildView(std::make_unique<views::View>()); + group_modifier_container->SetBorder( + views::CreateEmptyBorder(kDefaultBorderInsets)); + group_modifier_container->SetLayoutManager(std::move(container_layout)); + // Add the text field for editing the title. - title_field_ = AddChildView(std::make_unique<views::Textfield>()); + title_field_ = group_modifier_container->AddChildView( + std::make_unique<views::Textfield>()); title_field_->SetDefaultWidthInChars(15); title_field_->SetText(current_data->title()); title_field_->SetAccessibleName(base::ASCIIToUTF16("Group title")); @@ -106,21 +165,36 @@ views::DISTANCE_UNRELATED_CONTROL_VERTICAL), 0)); - color_selector_ = AddChildView(std::make_unique<ColorPickerView>( - GetColorPickerList(), base::Bind(&TabGroupEditorBubbleView::UpdateGroup, - base::Unretained(this)))); + color_selector_ = + group_modifier_container->AddChildView(std::make_unique<ColorPickerView>( + GetColorPickerList(), + base::Bind(&TabGroupEditorBubbleView::UpdateGroup, + base::Unretained(this)))); - // Layout vertically with margin collapsing. This allows us to use spacer - // views with |DISTANCE_UNRELATED_CONTROL_VERTICAL| margins without worrying - // about the default |DISTANCE_RELATED_CONTROL_VERTICAL| spacing. - auto layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, gfx::Insets(), - layout_provider->GetDistanceMetric( - views::DISTANCE_RELATED_CONTROL_VERTICAL), - true /* collapse_margins_spacing */); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kStretch); - SetLayoutManager(std::move(layout)); + AddChildView(std::make_unique<views::Separator>()); + + std::unique_ptr<views::LabelButton> new_tab_menu_item = CreateMenuItem( + TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP), + &menu_button_listener_); + AddChildView(std::move(new_tab_menu_item)); + + std::unique_ptr<views::LabelButton> ungroup_menu_item = CreateMenuItem( + TAB_GROUP_HEADER_CXMENU_UNGROUP, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP), + &menu_button_listener_); + AddChildView(std::move(ungroup_menu_item)); + + std::unique_ptr<views::LabelButton> close_menu_item = CreateMenuItem( + TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP, + l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP), + &menu_button_listener_); + AddChildView(std::move(close_menu_item)); + + views::FlexLayout* layout_manager_ = + SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout_manager_->SetOrientation(views::LayoutOrientation::kVertical) + .SetIgnoreDefaultMainAxisMargins(true); } TabGroupEditorBubbleView::~TabGroupEditorBubbleView() = default; @@ -142,3 +216,38 @@ DCHECK_EQ(sender, parent_->title_field_); parent_->UpdateGroup(); } + +TabGroupEditorBubbleView::ButtonListener::ButtonListener( + TabController* tab_controller, + TabGroupHeader* anchor_view, + TabGroupId group) + : tab_controller_(tab_controller), + anchor_view_(anchor_view), + group_(group) {} + +void TabGroupEditorBubbleView::ButtonListener::ButtonPressed( + views::Button* sender, + const ui::Event& event) { + switch (sender->GetID()) { + case TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP: + tab_controller_->AddNewTabInGroup(group_); + + break; + case TAB_GROUP_HEADER_CXMENU_UNGROUP: + anchor_view_->RemoveObserverFromWidget(sender->GetWidget()); + tab_controller_->UngroupAllTabsInGroup(group_); + break; + case TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP: + tab_controller_->CloseAllTabsInGroup(group_); + break; + default: + NOTREACHED(); + } + + // In the case of closing the tabs in a group or ungrouping the tabs, the + // widget should be closed because it is no longer applicable. In the case of + // opening a new tab in the group, the widget is closed to allow users to + // continue their work in their newly created tab. + sender->GetWidget()->CloseWithReason( + views::Widget::ClosedReason::kUnspecified); +}
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h index 442149b1c..2522d88 100644 --- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h +++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h
@@ -7,7 +7,9 @@ #include "base/strings/string16.h" #include "chrome/browser/ui/tabs/tab_group_id.h" +#include "chrome/browser/ui/views/tabs/tab_group_header.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/controls/button/button.h" #include "ui/views/controls/textfield/textfield.h" #include "ui/views/controls/textfield/textfield_controller.h" @@ -27,7 +29,7 @@ public: // Shows the editor for |group|. Returns an *unowned* pointer to the // bubble's widget. - static views::Widget* Show(views::View* anchor_view, + static views::Widget* Show(TabGroupHeader* anchor_view, TabController* tab_controller, TabGroupId group); @@ -38,7 +40,7 @@ int GetDialogButtons() const override; private: - TabGroupEditorBubbleView(views::View* anchor_view, + TabGroupEditorBubbleView(TabGroupHeader* anchor_view, TabController* tab_controller, TabGroupId group); ~TabGroupEditorBubbleView() override; @@ -63,6 +65,24 @@ }; TitleFieldController title_field_controller_; + + class ButtonListener : public views::ButtonListener { + public: + explicit ButtonListener(TabController* tab_controller, + TabGroupHeader* anchor_view, + TabGroupId group); + + // views::ButtonListener: + void ButtonPressed(views::Button* sender, const ui::Event& event) override; + + private: + TabController* const tab_controller_; + TabGroupHeader* anchor_view_; + const TabGroupId group_; + }; + + ButtonListener menu_button_listener_; + views::Textfield* title_field_; ColorPickerView* color_selector_;
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.cc b/chrome/browser/ui/views/tabs/tab_group_header.cc index 03d459d4..5d8b386 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.cc +++ b/chrome/browser/ui/views/tabs/tab_group_header.cc
@@ -116,6 +116,10 @@ title_chip_->GetPreferredSize()))); } +void TabGroupHeader::RemoveObserverFromWidget(views::Widget* widget) { + widget->RemoveObserver(&editor_bubble_tracker_); +} + void TabGroupHeader::EditorBubbleTracker::Opened(views::Widget* bubble_widget) { DCHECK(bubble_widget); DCHECK(!is_open_);
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.h b/chrome/browser/ui/views/tabs/tab_group_header.h index 3fc99a79..57e3c41 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.h +++ b/chrome/browser/ui/views/tabs/tab_group_header.h
@@ -34,6 +34,9 @@ // Updates our visual state according to the TabGroupVisualData for our group. void VisualsChanged(); + // Removes {editor_bubble_tracker_} from observing the widget. + void RemoveObserverFromWidget(views::Widget* widget); + private: // Calculate the width for this View. int CalculateWidth() const;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index db98ca4..32cd380 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -1827,6 +1827,23 @@ controller_->SetVisualDataForGroup(group, visual_data); } +void TabStrip::CloseAllTabsInGroup(TabGroupId group) { + UpdateHoverCard(nullptr); + + std::vector<int> tabs = controller_->ListTabsInGroup(group); + for (int i = tabs.size() - 1; i >= 0; i--) { + controller_->CloseTab(tabs[i], CLOSE_TAB_FROM_MOUSE); + } +} + +void TabStrip::UngroupAllTabsInGroup(TabGroupId group) { + UpdateHoverCard(nullptr); + controller_->UngroupAllTabsInGroup(group); +} + +void TabStrip::AddNewTabInGroup(TabGroupId group) { + controller_->AddNewTabInGroup(group); +} /////////////////////////////////////////////////////////////////////////////// // TabStrip, views::AccessiblePaneView overrides:
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h index 882bbe03..fbdf80b 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.h +++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -294,6 +294,9 @@ TabGroupId group) const override; void SetVisualDataForGroup(TabGroupId group, TabGroupVisualData visual_data) override; + void CloseAllTabsInGroup(TabGroupId group) override; + void UngroupAllTabsInGroup(TabGroupId group) override; + void AddNewTabInGroup(TabGroupId group) override; // MouseWatcherListener: void MouseMovedOutOfHost() override;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h index 81e8dc9..c9fac37f 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -78,6 +78,12 @@ // Closes the tab at the specified index in the model. virtual void CloseTab(int index, CloseTabSource source) = 0; + // Ungroups the tabs at the specified index in the model. + virtual void UngroupAllTabsInGroup(TabGroupId group) = 0; + + // Adds a new tab to end of the tab group. + virtual void AddNewTabInGroup(TabGroupId group) = 0; + // Moves the tab at |start_index| so that it is now at |final_index|, sliding // any tabs in between left or right as appropriate. virtual void MoveTab(int start_index, int final_index) = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc index eb82192..ae214d0 100644 --- a/chrome/browser/ui/views/tabs/tab_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -127,6 +127,12 @@ void SetVisualDataForGroup(TabGroupId group, TabGroupVisualData visual_data) override {} + void CloseAllTabsInGroup(TabGroupId group) override {} + + void UngroupAllTabsInGroup(TabGroupId group) override {} + + void AddNewTabInGroup(TabGroupId group) override {} + void SetTabColors(SkColor bg_color_active, SkColor fg_color_active, SkColor bg_color_inactive,
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 ce27b780..ea89ae0 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -716,8 +716,6 @@ AddRawCallback("showAddUser", &GaiaScreenHandler::HandleShowAddUser); AddCallback("getIsSamlUserPasswordless", &GaiaScreenHandler::HandleGetIsSamlUserPasswordless); - AddCallback("updateOobeDialogSize", - &GaiaScreenHandler::HandleUpdateOobeDialogSize); AddCallback("hideOobeDialog", &GaiaScreenHandler::HandleHideOobeDialog); AddCallback("updateSigninUIState", &GaiaScreenHandler::HandleUpdateSigninUIState); @@ -1004,11 +1002,6 @@ } } -void GaiaScreenHandler::HandleUpdateOobeDialogSize(int width, int height) { - if (LoginDisplayHost::default_host()) - LoginDisplayHost::default_host()->UpdateOobeDialogSize(width, height); -} - void GaiaScreenHandler::HandleHideOobeDialog() { if (LoginDisplayHost::default_host()) LoginDisplayHost::default_host()->HideOobeDialog();
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h index f8032841..a1e7df1 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -224,7 +224,6 @@ void HandleIdentifierEntered(const std::string& account_identifier); void HandleAuthExtensionLoaded(); - void HandleUpdateOobeDialogSize(int width, int height); void HandleHideOobeDialog(); void HandleShowAddUser(const base::ListValue* args); void HandleGetIsSamlUserPasswordless(const std::string& callback_id,
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl index 69e57cb4..94d99b68 100644 --- a/chrome/common/extensions/api/autotest_private.idl +++ b/chrome/common/extensions/api/autotest_private.idl
@@ -314,6 +314,39 @@ boolean hasNotification; }; + // A mapping of ash::AppType. + enum AppWindowType { + Browser, + ChromeApp, + ArcApp, + CrostiniApp, + SystemApp, + ExtensionApp + }; + + dictionary AppWindowInfo { + long id; + DOMString name; + AppWindowType windowType; + WindowStateType stateType; + Bounds bounds_in_root; + Bounds target_bounds; + DOMString displayId; + + DOMString title; + boolean isAnimating; + boolean isVisible; + boolean targetVisibility; + boolean canFocus; + + // WM Releated stats + boolean isActive; + boolean hasFocus; + boolean onActiveDesk; + boolean hasCapture; + DOMString? arcPackageName; + }; + callback GetShelfItemsCallback = void (ShelfItem[] items); callback GetShelfAutoHideBehaviorCallback = void (DOMString behavior); @@ -326,6 +359,8 @@ callback DOMStringCallback = void (DOMString data); + callback GetAppWindowListCallback = void (AppWindowInfo[] window_list); + interface Functions { // Must be called to allow autotestPrivateAPI events to be fired. static void initializeEvents(); @@ -606,22 +641,25 @@ // Send WM event to change the ARC app window's window state. // |packageName|: the package name of the ARC app window. - // |eventType|: WM event type to send to the ARC app window. + // |change|: WM event type to send to the ARC app window. // |callback|: called when the window state is changed. - static void setArcAppWindowState(DOMString packageName, - WindowStateChangeDict change, - WindowStateCallback callback); + [deprecated="Use setAppWindowState"] static void setArcAppWindowState( + DOMString packageName, + WindowStateChangeDict change, + WindowStateCallback callback); // Get ARC app window's window state. // |packageName|: the package name of the ARC app window. // |callback| is invoked with the window state. - static void getArcAppWindowState(DOMString packageName, WindowStateCallback callback); + static void getArcAppWindowState(DOMString packageName, + WindowStateCallback callback); // Get various information on an ARC window. // |packageName|: the package name of the ARC app window. // |callback|: called when the operation has completed. - static void getArcAppWindowInfo(DOMString packageName, - GetArcAppWindowInfoCallback callback); + [deprecated="Use getAppWindowList"] static void getArcAppWindowInfo( + DOMString packageName, + GetArcAppWindowInfoCallback callback); // Start ARC performance tracing for the active ARC app window. // |callback|: Called when the operation has completed. @@ -640,6 +678,7 @@ // |callback|: called when the operation has completed. static void setArcAppWindowFocus(DOMString packageName, VoidCallback callback); + // Invokes the callback when the display rotation animation is finished, or // invokes it immediately if it is not animating. The callback argument // is true if the display's rotation is same as |rotation|, or false otherwise. @@ -649,6 +688,24 @@ static void waitForDisplayRotation(DOMString displayId, RotationType rotation, WaitForDisplayRotationCallback callback); + + // Get information on nall application windows. Callback will be called + // with the list of |AppWindowInfo| dictionary. + // |callback|: called with window list. + static void getAppWindowList(GetAppWindowListCallback callback); + + // Send WM event to change the app window's window state. + // |id|: the id of the window + // |change|: WM event type to send to the app window. + // |callback|: called when the window state is changed. + static void setAppWindowState(long id, + WindowStateChangeDict change, + WindowStateCallback callback); + + // Closes an app window given by "id". + // |id|: the id of the window + // |callback|: called when the window state is requested to close. + static void closeAppWindow(long id, VoidCallback callback); }; interface Events {
diff --git a/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc b/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc index 5e3c28cd..d6f3f1c 100644 --- a/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc +++ b/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc
@@ -5,6 +5,7 @@ #include "chrome/renderer/supervised_user/supervised_user_error_page_controller.h" #include "base/bind.h" +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "chrome/renderer/supervised_user/supervised_user_error_page_controller_delegate.h" #include "content/public/renderer/render_frame.h" @@ -69,7 +70,9 @@ void SupervisedUserErrorPageController::RequestPermissionCallback( bool success) { std::string result = success ? "true" : "false"; - std::string js = "setRequestStatus(" + result + ");"; + std::string in_main_frame = render_frame_->IsMainFrame() ? "true" : "false"; + std::string js = base::StringPrintf("setRequestStatus(%s, %s)", + result.c_str(), in_main_frame.c_str()); render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(js)); }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java index 7a6d2e72..9ad177d 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
@@ -33,6 +33,7 @@ import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.DeferredStartupHandler; +import org.chromium.chrome.browser.appmenu.AppMenuCoordinator; import org.chromium.chrome.browser.appmenu.AppMenuTestSupport; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.infobar.InfoBar; @@ -164,7 +165,14 @@ /** Retrieves the application Menu */ public Menu getMenu() throws ExecutionException { return TestThreadUtils.runOnUiThreadBlocking( - () -> AppMenuTestSupport.getMenu(getActivity())); + () -> AppMenuTestSupport.getMenu(getAppMenuCoordinator())); + } + + /** + * @return The {@link AppMenuCoordinator} for the activity. + */ + public AppMenuCoordinator getAppMenuCoordinator() { + return getActivity().getRootUiCoordinatorForTesting().getAppMenuCoordinatorForTesting(); } /** @@ -183,7 +191,7 @@ /** * Waits for the activity to fully finish its native initialization. - * @param The {@link ChromeActivity} to wait for. + * @param activity The {@link ChromeActivity} to wait for. */ public static void waitForActivityNativeInitializationComplete(ChromeActivity activity) { CriteriaHelper.pollUiThread(()
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/ChromeMenu.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/ChromeMenu.java index ed1fedb..178c6463 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/ChromeMenu.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/ChromeMenu.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.test.pagecontroller.controllers.ntp; import org.chromium.chrome.R; +import org.chromium.chrome.browser.appmenu.AppMenuTestSupport; import org.chromium.chrome.test.pagecontroller.controllers.PageController; import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator; import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators; @@ -14,7 +15,7 @@ */ public class ChromeMenu extends PageController { private static final IUi2Locator LOCATOR_CHROME_MENU_BOX = - Ui2Locators.withAnyResEntry(R.id.app_menu_list); + Ui2Locators.withAnyResEntry(AppMenuTestSupport.getAppMenuLayoutListViewId()); private static final IUi2Locator LOCATOR_CHROME_MENU = Ui2Locators.withPath( LOCATOR_CHROME_MENU_BOX, Ui2Locators.withAnyResEntry(R.id.button_five));
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc index 8793bc1e..dfec8850 100644 --- a/chrome/test/base/in_process_browser_test.cc +++ b/chrome/test/base/in_process_browser_test.cc
@@ -126,7 +126,8 @@ std::unique_ptr<chromeos::device_sync::DeviceSyncBase> BuildInstance( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector, const chromeos::device_sync::GcmDeviceInfoProvider* gcm_device_info_provider, chromeos::device_sync::ClientAppMetadataProvider*
diff --git a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1 index 6169b19..5f9886b 100644 --- a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1 +++ b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1
@@ -1 +1 @@ -be5439aff226479418677e2cc1edc8a0eac74c63 \ No newline at end of file +06404a681d645a5f80975f4cf924e1de1408cc84 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1 index 7a4563f6..8e368c0 100644 --- a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1 +++ b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeDisabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1
@@ -1 +1 @@ -ff5e02c214b7e0e5b52eb13149963c789c15f98b \ No newline at end of file +71c85c6b88cf17ecae1c1511eec320ecb5162a97 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1 index 58836e3..8fdc485 100644 --- a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1 +++ b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_bottom.Nexus_5-19.png.sha1
@@ -1 +1 @@ -9d5d43b9a4d0091246a502881f71f4abfb53fe87 \ No newline at end of file +596f07620fc8ca654d226118bab7aefb0e98d568 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1 index 71c1a37d..79b216acd 100644 --- a/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1 +++ b/chrome/test/data/android/render_tests/ExploreSitesPageTest.NightModeEnabled-initial_layout_dense_title_right.Nexus_5-19.png.sha1
@@ -1 +1 @@ -e9a2866c3bf9fc47506ce219a9073d5bfcf3da56 \ No newline at end of file +8cfed527d78c2da92005be6e57caf8214da78e55 \ No newline at end of file
diff --git a/chrome/test/data/arc_default_apps/test_app2.json b/chrome/test/data/arc_default_apps/test_app2.json new file mode 100644 index 0000000..8fe777d --- /dev/null +++ b/chrome/test/data/arc_default_apps/test_app2.json
@@ -0,0 +1,7 @@ +{ + "name": "TestApp2", + "package_name": "test.app2", + "activity": "test.app2.activity", + "system": true, + "app_path": "test_app2" +}
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js index 87fb194..bfef5e3 100644 --- a/chrome/test/data/extensions/api_test/autotest_private/test.js +++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -497,7 +497,43 @@ chrome.autotestPrivate.arcAppTracingStart(chrome.test.callbackFail( 'Failed to start custom tracing.')); }, + // This test verifies that test can get the window list and set + // window state. + function getWindowInfoAndSetState() { + chrome.autotestPrivate.getAppWindowList(function(list) { + var found = false; + for (i = 0; i < list.length; i++) { + var window = list[i]; + if (window.name != 'BrowserFrame') { + continue; + } + found = true; + // Sanity check + chrome.test.assertEq('BrowserFrame', window.name); + chrome.test.assertTrue(window.title.includes('New Tab') > 0); + chrome.test.assertEq('Browser', window.windowType); + chrome.test.assertTrue(window.isVisible); + chrome.test.assertTrue(window.targetVisibility); + chrome.test.assertFalse(window.isAnimating); + chrome.test.assertTrue(window.canFocus); + chrome.test.assertTrue(window.hasFocus); + chrome.test.assertTrue(window.isActive); + chrome.test.assertFalse(window.hasCapture); + var change = new Object(); + change.eventType = 'WMEventMaximize'; + chrome.autotestPrivate.setAppWindowState( + window.id, + change, + function(state) { + chrome.test.assertEq(state, 'Maximized'); + chrome.test.assertNoLastError(); + chrome.test.succeed(); + }); + } + chrome.test.assertTrue(found); + }); + }, // KEEP |lockScreen()| TESTS AT THE BOTTOM OF THE defaultTests AS IT WILL // CHANGE THE SESSION STATE TO LOCKED STATE. function lockScreen() { @@ -510,12 +546,12 @@ var arcEnabledTests = [ // This test verifies that getArcState returns provisioned True in case ARC // provisioning is done. - function arcProvisioned() {chrome.autotestPrivate.getArcState( - function(state) { - chrome.test.assertTrue(state.provisioned); - chrome.test.assertNoLastError(); - chrome.test.succeed(); - }); + function arcProvisioned() { + chrome.autotestPrivate.getArcState(function(state) { + chrome.test.assertTrue(state.provisioned); + chrome.test.assertNoLastError(); + chrome.test.succeed(); + }); }, // This test verifies that ARC Terms of Service are not needed in case ARC is // provisioned and Terms of Service are accepted.
diff --git a/chrome/test/data/webui/settings/site_details_tests.js b/chrome/test/data/webui/settings/site_details_tests.js index 8e3354702..ada3304 100644 --- a/chrome/test/data/webui/settings/site_details_tests.js +++ b/chrome/test/data/webui/settings/site_details_tests.js
@@ -136,7 +136,6 @@ settings.ContentSettingsTypes.PROTECTED_CONTENT); } const experimentalSiteDetailsContentSettingsTypes = [ - settings.ContentSettingsTypes.SERIAL_PORTS, settings.ContentSettingsTypes.BLUETOOTH_SCANNING, ];
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 1dd3a2e..20f33b0 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -12586.0.0 \ No newline at end of file +12602.0.0 \ No newline at end of file
diff --git a/chromeos/audio/DEPS b/chromeos/audio/DEPS index 65d34ae..2a204a8 100644 --- a/chromeos/audio/DEPS +++ b/chromeos/audio/DEPS
@@ -6,6 +6,7 @@ "+chromeos/dbus", "+components/prefs", "+media", + "+mojo/public/cpp/bindings", "+testing", "+services/media_session/public", "+services/service_manager/public",
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc index 2c10329..583dbcd 100644 --- a/chromeos/audio/cras_audio_handler.cc +++ b/chromeos/audio/cras_audio_handler.cc
@@ -22,6 +22,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "chromeos/audio/audio_device.h" #include "chromeos/audio/audio_devices_pref_handler_stub.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_controller.mojom.h" #include "services/service_manager/public/cpp/connector.h" @@ -1186,10 +1187,10 @@ LOG(ERROR) << "Failed to get connector"; return; } - media_session::mojom::MediaControllerManagerPtr controller_manager_ptr; - connector_->BindInterface(media_session::mojom::kServiceName, - mojo::MakeRequest(&controller_manager_ptr)); - controller_manager_ptr->SuspendAllSessions(); + mojo::Remote<media_session::mojom::MediaControllerManager> controller_manager; + connector_->Connect(media_session::mojom::kServiceName, + controller_manager.BindNewPipeAndPassReceiver()); + controller_manager->SuspendAllSessions(); } void CrasAudioHandler::HandleNonHotplugNodesChange(
diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc index 29cec43e..6c435605 100644 --- a/chromeos/audio/cras_audio_handler_unittest.cc +++ b/chromeos/audio/cras_audio_handler_unittest.cc
@@ -23,6 +23,8 @@ #include "chromeos/dbus/audio/audio_node.h" #include "chromeos/dbus/audio/fake_cras_audio_client.h" #include "media/base/video_facing.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_controller.mojom-test-utils.h" #include "services/service_manager/public/cpp/binder_registry.h" @@ -43,7 +45,7 @@ service_manager::mojom::ServiceRequest request) : binding_(this, std::move(request)) { binder_registry_.AddInterface(base::BindRepeating( - &FakeMediaSessionService::BindMediaControllerManagerRequest, + &FakeMediaSessionService::BindMediaControllerManagerReceiver, base::Unretained(this))); } @@ -63,14 +65,15 @@ return nullptr; } - void BindMediaControllerManagerRequest( - media_session::mojom::MediaControllerManagerRequest request) { - bindings_.AddBinding(this, std::move(request)); + void BindMediaControllerManagerReceiver( + mojo::PendingReceiver<media_session::mojom::MediaControllerManager> + receiver) { + receivers_.Add(this, std::move(receiver)); } service_manager::ServiceBinding binding_; service_manager::BinderRegistry binder_registry_; - mojo::BindingSet<media_session::mojom::MediaControllerManager> bindings_; + mojo::ReceiverSet<media_session::mojom::MediaControllerManager> receivers_; DISALLOW_COPY_AND_ASSIGN(FakeMediaSessionService); };
diff --git a/chromeos/services/device_sync/BUILD.gn b/chromeos/services/device_sync/BUILD.gn index ce3d03a..87620b14 100644 --- a/chromeos/services/device_sync/BUILD.gn +++ b/chromeos/services/device_sync/BUILD.gn
@@ -106,6 +106,8 @@ "device_sync_base.h", "device_sync_impl.cc", "device_sync_impl.h", + "device_sync_service.cc", + "device_sync_service.h", "device_sync_type_converters.cc", "device_sync_type_converters.h", "network_request_error.cc", @@ -150,8 +152,8 @@ "//chromeos/services/device_sync/public/cpp", "//chromeos/services/device_sync/public/mojom", "//components/gcm_driver", - "//components/prefs", "//net", + "//services/preferences/public/cpp", ] visibility = [
diff --git a/chromeos/services/device_sync/DEPS b/chromeos/services/device_sync/DEPS index 7ab5e9d..f8cf07c4 100644 --- a/chromeos/services/device_sync/DEPS +++ b/chromeos/services/device_sync/DEPS
@@ -8,5 +8,6 @@ "+mojo/public/cpp", "+services/network/public", "+services/network/test", + "+services/preferences/public", "+components/cryptauth" ]
diff --git a/chromeos/services/device_sync/device_sync_base.cc b/chromeos/services/device_sync/device_sync_base.cc index 36c98f51..b64bd114 100644 --- a/chromeos/services/device_sync/device_sync_base.cc +++ b/chromeos/services/device_sync/device_sync_base.cc
@@ -2,12 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/device_sync/device_sync_base.h" - #include <utility> #include "base/bind.h" #include "base/callback.h" +#include "chromeos/services/device_sync/device_sync_base.h" namespace chromeos {
diff --git a/chromeos/services/device_sync/device_sync_base.h b/chromeos/services/device_sync/device_sync_base.h index 5d414bb..eae48ee 100644 --- a/chromeos/services/device_sync/device_sync_base.h +++ b/chromeos/services/device_sync/device_sync_base.h
@@ -21,9 +21,6 @@ public: ~DeviceSyncBase() override; - // Informs the implementation that accounts and preferences are ready to use. - virtual void OnProfileInitialized() {} - // mojom::DeviceSync: void AddObserver(mojom::DeviceSyncObserverPtr observer, AddObserverCallback callback) override;
diff --git a/chromeos/services/device_sync/device_sync_impl.cc b/chromeos/services/device_sync/device_sync_impl.cc index 12f4daf..83c356264 100644 --- a/chromeos/services/device_sync/device_sync_impl.cc +++ b/chromeos/services/device_sync/device_sync_impl.cc
@@ -11,7 +11,7 @@ #include "base/no_destructor.h" #include "base/optional.h" #include "base/time/default_clock.h" -#include "base/unguessable_token.h" +#include "base/token.h" #include "chromeos/components/multidevice/logging/logging.h" #include "chromeos/components/multidevice/secure_message_delegate_impl.h" #include "chromeos/constants/chromeos_features.h" @@ -41,6 +41,19 @@ namespace { +void RegisterDeviceSyncPrefs(PrefRegistrySimple* registry) { + CryptAuthGCMManager::RegisterPrefs(registry); + CryptAuthDeviceManager::RegisterPrefs(registry); + if (base::FeatureList::IsEnabled( + chromeos::features::kCryptAuthV2Enrollment)) { + CryptAuthV2EnrollmentManagerImpl::RegisterPrefs(registry); + CryptAuthKeyRegistryImpl::RegisterPrefs(registry); + CryptAuthSchedulerImpl::RegisterPrefs(registry); + } else { + CryptAuthEnrollmentManagerImpl::RegisterPrefs(registry); + } +} + constexpr base::TimeDelta kSetFeatureEnabledTimeout = base::TimeDelta::FromSeconds(5); @@ -207,15 +220,32 @@ std::unique_ptr<DeviceSyncBase> DeviceSyncImpl::Factory::BuildInstance( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector, const GcmDeviceInfoProvider* gcm_device_info_provider, ClientAppMetadataProvider* client_app_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, std::unique_ptr<base::OneShotTimer> timer) { return base::WrapUnique(new DeviceSyncImpl( - identity_manager, gcm_driver, profile_prefs, gcm_device_info_provider, - client_app_metadata_provider, std::move(url_loader_factory), - base::DefaultClock::GetInstance(), std::move(timer))); + identity_manager, gcm_driver, std::move(pref_store_connector), + gcm_device_info_provider, client_app_metadata_provider, + std::move(url_loader_factory), base::DefaultClock::GetInstance(), + std::make_unique<PrefConnectionDelegate>(), std::move(timer))); +} + +DeviceSyncImpl::PrefConnectionDelegate::~PrefConnectionDelegate() = default; + +scoped_refptr<PrefRegistrySimple> +DeviceSyncImpl::PrefConnectionDelegate::CreatePrefRegistry() { + return base::MakeRefCounted<PrefRegistrySimple>(); +} + +void DeviceSyncImpl::PrefConnectionDelegate::ConnectToPrefService( + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector, + scoped_refptr<PrefRegistrySimple> pref_registry, + prefs::ConnectCallback callback) { + prefs::ConnectToPrefService(std::move(pref_store_connector), + std::move(pref_registry), + base::Token::CreateRandom(), std::move(callback)); } DeviceSyncImpl::PendingSetSoftwareFeatureRequest:: @@ -269,42 +299,29 @@ std::move(callback_).Run(result); } -// static -void DeviceSyncImpl::RegisterProfilePrefs(PrefRegistrySimple* registry) { - CryptAuthGCMManager::RegisterPrefs(registry); - CryptAuthDeviceManager::RegisterPrefs(registry); - if (base::FeatureList::IsEnabled( - chromeos::features::kCryptAuthV2Enrollment)) { - CryptAuthV2EnrollmentManagerImpl::RegisterPrefs(registry); - CryptAuthKeyRegistryImpl::RegisterPrefs(registry); - CryptAuthSchedulerImpl::RegisterPrefs(registry); - } else { - CryptAuthEnrollmentManagerImpl::RegisterPrefs(registry); - } -} - DeviceSyncImpl::DeviceSyncImpl( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector, const GcmDeviceInfoProvider* gcm_device_info_provider, ClientAppMetadataProvider* client_app_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, base::Clock* clock, + std::unique_ptr<PrefConnectionDelegate> pref_connection_delegate, std::unique_ptr<base::OneShotTimer> timer) : DeviceSyncBase(), identity_manager_(identity_manager), gcm_driver_(gcm_driver), - profile_prefs_(profile_prefs), + pref_store_connector_(std::move(pref_store_connector)), gcm_device_info_provider_(gcm_device_info_provider), client_app_metadata_provider_(client_app_metadata_provider), url_loader_factory_(std::move(url_loader_factory)), clock_(clock), + pref_connection_delegate_(std::move(pref_connection_delegate)), set_software_feature_timer_(std::move(timer)), - status_(Status::WAITING_FOR_PROFILE_INIT) { - DCHECK(profile_prefs_); + status_(Status::FETCHING_ACCOUNT_INFO) { PA_LOG(VERBOSE) << "DeviceSyncImpl: Initializing."; - // Initialization will complete when the profile is fully loaded. + ProcessPrimaryAccountInfo(identity_manager_->GetPrimaryAccountInfo()); } DeviceSyncImpl::~DeviceSyncImpl() { @@ -534,11 +551,6 @@ } } -void DeviceSyncImpl::OnProfileInitialized() { - PA_LOG(VERBOSE) << "DeviceSyncImpl: OnProfileInitialized"; - ProcessPrimaryAccountInfo(identity_manager_->GetPrimaryAccountInfo()); -} - void DeviceSyncImpl::Shutdown() { software_feature_manager_.reset(); remote_device_provider_.reset(); @@ -548,10 +560,10 @@ cryptauth_key_registry_.reset(); cryptauth_client_factory_.reset(); cryptauth_gcm_manager_.reset(); + pref_connection_delegate_.reset(); identity_manager_ = nullptr; gcm_driver_ = nullptr; - profile_prefs_ = nullptr; gcm_device_info_provider_ = nullptr; client_app_metadata_provider_ = nullptr; url_loader_factory_ = nullptr; @@ -570,12 +582,31 @@ } primary_account_info_ = primary_account_info; + ConnectToPrefStore(); +} - DCHECK(status_ == Status::WAITING_FOR_PROFILE_INIT); +void DeviceSyncImpl::ConnectToPrefStore() { + DCHECK(status_ == Status::FETCHING_ACCOUNT_INFO); + status_ = Status::CONNECTING_TO_USER_PREFS; + + auto pref_registry = pref_connection_delegate_->CreatePrefRegistry(); + RegisterDeviceSyncPrefs(pref_registry.get()); + + PA_LOG(VERBOSE) << "DeviceSyncImpl: Connecting to pref service."; + pref_connection_delegate_->ConnectToPrefService( + std::move(pref_store_connector_), std::move(pref_registry), + base::Bind(&DeviceSyncImpl::OnConnectedToPrefService, + weak_ptr_factory_.GetWeakPtr())); +} + +void DeviceSyncImpl::OnConnectedToPrefService( + std::unique_ptr<PrefService> pref_service) { + DCHECK(status_ == Status::CONNECTING_TO_USER_PREFS); status_ = Status::WAITING_FOR_ENROLLMENT; - PA_LOG(VERBOSE) << "DeviceSyncImpl: Profile initialized; initializing " + PA_LOG(VERBOSE) << "DeviceSyncImpl: Connected to pref service; initializing " << "CryptAuth managers."; + pref_service_ = std::move(pref_service); InitializeCryptAuthManagementObjects(); // If enrollment has not yet completed successfully, initialization cannot @@ -595,7 +626,7 @@ // Initialize |cryptauth_gcm_manager_| and have it start listening for GCM // tickles. cryptauth_gcm_manager_ = CryptAuthGCMManagerImpl::Factory::NewInstance( - gcm_driver_, profile_prefs_); + gcm_driver_, pref_service_.get()); cryptauth_gcm_manager_->StartListening(); cryptauth_client_factory_ = std::make_unique<CryptAuthClientFactoryImpl>( @@ -606,23 +637,25 @@ // called yet since the device has not completed enrollment. cryptauth_device_manager_ = CryptAuthDeviceManagerImpl::Factory::NewInstance( clock_, cryptauth_client_factory_.get(), cryptauth_gcm_manager_.get(), - profile_prefs_); + pref_service_.get()); // Initialize |cryptauth_enrollment_manager_| and start observing, then call // Start() immediately to schedule enrollment. if (base::FeatureList::IsEnabled( chromeos::features::kCryptAuthV2Enrollment)) { cryptauth_key_registry_ = - CryptAuthKeyRegistryImpl::Factory::Get()->BuildInstance(profile_prefs_); + CryptAuthKeyRegistryImpl::Factory::Get()->BuildInstance( + pref_service_.get()); cryptauth_scheduler_ = - CryptAuthSchedulerImpl::Factory::Get()->BuildInstance(profile_prefs_); + CryptAuthSchedulerImpl::Factory::Get()->BuildInstance( + pref_service_.get()); cryptauth_enrollment_manager_ = CryptAuthV2EnrollmentManagerImpl::Factory::Get()->BuildInstance( client_app_metadata_provider_, cryptauth_key_registry_.get(), cryptauth_client_factory_.get(), cryptauth_gcm_manager_.get(), - cryptauth_scheduler_.get(), profile_prefs_, clock_); + cryptauth_scheduler_.get(), pref_service_.get(), clock_); } else { cryptauth_enrollment_manager_ = CryptAuthEnrollmentManagerImpl::Factory::NewInstance( @@ -631,7 +664,7 @@ cryptauth_client_factory_.get()), multidevice::SecureMessageDelegateImpl::Factory::NewInstance(), gcm_device_info_provider_->GetGcmDeviceInfo(), - cryptauth_gcm_manager_.get(), profile_prefs_); + cryptauth_gcm_manager_.get(), pref_service_.get()); } cryptauth_enrollment_manager_->AddObserver(this); @@ -794,6 +827,11 @@ } } +void DeviceSyncImpl::SetPrefConnectionDelegateForTesting( + std::unique_ptr<PrefConnectionDelegate> pref_connection_delegate) { + pref_connection_delegate_ = std::move(pref_connection_delegate); +} + } // namespace device_sync } // namespace chromeos
diff --git a/chromeos/services/device_sync/device_sync_impl.h b/chromeos/services/device_sync/device_sync_impl.h index f9b7ee5a..88e7398 100644 --- a/chromeos/services/device_sync/device_sync_impl.h +++ b/chromeos/services/device_sync/device_sync_impl.h
@@ -18,8 +18,11 @@ #include "chromeos/services/device_sync/public/mojom/device_sync.mojom.h" #include "chromeos/services/device_sync/remote_device_provider.h" #include "components/signin/public/identity_manager/account_info.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "services/preferences/public/cpp/pref_service_factory.h" +#include "services/preferences/public/mojom/preferences.mojom.h" -class PrefRegistrySimple; class PrefService; namespace base { @@ -74,7 +77,8 @@ virtual std::unique_ptr<DeviceSyncBase> BuildInstance( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_conector, const GcmDeviceInfoProvider* gcm_device_info_provider, ClientAppMetadataProvider* client_app_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, @@ -84,8 +88,6 @@ static Factory* test_factory_instance_; }; - static void RegisterProfilePrefs(PrefRegistrySimple* registry); - ~DeviceSyncImpl() override; protected: @@ -115,7 +117,27 @@ private: friend class DeviceSyncServiceTest; - enum class Status { WAITING_FOR_PROFILE_INIT, WAITING_FOR_ENROLLMENT, READY }; + enum class Status { + FETCHING_ACCOUNT_INFO, + CONNECTING_TO_USER_PREFS, + WAITING_FOR_ENROLLMENT, + READY + }; + + // Wrapper around preferences code. This class is necessary so that tests can + // override this functionality to use a fake PrefService rather than a real + // connection to the Preferences service. + class PrefConnectionDelegate { + public: + virtual ~PrefConnectionDelegate(); + + virtual scoped_refptr<PrefRegistrySimple> CreatePrefRegistry(); + virtual void ConnectToPrefService( + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector, + scoped_refptr<PrefRegistrySimple> pref_registry, + prefs::ConnectCallback callback); + }; class PendingSetSoftwareFeatureRequest { public: @@ -150,18 +172,21 @@ DeviceSyncImpl( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector, const GcmDeviceInfoProvider* gcm_device_info_provider, ClientAppMetadataProvider* client_app_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, base::Clock* clock, + std::unique_ptr<PrefConnectionDelegate> pref_connection_delegate, std::unique_ptr<base::OneShotTimer> timer); // DeviceSyncBase: - void OnProfileInitialized() override; void Shutdown() override; void ProcessPrimaryAccountInfo(const CoreAccountInfo& primary_account_info); + void ConnectToPrefStore(); + void OnConnectedToPrefService(std::unique_ptr<PrefService> pref_service); void InitializeCryptAuthManagementObjects(); void CompleteInitializationAfterSuccessfulEnrollment(); @@ -196,17 +221,22 @@ void StartSetSoftwareFeatureTimer(); void OnSetSoftwareFeatureTimerFired(); + void SetPrefConnectionDelegateForTesting( + std::unique_ptr<PrefConnectionDelegate> pref_connection_delegate); + signin::IdentityManager* identity_manager_; gcm::GCMDriver* gcm_driver_; - PrefService* profile_prefs_; + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector_; const GcmDeviceInfoProvider* gcm_device_info_provider_; ClientAppMetadataProvider* client_app_metadata_provider_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; base::Clock* clock_; + std::unique_ptr<PrefConnectionDelegate> pref_connection_delegate_; std::unique_ptr<base::OneShotTimer> set_software_feature_timer_; Status status_; CoreAccountInfo primary_account_info_; + std::unique_ptr<PrefService> pref_service_; base::flat_map<base::UnguessableToken, std::unique_ptr<PendingSetSoftwareFeatureRequest>> id_to_pending_set_software_feature_request_map_;
diff --git a/chromeos/services/device_sync/device_sync_service.cc b/chromeos/services/device_sync/device_sync_service.cc new file mode 100644 index 0000000..7007fc5 --- /dev/null +++ b/chromeos/services/device_sync/device_sync_service.cc
@@ -0,0 +1,60 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/device_sync/device_sync_service.h" + +#include "base/bind.h" +#include "base/timer/timer.h" +#include "chromeos/components/multidevice/logging/logging.h" +#include "chromeos/services/device_sync/device_sync_base.h" +#include "chromeos/services/device_sync/device_sync_impl.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + +namespace chromeos { + +namespace device_sync { + +DeviceSyncService::DeviceSyncService( + signin::IdentityManager* identity_manager, + gcm::GCMDriver* gcm_driver, + const GcmDeviceInfoProvider* gcm_device_info_provider, + ClientAppMetadataProvider* client_app_metadata_provider, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + mojo::PendingReceiver<mojom::DeviceSyncServiceInitializer> init_receiver) + : init_receiver_(this, std::move(init_receiver)), + identity_manager_(identity_manager), + gcm_driver_(gcm_driver), + gcm_device_info_provider_(gcm_device_info_provider), + client_app_metadata_provider_(client_app_metadata_provider), + url_loader_factory_(std::move(url_loader_factory)) {} + +DeviceSyncService::~DeviceSyncService() { + // Subclasses may hold onto message response callbacks. It's important that + // all bindings are closed by the time those callbacks are destroyed, or they + // will DCHECK. + if (device_sync_) + device_sync_->CloseAllBindings(); +} + +void DeviceSyncService::Initialize( + mojo::PendingReceiver<mojom::DeviceSyncService> receiver, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector) { + PA_LOG(VERBOSE) << "DeviceSyncService::Init()"; + receiver_.Bind(std::move(receiver)); + device_sync_ = DeviceSyncImpl::Factory::Get()->BuildInstance( + identity_manager_, gcm_driver_, std::move(pref_store_connector), + gcm_device_info_provider_, client_app_metadata_provider_, + url_loader_factory_, std::make_unique<base::OneShotTimer>()); +} + +void DeviceSyncService::BindDeviceSync( + mojo::PendingReceiver<mojom::DeviceSync> receiver) { + PA_LOG(VERBOSE) << "DeviceSyncService::BindDeviceSync()"; + device_sync_->BindRequest(std::move(receiver)); +} + +} // namespace device_sync + +} // namespace chromeos
diff --git a/chromeos/services/device_sync/device_sync_service.h b/chromeos/services/device_sync/device_sync_service.h new file mode 100644 index 0000000..7f4ab277 --- /dev/null +++ b/chromeos/services/device_sync/device_sync_service.h
@@ -0,0 +1,77 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_DEVICE_SYNC_DEVICE_SYNC_SERVICE_H_ +#define CHROMEOS_SERVICES_DEVICE_SYNC_DEVICE_SYNC_SERVICE_H_ + +#include <memory> + +#include "base/memory/ref_counted.h" +#include "chromeos/services/device_sync/public/mojom/device_sync.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace gcm { +class GCMDriver; +} // namespace gcm + +namespace signin { +class IdentityManager; +} // namespace signin + +namespace network { +class SharedURLLoaderFactory; +} // namespace network + +namespace chromeos { + +namespace device_sync { + +class ClientAppMetadataProvider; +class DeviceSyncBase; +class GcmDeviceInfoProvider; + +// Service which provides an implementation for DeviceSync. This service creates +// one implementation and shares it among all connection requests. +class DeviceSyncService : public mojom::DeviceSyncServiceInitializer, + public mojom::DeviceSyncService { + public: + DeviceSyncService( + signin::IdentityManager* identity_manager, + gcm::GCMDriver* gcm_driver, + const GcmDeviceInfoProvider* gcm_device_info_provider, + ClientAppMetadataProvider* client_app_metadata_provider, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + mojo::PendingReceiver<mojom::DeviceSyncServiceInitializer> init_receiver); + ~DeviceSyncService() override; + + private: + // mojom::DeviceSyncServiceInitializer: + void Initialize(mojo::PendingReceiver<mojom::DeviceSyncService> receiver, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector) override; + + // mojom::DeviceSyncService: + void BindDeviceSync( + mojo::PendingReceiver<mojom::DeviceSync> receiver) override; + + mojo::Receiver<mojom::DeviceSyncServiceInitializer> init_receiver_; + mojo::Receiver<mojom::DeviceSyncService> receiver_{this}; + + signin::IdentityManager* identity_manager_; + gcm::GCMDriver* gcm_driver_; + const GcmDeviceInfoProvider* gcm_device_info_provider_; + ClientAppMetadataProvider* client_app_metadata_provider_; + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + + std::unique_ptr<DeviceSyncBase> device_sync_; + + DISALLOW_COPY_AND_ASSIGN(DeviceSyncService); +}; + +} // namespace device_sync + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_DEVICE_SYNC_DEVICE_SYNC_SERVICE_H_
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc index e27dfc9..858fc4c 100644 --- a/chromeos/services/device_sync/device_sync_service_unittest.cc +++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chromeos/services/device_sync/device_sync_service.h" + #include <memory> #include "base/bind.h" @@ -495,16 +497,66 @@ } // namespace -// TODO(jamescook): Rename to DeviceSyncImplTest because it's actually testing -// the DeviceSync implementation. class DeviceSyncServiceTest : public ::testing::TestWithParam<bool> { public: + class FakePrefConnectionDelegate + : public DeviceSyncImpl::PrefConnectionDelegate { + public: + FakePrefConnectionDelegate( + std::unique_ptr<TestingPrefServiceSimple> test_pref_service) + : test_pref_service_(std::move(test_pref_service)), + test_pref_registry_( + base::WrapRefCounted(test_pref_service_->registry())) {} + + ~FakePrefConnectionDelegate() override = default; + + void InvokePendingCallback() { + EXPECT_FALSE(pending_callback_.is_null()); + std::move(pending_callback_).Run(std::move(test_pref_service_)); + + // Note: |pending_callback_| was passed from within the service, so it is + // necessary to let the rest of the current RunLoop run to ensure that + // the callback is executed before returning from this function. + base::RunLoop().RunUntilIdle(); + } + + bool HasStartedPrefConnection() { + return HasFinishedPrefConnection() || !pending_callback_.is_null(); + } + + bool HasFinishedPrefConnection() { return !test_pref_service_.get(); } + + // DeviceSyncImpl::PrefConnectionDelegate: + scoped_refptr<PrefRegistrySimple> CreatePrefRegistry() override { + return test_pref_registry_; + } + + void ConnectToPrefService( + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector, + scoped_refptr<PrefRegistrySimple> pref_registry, + prefs::ConnectCallback callback) override { + EXPECT_EQ(test_pref_service_->registry(), pref_registry.get()); + pending_callback_ = std::move(callback); + } + + private: + std::unique_ptr<TestingPrefServiceSimple> test_pref_service_; + scoped_refptr<PrefRegistrySimple> test_pref_registry_; + + prefs::ConnectCallback pending_callback_; + }; + class FakeDeviceSyncImplFactory : public DeviceSyncImpl::Factory { public: FakeDeviceSyncImplFactory( + std::unique_ptr<FakePrefConnectionDelegate> + fake_pref_connection_delegate, std::unique_ptr<base::MockOneShotTimer> mock_timer, base::SimpleTestClock* simple_test_clock) - : mock_timer_(std::move(mock_timer)), + : fake_pref_connection_delegate_( + std::move(fake_pref_connection_delegate)), + mock_timer_(std::move(mock_timer)), simple_test_clock_(simple_test_clock) {} ~FakeDeviceSyncImplFactory() override = default; @@ -513,18 +565,21 @@ std::unique_ptr<DeviceSyncBase> BuildInstance( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector, const GcmDeviceInfoProvider* gcm_device_info_provider, ClientAppMetadataProvider* client_app_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, std::unique_ptr<base::OneShotTimer> timer) override { return base::WrapUnique(new DeviceSyncImpl( - identity_manager, gcm_driver, profile_prefs, gcm_device_info_provider, - client_app_metadata_provider, std::move(url_loader_factory), - simple_test_clock_, std::move(mock_timer_))); + identity_manager, gcm_driver, std::move(pref_store_connector), + gcm_device_info_provider, client_app_metadata_provider, + std::move(url_loader_factory), simple_test_clock_, + std::move(fake_pref_connection_delegate_), std::move(mock_timer_))); } private: + std::unique_ptr<FakePrefConnectionDelegate> fake_pref_connection_delegate_; std::unique_ptr<base::MockOneShotTimer> mock_timer_; base::SimpleTestClock* simple_test_clock_; }; @@ -549,7 +604,8 @@ fake_gcm_driver_ = std::make_unique<gcm::FakeGCMDriver>(); - test_pref_service_ = std::make_unique<TestingPrefServiceSimple>(); + auto test_pref_service = std::make_unique<TestingPrefServiceSimple>(); + test_pref_service_ = test_pref_service.get(); simple_test_clock_ = std::make_unique<base::SimpleTestClock>(); @@ -561,15 +617,15 @@ identity_test_environment_->MakePrimaryAccountAvailable(kTestEmail); fake_cryptauth_gcm_manager_factory_ = - std::make_unique<FakeCryptAuthGCMManagerFactory>( - fake_gcm_driver_.get(), test_pref_service_.get()); + std::make_unique<FakeCryptAuthGCMManagerFactory>(fake_gcm_driver_.get(), + test_pref_service_); CryptAuthGCMManagerImpl::Factory::SetInstanceForTesting( fake_cryptauth_gcm_manager_factory_.get()); fake_cryptauth_device_manager_factory_ = std::make_unique<FakeCryptAuthDeviceManagerFactory>( simple_test_clock_.get(), fake_cryptauth_gcm_manager_factory_.get(), - test_pref_service_.get()); + test_pref_service_); CryptAuthDeviceManagerImpl::Factory::SetInstanceForTesting( fake_cryptauth_device_manager_factory_.get()); @@ -578,14 +634,12 @@ std::make_unique<FakeClientAppMetadataProvider>(); fake_cryptauth_key_registry_factory_ = - std::make_unique<FakeCryptAuthKeyRegistryFactory>( - test_pref_service_.get()); + std::make_unique<FakeCryptAuthKeyRegistryFactory>(test_pref_service_); CryptAuthKeyRegistryImpl::Factory::SetFactoryForTesting( fake_cryptauth_key_registry_factory_.get()); fake_cryptauth_scheduler_factory_ = - std::make_unique<FakeCryptAuthSchedulerFactory>( - test_pref_service_.get()); + std::make_unique<FakeCryptAuthSchedulerFactory>(test_pref_service_); CryptAuthSchedulerImpl::Factory::SetFactoryForTesting( fake_cryptauth_scheduler_factory_.get()); @@ -594,7 +648,7 @@ fake_client_app_metadata_provider_.get(), fake_cryptauth_key_registry_factory_.get(), fake_cryptauth_gcm_manager_factory_.get(), - fake_cryptauth_scheduler_factory_.get(), test_pref_service_.get(), + fake_cryptauth_scheduler_factory_.get(), test_pref_service_, simple_test_clock_.get()); CryptAuthV2EnrollmentManagerImpl::Factory::SetFactoryForTesting( fake_cryptauth_v2_enrollment_manager_factory_.get()); @@ -602,8 +656,7 @@ fake_cryptauth_enrollment_manager_factory_ = std::make_unique<FakeCryptAuthEnrollmentManagerFactory>( simple_test_clock_.get(), - fake_cryptauth_gcm_manager_factory_.get(), - test_pref_service_.get()); + fake_cryptauth_gcm_manager_factory_.get(), test_pref_service_); CryptAuthEnrollmentManagerImpl::Factory::SetInstanceForTesting( fake_cryptauth_enrollment_manager_factory_.get()); } @@ -622,12 +675,18 @@ SoftwareFeatureManagerImpl::Factory::SetInstanceForTesting( fake_software_feature_manager_factory_.get()); + auto fake_pref_connection_delegate = + std::make_unique<FakePrefConnectionDelegate>( + std::move(test_pref_service)); + fake_pref_connection_delegate_ = fake_pref_connection_delegate.get(); + auto mock_timer = std::make_unique<base::MockOneShotTimer>(); mock_timer_ = mock_timer.get(); fake_device_sync_impl_factory_ = - std::make_unique<FakeDeviceSyncImplFactory>(std::move(mock_timer), - simple_test_clock_.get()); + std::make_unique<FakeDeviceSyncImplFactory>( + std::move(fake_pref_connection_delegate), std::move(mock_timer), + simple_test_clock_.get()); DeviceSyncImpl::Factory::SetInstanceForTesting( fake_device_sync_impl_factory_.get()); @@ -642,12 +701,20 @@ })); fake_device_sync_observer_ = std::make_unique<FakeDeviceSyncObserver>(); - - device_sync_ = DeviceSyncImpl::Factory::Get()->BuildInstance( + mojo::Remote<mojom::DeviceSyncServiceInitializer> initializer; + service_ = std::make_unique<DeviceSyncService>( identity_test_environment_->identity_manager(), fake_gcm_driver_.get(), - test_pref_service_.get(), fake_gcm_device_info_provider_.get(), + fake_gcm_device_info_provider_.get(), fake_client_app_metadata_provider_.get(), shared_url_loader_factory, - std::make_unique<base::OneShotTimer>()); + initializer.BindNewPipeAndPassReceiver()); + + // FakePrefConnectionDelegate precludes the service ever actually sending + // messages over this interface, so we provided the service with a + // bound but disconnected endpoint. + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector; + ignore_result(pref_store_connector.InitWithNewPipeAndPassReceiver()); + initializer->Initialize(remote_service_.BindNewPipeAndPassReceiver(), + std::move(pref_store_connector)); } void TearDown() override { @@ -664,7 +731,8 @@ DBusThreadManager::Shutdown(); } - void InitializeDeviceSync(bool device_already_enrolled_in_cryptauth) { + void ConnectToDeviceSyncService(bool device_already_enrolled_in_cryptauth) { + // Used in CompleteConnectionToPrefService(). device_already_enrolled_in_cryptauth_ = device_already_enrolled_in_cryptauth; @@ -678,12 +746,21 @@ device_already_enrolled_in_cryptauth); } - device_sync_->OnProfileInitialized(); + remote_service_->BindDeviceSync(mojo::MakeRequest(&device_sync_)); // Set |fake_device_sync_observer_|. CallAddObserver(); + } - // CryptAuth classes are expected to be created and initialized. + void CompleteConnectionToPrefService() { + EXPECT_TRUE(fake_pref_connection_delegate()->HasStartedPrefConnection()); + EXPECT_FALSE(fake_pref_connection_delegate()->HasFinishedPrefConnection()); + + fake_pref_connection_delegate_->InvokePendingCallback(); + EXPECT_TRUE(fake_pref_connection_delegate()->HasFinishedPrefConnection()); + + // When connection to preferences is complete, CryptAuth classes are + // expected to be created and initialized. EXPECT_TRUE(fake_cryptauth_gcm_manager_factory_->instance() ->has_started_listening()); EXPECT_TRUE(fake_cryptauth_enrollment_manager()->has_started()); @@ -762,7 +839,8 @@ } void InitializeServiceSuccessfully() { - InitializeDeviceSync(true /* device_already_enrolled_in_cryptauth */); + ConnectToDeviceSyncService(true /* device_already_enrolled_in_cryptauth */); + CompleteConnectionToPrefService(); VerifyInitializationStatus(true /* expected_to_be_initialized */); base::RunLoop().RunUntilIdle(); @@ -788,6 +866,10 @@ return fake_device_sync_observer_.get(); } + FakePrefConnectionDelegate* fake_pref_connection_delegate() { + return fake_pref_connection_delegate_; + } + base::MockOneShotTimer* mock_timer() { return mock_timer_; } FakeCryptAuthEnrollmentManager* fake_cryptauth_enrollment_manager() { @@ -1064,7 +1146,8 @@ const std::vector<cryptauth::ExternalDeviceInfo> test_device_infos_; const std::vector<cryptauth::IneligibleDevice> test_ineligible_devices_; - std::unique_ptr<TestingPrefServiceSimple> test_pref_service_; + TestingPrefServiceSimple* test_pref_service_; + FakePrefConnectionDelegate* fake_pref_connection_delegate_; base::MockOneShotTimer* mock_timer_; std::unique_ptr<base::SimpleTestClock> simple_test_clock_; std::unique_ptr<FakeDeviceSyncImplFactory> fake_device_sync_impl_factory_; @@ -1091,6 +1174,9 @@ std::unique_ptr<gcm::FakeGCMDriver> fake_gcm_driver_; std::unique_ptr<FakeGcmDeviceInfoProvider> fake_gcm_device_info_provider_; + std::unique_ptr<DeviceSyncService> service_; + mojo::Remote<mojom::DeviceSyncService> remote_service_; + bool device_already_enrolled_in_cryptauth_; bool last_force_enrollment_now_result_; bool last_force_sync_now_result_; @@ -1104,7 +1190,7 @@ base::Optional<mojom::DebugInfo> last_debug_info_result_; std::unique_ptr<FakeDeviceSyncObserver> fake_device_sync_observer_; - std::unique_ptr<DeviceSyncBase> device_sync_; + mojom::DeviceSyncPtr device_sync_; base::HistogramTester histogram_tester_; @@ -1114,9 +1200,27 @@ DISALLOW_COPY_AND_ASSIGN(DeviceSyncServiceTest); }; +TEST_P(DeviceSyncServiceTest, PreferencesNeverConnect) { + ConnectToDeviceSyncService(false /* device_already_enrolled_in_cryptauth */); + + // A connection to the Preferences service should have started. + EXPECT_TRUE(fake_pref_connection_delegate()->HasStartedPrefConnection()); + EXPECT_FALSE(fake_pref_connection_delegate()->HasFinishedPrefConnection()); + + // Do not complete the connection; without this step, the other API functions + // should fail. + VerifyApiFunctionsFailBeforeInitialization(); + + // No observer callbacks should have been invoked. + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(0u, fake_device_sync_observer()->num_enrollment_events()); + EXPECT_EQ(0u, fake_device_sync_observer()->num_sync_events()); +} + TEST_P(DeviceSyncServiceTest, DeviceNotAlreadyEnrolledInCryptAuth_FailsEnrollment) { - InitializeDeviceSync(false /* device_already_enrolled_in_cryptauth */); + ConnectToDeviceSyncService(false /* device_already_enrolled_in_cryptauth */); + CompleteConnectionToPrefService(); // Simulate enrollment failing. SimulateEnrollment(false /* success */); @@ -1137,7 +1241,8 @@ TEST_P(DeviceSyncServiceTest, DeviceNotAlreadyEnrolledInCryptAuth_FailsEnrollment_ThenSucceeds) { - InitializeDeviceSync(false /* device_already_enrolled_in_cryptauth */); + ConnectToDeviceSyncService(false /* device_already_enrolled_in_cryptauth */); + CompleteConnectionToPrefService(); // Initialization has not yet completed, so no devices should be available. EXPECT_FALSE(CallGetSyncedDevices());
diff --git a/chromeos/services/device_sync/public/cpp/BUILD.gn b/chromeos/services/device_sync/public/cpp/BUILD.gn index ba676bee..8afb602 100644 --- a/chromeos/services/device_sync/public/cpp/BUILD.gn +++ b/chromeos/services/device_sync/public/cpp/BUILD.gn
@@ -69,7 +69,6 @@ "//chromeos/services/device_sync", "//chromeos/services/device_sync:test_support", "//components/gcm_driver:test_support", - "//components/prefs:test_support", "//components/signin/public/identity_manager:test_support", "//net", "//services/network:test_support",
diff --git a/chromeos/services/device_sync/public/cpp/device_sync_client.cc b/chromeos/services/device_sync/public/cpp/device_sync_client.cc index 836b737..aa9a7533 100644 --- a/chromeos/services/device_sync/public/cpp/device_sync_client.cc +++ b/chromeos/services/device_sync/public/cpp/device_sync_client.cc
@@ -12,10 +12,6 @@ DeviceSyncClient::~DeviceSyncClient() = default; -mojom::DeviceSyncPtr* DeviceSyncClient::GetDeviceSyncPtr() { - return nullptr; -} - void DeviceSyncClient::AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
diff --git a/chromeos/services/device_sync/public/cpp/device_sync_client.h b/chromeos/services/device_sync/public/cpp/device_sync_client.h index 0203c94..a4358c04 100644 --- a/chromeos/services/device_sync/public/cpp/device_sync_client.h +++ b/chromeos/services/device_sync/public/cpp/device_sync_client.h
@@ -10,17 +10,12 @@ #include "base/callback.h" #include "base/macros.h" -#include "base/memory/scoped_refptr.h" #include "base/observer_list.h" #include "base/optional.h" #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/components/multidevice/software_feature.h" #include "chromeos/services/device_sync/public/mojom/device_sync.mojom.h" -namespace base { -class TaskRunner; -} // namespace base - namespace chromeos { namespace device_sync { @@ -52,13 +47,6 @@ DeviceSyncClient(); virtual ~DeviceSyncClient(); - // Completes initialization. Must be called after connecting the DeviceSync - // mojo interface pointer to the implementation. - virtual void Initialize(scoped_refptr<base::TaskRunner> task_runner) {} - - // Returns the DeviceSync mojo interface pointer. - virtual mojom::DeviceSyncPtr* GetDeviceSyncPtr(); - void AddObserver(Observer* observer); void RemoveObserver(Observer* observer);
diff --git a/chromeos/services/device_sync/public/cpp/device_sync_client_impl.cc b/chromeos/services/device_sync/public/cpp/device_sync_client_impl.cc index bfd9f77..87f78c8 100644 --- a/chromeos/services/device_sync/public/cpp/device_sync_client_impl.cc +++ b/chromeos/services/device_sync/public/cpp/device_sync_client_impl.cc
@@ -40,23 +40,24 @@ DeviceSyncClientImpl::Factory::~Factory() = default; -std::unique_ptr<DeviceSyncClient> -DeviceSyncClientImpl::Factory::BuildInstance() { - return std::make_unique<DeviceSyncClientImpl>(); +std::unique_ptr<DeviceSyncClient> DeviceSyncClientImpl::Factory::BuildInstance( + mojom::DeviceSyncService* service) { + return base::WrapUnique(new DeviceSyncClientImpl(service)); } -DeviceSyncClientImpl::DeviceSyncClientImpl() - : observer_binding_(this), +DeviceSyncClientImpl::DeviceSyncClientImpl(mojom::DeviceSyncService* service) + : DeviceSyncClientImpl(service, base::ThreadTaskRunnerHandle::Get()) {} + +DeviceSyncClientImpl::DeviceSyncClientImpl( + mojom::DeviceSyncService* service, + scoped_refptr<base::TaskRunner> task_runner) + : binding_(this), expiring_device_cache_( - std::make_unique<multidevice::ExpiringRemoteDeviceCache>()) {} - -DeviceSyncClientImpl::~DeviceSyncClientImpl() = default; - -void DeviceSyncClientImpl::Initialize( - scoped_refptr<base::TaskRunner> task_runner) { + std::make_unique<multidevice::ExpiringRemoteDeviceCache>()) { + service->BindDeviceSync(mojo::MakeRequest(&device_sync_ptr_)); device_sync_ptr_->AddObserver(GenerateInterfacePtr(), base::OnceClosure()); - // Delay calling these until after initialization finishes. + // Delay calling these until after the constructor finishes. task_runner->PostTask( FROM_HERE, base::BindOnce(&DeviceSyncClientImpl::LoadLocalDeviceMetadata, weak_ptr_factory_.GetWeakPtr())); @@ -65,9 +66,7 @@ weak_ptr_factory_.GetWeakPtr())); } -mojom::DeviceSyncPtr* DeviceSyncClientImpl::GetDeviceSyncPtr() { - return &device_sync_ptr_; -} +DeviceSyncClientImpl::~DeviceSyncClientImpl() = default; void DeviceSyncClientImpl::OnEnrollmentFinished() { // Before notifying observers that enrollment has finished, sync down the @@ -245,7 +244,7 @@ mojom::DeviceSyncObserverPtr DeviceSyncClientImpl::GenerateInterfacePtr() { mojom::DeviceSyncObserverPtr interface_ptr; - observer_binding_.Bind(mojo::MakeRequest(&interface_ptr)); + binding_.Bind(mojo::MakeRequest(&interface_ptr)); return interface_ptr; }
diff --git a/chromeos/services/device_sync/public/cpp/device_sync_client_impl.h b/chromeos/services/device_sync/public/cpp/device_sync_client_impl.h index 5380278..6344239 100644 --- a/chromeos/services/device_sync/public/cpp/device_sync_client_impl.h +++ b/chromeos/services/device_sync/public/cpp/device_sync_client_impl.h
@@ -41,18 +41,16 @@ static Factory* Get(); static void SetInstanceForTesting(Factory* test_factory); virtual ~Factory(); - virtual std::unique_ptr<DeviceSyncClient> BuildInstance(); + virtual std::unique_ptr<DeviceSyncClient> BuildInstance( + mojom::DeviceSyncService* service); private: static Factory* test_factory_; }; - DeviceSyncClientImpl(); + explicit DeviceSyncClientImpl(mojom::DeviceSyncService* service); ~DeviceSyncClientImpl() override; - void Initialize(scoped_refptr<base::TaskRunner> task_runner) override; - mojom::DeviceSyncPtr* GetDeviceSyncPtr() override; - // DeviceSyncClient: void ForceEnrollmentNow( mojom::DeviceSync::ForceEnrollmentNowCallback callback) override; @@ -79,6 +77,9 @@ private: friend class DeviceSyncClientImplTest; + DeviceSyncClientImpl(mojom::DeviceSyncService* service, + scoped_refptr<base::TaskRunner> task_runner); + void AttemptToBecomeReady(); void LoadSyncedDevices(); @@ -99,7 +100,7 @@ void FlushForTesting(); mojom::DeviceSyncPtr device_sync_ptr_; - mojo::Binding<mojom::DeviceSyncObserver> observer_binding_; + mojo::Binding<mojom::DeviceSyncObserver> binding_; std::unique_ptr<multidevice::ExpiringRemoteDeviceCache> expiring_device_cache_;
diff --git a/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc b/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc index 44ed49f..00d83cb 100644 --- a/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc +++ b/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc
@@ -19,12 +19,12 @@ #include "base/test/test_simple_task_runner.h" #include "chromeos/components/multidevice/remote_device_test_util.h" #include "chromeos/services/device_sync/device_sync_impl.h" +#include "chromeos/services/device_sync/device_sync_service.h" #include "chromeos/services/device_sync/fake_device_sync.h" #include "chromeos/services/device_sync/public/cpp/fake_client_app_metadata_provider.h" #include "chromeos/services/device_sync/public/cpp/fake_gcm_device_info_provider.h" #include "chromeos/services/device_sync/public/mojom/device_sync.mojom.h" #include "components/gcm_driver/fake_gcm_driver.h" -#include "components/prefs/testing_pref_service.h" #include "components/signin/public/identity_manager/identity_test_environment.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" @@ -61,7 +61,8 @@ std::unique_ptr<DeviceSyncBase> BuildInstance( signin::IdentityManager* identity_manager, gcm::GCMDriver* gcm_driver, - PrefService* profile_prefs, + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> + pref_store_connector, const GcmDeviceInfoProvider* gcm_device_info_provider, ClientAppMetadataProvider* client_app_metadata_provider, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, @@ -168,26 +169,33 @@ return nullptr; })); - test_pref_service_ = std::make_unique<TestingPrefServiceSimple>(); - - device_sync_ = DeviceSyncImpl::Factory::Get()->BuildInstance( + mojo::Remote<mojom::DeviceSyncServiceInitializer> initializer; + service_ = std::make_unique<DeviceSyncService>( identity_test_environment_->identity_manager(), fake_gcm_driver_.get(), - test_pref_service_.get(), fake_gcm_device_info_provider_.get(), + fake_gcm_device_info_provider_.get(), fake_client_app_metadata_provider_.get(), shared_url_loader_factory, - std::make_unique<base::OneShotTimer>()); + initializer.BindNewPipeAndPassReceiver()); + + mojo::PendingRemote<prefs::mojom::PrefStoreConnector> pref_store_connector; + ignore_result(pref_store_connector.InitWithNewPipeAndPassReceiver()); + initializer->Initialize(remote_service_.BindNewPipeAndPassReceiver(), + std::move(pref_store_connector)); test_observer_ = std::make_unique<TestDeviceSyncClientObserver>(); - // DeviceSyncClient initialization posts two tasks to the TaskRunner. Idle + CreateClient(); + } + + void CreateClient() { + // DeviceSyncClient's constructor posts two tasks to the TaskRunner. Idle // the TaskRunner so that the tasks can be run via a RunLoop later on. auto test_task_runner = base::MakeRefCounted<base::TestSimpleTaskRunner>(); - client_ = std::make_unique<DeviceSyncClientImpl>(); - device_sync_->BindRequest(mojo::MakeRequest(client_->GetDeviceSyncPtr())); - client_->Initialize(test_task_runner); + client_ = base::WrapUnique( + new DeviceSyncClientImpl(remote_service_.get(), test_task_runner)); test_task_runner->RunUntilIdle(); } - void SetupClient(bool complete_enrollment_before_sync = true) { + void InitializeClient(bool complete_enrollment_before_sync = true) { client_->AddObserver(test_observer_.get()); SendPendingMojoMessages(); @@ -463,8 +471,8 @@ fake_client_app_metadata_provider_; FakeDeviceSync* fake_device_sync_; std::unique_ptr<FakeDeviceSyncImplFactory> fake_device_sync_impl_factory_; - std::unique_ptr<TestingPrefServiceSimple> test_pref_service_; - std::unique_ptr<DeviceSyncBase> device_sync_; + std::unique_ptr<DeviceSyncService> service_; + mojo::Remote<mojom::DeviceSyncService> remote_service_; std::unique_ptr<TestDeviceSyncClientObserver> test_observer_; std::unique_ptr<DeviceSyncClientImpl> client_; @@ -535,7 +543,7 @@ TEST_F(DeviceSyncClientImplTest, TestCompleteInitialSyncBeforeInitialEnrollment) { - SetupClient(false /* complete_enrollment_before_sync */); + InitializeClient(false /* complete_enrollment_before_sync */); } TEST_F( @@ -590,7 +598,7 @@ TEST_F(DeviceSyncClientImplTest, TestOnEnrollmentFinished) { EXPECT_EQ(0u, test_observer_->enrollment_finished_count()); - SetupClient(); + InitializeClient(); EXPECT_EQ(test_remote_device_list_[0].public_key, client_->GetLocalDeviceMetadata()->public_key()); @@ -627,7 +635,7 @@ TEST_F(DeviceSyncClientImplTest, TestOnNewDevicesSynced) { EXPECT_EQ(0u, test_observer_->new_devices_synced_count()); - SetupClient(); + InitializeClient(); VerifyRemoteDeviceRefListAndRemoteDeviceListAreEqual( client_->GetSyncedDevices(), test_remote_device_list_); @@ -656,31 +664,31 @@ } TEST_F(DeviceSyncClientImplTest, TestForceEnrollmentNow_ExpectSuccess) { - SetupClient(); + InitializeClient(); CallForceEnrollmentNow(true /* expected_success */); } TEST_F(DeviceSyncClientImplTest, TestForceEnrollmentNow_ExpectFailure) { - SetupClient(); + InitializeClient(); CallForceEnrollmentNow(false /* expected_success */); } TEST_F(DeviceSyncClientImplTest, TestSyncNow_ExpectSuccess) { - SetupClient(); + InitializeClient(); CallSyncNow(true /* expected_success */); } TEST_F(DeviceSyncClientImplTest, TestSyncNow_ExpectFailure) { - SetupClient(); + InitializeClient(); CallSyncNow(false /* expected_success */); } TEST_F(DeviceSyncClientImplTest, TestGetSyncedDevices_DeviceRemovedFromCache) { - SetupClient(); + InitializeClient(); VerifyRemoteDeviceRefListAndRemoteDeviceListAreEqual( client_->GetSyncedDevices(), test_remote_device_list_); @@ -703,13 +711,13 @@ } TEST_F(DeviceSyncClientImplTest, TestSetSoftwareFeatureState) { - SetupClient(); + InitializeClient(); CallSetSoftwareFeatureState(mojom::NetworkRequestResult::kSuccess); } TEST_F(DeviceSyncClientImplTest, TestFindEligibleDevices_NoErrorCode) { - SetupClient(); + InitializeClient(); multidevice::RemoteDeviceList expected_eligible_devices( {test_remote_device_list_[0], test_remote_device_list_[1]}); @@ -723,7 +731,7 @@ } TEST_F(DeviceSyncClientImplTest, TestFindEligibleDevices_ErrorCode) { - SetupClient(); + InitializeClient(); CallFindEligibleDevices(mojom::NetworkRequestResult::kEndpointNotFound, multidevice::RemoteDeviceList(), @@ -731,7 +739,7 @@ } TEST_F(DeviceSyncClientImplTest, TestGetDevicesActivityStatus_NoErrorCode) { - SetupClient(); + InitializeClient(); std::vector<mojom::DeviceActivityStatusPtr> expected_activity_statuses; expected_activity_statuses.emplace_back(mojom::DeviceActivityStatus::New( "deviceid", base::Time(), cryptauthv2::ConnectivityStatus::ONLINE)); @@ -741,14 +749,14 @@ } TEST_F(DeviceSyncClientImplTest, TestGetDevicesActivityStatus_ErrorCode) { - SetupClient(); + InitializeClient(); CallGetDevicesActivityStatus(mojom::NetworkRequestResult::kEndpointNotFound, base::nullopt); } TEST_F(DeviceSyncClientImplTest, TestGetDebugInfo) { - SetupClient(); + InitializeClient(); CallGetDebugInfo(); }
diff --git a/chromeos/services/device_sync/public/mojom/BUILD.gn b/chromeos/services/device_sync/public/mojom/BUILD.gn index 0914e33..f3e8fb2 100644 --- a/chromeos/services/device_sync/public/mojom/BUILD.gn +++ b/chromeos/services/device_sync/public/mojom/BUILD.gn
@@ -12,6 +12,7 @@ public_deps = [ "//chromeos/components/multidevice/mojom", "//mojo/public/mojom/base", + "//services/preferences/public/mojom", ] }
diff --git a/chromeos/services/device_sync/public/mojom/device_sync.mojom b/chromeos/services/device_sync/public/mojom/device_sync.mojom index f173065..2dbbecc 100644 --- a/chromeos/services/device_sync/public/mojom/device_sync.mojom +++ b/chromeos/services/device_sync/public/mojom/device_sync.mojom
@@ -6,6 +6,7 @@ import "chromeos/components/multidevice/mojom/multidevice_types.mojom"; import "mojo/public/mojom/base/time.mojom"; +import "services/preferences/public/mojom/preferences.mojom"; enum NetworkRequestResult { // Successful network request. @@ -159,8 +160,8 @@ // On success, this function returns a null error_code with the activity // statuses to the callback; on error, it returns a valid error_code string // indicating the reason for failure along with a null activity statuses. - // - // This method is expected to be used by multidevice_setup service running + // + // This method is expected to be used by multidevice_setup service running // in the browser process. GetDevicesActivityStatus() => (NetworkRequestResult result_code, @@ -173,3 +174,19 @@ GetDebugInfo() => (DebugInfo? debug_info); }; +// The main interface to the Device Sync service, used to initialized a new +// instance of the service. +interface DeviceSyncServiceInitializer { + // Initializes the service instance, binding a DeviceSyncService endpoint + // with access to a given PrefStoreConnector. + Initialize( + pending_receiver<DeviceSyncService> receiver, + pending_remote<prefs.mojom.PrefStoreConnector> pref_store_connector); +}; + +// The main interface to the Device Sync service. +interface DeviceSyncService { + // Binds a new DeviceSync endpoint. + BindDeviceSync(pending_receiver<DeviceSync> receiver); +}; +
diff --git a/chromeos/services/media_perception/public/mojom/media_perception_service.mojom b/chromeos/services/media_perception/public/mojom/media_perception_service.mojom index 4ac06df..d312460 100644 --- a/chromeos/services/media_perception/public/mojom/media_perception_service.mojom +++ b/chromeos/services/media_perception/public/mojom/media_perception_service.mojom
@@ -18,7 +18,7 @@ interface MediaPerceptionController { // Used by the client to establish a MediaPerception pipe. - ActivateMediaPerception@0(MediaPerception& request); + ActivateMediaPerception@0(pending_receiver<MediaPerception> receiver); }; interface MediaPerceptionControllerClient {
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index d4040fe46..26ec616 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -177,11 +177,9 @@ ~HistoryBackendHelper() override; }; -HistoryBackendHelper::HistoryBackendHelper() { -} +HistoryBackendHelper::HistoryBackendHelper() = default; -HistoryBackendHelper::~HistoryBackendHelper() { -} +HistoryBackendHelper::~HistoryBackendHelper() = default; // HistoryBackend -------------------------------------------------------------- @@ -1133,6 +1131,16 @@ return {!!db_, db_ ? db_->CountUniqueHostsVisitedLastMonth() : 0}; } +HistoryLastVisitToHostResult HistoryBackend::GetLastVisitToHost( + const GURL& host, + base::Time begin_time, + base::Time end_time) { + base::Time last_visit; + return { + db_ && db_->GetLastVisitToHost(host, begin_time, end_time, &last_visit), + last_visit}; +} + // Keyword visits -------------------------------------------------------------- void HistoryBackend::SetKeywordSearchTermsForURL(const GURL& url, @@ -1226,9 +1234,8 @@ } // Update a particular download entry. -void HistoryBackend::UpdateDownload( - const DownloadRow& data, - bool should_commit_immediately) { +void HistoryBackend::UpdateDownload(const DownloadRow& data, + bool should_commit_immediately) { TRACE_EVENT0("browser", "HistoryBackend::UpdateDownload"); if (!db_) return; @@ -2366,8 +2373,7 @@ const GURL& page_url) { RedirectList redirect_list = GetCachedRecentRedirects(page_url); if (!redirect_list.empty()) { - std::set<GURL> favicons_changed(redirect_list.begin(), - redirect_list.end()); + std::set<GURL> favicons_changed(redirect_list.begin(), redirect_list.end()); NotifyFaviconsChanged(favicons_changed, GURL()); } }
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index 00a8a63..63f7d73 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -275,6 +275,14 @@ // Returns the number of hosts visited in the last month. HistoryCountResult CountUniqueHostsVisitedLastMonth(); + // Gets the last time any webpage on the given host was visited within the + // time range [|begin_time|, |end_time|). If the given host has not been + // visited in the given time range, the result will have a null base::Time, + // but still report success. + HistoryLastVisitToHostResult GetLastVisitToHost(const GURL& host, + base::Time begin_time, + base::Time end_time); + // Favicon ------------------------------------------------------------------- std::vector<favicon_base::FaviconRawBitmapResult> GetFavicon(
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index b449687..17058cc0 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -724,6 +724,22 @@ std::move(callback)); } +base::CancelableTaskTracker::TaskId HistoryService::GetLastVisitToHost( + const GURL& host, + base::Time begin_time, + base::Time end_time, + GetLastVisitToHostCallback callback, + base::CancelableTaskTracker* tracker) { + DCHECK(backend_task_runner_) << "History service being called after cleanup"; + DCHECK(thread_checker_.CalledOnValidThread()); + + return tracker->PostTaskAndReplyWithResult( + backend_task_runner_.get(), FROM_HERE, + base::BindOnce(&HistoryBackend::GetLastVisitToHost, history_backend_, + host, begin_time, end_time), + std::move(callback)); +} + // Downloads ------------------------------------------------------------------- // Handle creation of a download by creating an entry in the history service's @@ -760,9 +776,8 @@ // Handle updates for a particular download. This is a 'fire and forget' // operation, so we don't need to be called back. -void HistoryService::UpdateDownload( - const DownloadRow& data, - bool should_commit_immediately) { +void HistoryService::UpdateDownload(const DownloadRow& data, + bool should_commit_immediately) { TRACE_EVENT0("browser", "HistoryService::UpdateDownload"); DCHECK(backend_task_runner_) << "History service being called after cleanup"; DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index 481c140..cc8ad6e 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -25,6 +25,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" +#include "base/optional.h" #include "base/sequenced_task_runner.h" #include "base/strings/string16.h" #include "base/task/cancelable_task_tracker.h" @@ -50,7 +51,7 @@ namespace base { class FilePath; class Thread; -} +} // namespace base namespace favicon { class FaviconServiceImpl; @@ -315,6 +316,20 @@ void CountUniqueHostsVisitedLastMonth(GetHistoryCountCallback callback, base::CancelableTaskTracker* tracker); + using GetLastVisitToHostCallback = + base::OnceCallback<void(HistoryLastVisitToHostResult)>; + + // Gets the last time any webpage on the given host was visited within the + // time range [|begin_time|, |end_time|). If the given host has not been + // visited in the given time age, the callback will be called with a null + // base::Time. + base::CancelableTaskTracker::TaskId GetLastVisitToHost( + const GURL& host, + base::Time begin_time, + base::Time end_time, + GetLastVisitToHostCallback callback, + base::CancelableTaskTracker* tracker); + // Database management operations -------------------------------------------- // Delete all the information related to a single url.
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index 3e57793..88dfac3 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -48,9 +48,9 @@ // (Warning): Please don't change any existing values while it is ok to add // new values when needed. enum VisitSource { - SOURCE_SYNCED = 0, // Synchronized from somewhere else. - SOURCE_BROWSED = 1, // User browsed. - SOURCE_EXTENSION = 2, // Added by an extension. + SOURCE_SYNCED = 0, // Synchronized from somewhere else. + SOURCE_BROWSED = 1, // User browsed. + SOURCE_EXTENSION = 2, // Added by an extension. SOURCE_FIREFOX_IMPORTED = 3, SOURCE_IE_IMPORTED = 4, SOURCE_SAFARI_IMPORTED = 5, @@ -432,6 +432,18 @@ int count = 0; }; +// HistoryLastVisitToHostResult encapsulates the result of a call to +// HistoryBackend::GetLastVisitToHost(). +struct HistoryLastVisitToHostResult { + // Indicates whether the call was successful or not. This can happen if there + // are internal database errors or the query was called with invalid + // arguments. |success| will be true and |last_visit| will be null if + // the host was never visited before. |last_visit| will always be null if + // |success| is false. + bool success = false; + base::Time last_visit; +}; + // Favicons ------------------------------------------------------------------- // Used for the mapping between the page and icon.
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc index 81859a97..8dfb5c06 100644 --- a/components/history/core/browser/visit_database.cc +++ b/components/history/core/browser/visit_database.cc
@@ -27,11 +27,9 @@ namespace history { -VisitDatabase::VisitDatabase() { -} +VisitDatabase::VisitDatabase() {} -VisitDatabase::~VisitDatabase() { -} +VisitDatabase::~VisitDatabase() {} bool VisitDatabase::InitVisitTable() { if (!GetDB().DoesTableExist("visits")) { @@ -58,7 +56,7 @@ if (!GetDB().DoesTableExist("visit_source")) { if (!GetDB().Execute("CREATE TABLE visit_source(" "id INTEGER PRIMARY KEY,source INTEGER NOT NULL)")) - return false; + return false; } // Index over url so we can quickly find visits for a page. @@ -68,16 +66,14 @@ // Create an index over from visits so that we can efficiently find // referrers and redirects. - if (!GetDB().Execute( - "CREATE INDEX IF NOT EXISTS visits_from_index ON " - "visits (from_visit)")) + if (!GetDB().Execute("CREATE INDEX IF NOT EXISTS visits_from_index ON " + "visits (from_visit)")) return false; // Create an index over time so that we can efficiently find the visits in a // given time range (most history views are time-based). - if (!GetDB().Execute( - "CREATE INDEX IF NOT EXISTS visits_time_index ON " - "visits (visit_time)")) + if (!GetDB().Execute("CREATE INDEX IF NOT EXISTS visits_time_index ON " + "visits (visit_time)")) return false; return true; @@ -85,9 +81,8 @@ bool VisitDatabase::DropVisitTable() { // This will also drop the indices over the table. - return - GetDB().Execute("DROP TABLE IF EXISTS visit_source") && - GetDB().Execute("DROP TABLE visits"); + return GetDB().Execute("DROP TABLE IF EXISTS visit_source") && + GetDB().Execute("DROP TABLE visits"); } // Must be in sync with HISTORY_VISIT_ROW_FIELDS. @@ -178,8 +173,8 @@ if (source != SOURCE_BROWSED) { // Record the source of this visit when it is not browsed. - sql::Statement statement1(GetDB().GetCachedStatement(SQL_FROM_HERE, - "INSERT INTO visit_source (id, source) VALUES (?,?)")); + sql::Statement statement1(GetDB().GetCachedStatement( + SQL_FROM_HERE, "INSERT INTO visit_source (id, source) VALUES (?,?)")); statement1.BindInt64(0, visit->visit_id); statement1.BindInt64(1, source); @@ -196,16 +191,16 @@ void VisitDatabase::DeleteVisit(const VisitRow& visit) { // Patch around this visit. Any visits that this went to will now have their // "source" be the deleted visit's source. - sql::Statement update_chain(GetDB().GetCachedStatement(SQL_FROM_HERE, - "UPDATE visits SET from_visit=? WHERE from_visit=?")); + sql::Statement update_chain(GetDB().GetCachedStatement( + SQL_FROM_HERE, "UPDATE visits SET from_visit=? WHERE from_visit=?")); update_chain.BindInt64(0, visit.referring_visit); update_chain.BindInt64(1, visit.visit_id); if (!update_chain.Run()) return; // Now delete the actual visit. - sql::Statement del(GetDB().GetCachedStatement(SQL_FROM_HERE, - "DELETE FROM visits WHERE id=?")); + sql::Statement del(GetDB().GetCachedStatement( + SQL_FROM_HERE, "DELETE FROM visits WHERE id=?")); del.BindInt64(0, visit.visit_id); if (!del.Run()) return; @@ -214,13 +209,14 @@ // If the visit was browsed, there is no corresponding entry in visit_source // table, and nothing will be deleted. del.Assign(GetDB().GetCachedStatement(SQL_FROM_HERE, - "DELETE FROM visit_source WHERE id=?")); + "DELETE FROM visit_source WHERE id=?")); del.BindInt64(0, visit.visit_id); del.Run(); } bool VisitDatabase::GetRowForVisit(VisitID visit_id, VisitRow* out_visit) { - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits WHERE id=?")); statement.BindInt64(0, visit_id); @@ -263,11 +259,10 @@ bool VisitDatabase::GetVisitsForURL(URLID url_id, VisitVector* visits) { visits->clear(); - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS - "FROM visits " - "WHERE url=? " - "ORDER BY visit_time ASC")); + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + "WHERE url=? " + "ORDER BY visit_time ASC")); statement.BindInt64(0, url_id); return FillVisitVector(statement, visits); } @@ -277,11 +272,12 @@ VisitVector* visits) { visits->clear(); - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " "WHERE url=? AND visit_time >= ? AND visit_time < ? " - "AND (transition & ?) != 0 " // CHAIN_END + "AND (transition & ?) != 0 " // CHAIN_END "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or // KEYWORD_GENERATED "ORDER BY visit_time DESC")); @@ -302,9 +298,9 @@ visits->clear(); for (auto it = times.begin(); it != times.end(); ++it) { - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " - "WHERE visit_time == ?")); + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + "WHERE visit_time == ?")); statement.BindInt64(0, it->ToInternalValue()); @@ -320,10 +316,10 @@ VisitVector* visits) { visits->clear(); - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " - "WHERE visit_time >= ? AND visit_time < ?" - "ORDER BY visit_time LIMIT ?")); + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + "WHERE visit_time >= ? AND visit_time < ?" + "ORDER BY visit_time LIMIT ?")); // See GetVisibleVisitsInRange for more info on how these times are bound. int64_t end = end_time.ToInternalValue(); @@ -335,20 +331,19 @@ return FillVisitVector(statement, visits); } -bool VisitDatabase::GetVisitsInRangeForTransition( - base::Time begin_time, - base::Time end_time, - int max_results, - ui::PageTransition transition, - VisitVector* visits) { +bool VisitDatabase::GetVisitsInRangeForTransition(base::Time begin_time, + base::Time end_time, + int max_results, + ui::PageTransition transition, + VisitVector* visits) { DCHECK(visits); visits->clear(); - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " - "WHERE visit_time >= ? AND visit_time < ? " - "AND (transition & ?) == ?" - "ORDER BY visit_time LIMIT ?")); + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + "WHERE visit_time >= ? AND visit_time < ? " + "AND (transition & ?) == ?" + "ORDER BY visit_time LIMIT ?")); // See GetVisibleVisitsInRange for more info on how these times are bound. int64_t end = end_time.ToInternalValue(); @@ -383,10 +378,12 @@ visits->clear(); // The visit_time values can be duplicated in a redirect chain, so we sort // by id too, to ensure a consistent ordering just in case. - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, + "SELECT" HISTORY_VISIT_ROW_FIELDS + "FROM visits " "WHERE visit_time >= ? AND visit_time < ? " - "AND (transition & ?) != 0 " // CHAIN_END + "AND (transition & ?) != 0 " // CHAIN_END "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or // KEYWORD_GENERATED "ORDER BY visit_time DESC, id DESC")); @@ -406,11 +403,11 @@ VisitRow* visit_row) { // The visit_time values can be duplicated in a redirect chain, so we sort // by id too, to ensure a consistent ordering just in case. - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " - "WHERE url=? " - "ORDER BY visit_time DESC, id DESC " - "LIMIT 1")); + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + "WHERE url=? " + "ORDER BY visit_time DESC, id DESC " + "LIMIT 1")); statement.BindInt64(0, url_id); if (!statement.Step()) return 0; // No visits for this URL. @@ -429,12 +426,11 @@ // The visit_time values can be duplicated in a redirect chain, so we sort // by id too, to ensure a consistent ordering just in case. - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT" HISTORY_VISIT_ROW_FIELDS - "FROM visits " - "WHERE url=? " - "ORDER BY visit_time DESC, id DESC " - "LIMIT ?")); + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " + "WHERE url=? " + "ORDER BY visit_time DESC, id DESC " + "LIMIT ?")); statement.BindInt64(0, url_id); statement.BindInt(1, max_results); @@ -444,7 +440,8 @@ bool VisitDatabase::GetRedirectFromVisit(VisitID from_visit, VisitID* to_visit, GURL* to_url) { - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT v.id,u.url " "FROM visits v JOIN urls u ON v.url = u.id " "WHERE v.from_visit = ? " @@ -472,7 +469,8 @@ *from_visit = row.referring_visit; if (from_url) { - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT u.url " "FROM visits v JOIN urls u ON v.url = u.id " "WHERE v.id = ? AND (v.transition & ?) != 0")); @@ -491,8 +489,7 @@ bool VisitDatabase::GetVisibleVisitCountToHost(const GURL& url, int* count, base::Time* first_visit) { - if (!url.SchemeIs(url::kHttpScheme) && - !url.SchemeIs(url::kHttpsScheme)) + if (!url.SchemeIs(url::kHttpScheme) && !url.SchemeIs(url::kHttpsScheme)) return false; // We need to search for URLs with a matching host/port. One way to query for @@ -508,15 +505,16 @@ // We also want to restrict ourselves to main frame navigations that are not // in the middle of redirect chains, hence the transition checks. - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT MIN(v.visit_time), COUNT(*) " "FROM visits v INNER JOIN urls u ON v.url = u.id " "WHERE u.url >= ? AND u.url < ? " "AND (transition & ?) != 0 " "AND (transition & ?) NOT IN (?, ?, ?)")); statement.BindString(0, host_query_min); - statement.BindString(1, - host_query_min.substr(0, host_query_min.size() - 1) + '0'); + statement.BindString( + 1, host_query_min.substr(0, host_query_min.size() - 1) + '0'); statement.BindInt(2, ui::PAGE_TRANSITION_CHAIN_END); statement.BindInt(3, ui::PAGE_TRANSITION_CORE_MASK); statement.BindInt(4, ui::PAGE_TRANSITION_AUTO_SUBFRAME); @@ -540,7 +538,8 @@ bool VisitDatabase::GetHistoryCount(const base::Time& begin_time, const base::Time& end_time, int* count) { - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT COUNT(*) FROM (" "SELECT DISTINCT url, " // Convert unit of timestamp from the numbers of microseconds since @@ -549,7 +548,7 @@ // valid here. "DATE((visit_time - ?) / ?, 'unixepoch', 'localtime')" "FROM visits " - "WHERE (transition & ?) != 0 " // CHAIN_END + "WHERE (transition & ?) != 0 " // CHAIN_END "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or // KEYWORD_GENERATED "AND visit_time >= ? AND visit_time < ?" @@ -572,8 +571,60 @@ return true; } +bool VisitDatabase::GetLastVisitToHost(const GURL& host, + base::Time begin_time, + base::Time end_time, + base::Time* last_visit) { + if (!host.is_valid() || !host.SchemeIsHTTPOrHTTPS()) + return false; + + // We need to search for URLs with a matching host/port. One way to query for + // this is to use the GLOB operator, eg 'url GLOB "http://google.com/*"'. This + // approach requires escaping the * and ? and such a query would also need to + // be recompiled on every Step(). The same query can be executed by using >= + // and < operator. The query becomes: 'url >= http://google.com/' and url < + // http://google.com0'. 0 is used as it is one character greater than '/'. + // This effectively applies the GLOB optimization by doing it in C++ instead + // of relying on SQLite to do it. + const std::string host_query_min = host.GetOrigin().spec(); + DCHECK(!host_query_min.empty()); + DCHECK_EQ('/', host_query_min.back()); + + const std::string host_query_max = + host_query_min.substr(0, host_query_min.size() - 1) + '0'; + + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, + "SELECT " + " v.visit_time " + "FROM visits v INNER JOIN urls u ON v.url = u.id " + "WHERE " + " u.url >= ? AND " + " u.url < ? AND " + " v.visit_time >= ? AND " + " v.visit_time < ? " + "ORDER BY v.visit_time DESC " + "LIMIT 1")); + statement.BindString(0, host_query_min); + statement.BindString(1, host_query_max); + statement.BindInt64(2, begin_time.ToInternalValue()); + statement.BindInt64(3, end_time.ToInternalValue()); + + if (!statement.Step()) { + // If there are no entries from the statement, the host may not have been + // visited in the given time range. Zero the time result and report the + // success of the statement. + *last_visit = base::Time(); + return statement.Succeeded(); + } + + *last_visit = base::Time::FromInternalValue(statement.ColumnInt64(0)); + return true; +} + bool VisitDatabase::GetStartDate(base::Time* first_visit) { - sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + sql::Statement statement(GetDB().GetCachedStatement( + SQL_FROM_HERE, "SELECT MIN(visit_time) FROM visits WHERE visit_time != 0")); if (!statement.Step() || statement.ColumnInt64(0) == 0) { *first_visit = base::Time::Now(); @@ -612,7 +663,8 @@ // Get the source entries out of the query result. while (statement.Step()) { - std::pair<VisitID, VisitSource> source_entry(statement.ColumnInt64(0), + std::pair<VisitID, VisitSource> source_entry( + statement.ColumnInt64(0), static_cast<VisitSource>(statement.ColumnInt(1))); sources->insert(source_entry); } @@ -668,8 +720,9 @@ if (!GetDB().DoesColumnExist("visits", "visit_duration")) { // Old versions don't have the visit_duration column, we modify the table // to add that field. - if (!GetDB().Execute("ALTER TABLE visits " - "ADD COLUMN visit_duration INTEGER DEFAULT 0 NOT NULL")) + if (!GetDB().Execute( + "ALTER TABLE visits " + "ADD COLUMN visit_duration INTEGER DEFAULT 0 NOT NULL")) return false; } return true;
diff --git a/components/history/core/browser/visit_database.h b/components/history/core/browser/visit_database.h index 53c549f9..baf5b65 100644 --- a/components/history/core/browser/visit_database.h +++ b/components/history/core/browser/visit_database.h
@@ -13,7 +13,7 @@ namespace sql { class Database; class Statement; -} +} // namespace sql namespace history { @@ -84,8 +84,10 @@ // is used for history expiration.) // // The results will be in increasing order of date. - bool GetAllVisitsInRange(base::Time begin_time, base::Time end_time, - int max_results, VisitVector* visits); + bool GetAllVisitsInRange(base::Time begin_time, + base::Time end_time, + int max_results, + VisitVector* visits); // Fills all visits with specified transition in the time range [begin, end) // to the given vector. Either time can be is_null(), in which case the times @@ -129,8 +131,7 @@ // // If non-NULL, the given visit row will be filled with the information of // the found visit. When no visit is found, the row will be unchanged. - VisitID GetMostRecentVisitForURL(URLID url_id, - VisitRow* visit_row); + VisitID GetMostRecentVisitForURL(URLID url_id, VisitRow* visit_row); // Returns the |max_results| most recent visit sessions for |url_id|. // @@ -181,12 +182,21 @@ const base::Time& end_time, int* count); + // Gets the last time any webpage on the given host was visited within the + // time range [|begin_time|, |end_time|). If the given host has not been + // visited in the given time range, this will return true and |last_visit| + // will be set to null. False will be returned if the host is not a valid + // HTTP or HTTPS url or for other database errors. + bool GetLastVisitToHost(const GURL& host, + base::Time begin_time, + base::Time end_time, + base::Time* last_visit); + // Get the time of the first item in our database. bool GetStartDate(base::Time* first_visit); // Get the source information about the given visits. - void GetVisitsSource(const VisitVector& visits, - VisitSourceMap* sources); + void GetVisitsSource(const VisitVector& visits, VisitSourceMap* sources); // Returns the list of Google domain visits of the user based on the Google // searches issued in the specified time interval. @@ -232,7 +242,6 @@ std::vector<URLID>* visited_url_rowids_sorted); private: - DISALLOW_COPY_AND_ASSIGN(VisitDatabase); };
diff --git a/components/history/core/browser/visit_database_unittest.cc b/components/history/core/browser/visit_database_unittest.cc index e44bd9ae..0bb3efaf 100644 --- a/components/history/core/browser/visit_database_unittest.cc +++ b/components/history/core/browser/visit_database_unittest.cc
@@ -29,10 +29,8 @@ namespace { -bool IsVisitInfoEqual(const VisitRow& a, - const VisitRow& b) { - return a.visit_id == b.visit_id && - a.url_id == b.url_id && +bool IsVisitInfoEqual(const VisitRow& a, const VisitRow& b) { + return a.visit_id == b.visit_id && a.url_id == b.url_id && a.visit_time == b.visit_time && a.referring_visit == b.referring_visit && ui::PageTransitionTypeIncludingQualifiersIs(a.transition, @@ -45,8 +43,7 @@ public URLDatabase, public VisitDatabase { public: - VisitDatabaseTest() { - } + VisitDatabaseTest() {} private: // Test setup. @@ -283,8 +280,7 @@ // Query a time range and make sure beginning is inclusive and ending is // exclusive. GetAllVisitsInRange(test_visit_rows[1].visit_time, - test_visit_rows[3].visit_time, 0, - &results); + test_visit_rows[3].visit_time, 0, &results); ASSERT_EQ(static_cast<size_t>(2), results.size()); EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[1])); EXPECT_TRUE(IsVisitInfoEqual(results[1], test_visit_rows[2])); @@ -443,8 +439,7 @@ Time now = two_days_ago; ui::PageTransition standard_transition = ui::PageTransitionFromInt( - ui::PAGE_TRANSITION_TYPED | - ui::PAGE_TRANSITION_CHAIN_START | + ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_CHAIN_START | ui::PAGE_TRANSITION_CHAIN_END); // Add 5 visits (3 distinct URLs) for the day before yesterday. @@ -515,27 +510,25 @@ // Narrowing the range to exclude |first_day_1| will still return 5, // because |first_day_1| is not unique. - EXPECT_TRUE(GetHistoryCount( - two_days_ago + TimeDelta::FromHours(2), today, &result)); + EXPECT_TRUE( + GetHistoryCount(two_days_ago + TimeDelta::FromHours(2), today, &result)); EXPECT_EQ(5, result); // Narrowing the range to exclude |second_day_4| will return 4, // because |second_day_4| is unique. - EXPECT_TRUE(GetHistoryCount( - two_days_ago, yesterday + TimeDelta::FromHours(3), &result)); + EXPECT_TRUE(GetHistoryCount(two_days_ago, yesterday + TimeDelta::FromHours(3), + &result)); EXPECT_EQ(4, result); // Narrowing the range to exclude both |first_day_1| and |second_day_4| will // still return 4. EXPECT_TRUE(GetHistoryCount(two_days_ago + TimeDelta::FromHours(2), - yesterday + TimeDelta::FromHours(3), - &result)); + yesterday + TimeDelta::FromHours(3), &result)); EXPECT_EQ(4, result); // A range that contains no visits will return 0. EXPECT_TRUE(GetHistoryCount(two_days_ago + TimeDelta::FromMicroseconds(1), - two_days_ago + TimeDelta::FromHours(1), - &result)); + two_days_ago + TimeDelta::FromHours(1), &result)); EXPECT_EQ(0, result); // If this timezone uses DST, test the behavior on days when the time @@ -579,9 +572,8 @@ backward_2.visit_id = 11; AddVisit(&backward_2, SOURCE_BROWSED); - EXPECT_TRUE(GetHistoryCount(shift_backward, - shift_backward + TimeDelta::FromHours(25), - &result)); + EXPECT_TRUE(GetHistoryCount( + shift_backward, shift_backward + TimeDelta::FromHours(25), &result)); EXPECT_EQ(1, result); } @@ -594,21 +586,148 @@ forward_1.visit_id = 12; AddVisit(&forward_1, SOURCE_BROWSED); - Time almost_24_hours_later = shift_forward + - TimeDelta::FromHours(24) - + Time almost_24_hours_later = shift_forward + TimeDelta::FromHours(24) - TimeDelta::FromMicroseconds(1); VisitRow forward_2(1, almost_24_hours_later, 0, standard_transition, 0, true); forward_2.visit_id = 13; AddVisit(&forward_2, SOURCE_BROWSED); - EXPECT_TRUE(GetHistoryCount(shift_forward, - shift_forward + TimeDelta::FromHours(24), - &result)); + EXPECT_TRUE(GetHistoryCount( + shift_forward, shift_forward + TimeDelta::FromHours(24), &result)); EXPECT_EQ(2, result); } } +TEST_F(VisitDatabaseTest, GetLastVisitToHost_BadURL) { + base::Time last_visit; + EXPECT_FALSE(GetLastVisitToHost(GURL(), base::Time::Min(), base::Time::Max(), + &last_visit)); + EXPECT_EQ(last_visit, base::Time()); +} + +TEST_F(VisitDatabaseTest, GetLastVisitToHost_NonHttpURL) { + base::Time last_visit; + EXPECT_FALSE(GetLastVisitToHost(GURL("ftp://host/"), base::Time::Min(), + base::Time::Max(), &last_visit)); + EXPECT_EQ(last_visit, base::Time()); +} + +TEST_F(VisitDatabaseTest, GetLastVisitToHost_NoVisits) { + base::Time last_visit; + EXPECT_TRUE(GetLastVisitToHost(GURL("https://www.chromium.org"), + base::Time::Min(), base::Time::Max(), + &last_visit)); + EXPECT_EQ(last_visit, base::Time()); +} + +TEST_F(VisitDatabaseTest, GetLastVisitToHost_VisitsOutsideRange) { + base::Time begin_time = base::Time::Now(); + base::Time end_time = begin_time + base::TimeDelta::FromHours(1); + + VisitRow row1{AddURL(URLRow(GURL("https://www.chromium.org"))), + begin_time - base::TimeDelta::FromHours(1), + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row1, SOURCE_BROWSED); + VisitRow row2{AddURL(URLRow(GURL("https://www.chromium.org"))), + end_time + base::TimeDelta::FromHours(1), + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row2, SOURCE_BROWSED); + + base::Time last_visit; + EXPECT_TRUE(GetLastVisitToHost(GURL("https://www.chromium.org"), begin_time, + end_time, &last_visit)); + EXPECT_EQ(last_visit, base::Time()); +} + +TEST_F(VisitDatabaseTest, GetLastVisitToHost_EndTimeNotIncluded) { + base::Time begin_time = base::Time::Now(); + base::Time end_time = begin_time + base::TimeDelta::FromHours(1); + + VisitRow row1{AddURL(URLRow(GURL("https://www.chromium.org"))), + begin_time, + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row1, SOURCE_BROWSED); + VisitRow row2{AddURL(URLRow(GURL("https://www.chromium.org"))), + end_time, + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row2, SOURCE_BROWSED); + + base::Time last_visit; + EXPECT_TRUE(GetLastVisitToHost(GURL("https://www.chromium.org"), begin_time, + end_time, &last_visit)); + EXPECT_EQ(last_visit, begin_time); +} + +TEST_F(VisitDatabaseTest, GetLastVisitToHost_SameOriginOnly) { + base::Time begin_time = base::Time::Now(); + base::Time end_time = begin_time + base::TimeDelta::FromHours(1); + + VisitRow row1{AddURL(URLRow(GURL("https://other.origin.chromium.org"))), + begin_time, + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row1, SOURCE_BROWSED); + VisitRow row2{AddURL(URLRow(GURL("https://www.chromium.org/path?query=foo"))), + begin_time + base::TimeDelta::FromMinutes(1), + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row2, SOURCE_BROWSED); + + base::Time last_visit; + EXPECT_TRUE(GetLastVisitToHost(GURL("https://www.chromium.org"), begin_time, + end_time, &last_visit)); + EXPECT_EQ(last_visit, begin_time + base::TimeDelta::FromMinutes(1)); +} + +TEST_F(VisitDatabaseTest, GetLastVisitToHost_MostRecentVisitTime) { + base::Time begin_time = base::Time::Now(); + base::Time end_time = begin_time + base::TimeDelta::FromHours(1); + + VisitRow row1{AddURL(URLRow(GURL("https://chromium.org/"))), + begin_time, + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row1, SOURCE_BROWSED); + VisitRow row2{AddURL(URLRow(GURL("https://www.chromium.org/"))), + begin_time + base::TimeDelta::FromMinutes(1), + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row2, SOURCE_BROWSED); + VisitRow row3{AddURL(URLRow(GURL("https://www.chromium.org/"))), + begin_time + base::TimeDelta::FromMinutes(2), + 0, + ui::PageTransitionFromInt(0), + 0, + false}; + AddVisit(&row3, SOURCE_BROWSED); + + base::Time last_visit; + EXPECT_TRUE(GetLastVisitToHost(GURL("https://www.chromium.org"), begin_time, + end_time, &last_visit)); + EXPECT_EQ(last_visit, begin_time + base::TimeDelta::FromMinutes(2)); +} + TEST_F(VisitDatabaseTest, GetGoogleDomainVisitsFromSearchesInRange_NoVisits) { const auto begin_time = base::Time::Now(); EXPECT_THAT(GetGoogleDomainVisitsFromSearchesInRange(
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java index 9590cbc1..36aedb3c 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
@@ -77,6 +77,7 @@ public boolean promoteOrigin; public boolean canRename; public boolean ignoreVisuals; + public double contentQualityScore; // Content Metadata. public long totalSizeBytes; @@ -134,6 +135,7 @@ clone.mimeType = mimeType; clone.canRename = canRename; clone.ignoreVisuals = ignoreVisuals; + clone.contentQualityScore = contentQualityScore; clone.pageUrl = pageUrl; clone.originalUrl = originalUrl; clone.isOffTheRecord = isOffTheRecord;
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java index e4412030..d46d7da 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
@@ -54,7 +54,7 @@ @FailState int failState, @PendingState int pendingState, boolean isResumable, boolean allowMetered, long receivedBytes, long progressValue, long progressMax, @OfflineItemProgressUnit int progressUnit, long timeRemainingMs, boolean isDangerous, - boolean canRename, boolean ignoreVisuals) { + boolean canRename, boolean ignoreVisuals, double contentQualityScore) { OfflineItem item = new OfflineItem(); item.id.namespace = nameSpace; item.id.id = id; @@ -88,6 +88,7 @@ item.isDangerous = isDangerous; item.canRename = canRename; item.ignoreVisuals = ignoreVisuals; + item.contentQualityScore = contentQualityScore; if (list != null) list.add(item); return item; }
diff --git a/components/offline_items_collection/core/android/offline_item_bridge.cc b/components/offline_items_collection/core/android/offline_item_bridge.cc index 545313e..6d1b7cf 100644 --- a/components/offline_items_collection/core/android/offline_item_bridge.cc +++ b/components/offline_items_collection/core/android/offline_item_bridge.cc
@@ -45,7 +45,8 @@ item.is_resumable, item.allow_metered, item.received_bytes, item.progress.value, item.progress.max.value_or(-1), static_cast<jint>(item.progress.unit), item.time_remaining_ms, - item.is_dangerous, item.can_rename, item.ignore_visuals); + item.is_dangerous, item.can_rename, item.ignore_visuals, + item.content_quality_score); } } // namespace
diff --git a/components/offline_items_collection/core/offline_item.cc b/components/offline_items_collection/core/offline_item.cc index a779105..69aa4154 100644 --- a/components/offline_items_collection/core/offline_item.cc +++ b/components/offline_items_collection/core/offline_item.cc
@@ -46,6 +46,7 @@ promote_origin(false), can_rename(false), ignore_visuals(false), + content_quality_score(0), total_size_bytes(0), externally_removed(false), is_openable(false), @@ -77,6 +78,7 @@ promote_origin == offline_item.promote_origin && can_rename == offline_item.can_rename && ignore_visuals == offline_item.ignore_visuals && + content_quality_score == offline_item.content_quality_score && total_size_bytes == offline_item.total_size_bytes && externally_removed == offline_item.externally_removed && creation_time == offline_item.creation_time &&
diff --git a/components/offline_items_collection/core/offline_item.h b/components/offline_items_collection/core/offline_item.h index d7d08166..42c5eb59 100644 --- a/components/offline_items_collection/core/offline_item.h +++ b/components/offline_items_collection/core/offline_item.h
@@ -128,6 +128,11 @@ // information. bool ignore_visuals; + // A score in the range of 0 to 1.0 showing how relevant the content is for + // the user. Higher score is an indication that the item will be ranked higher + // in the UI surfaces. + double content_quality_score; + // TODO(dtrainor): Build out custom per-item icon support. // Content Metadata.
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 648d5f8..ca2a2234 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -78,6 +78,8 @@ "export/password_csv_writer.h", "export/password_manager_exporter.cc", "export/password_manager_exporter.h", + "field_info_table.cc", + "field_info_table.h", "form_fetcher.h", "form_fetcher_impl.cc", "form_fetcher_impl.h", @@ -506,6 +508,7 @@ "export/csv_writer_unittest.cc", "export/password_csv_writer_unittest.cc", "export/password_manager_exporter_unittest.cc", + "field_info_table_unittest.cc", "form_fetcher_impl_unittest.cc", "form_saver_impl_unittest.cc", "generation/password_generator_unittest.cc",
diff --git a/components/password_manager/core/browser/field_info_table.cc b/components/password_manager/core/browser/field_info_table.cc new file mode 100644 index 0000000..1e44af7 --- /dev/null +++ b/components/password_manager/core/browser/field_info_table.cc
@@ -0,0 +1,128 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/field_info_table.h" + +#include "components/password_manager/core/browser/sql_table_builder.h" +#include "sql/database.h" +#include "sql/statement.h" + +namespace password_manager { + +namespace { + +constexpr char kFieldInfoTableName[] = "field_info"; + +// Represents columns of the FieldInfoTable. Used with SQL queries that use all +// the columns. +enum class FieldInfoTableColumn { + kFormSignature, + kFieldSignature, + kFieldType, + kCreateTime, +}; + +// Casts the field info table column enum to its integer value. +int GetColumnNumber(FieldInfoTableColumn column) { + return static_cast<int>(column); +} + +// Teaches |builder| about the different DB schemes in different versions. +void InitializeFieldInfoBuilder(SQLTableBuilder* builder) { + // Version 0. + builder->AddColumnToUniqueKey("form_signature", "INTEGER NOT NULL"); + builder->AddColumnToUniqueKey("field_signature", "INTEGER NOT NULL"); + builder->AddColumn("field_type", "INTEGER NOT NULL"); + builder->AddColumn("create_time", "INTEGER NOT NULL"); + builder->AddIndex("field_info_index", {"form_signature", "field_signature"}); + builder->SealVersion(); +} + +// Returns a FieldInfo vector from the SQL statement. +std::vector<FieldInfo> StatementToFieldInfo(sql::Statement* s) { + std::vector<FieldInfo> results; + while (s->Step()) { + results.emplace_back(); + results.back().form_signature = + s->ColumnInt64(GetColumnNumber(FieldInfoTableColumn::kFormSignature)); + results.back().field_signature = + s->ColumnInt(GetColumnNumber(FieldInfoTableColumn::kFieldSignature)); + results.back().field_type = static_cast<autofill::ServerFieldType>( + s->ColumnInt(GetColumnNumber(FieldInfoTableColumn::kFieldType))); + results.back().create_time = base::Time::FromDeltaSinceWindowsEpoch( + (base::TimeDelta::FromMicroseconds(s->ColumnInt64( + GetColumnNumber(FieldInfoTableColumn::kCreateTime))))); + } + return results; +} + +} // namespace + +bool operator==(const FieldInfo& lhs, const FieldInfo& rhs) { + return lhs.form_signature == rhs.form_signature && + lhs.field_signature == rhs.field_signature && + lhs.field_type == rhs.field_type && lhs.create_time == rhs.create_time; +} + +void FieldInfoTable::Init(sql::Database* db) { + db_ = db; +} + +bool FieldInfoTable::CreateTableIfNecessary() { + if (db_->DoesTableExist(kFieldInfoTableName)) + return true; + SQLTableBuilder builder(kFieldInfoTableName); + InitializeFieldInfoBuilder(&builder); + return builder.CreateTable(db_); +} + +bool FieldInfoTable::AddRow(const FieldInfo& field) { + sql::Statement s(db_->GetCachedStatement( + SQL_FROM_HERE, + "INSERT OR IGNORE INTO field_info " + "(form_signature, field_signature, field_type, create_time) " + "VALUES (?, ?, ?, ?)")); + s.BindInt64(GetColumnNumber(FieldInfoTableColumn::kFormSignature), + field.form_signature); + s.BindInt(GetColumnNumber(FieldInfoTableColumn::kFieldSignature), + field.field_signature); + s.BindInt(GetColumnNumber(FieldInfoTableColumn::kFieldType), + field.field_type); + s.BindInt64(GetColumnNumber(FieldInfoTableColumn::kCreateTime), + field.create_time.ToDeltaSinceWindowsEpoch().InMicroseconds()); + return s.Run(); +} + +bool FieldInfoTable::RemoveRowsByTime(base::Time remove_begin, + base::Time remove_end) { + sql::Statement s( + db_->GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM field_info WHERE " + "create_time >= ? AND create_time < ?")); + s.BindInt64(0, remove_begin.ToDeltaSinceWindowsEpoch().InMicroseconds()); + s.BindInt64(1, remove_end.ToDeltaSinceWindowsEpoch().InMicroseconds()); + return s.Run(); +} + +std::vector<FieldInfo> FieldInfoTable::GetAllRows() { + sql::Statement s(db_->GetCachedStatement( + SQL_FROM_HERE, + "SELECT form_signature, field_signature, field_type, create_time FROM " + "field_info")); + return StatementToFieldInfo(&s); +} + +// Returns all FieldInfo from the database which have |form_signature|. +std::vector<FieldInfo> FieldInfoTable::GetAllRowsForFormSignature( + uint64_t form_signature) { + sql::Statement s( + db_->GetCachedStatement(SQL_FROM_HERE, + "SELECT form_signature, field_signature, " + "field_type, create_time FROM field_info " + "WHERE form_signature = ?")); + s.BindInt64(0, form_signature); + return StatementToFieldInfo(&s); +} + +} // namespace password_manager
diff --git a/components/password_manager/core/browser/field_info_table.h b/components/password_manager/core/browser/field_info_table.h new file mode 100644 index 0000000..1284501 --- /dev/null +++ b/components/password_manager/core/browser/field_info_table.h
@@ -0,0 +1,62 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_FIELD_INFO_TABLE_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_FIELD_INFO_TABLE_H_ + +#include "base/macros.h" +#include "base/time/time.h" +#include "components/autofill/core/browser/field_types.h" + +namespace sql { +class Database; +} + +namespace password_manager { + +struct FieldInfo { + uint64_t form_signature = 0u; + uint32_t field_signature = 0u; + autofill::ServerFieldType field_type = autofill::UNKNOWN_TYPE; + // The date when the record was created. + base::Time create_time; +}; + +bool operator==(const FieldInfo& lhs, const FieldInfo& rhs); + +class FieldInfoTable { + public: + FieldInfoTable() = default; + ~FieldInfoTable() = default; + + // Initializes |db_|. + void Init(sql::Database* db); + + // Creates the table if it doesn't exist. Returns true if the table already + // exists or was created successfully. + bool CreateTableIfNecessary(); + + // Adds information about the field. Returns true if the SQL completed + // successfully. + bool AddRow(const FieldInfo& field); + + // Removes all records created between |remove_begin| inclusive and + // |remove_end| exclusive. + bool RemoveRowsByTime(base::Time remove_begin, base::Time remove_end); + + // Returns all FieldInfo from the database. + std::vector<FieldInfo> GetAllRows(); + + // Returns all FieldInfo from the database which have |form_signature|. + std::vector<FieldInfo> GetAllRowsForFormSignature(uint64_t form_signature); + + private: + sql::Database* db_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FieldInfoTable); +}; + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_FIELD_INFO_TABLE_H_
diff --git a/components/password_manager/core/browser/field_info_table_unittest.cc b/components/password_manager/core/browser/field_info_table_unittest.cc new file mode 100644 index 0000000..1a8991b --- /dev/null +++ b/components/password_manager/core/browser/field_info_table_unittest.cc
@@ -0,0 +1,96 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/field_info_table.h" + +#include <vector> + +#include "base/files/scoped_temp_dir.h" +#include "components/autofill/core/browser/field_types.h" +#include "sql/database.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using autofill::PASSWORD; +using autofill::SINGLE_USERNAME; +using autofill::USERNAME; +using base::Time; +using testing::ElementsAre; + +namespace password_manager { +namespace { + +class FieldInfoTableTest : public testing::Test { + protected: + void SetUp() override { + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + ReloadDatabase(); + } + + void ReloadDatabase() { + base::FilePath file = temp_dir_.GetPath().AppendASCII("TestDatabase"); + db_ = std::make_unique<FieldInfoTable>(); + connection_ = std::make_unique<sql::Database>(); + connection_->set_exclusive_locking(); + ASSERT_TRUE(connection_->Open(file)); + db_->Init(connection_.get()); + ASSERT_TRUE(db_->CreateTableIfNecessary()); + + test_data_.push_back({101u, 1u, USERNAME, Time::FromTimeT(1)}); + test_data_.push_back({101u, 10u, PASSWORD, Time::FromTimeT(5)}); + test_data_.push_back({102u, 1u, SINGLE_USERNAME, Time::FromTimeT(10)}); + } + + base::ScopedTempDir temp_dir_; + std::unique_ptr<sql::Database> connection_; + std::unique_ptr<FieldInfoTable> db_; + std::vector<FieldInfo> test_data_; +}; + +TEST_F(FieldInfoTableTest, AddRow) { + EXPECT_TRUE(db_->AddRow(test_data_[0])); + EXPECT_EQ(test_data_[0], db_->GetAllRows()[0]); +} + +TEST_F(FieldInfoTableTest, Reload) { + EXPECT_TRUE(db_->AddRow(test_data_[0])); + ReloadDatabase(); + EXPECT_EQ(test_data_[0], db_->GetAllRows()[0]); +} + +TEST_F(FieldInfoTableTest, AddManyRow) { + for (const FieldInfo& field : test_data_) + EXPECT_TRUE(db_->AddRow(field)); + EXPECT_EQ(test_data_, db_->GetAllRows()); +} + +TEST_F(FieldInfoTableTest, RemoveRowsByTime) { + for (const FieldInfo& field : test_data_) + EXPECT_TRUE(db_->AddRow(field)); + db_->RemoveRowsByTime(Time::FromTimeT(1), Time::FromTimeT(10)); + std::vector<FieldInfo> expected_rows = {test_data_[2]}; + EXPECT_EQ(expected_rows, db_->GetAllRows()); +} + +TEST_F(FieldInfoTableTest, GetAllRowsForFormSignature) { + for (const FieldInfo& field : test_data_) + EXPECT_TRUE(db_->AddRow(field)); + + constexpr uint64_t kFirstFormSignature = 101u; + constexpr uint64_t kSecondFormSignature = 102u; + constexpr uint64_t kNotExistingSignature = 1001; + + std::vector<FieldInfo> expected_rows = {test_data_[0], test_data_[1]}; + EXPECT_EQ(expected_rows, + db_->GetAllRowsForFormSignature(kFirstFormSignature)); + + expected_rows = {test_data_[2]}; + EXPECT_EQ(expected_rows, + db_->GetAllRowsForFormSignature(kSecondFormSignature)); + + EXPECT_TRUE(db_->GetAllRowsForFormSignature(kNotExistingSignature).empty()); +} + +} // namespace +} // namespace password_manager
diff --git a/components/password_manager/core/browser/manage_passwords_referrer.h b/components/password_manager/core/browser/manage_passwords_referrer.h index ce50c46..2420893 100644 --- a/components/password_manager/core/browser/manage_passwords_referrer.h +++ b/components/password_manager/core/browser/manage_passwords_referrer.h
@@ -32,9 +32,12 @@ kProfileChooser = 5, // Corresponds to the passwords accessory sheet on Android, triggered by // tapping on the key icon above in the keyboard accessory bar. - // Only used on Android + // Only used on Android. kPasswordsAccessorySheet = 6, - kMaxValue = kPasswordsAccessorySheet, + // Corresponds to the touch to fill bottom sheet that replaces the dropdown. + // Only used on Android. + kTouchToFill = 7, + kMaxValue = kTouchToFill, }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc index 89e52f9..81a9355b 100644 --- a/components/password_manager/core/browser/password_form_manager.cc +++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -344,9 +344,6 @@ metrics_recorder_->SetSubmissionIndicatorEvent( parsed_submitted_form_->submission_event); - std::unique_ptr<PasswordForm> parsed_observed_form = - parser_.Parse(observed_form_, FormDataParser::Mode::kFilling); - base::string16 password_to_save = pending_credentials_.password_value; bool skip_zero_click = pending_credentials_.skip_zero_click; pending_credentials_ = credentials_to_update;
diff --git a/components/policy/core/browser/BUILD.gn b/components/policy/core/browser/BUILD.gn index bf4ee73..36497d4 100644 --- a/components/policy/core/browser/BUILD.gn +++ b/components/policy/core/browser/BUILD.gn
@@ -55,7 +55,6 @@ ] deps = [ "//base/third_party/dynamic_annotations", - "//components/bookmarks/managed", "//components/google/core/common", "//components/keyed_service/core", "//components/pref_registry",
diff --git a/components/policy/core/browser/DEPS b/components/policy/core/browser/DEPS index c2ed8c6..c661ce4 100644 --- a/components/policy/core/browser/DEPS +++ b/components/policy/core/browser/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+components/bookmarks", "+components/google/core", "+components/pref_registry", "+components/proxy_config",
diff --git a/components/policy/core/common/BUILD.gn b/components/policy/core/common/BUILD.gn index 2f22a67..ea7e0ed 100644 --- a/components/policy/core/common/BUILD.gn +++ b/components/policy/core/common/BUILD.gn
@@ -31,6 +31,7 @@ "async_policy_provider.h", "chrome_schema.cc", "chrome_schema.h", + "cloud/chrome_browser_cloud_management_metrics.h", "cloud/cloud_external_data_manager.cc", "cloud/cloud_external_data_manager.h", "cloud/cloud_policy_client.cc", @@ -71,7 +72,6 @@ "cloud/external_policy_data_updater.h", "cloud/machine_level_user_cloud_policy_manager.cc", "cloud/machine_level_user_cloud_policy_manager.h", - "cloud/machine_level_user_cloud_policy_metrics.h", "cloud/machine_level_user_cloud_policy_store.cc", "cloud/machine_level_user_cloud_policy_store.h", "cloud/policy_value_validator.h", @@ -229,11 +229,11 @@ "proxy_policy_provider.h", ] sources -= [ + "cloud/chrome_browser_cloud_management_metrics.h", "cloud/cloud_policy_client_registration_helper.cc", "cloud/cloud_policy_client_registration_helper.h", "cloud/machine_level_user_cloud_policy_manager.cc", "cloud/machine_level_user_cloud_policy_manager.h", - "cloud/machine_level_user_cloud_policy_metrics.h", "cloud/machine_level_user_cloud_policy_store.cc", "cloud/machine_level_user_cloud_policy_store.h", "cloud/user_cloud_policy_manager.cc",
diff --git a/components/policy/core/common/cloud/machine_level_user_cloud_policy_metrics.h b/components/policy/core/common/cloud/chrome_browser_cloud_management_metrics.h similarity index 61% rename from components/policy/core/common/cloud/machine_level_user_cloud_policy_metrics.h rename to components/policy/core/common/cloud/chrome_browser_cloud_management_metrics.h index 8423d0db..62ffe00 100644 --- a/components/policy/core/common/cloud/machine_level_user_cloud_policy_metrics.h +++ b/components/policy/core/common/cloud/chrome_browser_cloud_management_metrics.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_POLICY_CORE_COMMON_CLOUD_MACHINE_LEVEL_USER_CLOUD_POLICY_METRICS_H_ -#define COMPONENTS_POLICY_CORE_COMMON_CLOUD_MACHINE_LEVEL_USER_CLOUD_POLICY_METRICS_H_ +#ifndef COMPONENTS_POLICY_CORE_COMMON_CLOUD_CHROME_BROWSER_CLOUD_MANAGEMENT_METRICS_H_ +#define COMPONENTS_POLICY_CORE_COMMON_CLOUD_CHROME_BROWSER_CLOUD_MANAGEMENT_METRICS_H_ namespace policy { // This enum is used for recording the metrics. It must match the // MachineLevelUserCloudPolicyEnrollmentResult in enums.xml and should not be // reordered. |kMaxValue| must be assigned to the last entry of the enum. -enum class MachineLevelUserCloudPolicyEnrollmentResult { +enum class ChromeBrowserCloudManagementEnrollmentResult { kSuccess = 0, kFailedToFetch = 1, kFailedToStore = 2, @@ -19,4 +19,4 @@ } // namespace policy -#endif // COMPONENTS_POLICY_CORE_COMMON_CLOUD_MACHINE_LEVEL_USER_CLOUD_POLICY_METRICS_H_ +#endif // COMPONENTS_POLICY_CORE_COMMON_CLOUD_CHROME_BROWSER_CLOUD_MANAGEMENT_METRICS_H_
diff --git a/components/policy/core/common/cloud/cloud_policy_util.cc b/components/policy/core/common/cloud/cloud_policy_util.cc index dba3f8b..29bbb82 100644 --- a/components/policy/core/common/cloud/cloud_policy_util.cc +++ b/components/policy/core/common/cloud/cloud_policy_util.cc
@@ -164,7 +164,7 @@ auto* user = user_manager::UserManager::Get()->GetPrimaryUser(); if (!user) return std::string(); - return user->GetAccountName(/*use_display_email=*/false); + return user->GetAccountId().GetUserEmail(); #else NOTREACHED(); return std::string();
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 0e0a95fb..35d1026d 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -5815,7 +5815,7 @@ 'owners': ['file://components/policy/resources/OWNERS'], 'type': 'int', 'schema': { 'type': 'integer' }, - 'supported_on': ['chrome_os:11-'], + 'supported_on': ['chrome_os:11-', 'chrome.*:79-'], 'features': { 'dynamic_refresh': True, 'per_profile': True,
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc index 66d7f41188..c0d9d7b5 100644 --- a/components/safe_browsing/features.cc +++ b/components/safe_browsing/features.cc
@@ -39,7 +39,7 @@ "SafeBrowsingCommittedInterstitials", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kDeepScanningOfDownloads{ - "SafeBrowsingDeepScanningOfDownloads", base::FEATURE_ENABLED_BY_DEFAULT}; + "SafeBrowsingDeepScanningOfDownloads", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kForceUseAPDownloadProtection{ "ForceUseAPDownloadProtection", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/security_state/content/BUILD.gn b/components/security_state/content/BUILD.gn index 496816b..847b81ce 100644 --- a/components/security_state/content/BUILD.gn +++ b/components/security_state/content/BUILD.gn
@@ -13,6 +13,7 @@ ] public_deps = [ + "//components/security_interstitials/core", "//components/security_state/core", ]
diff --git a/components/security_state/content/DEPS b/components/security_state/content/DEPS index 42cbf7e..ab71ccee 100644 --- a/components/security_state/content/DEPS +++ b/components/security_state/content/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+components/strings", + "+components/security_interstitials/core", "+content/public/browser", "+content/public/common", "+content/public/test",
diff --git a/components/security_state/content/content_utils.cc b/components/security_state/content/content_utils.cc index 8db5d74..4f39d71 100644 --- a/components/security_state/content/content_utils.cc +++ b/components/security_state/content/content_utils.cc
@@ -12,6 +12,7 @@ #include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "components/security_interstitials/core/common_string_util.h" #include "components/security_state/content/ssl_status_input_event_data.h" #include "components/security_state/core/security_state.h" #include "components/strings/grit/components_chromium_strings.h" @@ -66,8 +67,12 @@ // summary for the page and add a bullet describing the issue. if (security_level == security_state::DANGEROUS && !security_state::IsSchemeCryptographic(visible_security_state.url)) { - security_style_explanations->summary = - l10n_util::GetStringUTF8(IDS_HTTP_NONSECURE_SUMMARY); + // Only change the summary if it's empty to avoid overwriting summaries + // from SafeBrowsing or Safety Tips. + if (security_style_explanations->summary.empty()) { + security_style_explanations->summary = + l10n_util::GetStringUTF8(IDS_HTTP_NONSECURE_SUMMARY); + } if (visible_security_state.insecure_input_events.insecure_field_edited) { security_style_explanations->insecure_explanations.push_back( content::SecurityStyleExplanation( @@ -287,11 +292,11 @@ content::SecurityStyleExplanations* security_style_explanations) { std::vector<content::SecurityStyleExplanation> explanations; - switch (visible_security_state.safety_tip_status) { + switch (visible_security_state.safety_tip_info.status) { case security_state::SafetyTipStatus::kBadReputation: explanations.emplace_back( l10n_util::GetStringUTF8( - IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_TITLE), + IDS_SECURITY_TAB_SAFETY_TIP_BAD_REPUTATION_SUMMARY), l10n_util::GetStringUTF8( IDS_SECURITY_TAB_SAFETY_TIP_BAD_REPUTATION_DESCRIPTION)); break; @@ -300,8 +305,10 @@ explanations.emplace_back( l10n_util::GetStringUTF8( IDS_SECURITY_TAB_SAFETY_TIP_LOOKALIKE_SUMMARY), - l10n_util::GetStringUTF8( - IDS_SECURITY_TAB_SAFETY_TIP_LOOKALIKE_DESCRIPTION)); + l10n_util::GetStringFUTF8( + IDS_SECURITY_TAB_SAFETY_TIP_LOOKALIKE_DESCRIPTION, + security_interstitials::common_string_util::GetFormattedHostName( + visible_security_state.safety_tip_info.safe_url))); break; case security_state::SafetyTipStatus::kBadKeyword: @@ -318,8 +325,8 @@ // it's empty. The title set here can be overridden by later checks (e.g. // bad HTTP). if (security_style_explanations->summary.empty()) { - security_style_explanations->summary = l10n_util::GetStringUTF8( - IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_TITLE); + security_style_explanations->summary = + l10n_util::GetStringUTF8(IDS_SECURITY_TAB_SAFETY_TIP_TITLE); } DCHECK_EQ(1u, explanations.size()); security_style_explanations->insecure_explanations.push_back(
diff --git a/components/security_state/content/content_utils_unittest.cc b/components/security_state/content/content_utils_unittest.cc index f94454f9..d10ae45 100644 --- a/components/security_state/content/content_utils_unittest.cc +++ b/components/security_state/content/content_utils_unittest.cc
@@ -655,7 +655,7 @@ // Tests that a bad reputation warning in VisibleSecurityState causes an // insecure explanation to be set. -TEST(SecurityStateContentUtilsTest, SafetyTipExplanation) { +TEST(SecurityStateContentUtilsTest, SafetyTipExplanation_BadReputation) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature( security_state::features::kSafetyTipUI); @@ -665,16 +665,46 @@ visible_security_state.url = GURL("https://scheme-is-cryptographic.test"); visible_security_state.malicious_content_status = security_state::MALICIOUS_CONTENT_STATUS_NONE; - visible_security_state.safety_tip_status = - security_state::SafetyTipStatus::kBadReputation; + visible_security_state.safety_tip_info = { + security_state::SafetyTipStatus::kBadReputation, GURL()}; content::SecurityStyleExplanations explanations; GetSecurityStyle(security_state::WARNING, visible_security_state, &explanations); - EXPECT_EQ( - l10n_util::GetStringUTF8(IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_TITLE), - explanations.summary); + EXPECT_EQ(l10n_util::GetStringUTF8(IDS_SECURITY_TAB_SAFETY_TIP_TITLE), + explanations.summary); EXPECT_EQ(1u, explanations.insecure_explanations.size()); + EXPECT_EQ(l10n_util::GetStringUTF8( + IDS_SECURITY_TAB_SAFETY_TIP_BAD_REPUTATION_DESCRIPTION), + explanations.insecure_explanations[0].description); +} + +// Same as SafetyTipExplanation_BadReputation, but for lookalikes. Also checks +// that the explanation text contains the safe URL. +TEST(SecurityStateContentUtilsTest, SafetyTipExplanation_Lookalike) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + security_state::features::kSafetyTipUI); + + security_state::VisibleSecurityState visible_security_state; + visible_security_state.cert_status = 0; + visible_security_state.url = GURL("https://lookalike.test"); + visible_security_state.malicious_content_status = + security_state::MALICIOUS_CONTENT_STATUS_NONE; + visible_security_state.safety_tip_info = { + security_state::SafetyTipStatus::kLookalike, + GURL("http://good-site.test")}; + content::SecurityStyleExplanations explanations; + GetSecurityStyle(security_state::WARNING, visible_security_state, + &explanations); + + EXPECT_EQ(l10n_util::GetStringUTF8(IDS_SECURITY_TAB_SAFETY_TIP_TITLE), + explanations.summary); + EXPECT_EQ(1u, explanations.insecure_explanations.size()); + EXPECT_EQ(l10n_util::GetStringFUTF8( + IDS_SECURITY_TAB_SAFETY_TIP_LOOKALIKE_DESCRIPTION, + base::ASCIIToUTF16("good-site.test")), + explanations.insecure_explanations[0].description); } // Tests that a Safebrowsing warning and a bad reputation warning in @@ -691,8 +721,8 @@ visible_security_state.url = GURL("https://scheme-is-cryptographic.test"); visible_security_state.malicious_content_status = security_state::MALICIOUS_CONTENT_STATUS_MALWARE; - visible_security_state.safety_tip_status = - security_state::SafetyTipStatus::kBadReputation; + visible_security_state.safety_tip_info = { + security_state::SafetyTipStatus::kBadReputation, GURL()}; content::SecurityStyleExplanations explanations; GetSecurityStyle(security_state::DANGEROUS, visible_security_state, &explanations); @@ -704,9 +734,9 @@ EXPECT_EQ(2u, explanations.insecure_explanations.size()); EXPECT_EQ(l10n_util::GetStringUTF8(IDS_SAFEBROWSING_WARNING_SUMMARY), explanations.insecure_explanations[0].summary); - EXPECT_EQ( - l10n_util::GetStringUTF8(IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_TITLE), - explanations.insecure_explanations[1].summary); + EXPECT_EQ(l10n_util::GetStringUTF8( + IDS_SECURITY_TAB_SAFETY_TIP_BAD_REPUTATION_SUMMARY), + explanations.insecure_explanations[1].summary); } // Tests that a Safebrowsing warning and safety tip status of None in @@ -722,8 +752,8 @@ visible_security_state.url = GURL("https://scheme-is-cryptographic.test"); visible_security_state.malicious_content_status = security_state::MALICIOUS_CONTENT_STATUS_MALWARE; - visible_security_state.safety_tip_status = - security_state::SafetyTipStatus::kNone; + visible_security_state.safety_tip_info = { + security_state::SafetyTipStatus::kNone, GURL()}; content::SecurityStyleExplanations explanations; GetSecurityStyle(security_state::DANGEROUS, visible_security_state, &explanations);
diff --git a/components/security_state/core/security_state.cc b/components/security_state/core/security_state.cc index a99385f..69d0d29f 100644 --- a/components/security_state/core/security_state.cc +++ b/components/security_state/core/security_state.cc
@@ -194,7 +194,7 @@ // Downgrade the security level for pages that trigger a Safety Tip. SecurityLevel safety_tip_level; if (ShouldSetSecurityLevelFromSafetyTip( - visible_security_state.safety_tip_status, &safety_tip_level)) { + visible_security_state.safety_tip_info.status, &safety_tip_level)) { return safety_tip_level; } @@ -250,7 +250,6 @@ VisibleSecurityState::VisibleSecurityState() : malicious_content_status(MALICIOUS_CONTENT_STATUS_NONE), - safety_tip_status(security_state::SafetyTipStatus::kUnknown), connection_info_initialized(false), cert_status(0), connection_status(0),
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h index 93cf88101..8772e62 100644 --- a/components/security_state/core/security_state.h +++ b/components/security_state/core/security_state.h
@@ -129,6 +129,16 @@ kMaxValue = kBadKeyword, }; +// Information about the last safety tip shown in the UI. This is used in page +// info and security tab (in devtools) to give more information about the safety +// tip. +struct SafetyTipInfo { + SafetyTipStatus status = SafetyTipStatus::kUnknown; + // The URL the safety tip suggested ("Did you mean?"). Only filled in for + // lookalike matches. + GURL safe_url; +}; + // Contains the security state relevant to computing the SecurityLevel // for a page. This is the input to GetSecurityLevel(). struct VisibleSecurityState { @@ -142,7 +152,7 @@ // field will be set even if the Safety Tip UI was not actually shown due to // the feature being disabled (so that this field can be used to record // metrics independent of whether the UI actually showed). - SafetyTipStatus safety_tip_status; + SafetyTipInfo safety_tip_info; // CONNECTION SECURITY FIELDS // Whether the connection security fields are initialized.
diff --git a/components/security_state/core/security_state_unittest.cc b/components/security_state/core/security_state_unittest.cc index 6579081..e155a46 100644 --- a/components/security_state/core/security_state_unittest.cc +++ b/components/security_state/core/security_state_unittest.cc
@@ -61,7 +61,7 @@ is_error_page_(false), is_view_source_(false), has_policy_certificate_(false), - safety_tip_status_(security_state::SafetyTipStatus::kUnknown) {} + safety_tip_info_({security_state::SafetyTipStatus::kUnknown, GURL()}) {} virtual ~TestSecurityStateHelper() {} void SetCertificate(scoped_refptr<net::X509Certificate> cert) { @@ -109,7 +109,7 @@ void set_safety_tip_status( security_state::SafetyTipStatus safety_tip_status) { - safety_tip_status_ = safety_tip_status; + safety_tip_info_.status = safety_tip_status; } std::unique_ptr<VisibleSecurityState> GetVisibleSecurityState() const { @@ -126,7 +126,7 @@ state->is_error_page = is_error_page_; state->is_view_source = is_view_source_; state->insecure_input_events = insecure_input_events_; - state->safety_tip_status = safety_tip_status_; + state->safety_tip_info = safety_tip_info_; return state; } @@ -153,7 +153,7 @@ bool is_view_source_; bool has_policy_certificate_; InsecureInputEventData insecure_input_events_; - security_state::SafetyTipStatus safety_tip_status_; + security_state::SafetyTipInfo safety_tip_info_; }; } // namespace
diff --git a/components/security_state_strings.grdp b/components/security_state_strings.grdp index cf27ac32..61654e0 100644 --- a/components/security_state_strings.grdp +++ b/components/security_state_strings.grdp
@@ -143,9 +143,11 @@ </message> <!-- Safety tips --> - - <message name="IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_SUMMARY" desc="Message to display in devtools security tab when the page you are on triggered a safety tip."> - This page is suspicious. + <message name="IDS_SECURITY_TAB_SAFETY_TIP_TITLE" desc="Title of the devtools security tab when the page you are on triggered a safety tip."> + This page is suspicious (flagged by Chrome). + </message> + <message name="IDS_SECURITY_TAB_SAFETY_TIP_BAD_REPUTATION_SUMMARY" desc="Message to display in devtools security tab when the page you are on triggered a safety tip."> + This page is suspicious </message> <message name="IDS_SECURITY_TAB_SAFETY_TIP_BAD_REPUTATION_DESCRIPTION" desc="Body of message to display in devtools security tab when you are viewing a page that
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index 3a3dded..549c5a1 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -314,6 +314,8 @@ "nigori/cryptographer_impl.h", "nigori/forwarding_model_type_processor.cc", "nigori/forwarding_model_type_processor.h", + "nigori/keystore_keys_cryptographer.cc", + "nigori/keystore_keys_cryptographer.h", "nigori/keystore_keys_handler.h", "nigori/nigori.cc", "nigori/nigori.h",
diff --git a/components/sync/nigori/DEPS b/components/sync/nigori/DEPS index c2ee8b4..d7025ebb 100644 --- a/components/sync/nigori/DEPS +++ b/components/sync/nigori/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+components/sync/base", "+components/sync/engine", + "+components/sync/engine_impl", "+components/sync/model", "+components/sync/model_impl", "+components/sync/protocol",
diff --git a/components/sync/nigori/keystore_keys_cryptographer.cc b/components/sync/nigori/keystore_keys_cryptographer.cc new file mode 100644 index 0000000..5c773db --- /dev/null +++ b/components/sync/nigori/keystore_keys_cryptographer.cc
@@ -0,0 +1,111 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync/nigori/keystore_keys_cryptographer.h" + +#include <utility> + +#include "base/memory/ptr_util.h" +#include "components/sync/nigori/cryptographer_impl.h" +#include "components/sync/protocol/encryption.pb.h" +#include "components/sync/protocol/nigori_specifics.pb.h" + +namespace syncer { + +namespace { + +std::unique_ptr<CryptographerImpl> CreateCryptographerFromKeystoreKeys( + const std::vector<std::string>& keystore_keys) { + std::unique_ptr<CryptographerImpl> cryptographer = + CryptographerImpl::CreateEmpty(); + + if (keystore_keys.empty()) { + return cryptographer; + } + + std::string last_key_name; + for (const std::string& key : keystore_keys) { + last_key_name = + cryptographer->EmplaceKey(key, KeyDerivationParams::CreateForPbkdf2()); + // TODO(crbug.com/922900): possible behavioral change. Old implementation + // fails only if we failed to add current keystore key. Failing to add any + // of these keys doesn't seem valid. This line seems to be a good candidate + // for UMA, as it's not a normal situation, if we fail to add any key. + if (last_key_name.empty()) { + return nullptr; + } + } + + DCHECK(!last_key_name.empty()); + cryptographer->SelectDefaultEncryptionKey(last_key_name); + + return cryptographer; +} + +} // namespace + +// static +std::unique_ptr<KeystoreKeysCryptographer> +KeystoreKeysCryptographer::CreateEmpty() { + return base::WrapUnique(new KeystoreKeysCryptographer( + CryptographerImpl::CreateEmpty(), + /*keystore_keys=*/std::vector<std::string>())); +} + +// static +std::unique_ptr<KeystoreKeysCryptographer> +KeystoreKeysCryptographer::FromKeystoreKeys( + const std::vector<std::string>& keystore_keys) { + std::unique_ptr<CryptographerImpl> cryptographer = + CreateCryptographerFromKeystoreKeys(keystore_keys); + if (!cryptographer) { + return nullptr; + } + return base::WrapUnique( + new KeystoreKeysCryptographer(std::move(cryptographer), keystore_keys)); +} + +KeystoreKeysCryptographer::KeystoreKeysCryptographer( + std::unique_ptr<CryptographerImpl> cryptographer, + const std::vector<std::string>& keystore_keys) + : cryptographer_(std::move(cryptographer)), keystore_keys_(keystore_keys) { + DCHECK(cryptographer_); +} + +KeystoreKeysCryptographer::~KeystoreKeysCryptographer() = default; + +bool KeystoreKeysCryptographer::IsEmpty() const { + return keystore_keys_.empty(); +} + +std::unique_ptr<KeystoreKeysCryptographer> KeystoreKeysCryptographer::Clone() + const { + return base::WrapUnique(new KeystoreKeysCryptographer( + cryptographer_->CloneImpl(), keystore_keys_)); +} + +std::unique_ptr<CryptographerImpl> +KeystoreKeysCryptographer::ToCryptographerImpl() const { + return cryptographer_->CloneImpl(); +} + +bool KeystoreKeysCryptographer::EncryptKeystoreDecryptorToken( + const sync_pb::NigoriKey& keystore_decryptor_key, + sync_pb::EncryptedData* keystore_decryptor_token) const { + DCHECK(keystore_decryptor_token); + if (IsEmpty()) { + return false; + } + return cryptographer_->EncryptString( + keystore_decryptor_key.SerializeAsString(), keystore_decryptor_token); +} + +bool KeystoreKeysCryptographer::DecryptKeystoreDecryptorToken( + const sync_pb::EncryptedData& keystore_decryptor_token, + sync_pb::NigoriKey* keystore_decryptor_key) const { + return cryptographer_->Decrypt(keystore_decryptor_token, + keystore_decryptor_key); +} + +} // namespace syncer
diff --git a/components/sync/nigori/keystore_keys_cryptographer.h b/components/sync/nigori/keystore_keys_cryptographer.h new file mode 100644 index 0000000..ac850bc --- /dev/null +++ b/components/sync/nigori/keystore_keys_cryptographer.h
@@ -0,0 +1,75 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_NIGORI_KEYSTORE_KEYS_CRYPTOGRAPHER_H_ +#define COMPONENTS_SYNC_NIGORI_KEYSTORE_KEYS_CRYPTOGRAPHER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/macros.h" + +namespace sync_pb { + +class EncryptedData; +class NigoriKey; + +} // namespace sync_pb + +namespace syncer { + +class CryptographerImpl; + +// Wrapper of CryptographerImpl, which contains only keystore keys and uses the +// last one as the default encryption key. +class KeystoreKeysCryptographer { + public: + // Factory methods. + static std::unique_ptr<KeystoreKeysCryptographer> CreateEmpty(); + // Returns null if crypto error occurs. + static std::unique_ptr<KeystoreKeysCryptographer> FromKeystoreKeys( + const std::vector<std::string>& keystore_keys); + + ~KeystoreKeysCryptographer(); + + const std::vector<std::string>& keystore_keys() const { + return keystore_keys_; + } + + bool IsEmpty() const; + + std::unique_ptr<KeystoreKeysCryptographer> Clone() const; + + // Returns CryptographerImpl, which contains all keystore keys and uses the + // last one as the default encryption key. + std::unique_ptr<CryptographerImpl> ToCryptographerImpl() const; + + // Encrypts |keystore_decryptor_key| into |keystore_decryptor_token|. + // |keystore_decryptor_token| must be not null. Returns false if there is no + // keystore keys or crypto error occurs. + bool EncryptKeystoreDecryptorToken( + const sync_pb::NigoriKey& keystore_decryptor_key, + sync_pb::EncryptedData* keystore_decryptor_token) const; + + // Decrypts |keystore_decryptor_token| into |keystore_decryptor_key|. + // |keystore_decryptor_key| must be not null. Returns false if can't decrypt + // or crypto error occurs. + bool DecryptKeystoreDecryptorToken( + const sync_pb::EncryptedData& keystore_decryptor_token, + sync_pb::NigoriKey* keystore_decryptor_key) const; + + private: + KeystoreKeysCryptographer(std::unique_ptr<CryptographerImpl> cryptographer, + const std::vector<std::string>& keystore_keys); + + std::unique_ptr<CryptographerImpl> cryptographer_; + std::vector<std::string> keystore_keys_; + + DISALLOW_COPY_AND_ASSIGN(KeystoreKeysCryptographer); +}; + +} // namespace syncer + +#endif // COMPONENTS_SYNC_NIGORI_KEYSTORE_KEYS_CRYPTOGRAPHER_H_
diff --git a/components/sync/nigori/nigori_local_change_processor.h b/components/sync/nigori/nigori_local_change_processor.h index fb03e80b..3f2a938 100644 --- a/components/sync/nigori/nigori_local_change_processor.h +++ b/components/sync/nigori/nigori_local_change_processor.h
@@ -69,6 +69,12 @@ virtual base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegate() = 0; + // Returns a boolean representing whether the processor's metadata is + // currently up to date and accurately tracking the model type's data. If + // false, and ModelReadyToSync() has already been called, then Put and Delete + // will no-op and can be omitted by bridge. + virtual bool IsTrackingMetadata() = 0; + private: DISALLOW_COPY_AND_ASSIGN(NigoriLocalChangeProcessor); };
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index 77ce8b2..41689a8 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -4,11 +4,13 @@ #include "components/sync/nigori/nigori_model_type_processor.h" +#include "base/metrics/histogram_macros.h" #include "base/threading/sequenced_task_runner_handle.h" #include "components/sync/base/client_tag_hash.h" #include "components/sync/base/data_type_histogram.h" #include "components/sync/base/time.h" #include "components/sync/engine/commit_queue.h" +#include "components/sync/engine_impl/conflict_resolver.h" #include "components/sync/model_impl/processor_entity.h" #include "components/sync/nigori/forwarding_model_type_processor.h" #include "components/sync/nigori/nigori_sync_bridge.h" @@ -160,8 +162,16 @@ } if (entity_->IsUnsynced()) { - // TODO(mamir): conflict resolution - NOTIMPLEMENTED(); + // Remote update always win in case of conflict, because bridge takes care + // of reapplying pending local changes after processing the remote update. + entity_->RecordForcedUpdate(*updates[0]); + error = bridge_->ApplySyncChanges(std::move(*updates[0]->entity)); + UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict", + ConflictResolution::kUseRemote, + ConflictResolution::kTypeSize); + UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict", + ConflictResolver::NIGORI_MERGE, + ConflictResolver::CONFLICT_RESOLUTION_SIZE); } else if (!entity_->MatchesData(*updates[0]->entity)) { // Inform the bridge of the new or updated data. entity_->RecordAcceptedUpdate(*updates[0]);
diff --git a/components/sync/nigori/nigori_model_type_processor.h b/components/sync/nigori/nigori_model_type_processor.h index 0121473..d2f33fb 100644 --- a/components/sync/nigori/nigori_model_type_processor.h +++ b/components/sync/nigori/nigori_model_type_processor.h
@@ -54,12 +54,11 @@ NigoriMetadataBatch GetMetadata() override; void ReportError(const ModelError& error) override; base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegate() override; + bool IsTrackingMetadata() override; bool IsConnectedForTest() const; private: - bool IsTrackingMetadata(); - // Returns true if the handshake with sync thread is complete. bool IsConnected() const;
diff --git a/components/sync/nigori/nigori_state.cc b/components/sync/nigori/nigori_state.cc index 8f9e3e9..2207c51 100644 --- a/components/sync/nigori/nigori_state.cc +++ b/components/sync/nigori/nigori_state.cc
@@ -9,6 +9,7 @@ #include "components/sync/base/time.h" #include "components/sync/engine/sync_encryption_handler.h" #include "components/sync/nigori/cryptographer_impl.h" +#include "components/sync/nigori/keystore_keys_cryptographer.h" #include "components/sync/protocol/nigori_local_data.pb.h" namespace syncer { @@ -116,54 +117,8 @@ } } -bool EncryptKeystoreDecryptorToken( - const CryptographerImpl& cryptographer, - sync_pb::EncryptedData* keystore_decryptor_token, - const std::vector<std::string>& keystore_keys) { - DCHECK(keystore_decryptor_token); - - const sync_pb::NigoriKey default_key = cryptographer.ExportDefaultKey(); - - std::unique_ptr<Cryptographer> keystore_cryptographer = - CreateCryptographerFromKeystoreKeys(keystore_keys); - if (!keystore_cryptographer) { - return false; - } - - return keystore_cryptographer->EncryptString(default_key.SerializeAsString(), - keystore_decryptor_token); -} - } // namespace -std::unique_ptr<CryptographerImpl> CreateCryptographerFromKeystoreKeys( - const std::vector<std::string>& keystore_keys) { - std::unique_ptr<CryptographerImpl> cryptographer = - CryptographerImpl::CreateEmpty(); - - if (keystore_keys.empty()) { - return cryptographer; - } - - std::string last_key_name; - for (const std::string& key : keystore_keys) { - last_key_name = - cryptographer->EmplaceKey(key, KeyDerivationParams::CreateForPbkdf2()); - // TODO(crbug.com/922900): possible behavioral change. Old implementation - // fails only if we failed to add current keystore key. Failing to add any - // of these keys doesn't seem valid. This line seems to be a good candidate - // for UMA, as it's not a normal situation, if we fail to add any key. - if (last_key_name.empty()) { - return nullptr; - } - } - - DCHECK(!last_key_name.empty()); - cryptographer->SelectDefaultEncryptionKey(last_key_name); - - return cryptographer; -} - // static NigoriState NigoriState::CreateFromLocalProto( const sync_pb::NigoriModel& proto) { @@ -187,9 +142,20 @@ proto.custom_passphrase_key_derivation_params()); } state.encrypt_everything = proto.encrypt_everything(); - for (int i = 0; i < proto.keystore_key_size(); ++i) { - state.keystore_keys.push_back(proto.keystore_key(i)); + + std::vector<std::string> keystore_keys; + for (const std::string& keystore_key : proto.keystore_key()) { + keystore_keys.push_back(keystore_key); } + state.keystore_keys_cryptographer = + KeystoreKeysCryptographer::FromKeystoreKeys(keystore_keys); + if (!state.keystore_keys_cryptographer) { + // Crypto error occurs, create empty |keystore_keys_cryptographer|. + // Effectively it resets keystore keys. + state.keystore_keys_cryptographer = + KeystoreKeysCryptographer::CreateEmpty(); + } + if (proto.has_pending_keystore_decryptor_token()) { state.pending_keystore_decryptor_token = proto.pending_keystore_decryptor_token(); @@ -200,7 +166,8 @@ NigoriState::NigoriState() : cryptographer(CryptographerImpl::CreateEmpty()), passphrase_type(kInitialPassphraseType), - encrypt_everything(kInitialEncryptEverything) {} + encrypt_everything(kInitialEncryptEverything), + keystore_keys_cryptographer(KeystoreKeysCryptographer::CreateEmpty()) {} NigoriState::NigoriState(NigoriState&& other) = default; @@ -214,6 +181,8 @@ if (pending_keys.has_value()) { *proto.mutable_pending_keys() = *pending_keys; } + const std::vector<std::string>& keystore_keys = + keystore_keys_cryptographer->keystore_keys(); if (!keystore_keys.empty()) { proto.set_current_keystore_key_name( ComputePbkdf2KeyName(keystore_keys.back())); @@ -284,10 +253,12 @@ *specifics.mutable_keystore_decryptor_token() = *pending_keystore_decryptor_token; } else { - DCHECK(!keystore_keys.empty()); - EncryptKeystoreDecryptorToken( - *cryptographer, specifics.mutable_keystore_decryptor_token(), - keystore_keys); + // TODO(crbug.com/922900): error handling (crypto errors, which could + // cause empty |keystore_keys_cryptographer| or can occur during + // encryption). + keystore_keys_cryptographer->EncryptKeystoreDecryptorToken( + cryptographer->ExportDefaultKey(), + specifics.mutable_keystore_decryptor_token()); } } if (!keystore_migration_time.is_null()) { @@ -313,7 +284,7 @@ result.custom_passphrase_key_derivation_params = custom_passphrase_key_derivation_params; result.encrypt_everything = encrypt_everything; - result.keystore_keys = keystore_keys; + result.keystore_keys_cryptographer = keystore_keys_cryptographer->Clone(); result.pending_keystore_decryptor_token = pending_keystore_decryptor_token; return result; }
diff --git a/components/sync/nigori/nigori_state.h b/components/sync/nigori/nigori_state.h index 9ade4694..6595dfd 100644 --- a/components/sync/nigori/nigori_state.h +++ b/components/sync/nigori/nigori_state.h
@@ -23,13 +23,7 @@ namespace syncer { class CryptographerImpl; - -// Creates a cryptographer that can decrypt all |keystore_keys| and uses the -// last one as default encryption key. May return null in case of error. -// TODO(crbug.com/922900): consider maintaining cached version of this -// cryptographer in NigoriState to avoid repeated creations. -std::unique_ptr<CryptographerImpl> CreateCryptographerFromKeystoreKeys( - const std::vector<std::string>& keystore_keys); +class KeystoreKeysCryptographer; struct NigoriState { static constexpr sync_pb::NigoriSpecifics::PassphraseType @@ -77,10 +71,10 @@ base::Optional<KeyDerivationParams> custom_passphrase_key_derivation_params; bool encrypt_everything; - // Base64 encoded keystore keys. The last element is the current keystore - // key. These keys are not a part of Nigori node and are persisted - // separately. Must be encrypted with OSCrypt before persisting. - std::vector<std::string> keystore_keys; + // Contains keystore keys. Uses last keystore key as encryption key. Must be + // not null. Serialized as keystore keys, which must be encrypted with + // OSCrypt before persisting. + std::unique_ptr<KeystoreKeysCryptographer> keystore_keys_cryptographer; // Represents |keystore_decryptor_token| from NigoriSpecifics in case it // can't be decrypted right after remote update arrival due to lack of
diff --git a/components/sync/nigori/nigori_state_unittest.cc b/components/sync/nigori/nigori_state_unittest.cc index 1bc87c4f..ed937e6 100644 --- a/components/sync/nigori/nigori_state_unittest.cc +++ b/components/sync/nigori/nigori_state_unittest.cc
@@ -6,6 +6,7 @@ #include "components/sync/base/time.h" #include "components/sync/nigori/cryptographer_impl.h" +#include "components/sync/nigori/keystore_keys_cryptographer.h" #include "components/sync/nigori/nigori.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -58,7 +59,9 @@ const std::string kDefaultEncryptionKey = "defaultkey"; NigoriState state; - state.keystore_keys = {kKeystoreKey1, kKeystoreKey2}; + state.keystore_keys_cryptographer = + KeystoreKeysCryptographer::FromKeystoreKeys( + {kKeystoreKey1, kKeystoreKey2}); state.passphrase_type = NigoriSpecifics::KEYSTORE_PASSPHRASE; state.keystore_migration_time = now; state.cryptographer = CryptographerImpl::CreateEmpty();
diff --git a/components/sync/nigori/nigori_sync_bridge.h b/components/sync/nigori/nigori_sync_bridge.h index 1747140..3155947 100644 --- a/components/sync/nigori/nigori_sync_bridge.h +++ b/components/sync/nigori/nigori_sync_bridge.h
@@ -36,11 +36,6 @@ // Retrieve Nigori sync data. virtual std::unique_ptr<EntityData> GetData() = 0; - // Resolve a conflict between the client and server versions of data. They are - // guaranteed not to match (both be deleted or have identical specifics). - virtual ConflictResolution ResolveConflict(const EntityData& local_data, - const EntityData& remote_data) = 0; - // Informs the bridge that sync has been disabed. The bridge is responsible // for deleting all data and metadata upon disabling sync. virtual void ApplyDisableSyncChanges() = 0;
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.cc b/components/sync/nigori/nigori_sync_bridge_impl.cc index e9ee597..a238b7c 100644 --- a/components/sync/nigori/nigori_sync_bridge_impl.cc +++ b/components/sync/nigori/nigori_sync_bridge_impl.cc
@@ -17,6 +17,7 @@ #include "components/sync/base/time.h" #include "components/sync/engine/sync_engine_switches.h" #include "components/sync/model/entity_data.h" +#include "components/sync/nigori/keystore_keys_cryptographer.h" #include "components/sync/nigori/nigori.h" #include "components/sync/nigori/nigori_storage.h" #include "components/sync/nigori/pending_local_nigori_commit.h" @@ -32,29 +33,6 @@ const char kNigoriNonUniqueName[] = "Nigori"; -// Creates keystore Nigori specifics given |keystore_keys|. -// Returns NigoriSpecifics that contain: -// 1. passphrase_type = KEYSTORE_PASSPHRASE. -// 2. encryption_keybag contains all |keystore_keys| and encrypted with the -// latest keystore key. -// 3. keystore_decryptor_token contains latest keystore key encrypted with -// itself. -// 4. keybag_is_frozen = true. -// 5. keystore_migration_time is current time. -// 6. Other fields are default. -NigoriSpecifics MakeDefaultKeystoreNigori( - const std::vector<std::string>& keystore_keys) { - DCHECK(!keystore_keys.empty()); - - NigoriState state; - state.keystore_keys = keystore_keys; - state.passphrase_type = NigoriSpecifics::KEYSTORE_PASSPHRASE; - state.keystore_migration_time = base::Time::Now(); - state.cryptographer = CreateCryptographerFromKeystoreKeys(keystore_keys); - - return state.ToSpecificsProto(); -} - KeyDerivationMethod GetKeyDerivationMethodFromSpecifics( const sync_pb::NigoriSpecifics& specifics) { KeyDerivationMethod key_derivation_method = ProtoKeyDerivationMethodToEnum( @@ -174,8 +152,9 @@ } switch (old_passphrase_type) { case NigoriSpecifics::UNKNOWN: - // This can happen iff we have not synced local state yet, so we accept - // any valid passphrase type (invalid filtered before). + // This can happen iff we have not synced local state yet or synced with + // default NigoriSpecifics, so we accept any valid passphrase type + // (invalid filtered before). case NigoriSpecifics::IMPLICIT_PASSPHRASE: return true; case NigoriSpecifics::KEYSTORE_PASSPHRASE: @@ -488,7 +467,7 @@ // nigori keybag's encryption key. Otherwise we're simply missing the // keystore key. UMA_HISTOGRAM_BOOLEAN("Sync.KeystoreDecryptionFailed", - !state_.keystore_keys.empty()); + !state_.keystore_keys_cryptographer->IsEmpty()); } return true; } @@ -600,10 +579,12 @@ std::string NigoriSyncBridgeImpl::GetLastKeystoreKey() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (state_.keystore_keys.empty()) { + const std::vector<std::string> keystore_keys = + state_.keystore_keys_cryptographer->keystore_keys(); + if (keystore_keys.empty()) { return std::string(); } - return state_.keystore_keys.back(); + return keystore_keys.back(); } bool NigoriSyncBridgeImpl::NeedKeystoreKey() const { @@ -613,7 +594,7 @@ // server responsibility to send updated keystore keys. |keystore_keys_| is // expected to be non-empty before MergeSyncData() call, regardless of // passphrase type. - return state_.keystore_keys.empty() || + return state_.keystore_keys_cryptographer->IsEmpty() || state_.pending_keystore_decryptor_token.has_value(); } @@ -624,13 +605,21 @@ return false; } - state_.keystore_keys.resize(keys.size()); + std::vector<std::string> encoded_keystore_keys(keys.size()); for (size_t i = 0; i < keys.size(); ++i) { // We need to apply base64 encoding before using the keys to provide // backward compatibility with non-USS implementation. It's actually needed // only for the keys persisting, but was applied before passing keys to // cryptographer, so we have to do the same. - base::Base64Encode(keys[i], &state_.keystore_keys[i]); + base::Base64Encode(keys[i], &encoded_keystore_keys[i]); + } + + state_.keystore_keys_cryptographer = + KeystoreKeysCryptographer::FromKeystoreKeys(encoded_keystore_keys); + if (!state_.keystore_keys_cryptographer) { + state_.keystore_keys_cryptographer = + KeystoreKeysCryptographer::CreateEmpty(); + return false; } if (state_.pending_keystore_decryptor_token.has_value()) { @@ -679,7 +668,8 @@ // Ensure we have |keystore_keys| during the initial download, requested to // the server as per NeedKeystoreKey(), and required for initializing the // default keystore Nigori. - if (state_.keystore_keys.empty()) { + DCHECK(state_.keystore_keys_cryptographer); + if (state_.keystore_keys_cryptographer->IsEmpty()) { // TODO(crbug.com/922900): try to relax this requirement for Nigori // initialization as well. Keystore keys might not arrive, for example, due // to throttling. @@ -688,22 +678,14 @@ } // We received uninitialized Nigori and need to initialize it as default // keystore Nigori. - // TODO(crbug.com/922900): Adopt QueuePendingLocalCommit(). - NigoriSpecifics initialized_specifics = - MakeDefaultKeystoreNigori(state_.keystore_keys); - // In rare cases the crypto operations may fail. - if (!IsValidNigoriSpecifics(initialized_specifics)) { - return ModelError(FROM_HERE, "Failed to initialize keystore Nigori."); - } - *data->specifics.mutable_nigori() = initialized_specifics; - processor_->Put(std::make_unique<EntityData>(std::move(*data))); - return UpdateLocalState(initialized_specifics); + QueuePendingLocalCommit( + PendingLocalNigoriCommit::ForKeystoreInitialization()); + return base::nullopt; } base::Optional<ModelError> NigoriSyncBridgeImpl::ApplySyncChanges( base::Optional<EntityData> data) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_NE(state_.passphrase_type, NigoriSpecifics::UNKNOWN); if (data) { DCHECK(data->specifics.has_nigori()); @@ -812,14 +794,9 @@ MaybeNotifyOfPendingKeys(); - // TODO(crbug.com/): Instead of issuing errors for local commits, call - // PutNextApplicablePendingLocalCommit() to verify pending local changes - // (relevant for the conflict case). Issue failures if they are no longer - // applicable, or call Put() otherwise. - for (const auto& pending_local_commit : pending_local_commit_queue_) { - pending_local_commit->OnFailure(broadcasting_observer_.get()); - } - pending_local_commit_queue_.clear(); + // There might be pending local commits, so make attempt to apply them on top + // of new |state_|. + PutNextApplicablePendingLocalCommit(); storage_->StoreData(SerializeAsNigoriLocalData()); @@ -834,17 +811,10 @@ DCHECK(!keystore_decryptor_token.blob().empty()); // Decryption of |keystore_decryptor_token|. - std::unique_ptr<Cryptographer> keystore_cryptographer = - CreateCryptographerFromKeystoreKeys(state_.keystore_keys); - if (!keystore_cryptographer) { - return ModelError(FROM_HERE, - "Failed to create cryptographer from keystore keys."); - } - NigoriKeyBag keystore_decryptor_key_bag = NigoriKeyBag::CreateEmpty(); sync_pb::NigoriKey keystore_decryptor_key; - if (keystore_cryptographer->Decrypt(keystore_decryptor_token, - &keystore_decryptor_key)) { + if (state_.keystore_keys_cryptographer->DecryptKeystoreDecryptorToken( + keystore_decryptor_token, &keystore_decryptor_key)) { keystore_decryptor_key_bag.AddKeyFromProto(keystore_decryptor_key); state_.pending_keystore_decryptor_token.reset(); } else { @@ -962,14 +932,6 @@ return entity_data; } -ConflictResolution NigoriSyncBridgeImpl::ResolveConflict( - const EntityData& local_data, - const EntityData& remote_data) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - NOTIMPLEMENTED(); - return ConflictResolution::kUseLocal; -} - void NigoriSyncBridgeImpl::ApplyDisableSyncChanges() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // The user intended to disable sync, so we need to clear all the data, except @@ -982,7 +944,7 @@ // |explicit_passphrase_key_| will become not working, once we clean up // storing explicit passphrase key in prefs, we need to find better solution. storage_->ClearData(); - state_.keystore_keys.clear(); + state_.keystore_keys_cryptographer = KeystoreKeysCryptographer::CreateEmpty(); state_.cryptographer = CryptographerImpl::CreateEmpty(); state_.pending_keys.reset(); state_.pending_keystore_decryptor_token.reset(); @@ -1123,11 +1085,7 @@ void NigoriSyncBridgeImpl::QueuePendingLocalCommit( std::unique_ptr<PendingLocalNigoriCommit> local_commit) { - NigoriState tmp_state = state_.Clone(); - if (state_.passphrase_type == NigoriSpecifics::UNKNOWN) { - local_commit->OnFailure(broadcasting_observer_.get()); - return; - } + DCHECK(processor_->IsTrackingMetadata()); pending_local_commit_queue_.push_back(std::move(local_commit));
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.h b/components/sync/nigori/nigori_sync_bridge_impl.h index d941cf47..070b833 100644 --- a/components/sync/nigori/nigori_sync_bridge_impl.h +++ b/components/sync/nigori/nigori_sync_bridge_impl.h
@@ -80,8 +80,6 @@ base::Optional<ModelError> ApplySyncChanges( base::Optional<EntityData> data) override; std::unique_ptr<EntityData> GetData() override; - ConflictResolution ResolveConflict(const EntityData& local_data, - const EntityData& remote_data) override; void ApplyDisableSyncChanges() override; // TODO(crbug.com/922900): investigate whether we need this getter outside of
diff --git a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc index 3d57c05..e0465c6 100644 --- a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc +++ b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
@@ -297,6 +297,7 @@ MOCK_METHOD1(ReportError, void(const ModelError&)); MOCK_METHOD0(GetControllerDelegate, base::WeakPtr<ModelTypeControllerDelegate>()); + MOCK_METHOD0(IsTrackingMetadata, bool()); }; class MockObserver : public SyncEncryptionHandler::Observer { @@ -340,6 +341,7 @@ auto processor = std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>(); + ON_CALL(*processor, IsTrackingMetadata()).WillByDefault(Return(true)); processor_ = processor.get(); auto storage = std::make_unique<testing::NiceMock<MockNigoriStorage>>(); storage_ = storage.get(); @@ -591,10 +593,15 @@ // We don't verify entire NigoriSpecifics here, because it requires too // complex matcher (NigoriSpecifics is not determenistic). + // Calling MergeSyncData() triggers a commit cycle but doesn't immediately + // expose the new state, until the commit completes. EXPECT_CALL(*processor(), Put(HasKeystoreNigori())); EXPECT_THAT(bridge()->MergeSyncData(std::move(default_entity_data)), Eq(base::nullopt)); EXPECT_THAT(bridge()->GetData(), HasKeystoreNigori()); + + EXPECT_THAT(bridge()->ApplySyncChanges(base::nullopt), Eq(base::nullopt)); + EXPECT_THAT(bridge()->GetData(), HasKeystoreNigori()); EXPECT_THAT(bridge()->GetKeystoreMigrationTime(), Not(NullTime())); EXPECT_EQ(bridge()->GetPassphraseTypeForTesting(), sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE); @@ -887,6 +894,7 @@ ASSERT_THAT(bridge()->MergeSyncData(std::move(default_entity_data)), Eq(base::nullopt)); ASSERT_THAT(bridge()->GetData(), Not(HasCustomPassphraseNigori())); + EXPECT_THAT(bridge()->ApplySyncChanges(base::nullopt), Eq(base::nullopt)); // Calling SetEncryptionPassphrase() triggers a commit cycle but doesn't // immediately expose the new state, until the commit completes. @@ -913,6 +921,68 @@ // salt to check expectations about cryptographer state. } +// Tests that pending local change with setting custom passphrase is applied, +// when there was a conflicting remote update and remote update is respected. +TEST_F(NigoriSyncBridgeImplTest, + ShouldSetCustomPassphraseAfterConflictingUpdates) { + // Start with simple keystore Nigori. + const std::string kRawKeystoreKey1 = "keystore_key1"; + const KeyParams kKeystoreKeyParams1 = KeystoreKeyParams(kRawKeystoreKey1); + EntityData simple_keystore_entity_data; + *simple_keystore_entity_data.specifics.mutable_nigori() = + BuildKeystoreNigoriSpecifics( + /*keybag_keys_params=*/{kKeystoreKeyParams1}, + /*keystore_decryptor_params=*/kKeystoreKeyParams1, + /*keystore_key_params=*/kKeystoreKeyParams1); + bridge()->SetKeystoreKeys({kRawKeystoreKey1}); + ASSERT_THAT(bridge()->MergeSyncData(std::move(simple_keystore_entity_data)), + Eq(base::nullopt)); + + // Set up custom passphrase locally, but don't emulate commit completion. + const std::string kCustomPassphrase = "custom_passphrase"; + bridge()->SetEncryptionPassphrase(kCustomPassphrase); + + // Emulate conflict with rotated keystore Nigori. + const std::string kRawKeystoreKey2 = "keystore_key2"; + const KeyParams kKeystoreKeyParams2 = KeystoreKeyParams(kRawKeystoreKey2); + EntityData rotated_keystore_entity_data; + *rotated_keystore_entity_data.specifics.mutable_nigori() = + BuildKeystoreNigoriSpecifics( + /*keybag_keys_params=*/{kKeystoreKeyParams1, kKeystoreKeyParams2}, + /*keystore_decryptor_params=*/kKeystoreKeyParams2, + /*keystore_key_params=*/kKeystoreKeyParams2); + bridge()->SetKeystoreKeys({kRawKeystoreKey1, kRawKeystoreKey2}); + + // Verify that custom passphrase is set on top of + // |rotated_keystore_entity_data|. + EXPECT_CALL(*processor(), Put(HasCustomPassphraseNigori())); + EXPECT_THAT( + bridge()->ApplySyncChanges(std::move(rotated_keystore_entity_data)), + Eq(base::nullopt)); + EXPECT_THAT(bridge()->GetData(), HasCustomPassphraseNigori()); + + // Mimic commit completion. + EXPECT_CALL(*observer(), OnPassphraseAccepted()); + EXPECT_CALL(*observer(), OnEncryptedTypesChanged( + /*encrypted_types=*/EncryptableUserTypes(), + /*encrypt_everything=*/true)); + EXPECT_CALL(*observer(), OnCryptographerStateChanged( + NotNull(), /*has_pending_keys=*/false)); + EXPECT_CALL(*observer(), + OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase, + /*passphrase_time=*/Not(NullTime()))); + EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(Ne(std::string()), + PASSPHRASE_BOOTSTRAP_TOKEN)); + EXPECT_THAT(bridge()->ApplySyncChanges(base::nullopt), Eq(base::nullopt)); + EXPECT_THAT(bridge()->GetData(), HasCustomPassphraseNigori()); + + const Cryptographer& cryptographer = bridge()->GetCryptographerForTesting(); + EXPECT_THAT(cryptographer, CanDecryptWith(kKeystoreKeyParams1)); + EXPECT_THAT(cryptographer, CanDecryptWith(kKeystoreKeyParams2)); + // TODO(crbug.com/922900): find a good way to get key derivation method and + // salt to check expectations about cryptographer state. +} + // Tests that SetEncryptionPassphrase() call doesn't lead to custom passphrase // change in case we already have one. TEST_F(NigoriSyncBridgeImplTest, ShouldNotAllowCustomPassphraseChange) {
diff --git a/components/sync/nigori/pending_local_nigori_commit.cc b/components/sync/nigori/pending_local_nigori_commit.cc index 8e48e40c..f5bfd57 100644 --- a/components/sync/nigori/pending_local_nigori_commit.cc +++ b/components/sync/nigori/pending_local_nigori_commit.cc
@@ -10,6 +10,7 @@ #include "components/sync/base/sync_base_switches.h" #include "components/sync/engine/sync_engine_switches.h" #include "components/sync/nigori/cryptographer_impl.h" +#include "components/sync/nigori/keystore_keys_cryptographer.h" #include "components/sync/nigori/nigori_state.h" namespace syncer { @@ -129,6 +130,39 @@ DISALLOW_COPY_AND_ASSIGN(CustomPassphraseSetter); }; +class KeystoreInitializer : public PendingLocalNigoriCommit { + public: + KeystoreInitializer() = default; + ~KeystoreInitializer() override = default; + + bool TryApply(NigoriState* state) const override { + DCHECK(!state->keystore_keys_cryptographer->IsEmpty()); + if (state->passphrase_type != NigoriSpecifics::UNKNOWN) { + return false; + } + + state->passphrase_type = NigoriSpecifics::KEYSTORE_PASSPHRASE; + state->keystore_migration_time = base::Time::Now(); + state->cryptographer = + state->keystore_keys_cryptographer->ToCryptographerImpl(); + return true; + } + + void OnSuccess(const NigoriState& state, + SyncEncryptionHandler::Observer* observer) override { + // Note: |passphrase_time| isn't populated for keystore passphrase. + observer->OnPassphraseTypeChanged(PassphraseType::kKeystorePassphrase, + /*passphrase_time=*/base::Time()); + observer->OnCryptographerStateChanged(state.cryptographer.get(), + /*has_pending_keys=*/false); + } + + void OnFailure(SyncEncryptionHandler::Observer* observer) override {} + + private: + DISALLOW_COPY_AND_ASSIGN(KeystoreInitializer); +}; + } // namespace // static @@ -140,4 +174,10 @@ random_salt_generator); } +// static +std::unique_ptr<PendingLocalNigoriCommit> +PendingLocalNigoriCommit::ForKeystoreInitialization() { + return std::make_unique<KeystoreInitializer>(); +} + } // namespace syncer
diff --git a/components/sync/nigori/pending_local_nigori_commit.h b/components/sync/nigori/pending_local_nigori_commit.h index e2f3895..db9f60ff 100644 --- a/components/sync/nigori/pending_local_nigori_commit.h +++ b/components/sync/nigori/pending_local_nigori_commit.h
@@ -24,6 +24,8 @@ const std::string& passphrase, const base::RepeatingCallback<std::string()>& random_salt_generator); + static std::unique_ptr<PendingLocalNigoriCommit> ForKeystoreInitialization(); + PendingLocalNigoriCommit() = default; virtual ~PendingLocalNigoriCommit() = default;
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc index c73caaa..a0197fb 100644 --- a/components/sync_bookmarks/bookmark_model_merger.cc +++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -470,7 +470,10 @@ const bookmarks::BookmarkNode* node = parent->children()[index].get(); DCHECK(!FindMatchingRemoteUpdateByGUID(node)); DCHECK(base::IsValidGUID(node->guid())); - const std::string sync_id = node->guid(); + // TODO(crbug.com/978430): Consider using |node->guid()| instead of generating + // a new random GUID. However, currently that can lead to crashes due to + // duplicate server IDs, see crbug.com/1004205. + const std::string sync_id = base::GenerateGUID(); const int64_t server_version = syncer::kUncommittedVersion; const base::Time creation_time = base::Time::Now(); const std::string& suffix = syncer::GenerateSyncableBookmarkHash(
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc index aac6b88..30b7413 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -93,11 +93,12 @@ // Similar to the directory implementation here: // https://cs.chromium.org/chromium/src/components/sync/syncable/mutable_entry.cc?l=237&gsn=CreateEntryKernel // Assign a temp server id for the entity. Will be overriden by the actual - // server id upon receiving commit response. As this value later populates the - // originator_client_item_id field in EntityData, which replaces the GUID in - // legacy clients, it is set to the node's actual GUID. + // server id upon receiving commit response. DCHECK(base::IsValidGUID(node->guid())); - const std::string sync_id = node->guid(); + // TODO(crbug.com/978430): Consider using |node->guid()| instead of generating + // a new random GUID. However, currently that can lead to crashes due to + // duplicate server IDs, see crbug.com/1004205. + const std::string sync_id = base::GenerateGUID(); const int64_t server_version = syncer::kUncommittedVersion; const base::Time creation_time = base::Time::Now(); const sync_pb::UniquePosition unique_position =
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc index 504c082..4eefb70 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
@@ -133,8 +133,12 @@ bookmark_tracker()->GetEntitiesWithLocalChanges(kMaxEntries); ASSERT_THAT(local_changes.size(), 1U); EXPECT_THAT(local_changes[0]->bookmark_node(), Eq(bookmark_node)); - EXPECT_THAT(local_changes[0]->metadata()->server_id(), - Eq(bookmark_node->guid())); + // TODO(crbug.com/978430): Consider using |node->guid()| instead of generating + // new random GUIDs as the temporary server ID, and then reinstate the + // following expectation. However, currently that can lead to crashes due to + // duplicate server IDs, see crbug.com/1004205. + // EXPECT_THAT(local_changes[0]->metadata()->server_id(), + // Eq(bookmark_node->guid())); } TEST_F(BookmarkModelObserverImplTest,
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index be42091..d571c127 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -111,6 +111,8 @@ "display_embedder/gl_output_surface.h", "display_embedder/gl_output_surface_buffer_queue.cc", "display_embedder/gl_output_surface_buffer_queue.h", + "display_embedder/gl_output_surface_chromeos.cc", + "display_embedder/gl_output_surface_chromeos.h", "display_embedder/gl_output_surface_offscreen.cc", "display_embedder/gl_output_surface_offscreen.h", "display_embedder/in_process_gpu_memory_buffer_manager.cc",
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc index c13e6e3..54501ba 100644 --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc
@@ -527,13 +527,16 @@ // The CompositorFrame provided by the SurfaceAggregator includes the display // transform while |current_surface_size_| is the pre-transform size received // from the client. + const gfx::OverlayTransform current_display_transform = + output_surface_->GetDisplayTransform(); const gfx::Transform display_transform = gfx::OverlayTransformToTransform( - output_surface_->GetDisplayTransform(), current_surface_size_); + current_display_transform, current_surface_size_); const gfx::Size current_surface_size = cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform( display_transform, gfx::Rect(current_surface_size_)) .size(); if (settings_.auto_resize_output_surface && + last_display_transform_swapped_ == current_display_transform && last_render_pass.output_rect.size() != current_surface_size && last_render_pass.damage_rect == last_render_pass.output_rect && !current_surface_size.IsEmpty()) { @@ -610,6 +613,7 @@ "Graphics.Pipeline.DrawAndSwap", swapped_trace_id_, "Swap"); swapped_since_resize_ = true; + last_display_transform_swapped_ = current_display_transform; ui::LatencyInfo::TraceIntermediateFlowEvents(frame.metadata.latency_info, "Display::DrawAndSwap");
diff --git a/components/viz/service/display/display.h b/components/viz/service/display/display.h index 6ee4efa..8ecf3be 100644 --- a/components/viz/service/display/display.h +++ b/components/viz/service/display/display.h
@@ -31,6 +31,7 @@ #include "components/viz/service/viz_service_export.h" #include "gpu/command_buffer/common/texture_in_use_response.h" #include "ui/gfx/color_space.h" +#include "ui/gfx/overlay_transform.h" #include "ui/gfx/swap_result.h" #include "ui/latency/latency_info.h" @@ -263,6 +264,9 @@ int64_t swapped_trace_id_ = 0; int64_t last_presented_trace_id_ = 0; + gfx::OverlayTransform last_display_transform_swapped_ = + gfx::OVERLAY_TRANSFORM_NONE; + DISALLOW_COPY_AND_ASSIGN(Display); };
diff --git a/components/viz/service/display/external_use_client.cc b/components/viz/service/display/external_use_client.cc index 5ea946ee..b831b28 100644 --- a/components/viz/service/display/external_use_client.cc +++ b/components/viz/service/display/external_use_client.cc
@@ -20,6 +20,10 @@ ExternalUseClient::ImageContext::~ImageContext() = default; +void ExternalUseClient::ImageContext::OnContextLost() { + NOTREACHED(); +} + void ExternalUseClient::ImageContext::SetImage(sk_sp<SkImage> image, GrBackendFormat backend_format) { DCHECK(!image_);
diff --git a/components/viz/service/display/external_use_client.h b/components/viz/service/display/external_use_client.h index de2dd34..bfb95f8 100644 --- a/components/viz/service/display/external_use_client.h +++ b/components/viz/service/display/external_use_client.h
@@ -38,6 +38,7 @@ const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info, sk_sp<SkColorSpace> color_space); virtual ~ImageContext(); + virtual void OnContextLost(); // // Thread safety is guaranteed by these invariants: (a) only the compositor
diff --git a/components/viz/service/display_embedder/gl_output_surface_chromeos.cc b/components/viz/service/display_embedder/gl_output_surface_chromeos.cc new file mode 100644 index 0000000..d3cc855 --- /dev/null +++ b/components/viz/service/display_embedder/gl_output_surface_chromeos.cc
@@ -0,0 +1,25 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/viz/service/display_embedder/gl_output_surface_chromeos.h" + +namespace viz { + +GLOutputSurfaceChromeOS::GLOutputSurfaceChromeOS( + scoped_refptr<VizProcessContextProvider> context_provider, + gpu::SurfaceHandle surface_handle) + : GLOutputSurface(context_provider, surface_handle) {} + +GLOutputSurfaceChromeOS::~GLOutputSurfaceChromeOS() = default; + +void GLOutputSurfaceChromeOS::SetDisplayTransformHint( + gfx::OverlayTransform transform) { + display_transform_ = transform; +} + +gfx::OverlayTransform GLOutputSurfaceChromeOS::GetDisplayTransform() { + return display_transform_; +} + +} // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_chromeos.h b/components/viz/service/display_embedder/gl_output_surface_chromeos.h new file mode 100644 index 0000000..7f7b70c --- /dev/null +++ b/components/viz/service/display_embedder/gl_output_surface_chromeos.h
@@ -0,0 +1,31 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_CHROMEOS_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_CHROMEOS_H_ + +#include "components/viz/service/display_embedder/gl_output_surface.h" + +namespace viz { + +class GLOutputSurfaceChromeOS : public GLOutputSurface { + public: + GLOutputSurfaceChromeOS( + scoped_refptr<VizProcessContextProvider> context_provider, + gpu::SurfaceHandle surface_handle); + ~GLOutputSurfaceChromeOS() override; + + // GLOutputSurface: + void SetDisplayTransformHint(gfx::OverlayTransform transform) override; + gfx::OverlayTransform GetDisplayTransform() override; + + private: + gfx::OverlayTransform display_transform_ = gfx::OVERLAY_TRANSFORM_NONE; + + DISALLOW_COPY_AND_ASSIGN(GLOutputSurfaceChromeOS); +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_CHROMEOS_H_
diff --git a/components/viz/service/display_embedder/image_context_impl.cc b/components/viz/service/display_embedder/image_context_impl.cc index bada876..42efbf5 100644 --- a/components/viz/service/display_embedder/image_context_impl.cc +++ b/components/viz/service/display_embedder/image_context_impl.cc
@@ -42,6 +42,13 @@ render_pass_id_(render_pass_id), mipmap_(mipmap ? GrMipMapped::kYes : GrMipMapped::kNo) {} +void ImageContextImpl::OnContextLost() { + if (representation_) { + representation_->OnContextLost(); + representation_ = nullptr; + } +} + ImageContextImpl::~ImageContextImpl() { DCHECK(!representation_scoped_read_access_);
diff --git a/components/viz/service/display_embedder/image_context_impl.h b/components/viz/service/display_embedder/image_context_impl.h index 8d661b4..6f12392 100644 --- a/components/viz/service/display_embedder/image_context_impl.h +++ b/components/viz/service/display_embedder/image_context_impl.h
@@ -58,6 +58,8 @@ sk_sp<SkColorSpace> color_space); ~ImageContextImpl() final; + void OnContextLost() final; + RenderPassId render_pass_id() const { return render_pass_id_; } GrMipMapped mipmap() const { return mipmap_; }
diff --git a/components/viz/service/display_embedder/output_surface_provider_impl.cc b/components/viz/service/display_embedder/output_surface_provider_impl.cc index e17b24a..8718732e 100644 --- a/components/viz/service/display_embedder/output_surface_provider_impl.cc +++ b/components/viz/service/display_embedder/output_surface_provider_impl.cc
@@ -64,6 +64,7 @@ #endif #if defined(OS_CHROMEOS) +#include "components/viz/service/display_embedder/gl_output_surface_chromeos.h" #include "components/viz/service/display_embedder/output_surface_unified.h" #endif @@ -206,6 +207,9 @@ #elif defined(OS_ANDROID) output_surface = std::make_unique<GLOutputSurfaceAndroid>( std::move(context_provider), surface_handle); +#elif defined(OS_CHROMEOS) + output_surface = std::make_unique<GLOutputSurfaceChromeOS>( + std::move(context_provider), surface_handle); #else output_surface = std::make_unique<GLOutputSurface>( std::move(context_provider), surface_handle);
diff --git a/components/viz/service/display_embedder/skia_output_surface_dependency.h b/components/viz/service/display_embedder/skia_output_surface_dependency.h index 474d38dea..0c62bad 100644 --- a/components/viz/service/display_embedder/skia_output_surface_dependency.h +++ b/components/viz/service/display_embedder/skia_output_surface_dependency.h
@@ -21,6 +21,7 @@ namespace gpu { +class DisplayContext; class GpuDriverBugWorkarounds; class ImageFactory; class ImageTransportSurfaceDelegate; @@ -86,6 +87,10 @@ gpu::SurfaceHandle parent_window, gpu::SurfaceHandle child_window) = 0; #endif + + virtual void RegisterDisplayContext(gpu::DisplayContext* display_context) = 0; + virtual void UnregisterDisplayContext( + gpu::DisplayContext* display_context) = 0; }; } // namespace viz
diff --git a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc index 8e75d57..34b24a3 100644 --- a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc
@@ -115,4 +115,14 @@ } #endif +void SkiaOutputSurfaceDependencyImpl::RegisterDisplayContext( + gpu::DisplayContext* display_context) { + gpu_service_impl_->RegisterDisplayContext(display_context); +} + +void SkiaOutputSurfaceDependencyImpl::UnregisterDisplayContext( + gpu::DisplayContext* display_context) { + gpu_service_impl_->UnregisterDisplayContext(display_context); +} + } // namespace viz
diff --git a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.h b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.h index 6bf0627..c74257c 100644 --- a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.h +++ b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.h
@@ -49,6 +49,9 @@ gpu::SurfaceHandle child_window) override; #endif + void RegisterDisplayContext(gpu::DisplayContext* display_context) override; + void UnregisterDisplayContext(gpu::DisplayContext* display_context) override; + private: GpuServiceImpl* const gpu_service_impl_; const gpu::SurfaceHandle surface_handle_;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index 88eff579..e8202c3 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -52,18 +52,37 @@ void DoNothing(void* texture_context) {} template <typename... Args> -void PostAsyncTask(SkiaOutputSurfaceDependency* dependency, - const base::RepeatingCallback<void(Args...)>& callback, - Args... args) { +void PostAsyncTaskRepeatedly( + SkiaOutputSurfaceDependency* dependency, + const base::RepeatingCallback<void(Args...)>& callback, + Args... args) { dependency->PostTaskToClientThread(base::BindOnce(callback, args...)); } template <typename... Args> -base::RepeatingCallback<void(Args...)> CreateSafeCallback( +base::RepeatingCallback<void(Args...)> CreateSafeRepeatingCallback( SkiaOutputSurfaceDependency* dependency, const base::RepeatingCallback<void(Args...)>& callback) { DCHECK(dependency); - return base::BindRepeating(&PostAsyncTask<Args...>, dependency, callback); + return base::BindRepeating(&PostAsyncTaskRepeatedly<Args...>, dependency, + callback); +} + +template <typename... Args> +void PostAsyncTaskOnce(SkiaOutputSurfaceDependency* dependency, + base::OnceCallback<void(Args...)> callback, + Args... args) { + dependency->PostTaskToClientThread( + base::BindOnce(std::move(callback), args...)); +} + +template <typename... Args> +base::OnceCallback<void(Args...)> CreateSafeOnceCallback( + SkiaOutputSurfaceDependency* dependency, + base::OnceCallback<void(Args...)> callback) { + DCHECK(dependency); + return base::BindOnce(&PostAsyncTaskOnce<Args...>, dependency, + std::move(callback)); } } // namespace @@ -656,17 +675,17 @@ base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(event))); } - auto did_swap_buffer_complete_callback = CreateSafeCallback( + auto did_swap_buffer_complete_callback = CreateSafeRepeatingCallback( dependency_.get(), base::BindRepeating(&SkiaOutputSurfaceImpl::DidSwapBuffersComplete, weak_ptr_)); - auto buffer_presented_callback = CreateSafeCallback( + auto buffer_presented_callback = CreateSafeRepeatingCallback( dependency_.get(), base::BindRepeating(&SkiaOutputSurfaceImpl::BufferPresented, weak_ptr_)); - auto context_lost_callback = CreateSafeCallback( + auto context_lost_callback = CreateSafeOnceCallback( dependency_.get(), - base::BindRepeating(&SkiaOutputSurfaceImpl::ContextLost, weak_ptr_)); - auto gpu_vsync_callback = CreateSafeCallback( + base::BindOnce(&SkiaOutputSurfaceImpl::ContextLost, weak_ptr_)); + auto gpu_vsync_callback = CreateSafeRepeatingCallback( dependency_.get(), base::BindRepeating(&SkiaOutputSurfaceImpl::OnGpuVSync, weak_ptr_));
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc index 752918c..60d554e 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -626,11 +626,14 @@ gpu_vsync_callback_(std::move(gpu_vsync_callback)), gpu_preferences_(dependency_->GetGpuPreferences()) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + dependency_->RegisterDisplayContext(this); } SkiaOutputSurfaceImplOnGpu::~SkiaOutputSurfaceImplOnGpu() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + dependency_->UnregisterDisplayContext(this); + // |context_provider_| and clients want either the context to be lost or made // current on destruction. if (context_state_ && MakeCurrent(false /* need_fbo0 */)) { @@ -1214,7 +1217,10 @@ DCHECK(!image_contexts.empty()); // The window could be destroyed already, and the MakeCurrent will fail with // an destroyed window, so MakeCurrent without requiring the fbo0. - MakeCurrent(false /* need_fbo0 */); + if (!MakeCurrent(false /* need_fbo0 */)) { + for (const auto& context : image_contexts) + context->OnContextLost(); + } // |image_contexts| goes out of scope here. } @@ -1354,13 +1360,14 @@ bool SkiaOutputSurfaceImplOnGpu::MakeCurrent(bool need_fbo0) { if (!is_using_vulkan()) { + if (context_state_->context_lost()) + return false; + // Only make current with |gl_surface_|, if following operations will use // fbo0. if (!context_state_->MakeCurrent(need_fbo0 ? gl_surface_.get() : nullptr)) { LOG(ERROR) << "Failed to make current."; - context_lost_callback_.Run(); - if (context_provider_) - context_provider_->MarkContextLost(); + MarkContextLost(); return false; } context_state_->set_need_context_state_reset(true); @@ -1474,4 +1481,13 @@ #endif } +void SkiaOutputSurfaceImplOnGpu::MarkContextLost() { + context_state_->MarkContextLost(); + if (context_lost_callback_) { + std::move(context_lost_callback_).Run(); + if (context_provider_) + context_provider_->MarkContextLost(); + } +} + } // namespace viz
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h index 0d55534..b670671 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -26,6 +26,7 @@ #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/sync_point_manager.h" #include "gpu/ipc/in_process_command_buffer.h" +#include "gpu/ipc/service/display_context.h" #include "gpu/ipc/service/image_transport_surface_delegate.h" #include "third_party/skia/include/core/SkPromiseImageTexture.h" #include "third_party/skia/include/core/SkSurface.h" @@ -71,14 +72,15 @@ // The SkiaOutputSurface implementation running on the GPU thread. This class // should be created, used and destroyed on the GPU thread. -class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate { +class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate, + public gpu::DisplayContext { public: using DidSwapBufferCompleteCallback = base::RepeatingCallback<void(gpu::SwapBuffersCompleteParams, const gfx::Size& pixel_size)>; using BufferPresentedCallback = base::RepeatingCallback<void(const gfx::PresentationFeedback& feedback)>; - using ContextLostCallback = base::RepeatingCallback<void()>; + using ContextLostCallback = base::OnceClosure; static std::unique_ptr<SkiaOutputSurfaceImplOnGpu> Create( SkiaOutputSurfaceDependency* deps, @@ -189,6 +191,9 @@ void RenderToOverlay(gpu::Mailbox overlay_candidate_mailbox, const gfx::Rect& bounds); + // gpu::DisplayContext implementation: + void MarkContextLost() override; + private: class ScopedPromiseImageAccess; @@ -229,7 +234,7 @@ const gpu::SequenceId sequence_id_; const DidSwapBufferCompleteCallback did_swap_buffer_complete_callback_; const BufferPresentedCallback buffer_presented_callback_; - const ContextLostCallback context_lost_callback_; + ContextLostCallback context_lost_callback_; const GpuVSyncCallback gpu_vsync_callback_; #if defined(USE_OZONE)
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 3e1ba57..0a1cdad 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -682,10 +682,6 @@ "devtools/devtools_agent_host_impl.h", "devtools/devtools_background_services_context_impl.cc", "devtools/devtools_background_services_context_impl.h", - "devtools/devtools_frame_metadata.cc", - "devtools/devtools_frame_metadata.h", - "devtools/devtools_frame_trace_recorder.cc", - "devtools/devtools_frame_trace_recorder.h", "devtools/devtools_http_handler.cc", "devtools/devtools_http_handler.h", "devtools/devtools_instrumentation.cc", @@ -2369,6 +2365,8 @@ "android/web_contents_observer_proxy.h", "contacts/contacts_provider_android.cc", "contacts/contacts_provider_android.h", + "devtools/devtools_frame_trace_recorder.cc", + "devtools/devtools_frame_trace_recorder.h", "font_unique_name_lookup/font_unique_name_lookup.cc", "font_unique_name_lookup/font_unique_name_lookup.h", "font_unique_name_lookup/font_unique_name_lookup_service.cc",
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index 0c9ae5d..da36334 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -2176,7 +2176,7 @@ protected: base::FieldTrialParams GetFeatureParams() override { - return {{"service_worker_supported", "true"}}; + return {{"experimental extended supported feature set", "true"}}; } }; @@ -2279,6 +2279,10 @@ protected: GeolocationBackForwardCacheBrowserTest() : geo_override_(0.0, 0.0) {} + base::FieldTrialParams GetFeatureParams() override { + return {{"experimental extended supported feature set", "true"}}; + } + device::ScopedGeolocationOverrider geo_override_; };
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 6cddbcb..ddce3f6 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -141,13 +141,6 @@ GetShapeDetectionService()->BindTextDetection(std::move(receiver)); } -#if !defined(OS_ANDROID) -bool AreExperimentalWebPlatformFeaturesEnabled() { - auto* command_line = base::CommandLine::ForCurrentProcess(); - return command_line->HasSwitch( - switches::kEnableExperimentalWebPlatformFeatures); -} -#endif } // namespace // Documents/frames @@ -284,10 +277,8 @@ map->Add<blink::mojom::InstalledAppProvider>( base::BindRepeating(&InstalledAppProviderImplDefault::Create)); - if (AreExperimentalWebPlatformFeaturesEnabled()) { - map->Add<blink::mojom::SerialService>(base::BindRepeating( - &RenderFrameHostImpl::BindSerialService, base::Unretained(host))); - } + map->Add<blink::mojom::SerialService>(base::BindRepeating( + &RenderFrameHostImpl::BindSerialService, base::Unretained(host))); #endif // !defined(OS_ANDROID) } @@ -360,10 +351,8 @@ &DedicatedWorkerHost::CreateIDBFactory, base::Unretained(host))); #if !defined(OS_ANDROID) - if (AreExperimentalWebPlatformFeaturesEnabled()) { - map->Add<blink::mojom::SerialService>(base::BindRepeating( - &DedicatedWorkerHost::BindSerialService, base::Unretained(host))); - } + map->Add<blink::mojom::SerialService>(base::BindRepeating( + &DedicatedWorkerHost::BindSerialService, base::Unretained(host))); #endif // !defined(OS_ANDROID) }
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc index 0dc44d6..1d9e3e3 100644 --- a/content/browser/child_process_launcher.cc +++ b/content/browser/child_process_launcher.cc
@@ -186,8 +186,11 @@ } bool ChildProcessLauncherPriority::is_background() const { - return !visible && !has_media_stream && !boost_for_pending_views && - !has_foreground_service_worker; + if (boost_for_pending_views || has_foreground_service_worker || + has_media_stream) { + return false; + } + return has_only_low_priority_frames || !visible; } bool ChildProcessLauncherPriority::operator==( @@ -195,6 +198,7 @@ return visible == other.visible && has_media_stream == other.has_media_stream && has_foreground_service_worker == other.has_foreground_service_worker && + has_only_low_priority_frames == other.has_only_low_priority_frames && frame_depth == other.frame_depth && intersects_viewport == other.intersects_viewport && boost_for_pending_views == other.boost_for_pending_views
diff --git a/content/browser/child_process_launcher.h b/content/browser/child_process_launcher.h index 0e5f2250..0136b71 100644 --- a/content/browser/child_process_launcher.h +++ b/content/browser/child_process_launcher.h
@@ -59,6 +59,7 @@ ChildProcessLauncherPriority(bool visible, bool has_media_stream, bool has_foreground_service_worker, + bool has_only_low_priority_frames, unsigned int frame_depth, bool intersects_viewport, bool boost_for_pending_views @@ -70,6 +71,7 @@ : visible(visible), has_media_stream(has_media_stream), has_foreground_service_worker(has_foreground_service_worker), + has_only_low_priority_frames(has_only_low_priority_frames), frame_depth(frame_depth), intersects_viewport(intersects_viewport), boost_for_pending_views(boost_for_pending_views) @@ -106,6 +108,10 @@ // processes. bool has_foreground_service_worker; + // True if this ChildProcessLauncher has a non-zero number of frames attached + // to it and they're all low priority. + bool has_only_low_priority_frames; + // |frame_depth| is the depth of the shallowest frame this process is // responsible for which has |visible| visibility. It only makes sense to // compare this property for two ChildProcessLauncherPriority instances with
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc index b5091a5..d969419 100644 --- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc +++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
@@ -202,6 +202,15 @@ return 0; } +void GpuBrowserCompositorOutputSurface::SetDisplayTransformHint( + gfx::OverlayTransform transform) { + display_transform_ = transform; +} + +gfx::OverlayTransform GpuBrowserCompositorOutputSurface::GetDisplayTransform() { + return display_transform_; +} + gpu::SurfaceHandle GpuBrowserCompositorOutputSurface::GetSurfaceHandle() const { return surface_handle_; }
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.h b/content/browser/compositor/gpu_browser_compositor_output_surface.h index 48ccdcfd..3bc3238 100644 --- a/content/browser/compositor/gpu_browser_compositor_output_surface.h +++ b/content/browser/compositor/gpu_browser_compositor_output_surface.h
@@ -65,6 +65,8 @@ unsigned GetOverlayTextureId() const override; gfx::BufferFormat GetOverlayBufferFormat() const override; unsigned UpdateGpuFence() override; + void SetDisplayTransformHint(gfx::OverlayTransform transform) override; + gfx::OverlayTransform GetDisplayTransform() override; void SetDrawRectangle(const gfx::Rect& rect) override; @@ -87,6 +89,7 @@ private: const gpu::SurfaceHandle surface_handle_; + gfx::OverlayTransform display_transform_ = gfx::OVERLAY_TRANSFORM_NONE; base::WeakPtrFactory<GpuBrowserCompositorOutputSurface> weak_ptr_factory_{ this};
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index a66cb2fd..d6b1ec60 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -487,6 +487,7 @@ features::IsVizHitTestingSurfaceLayerEnabled()); data->display->Resize(compositor->size()); data->display->SetOutputIsSecure(data->output_is_secure); + data->display->SetDisplayTransformHint(compositor->display_transform()); compositor->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink)); } @@ -744,6 +745,18 @@ std::make_unique<viz::VSyncParameterListener>(std::move(observer)); } +void GpuProcessTransportFactory::SetDisplayTransformHint( + ui::Compositor* compositor, + gfx::OverlayTransform transform) { + auto it = per_compositor_data_.find(compositor); + if (it == per_compositor_data_.end()) + return; + PerCompositorData* data = it->second.get(); + DCHECK(data); + if (data->display) + data->display->SetDisplayTransformHint(transform); +} + void GpuProcessTransportFactory::AddObserver( ui::ContextFactoryObserver* observer) { observer_list_.AddObserver(observer);
diff --git a/content/browser/compositor/gpu_process_transport_factory.h b/content/browser/compositor/gpu_process_transport_factory.h index 09aca908..a73e508 100644 --- a/content/browser/compositor/gpu_process_transport_factory.h +++ b/content/browser/compositor/gpu_process_transport_factory.h
@@ -106,6 +106,8 @@ void AddVSyncParameterObserver( ui::Compositor* compositor, viz::mojom::VSyncParameterObserverPtr observer) override; + void SetDisplayTransformHint(ui::Compositor* compositor, + gfx::OverlayTransform transform) override; // ImageTransportFactory implementation. void DisableGpuCompositing() override;
diff --git a/content/browser/compositor/test/test_image_transport_factory.h b/content/browser/compositor/test/test_image_transport_factory.h index 68ed98ce..4b613c0 100644 --- a/content/browser/compositor/test/test_image_transport_factory.h +++ b/content/browser/compositor/test/test_image_transport_factory.h
@@ -85,6 +85,8 @@ void AddVSyncParameterObserver( ui::Compositor* compositor, viz::mojom::VSyncParameterObserverPtr observer) override {} + void SetDisplayTransformHint(ui::Compositor* compositor, + gfx::OverlayTransform transform) override {} // ImageTransportFactory implementation. void DisableGpuCompositing() override;
diff --git a/content/browser/devtools/devtools_frame_metadata.cc b/content/browser/devtools/devtools_frame_metadata.cc deleted file mode 100644 index bf07a5e..0000000 --- a/content/browser/devtools/devtools_frame_metadata.cc +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/devtools/devtools_frame_metadata.h" - -#include "build/build_config.h" -#include "cc/trees/render_frame_metadata.h" - -namespace content { - -#if defined(OS_ANDROID) -DevToolsFrameMetadata::DevToolsFrameMetadata( - const cc::RenderFrameMetadata& metadata) - : device_scale_factor(metadata.device_scale_factor), - page_scale_factor(metadata.page_scale_factor), - root_scroll_offset( - metadata.root_scroll_offset.value_or(gfx::Vector2dF())), - top_controls_height(metadata.top_controls_height), - top_controls_shown_ratio(metadata.top_controls_shown_ratio), - scrollable_viewport_size(metadata.scrollable_viewport_size) {} -#else -// On non-Android, this class should never be created. -DevToolsFrameMetadata::DevToolsFrameMetadata( - const cc::RenderFrameMetadata& metadata) { - NOTREACHED(); -} -#endif // defined(OS_ANDROID) - -} // namespace content
diff --git a/content/browser/devtools/devtools_frame_metadata.h b/content/browser/devtools/devtools_frame_metadata.h deleted file mode 100644 index f9922b0..0000000 --- a/content/browser/devtools/devtools_frame_metadata.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_FRAME_METADATA_H_ -#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_FRAME_METADATA_H_ - -#include "ui/gfx/geometry/size_f.h" -#include "ui/gfx/geometry/vector2d_f.h" - -namespace cc { -class RenderFrameMetadata; -} - -namespace content { - -// A subset of the information in RenderFrameMetadata used in DevTools with -// Android WebView. -// TODO(crbug.com/985009): Replace with RenderFrameMetadata. -struct DevToolsFrameMetadata { - public: - explicit DevToolsFrameMetadata(const cc::RenderFrameMetadata& metadata); - - float device_scale_factor; - float page_scale_factor; - gfx::Vector2dF root_scroll_offset; - float top_controls_height; - float top_controls_shown_ratio; - gfx::SizeF scrollable_viewport_size; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_FRAME_METADATA_H_
diff --git a/content/browser/devtools/devtools_frame_trace_recorder.cc b/content/browser/devtools/devtools_frame_trace_recorder.cc index 3a9fca06..be04f84 100644 --- a/content/browser/devtools/devtools_frame_trace_recorder.cc +++ b/content/browser/devtools/devtools_frame_trace_recorder.cc
@@ -13,7 +13,8 @@ #include "base/bind.h" #include "base/memory/ref_counted.h" #include "base/trace_event/trace_event_impl.h" -#include "content/browser/devtools/devtools_frame_metadata.h" +#include "build/build_config.h" +#include "cc/trees/render_frame_metadata.h" #include "content/browser/devtools/devtools_traceable_screenshot.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" @@ -31,7 +32,7 @@ if (bitmap.drawsNothing()) return; if (DevToolsTraceableScreenshot::GetNumberOfInstances() >= - DevToolsFrameTraceRecorder::kMaximumNumberOfScreenshots) { + DevToolsTraceableScreenshot::kMaximumNumberOfScreenshots) { return; } TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID_AND_TIMESTAMP( @@ -42,13 +43,13 @@ } void CaptureFrame(RenderFrameHostImpl* host, - const DevToolsFrameMetadata& metadata) { + const cc::RenderFrameMetadata& metadata) { RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(host->GetView()); if (!view) return; if (DevToolsTraceableScreenshot::GetNumberOfInstances() >= - DevToolsFrameTraceRecorder::kMaximumNumberOfScreenshots) { + DevToolsTraceableScreenshot::kMaximumNumberOfScreenshots) { return; } @@ -82,7 +83,7 @@ void DevToolsFrameTraceRecorder::OnSynchronousSwapCompositorFrame( RenderFrameHostImpl* host, - const DevToolsFrameMetadata& metadata) { + const cc::RenderFrameMetadata& metadata) { if (!host || !ScreenshotCategoryEnabled()) { return; }
diff --git a/content/browser/devtools/devtools_frame_trace_recorder.h b/content/browser/devtools/devtools_frame_trace_recorder.h index 0b43c995..968a3c9 100644 --- a/content/browser/devtools/devtools_frame_trace_recorder.h +++ b/content/browser/devtools/devtools_frame_trace_recorder.h
@@ -9,20 +9,22 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +namespace cc { +class RenderFrameMetadata; +} + namespace content { class RenderFrameHostImpl; -struct DevToolsFrameMetadata; class DevToolsFrameTraceRecorder { public: DevToolsFrameTraceRecorder(); ~DevToolsFrameTraceRecorder(); - void OnSynchronousSwapCompositorFrame(RenderFrameHostImpl* host, - const DevToolsFrameMetadata& metadata); - - static constexpr int kMaximumNumberOfScreenshots = 450; + void OnSynchronousSwapCompositorFrame( + RenderFrameHostImpl* host, + const cc::RenderFrameMetadata& metadata); private: DISALLOW_COPY_AND_ASSIGN(DevToolsFrameTraceRecorder);
diff --git a/content/browser/devtools/devtools_traceable_screenshot.h b/content/browser/devtools/devtools_traceable_screenshot.h index bd6afd2..0f90cb1 100644 --- a/content/browser/devtools/devtools_traceable_screenshot.h +++ b/content/browser/devtools/devtools_traceable_screenshot.h
@@ -15,6 +15,8 @@ class DevToolsTraceableScreenshot : public base::trace_event::ConvertableToTraceFormat { public: + static constexpr int kMaximumNumberOfScreenshots = 450; + static base::subtle::Atomic32 GetNumberOfInstances(); DevToolsTraceableScreenshot(const SkBitmap& bitmap);
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 4675c01..b85fcd3 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -271,7 +271,7 @@ } void PageHandler::OnSynchronousSwapCompositorFrame( - const DevToolsFrameMetadata& frame_metadata) { + const cc::RenderFrameMetadata& frame_metadata) { // Cache |frame_metadata_| as InnerSwapCompositorFrame may also be called on // screencast start. frame_metadata_ = frame_metadata; @@ -1104,8 +1104,8 @@ BuildScreencastFrameMetadata( surface_size, frame_metadata_->device_scale_factor, frame_metadata_->page_scale_factor, - frame_metadata_->root_scroll_offset, top_controls_height, - top_controls_shown_ratio); + frame_metadata_->root_scroll_offset.value_or(gfx::Vector2dF()), + top_controls_height, top_controls_shown_ratio); if (!page_metadata) return;
diff --git a/content/browser/devtools/protocol/page_handler.h b/content/browser/devtools/protocol/page_handler.h index aa3ae1e..388e89e 100644 --- a/content/browser/devtools/protocol/page_handler.h +++ b/content/browser/devtools/protocol/page_handler.h
@@ -18,7 +18,7 @@ #include "base/scoped_observer.h" #include "base/time/time.h" #include "build/build_config.h" -#include "content/browser/devtools/devtools_frame_metadata.h" +#include "cc/trees/render_frame_metadata.h" #include "content/browser/devtools/devtools_video_consumer.h" #include "content/browser/devtools/protocol/devtools_domain_handler.h" #include "content/browser/devtools/protocol/devtools_download_manager_delegate.h" @@ -77,7 +77,7 @@ RenderFrameHostImpl* frame_host) override; // Instrumentation signals. void OnSynchronousSwapCompositorFrame( - const DevToolsFrameMetadata& frame_metadata); + const cc::RenderFrameMetadata& frame_metadata); void DidAttachInterstitialPage(); void DidDetachInterstitialPage(); bool screencast_enabled() const { return enabled_ && screencast_enabled_; } @@ -218,7 +218,7 @@ int screencast_max_height_; int capture_every_nth_frame_; int capture_retry_count_; - base::Optional<DevToolsFrameMetadata> frame_metadata_; + base::Optional<cc::RenderFrameMetadata> frame_metadata_; int session_id_; int frame_counter_; int frames_in_flight_;
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc index 43e5eae3..8358a12 100644 --- a/content/browser/devtools/protocol/tracing_handler.cc +++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -27,7 +27,6 @@ #include "build/build_config.h" #include "components/tracing/common/trace_startup_config.h" #include "content/browser/devtools/devtools_agent_host_impl.h" -#include "content/browser/devtools/devtools_frame_trace_recorder.h" #include "content/browser/devtools/devtools_io_context.h" #include "content/browser/devtools/devtools_protocol_encoding.h" #include "content/browser/devtools/devtools_stream_file.h" @@ -956,7 +955,7 @@ ++number_of_screenshots_from_video_consumer_; DCHECK(video_consumer_); if (number_of_screenshots_from_video_consumer_ >= - DevToolsFrameTraceRecorder::kMaximumNumberOfScreenshots) { + DevToolsTraceableScreenshot::kMaximumNumberOfScreenshots) { video_consumer_->StopCapture(); } }
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc index c480bbbd..031a1e7 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host.cc +++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -18,7 +18,6 @@ #include "build/build_config.h" #include "content/browser/bad_message.h" #include "content/browser/child_process_security_policy_impl.h" -#include "content/browser/devtools/devtools_frame_trace_recorder.h" #include "content/browser/devtools/devtools_manager.h" #include "content/browser/devtools/devtools_renderer_channel.h" #include "content/browser/devtools/devtools_session.h" @@ -63,6 +62,7 @@ #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h" #if defined(OS_ANDROID) +#include "content/browser/devtools/devtools_frame_trace_recorder.h" #include "content/browser/renderer_host/compositor_impl_android.h" #include "content/public/browser/render_widget_host_view.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -333,16 +333,13 @@ #endif // !defined(OS_ANDROID) if (sessions().empty()) { - bool use_video_capture_api = true; #ifdef OS_ANDROID - // Video capture API cannot be used on Android WebView. + // With video capture API snapshots happen in TracingHandler. However, the + // video capture API cannot be used with Android WebView so + // DevToolsFrameTraceRecorder takes snapshots. if (!CompositorImpl::IsInitialized()) - use_video_capture_api = false; -#endif - // When video capture API is used, don't instantiate - // DevToolsFrameTraceRecorder. Taking snapshots happens in TracingHandler. - if (!use_video_capture_api) frame_trace_recorder_ = std::make_unique<DevToolsFrameTraceRecorder>(); +#endif UpdateRawHeadersAccess(nullptr, frame_host_); #if defined(OS_ANDROID) GetWakeLock()->RequestWakeLock(); @@ -354,7 +351,9 @@ void RenderFrameDevToolsAgentHost::DetachSession(DevToolsSession* session) { // Destroying session automatically detaches in renderer. if (sessions().empty()) { +#if defined(OS_ANDROID) frame_trace_recorder_.reset(); +#endif UpdateRawHeadersAccess(frame_host_, nullptr); #if defined(OS_ANDROID) GetWakeLock()->CancelWakeLock(); @@ -737,9 +736,10 @@ return base::TimeTicks(); } +#if defined(OS_ANDROID) void RenderFrameDevToolsAgentHost::SignalSynchronousSwapCompositorFrame( RenderFrameHost* frame_host, - const DevToolsFrameMetadata& frame_metadata) { + const cc::RenderFrameMetadata& frame_metadata) { scoped_refptr<RenderFrameDevToolsAgentHost> dtah(FindAgentHost( static_cast<RenderFrameHostImpl*>(frame_host)->frame_tree_node())); if (dtah) { @@ -753,7 +753,7 @@ } void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( - const DevToolsFrameMetadata& frame_metadata) { + const cc::RenderFrameMetadata& frame_metadata) { for (auto* page : protocol::PageHandler::ForAgentHost(this)) page->OnSynchronousSwapCompositorFrame(frame_metadata); @@ -767,6 +767,7 @@ frame_metadata); } } +#endif void RenderFrameDevToolsAgentHost::UpdateRendererChannel(bool force) { mojo::PendingAssociatedRemote<blink::mojom::DevToolsAgent> agent_remote;
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.h b/content/browser/devtools/render_frame_devtools_agent_host.h index 7fb6d56..3ebf652e 100644 --- a/content/browser/devtools/render_frame_devtools_agent_host.h +++ b/content/browser/devtools/render_frame_devtools_agent_host.h
@@ -28,6 +28,10 @@ #include "ui/android/view_android.h" #endif // OS_ANDROID +namespace cc { +class RenderFrameMetadata; +} + namespace content { class BrowserContext; @@ -35,7 +39,6 @@ class FrameTreeNode; class NavigationRequest; class RenderFrameHostImpl; -struct DevToolsFrameMetadata; class CONTENT_EXPORT RenderFrameDevToolsAgentHost : public DevToolsAgentHostImpl, @@ -65,9 +68,12 @@ static void WebContentsCreated(WebContents* web_contents); +#if defined(OS_ANDROID) static void SignalSynchronousSwapCompositorFrame( RenderFrameHost* frame_host, - const DevToolsFrameMetadata& frame_metadata); + const cc::RenderFrameMetadata& frame_metadata); +#endif + FrameTreeNode* frame_tree_node() { return frame_tree_node_; } // DevToolsAgentHost overrides. @@ -129,14 +135,14 @@ #if defined(OS_ANDROID) device::mojom::WakeLock* GetWakeLock(); + void SynchronousSwapCompositorFrame( + const cc::RenderFrameMetadata& frame_metadata); #endif - void SynchronousSwapCompositorFrame( - const DevToolsFrameMetadata& frame_metadata); void UpdateResourceLoaderFactories(); - std::unique_ptr<DevToolsFrameTraceRecorder> frame_trace_recorder_; #if defined(OS_ANDROID) + std::unique_ptr<DevToolsFrameTraceRecorder> frame_trace_recorder_; mojo::Remote<device::mojom::WakeLock> wake_lock_; #endif
diff --git a/content/browser/frame_host/back_forward_cache_impl.cc b/content/browser/frame_host/back_forward_cache_impl.cc index 48c73cf..8aebfe8 100644 --- a/content/browser/frame_host/back_forward_cache_impl.cc +++ b/content/browser/frame_host/back_forward_cache_impl.cc
@@ -75,10 +75,11 @@ } } -bool IsServiceWorkerSupported() { - static constexpr base::FeatureParam<bool> service_worker_supported( - &features::kBackForwardCache, "service_worker_supported", false); - return service_worker_supported.Get(); +bool IsExtendedSupportEnabled() { + static constexpr base::FeatureParam<bool> extended_support_enabled( + &features::kBackForwardCache, + "experimental extended supported feature set", false); + return extended_support_enabled.Get(); } uint64_t GetDisallowedFeatures() { @@ -114,10 +115,13 @@ uint64_t result = kAlwaysDisallowedFeatures; - if (!IsServiceWorkerSupported()) { + if (!IsExtendedSupportEnabled()) { result |= ToFeatureBit(WebSchedulerTrackedFeature::kServiceWorkerControlledPage); + result |= ToFeatureBit( + WebSchedulerTrackedFeature::kRequestedGeolocationPermission); } + return result; }
diff --git a/content/browser/frame_host/render_frame_host_delegate.cc b/content/browser/frame_host/render_frame_host_delegate.cc index e4f2dcf6..4dfe0da 100644 --- a/content/browser/frame_host/render_frame_host_delegate.cc +++ b/content/browser/frame_host/render_frame_host_delegate.cc
@@ -163,4 +163,9 @@ return nullptr; } +bool RenderFrameHostDelegate::IsFrameLowPriority( + const RenderFrameHost* render_frame_host) { + return false; +} + } // namespace content
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h index 7af38fe..a08c40d 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h
@@ -457,6 +457,9 @@ const base::Optional<SkColor>& theme_color) { } + // Determine if the frame is of a low priority. + virtual bool IsFrameLowPriority(const RenderFrameHost* render_frame_host); + protected: virtual ~RenderFrameHostDelegate() {} };
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index c799201..f28a53d 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1018,6 +1018,10 @@ ClearAllWebUI(); SetLastCommittedSiteUrl(GURL()); + if (last_committed_document_priority_) { + GetProcess()->UpdateFrameWithPriority(last_committed_document_priority_, + base::nullopt); + } if (overlay_routing_token_) g_token_frame_map.Get().erase(*overlay_routing_token_); @@ -2239,9 +2243,16 @@ const url::Origin& RenderFrameHostImpl::ComputeTopFrameOrigin( const url::Origin& frame_origin) const { - return frame_tree_node_->IsMainFrame() - ? frame_origin - : frame_tree_->root()->current_origin(); + if (frame_tree_node_->IsMainFrame()) { + return frame_origin; + } + + DCHECK(parent_); + RenderFrameHostImpl* host = parent_; + while (host->parent_) { + host = host->parent_; + } + return host->GetLastCommittedOrigin(); } GURL RenderFrameHostImpl::ComputeSiteForCookiesForNavigation( @@ -2386,6 +2397,18 @@ last_committed_url_ = url; } +void RenderFrameHostImpl::UpdateRenderProcessHostFramePriorities() { + const auto new_committed_document_priority = + (delegate_ && delegate_->IsFrameLowPriority(this)) + ? RenderProcessHostImpl::FramePriority::kLow + : RenderProcessHostImpl::FramePriority::kNormal; + if (last_committed_document_priority_ != new_committed_document_priority) { + GetProcess()->UpdateFrameWithPriority(last_committed_document_priority_, + new_committed_document_priority); + last_committed_document_priority_ = new_committed_document_priority; + } +} + void RenderFrameHostImpl::OnDetach() { if (!parent_) { bad_message::ReceivedBadMessage(GetProcess(), @@ -7131,6 +7154,8 @@ last_http_status_code_ = validated_params->http_status_code; last_http_method_ = validated_params->method; UpdateSiteURL(validated_params->url, validated_params->url_is_unreachable); + if (!is_same_document_navigation) + UpdateRenderProcessHostFramePriorities(); // Set the state whether this navigation is to an MHTML document, since there // are certain security checks that we cannot apply to subframes in MHTML
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 6e56e4e..9bc38868 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -475,6 +475,8 @@ // Return the http status code of the last committed navigation. int last_http_status_code() { return last_http_status_code_; } + // Returns |frame_origin| if this frame is the top (i.e. root) frame in the + // frame tree. Otherwise, it returns the top frame's origin. const url::Origin& ComputeTopFrameOrigin( const url::Origin& frame_origin) const; @@ -1346,6 +1348,9 @@ class DroppedInterfaceRequestLogger; + // Update the RenderProcessHost priority when a navigation occurs. + void UpdateRenderProcessHostFramePriorities(); + // IPC Message handlers. void OnDetach(); void OnOpenURL(const FrameHostMsg_OpenURL_Params& params); @@ -1983,6 +1988,11 @@ // Track this frame's last committed URL. GURL last_committed_url_; + // Track the frame priority of the last committed document, which is nullopt + // prior to the first commit. + base::Optional<RenderProcessHostImpl::FramePriority> + last_committed_document_priority_; + // Track this frame's last committed origin. url::Origin last_committed_origin_;
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 874fb88c..9c480f82 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -656,7 +656,7 @@ if (!IsURLHandledByNetworkService(resource_request_->url)) { if (known_schemes_.find(resource_request_->url.scheme()) == known_schemes_.end()) { - network::mojom::URLLoaderFactoryPtr loader_factory; + mojo::PendingRemote<network::mojom::URLLoaderFactory> loader_factory; bool handled = GetContentClient()->browser()->HandleExternalProtocol( resource_request_->url, web_contents_getter_, ChildProcessHost::kInvalidUniqueID, navigation_ui_data_.get(),
diff --git a/content/browser/media/mpris_notifier.cc b/content/browser/media/mpris_notifier.cc index 3b34a30..8693981 100644 --- a/content/browser/media/mpris_notifier.cc +++ b/content/browser/media/mpris_notifier.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "mojo/public/cpp/bindings/remote.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "services/service_manager/public/cpp/connector.h" @@ -31,10 +32,10 @@ // Connect to the MediaControllerManager and create a MediaController that // controls the active session so we can observe it. - media_session::mojom::MediaControllerManagerPtr controller_manager_ptr; - connector_->BindInterface(media_session::mojom::kServiceName, - mojo::MakeRequest(&controller_manager_ptr)); - controller_manager_ptr->CreateActiveMediaController( + mojo::Remote<media_session::mojom::MediaControllerManager> controller_manager; + connector_->Connect(media_session::mojom::kServiceName, + controller_manager.BindNewPipeAndPassReceiver()); + controller_manager->CreateActiveMediaController( media_controller_.BindNewPipeAndPassReceiver()); // Observe the active media controller for changes to playback state and
diff --git a/content/browser/media/now_playing_info_center_notifier.cc b/content/browser/media/now_playing_info_center_notifier.cc index 25fc859..36ff84ee2 100644 --- a/content/browser/media/now_playing_info_center_notifier.cc +++ b/content/browser/media/now_playing_info_center_notifier.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "mojo/public/cpp/bindings/remote.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "services/service_manager/public/cpp/connector.h" @@ -26,10 +27,10 @@ // Connect to the MediaControllerManager and create a MediaController that // controls the active session so we can observe it. - media_session::mojom::MediaControllerManagerPtr controller_manager_ptr; - connector->BindInterface(media_session::mojom::kServiceName, - mojo::MakeRequest(&controller_manager_ptr)); - controller_manager_ptr->CreateActiveMediaController( + mojo::Remote<media_session::mojom::MediaControllerManager> controller_manager; + connector->Connect(media_session::mojom::kServiceName, + controller_manager.BindNewPipeAndPassReceiver()); + controller_manager->CreateActiveMediaController( media_controller_.BindNewPipeAndPassReceiver()); // Observe the active media controller for changes to playback state and
diff --git a/content/browser/media/system_media_controls_notifier.cc b/content/browser/media/system_media_controls_notifier.cc index 0368b25..3b5e59e 100644 --- a/content/browser/media/system_media_controls_notifier.cc +++ b/content/browser/media/system_media_controls_notifier.cc
@@ -11,6 +11,7 @@ #include "base/time/time.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "services/service_manager/public/cpp/connector.h" @@ -59,10 +60,10 @@ // Connect to the MediaControllerManager and create a MediaController that // controls the active session so we can observe it. - media_session::mojom::MediaControllerManagerPtr controller_manager_ptr; - connector_->BindInterface(media_session::mojom::kServiceName, - mojo::MakeRequest(&controller_manager_ptr)); - controller_manager_ptr->CreateActiveMediaController( + mojo::Remote<media_session::mojom::MediaControllerManager> controller_manager; + connector_->Connect(media_session::mojom::kServiceName, + controller_manager.BindNewPipeAndPassReceiver()); + controller_manager->CreateActiveMediaController( media_controller_.BindNewPipeAndPassReceiver()); // Observe the active media controller for changes to playback state and
diff --git a/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc b/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc index bdfa4f9..aec4470 100644 --- a/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc +++ b/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc
@@ -82,18 +82,11 @@ // the WebView's parent gfx::NativeViewAccessible native_view_accessible = GetView()->GetNativeViewAccessible(); - if (GetParam().is_uia_enabled && !GetParam().is_legacy_window_disabled) { - EXPECT_EQ(native_view_accessible, - ui::AXFragmentRootWin::GetForAcceleratedWidget( - GetView()->AccessibilityGetAcceleratedWidget()) - ->GetNativeViewAccessible()); - } else { - EXPECT_EQ(native_view_accessible, GetView() - ->host() - ->GetRootBrowserAccessibilityManager() - ->GetRoot() - ->GetNativeViewAccessible()); - } + EXPECT_EQ(native_view_accessible, GetView() + ->host() + ->GetRootBrowserAccessibilityManager() + ->GetRoot() + ->GetNativeViewAccessible()); // Used by LegacyRenderWidgetHostHWND to find the parent of the UIA fragment // root for web content
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc index e7d7fbd..14709196 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.cc +++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -151,7 +151,8 @@ // element B, then ask element B for its fragment root, without having sent // WM_GETOBJECT to element B's window. So we create the fragment root now to // ensure it's ready if asked for. - ax_fragment_root_ = std::make_unique<ui::AXFragmentRootWin>(hwnd(), this); + ax_fragment_root_ = + std::make_unique<ui::AXFragmentRootWin>(hwnd(), this, true); hr = S_OK; }
diff --git a/content/browser/renderer_host/media/service_video_capture_provider.cc b/content/browser/renderer_host/media/service_video_capture_provider.cc index 0d3ede4..9134d195 100644 --- a/content/browser/renderer_host/media/service_video_capture_provider.cc +++ b/content/browser/renderer_host/media/service_video_capture_provider.cc
@@ -17,7 +17,8 @@ #include "content/public/browser/video_capture_service.h" #include "content/public/common/content_features.h" #include "mojo/public/cpp/bindings/callback_helpers.h" -#include "mojo/public/cpp/bindings/strong_binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/video_capture/public/mojom/video_capture_service.mojom.h" #include "services/video_capture/public/uma/video_capture_service_event.h" @@ -214,12 +215,14 @@ auto ui_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::UI}); #if defined(OS_CHROMEOS) - video_capture::mojom::AcceleratorFactoryPtr accelerator_factory; + mojo::PendingRemote<video_capture::mojom::AcceleratorFactory> + accelerator_factory; if (!create_accelerator_factory_cb_) create_accelerator_factory_cb_ = base::BindRepeating(&CreateAcceleratorFactory); - mojo::MakeStrongBinding(create_accelerator_factory_cb_.Run(), - mojo::MakeRequest(&accelerator_factory)); + mojo::MakeSelfOwnedReceiver( + create_accelerator_factory_cb_.Run(), + accelerator_factory.InitWithNewPipeAndPassReceiver()); GetVideoCaptureService().InjectGpuDependencies( std::move(accelerator_factory)); #endif // defined(OS_CHROMEOS)
diff --git a/content/browser/renderer_host/media/service_video_capture_provider_unittest.cc b/content/browser/renderer_host/media/service_video_capture_provider_unittest.cc index b34a003..274ae019 100644 --- a/content/browser/renderer_host/media/service_video_capture_provider_unittest.cc +++ b/content/browser/renderer_host/media/service_video_capture_provider_unittest.cc
@@ -17,6 +17,7 @@ #include "content/public/test/browser_task_environment.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "services/video_capture/public/cpp/mock_push_subscription.h" @@ -80,10 +81,12 @@ ON_CALL(mock_video_capture_service_, DoConnectToVideoSourceProvider(_)) .WillByDefault(Invoke( - [this](video_capture::mojom::VideoSourceProviderRequest& request) { + [this]( + mojo::PendingReceiver<video_capture::mojom::VideoSourceProvider> + receiver) { if (source_provider_binding_.is_bound()) source_provider_binding_.Close(); - source_provider_binding_.Bind(std::move(request)); + source_provider_binding_.Bind(std::move(receiver)); wait_for_connection_to_service_.Quit(); }));
diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc index 0b6372da..be3d057 100644 --- a/content/browser/renderer_host/render_process_host_browsertest.cc +++ b/content/browser/renderer_host/render_process_host_browsertest.cc
@@ -22,6 +22,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/common/content_client.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/url_constants.h" #include "content/public/test/browser_test_utils.h" @@ -50,7 +51,6 @@ #endif namespace content { -namespace { std::unique_ptr<net::test_server::HttpResponse> HandleBeacon( const net::test_server::HttpRequest& request) { @@ -73,7 +73,19 @@ class RenderProcessHostTest : public ContentBrowserTest, public RenderProcessHostObserver { public: - RenderProcessHostTest() : process_exits_(0), host_destructions_(0) {} + RenderProcessHostTest() + : process_exits_(0), host_destructions_(0), use_frame_priority_(false) {} + + void SetUp() override { + if (use_frame_priority_) { + feature_list_.InitAndEnableFeature( + features::kUseFramePriorityInRenderProcessHost); + } else { + feature_list_.InitAndDisableFeature( + features::kUseFramePriorityInRenderProcessHost); + } + ContentBrowserTest::SetUp(); + } void SetUpCommandLine(base::CommandLine* command_line) override { command_line->AppendSwitchASCII( @@ -86,6 +98,11 @@ host_resolver()->AddRule("*", "127.0.0.1"); } + void SetVisibleClients(RenderProcessHost* process, int32_t visible_clients) { + RenderProcessHostImpl* impl = static_cast<RenderProcessHostImpl*>(process); + impl->visible_clients_ = visible_clients; + } + protected: void set_process_exit_callback(const base::Closure& callback) { process_exit_callback_ = callback; @@ -109,6 +126,8 @@ int process_exits_; int host_destructions_; base::Closure process_exit_callback_; + bool use_frame_priority_; + base::test::ScopedFeatureList feature_list_; }; // A mock ContentBrowserClient that only considers a spare renderer to be a @@ -1094,6 +1113,28 @@ rph->RemoveObserver(this); } +IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, LowPriorityFramesDisabled) { + // RenderProcessHostImpl::UpdateProcessPriority has an early check of + // run_renderer_in_process and exits for RenderProcessHosts without a child + // process launcher. In order to skip initializing that here and the layer of + // indirection, we explicitly run in-process, which we must also disable once + // the test has finished to prevent crashing on exit. + RenderProcessHost::SetRunRendererInProcess(true); + RenderProcessHostImpl* process = static_cast<RenderProcessHostImpl*>( + RenderProcessHostImpl::CreateRenderProcessHost( + ShellContentBrowserClient::Get()->browser_context(), nullptr, nullptr, + false /* is_for_guests_only */)); + // It starts off as normal priority. + EXPECT_FALSE(process->IsProcessBackgrounded()); + // With the feature off it stays low priority when adding low priority frames. + process->UpdateFrameWithPriority(base::nullopt, + RenderProcessHostImpl::FramePriority::kLow); + process->UpdateFrameWithPriority(base::nullopt, + RenderProcessHostImpl::FramePriority::kLow); + EXPECT_FALSE(process->IsProcessBackgrounded()); + RenderProcessHost::SetRunRendererInProcess(false); +} + // This test verifies properties of RenderProcessHostImpl *before* Init method // is called. IN_PROC_BROWSER_TEST_F(RenderProcessHostTest, ConstructedButNotInitializedYet) { @@ -1136,5 +1177,73 @@ process->Cleanup(); } -} // namespace +class RenderProcessHostFramePriorityTest : public RenderProcessHostTest { + public: + RenderProcessHostFramePriorityTest() : RenderProcessHostTest() { + use_frame_priority_ = true; + } +}; + +IN_PROC_BROWSER_TEST_F(RenderProcessHostFramePriorityTest, + LowPriorityFramesEnabled) { + // RenderProcessHostImpl::UpdateProcessPriority has an early check of + // run_renderer_in_process and exits for RenderProcessHosts without a child + // process launcher. In order to skip initializing that here and the layer of + // indirection, we explicitly run in-process, which we must also disable once + // the test has finished to prevent crashing on exit. + RenderProcessHost::SetRunRendererInProcess(true); + RenderProcessHostImpl* process = static_cast<RenderProcessHostImpl*>( + RenderProcessHostImpl::CreateRenderProcessHost( + ShellContentBrowserClient::Get()->browser_context(), nullptr, nullptr, + false /* is_for_guests_only */)); + // For these tests, assume something is always visible. + SetVisibleClients(process, 1); + // When no frames are attached, it's not low priority. + EXPECT_FALSE(process->IsProcessBackgrounded()); + // When all frames added are low priority, it's low priority. + process->UpdateFrameWithPriority(base::nullopt, + RenderProcessHostImpl::FramePriority::kLow); + process->UpdateFrameWithPriority(base::nullopt, + RenderProcessHostImpl::FramePriority::kLow); + EXPECT_TRUE(process->IsProcessBackgrounded()); + // When all the low priority frames are removed, it's not low priority. + process->UpdateFrameWithPriority(RenderProcessHostImpl::FramePriority::kLow, + base::nullopt); + process->UpdateFrameWithPriority(RenderProcessHostImpl::FramePriority::kLow, + base::nullopt); + EXPECT_FALSE(process->IsProcessBackgrounded()); + // When a low priority frame is added back in, it's low priority. + process->UpdateFrameWithPriority(base::nullopt, + RenderProcessHostImpl::FramePriority::kLow); + EXPECT_TRUE(process->IsProcessBackgrounded()); + // As soon as a non-low priority frame is added, it's not low priority. + process->UpdateFrameWithPriority( + base::nullopt, RenderProcessHostImpl::FramePriority::kNormal); + EXPECT_FALSE(process->IsProcessBackgrounded()); + // It remains not low priority even if we add more low priority frames. + process->UpdateFrameWithPriority(base::nullopt, + RenderProcessHostImpl::FramePriority::kLow); + EXPECT_FALSE(process->IsProcessBackgrounded()); + // As soon as the non-low priority frame is removed, it becomes low priority. + process->UpdateFrameWithPriority( + RenderProcessHostImpl::FramePriority::kNormal, base::nullopt); + EXPECT_TRUE(process->IsProcessBackgrounded()); + // Add a non-low priority frame, but then transition it to low, the process + // should go from unbackgrounded to backgrounded. + process->UpdateFrameWithPriority( + base::nullopt, RenderProcessHostImpl::FramePriority::kNormal); + EXPECT_FALSE(process->IsProcessBackgrounded()); + process->UpdateFrameWithPriority( + RenderProcessHostImpl::FramePriority::kNormal, + RenderProcessHostImpl::FramePriority::kLow); + EXPECT_TRUE(process->IsProcessBackgrounded()); + // Transition the frame back to normal priority, it becomes normal priority. + process->UpdateFrameWithPriority( + RenderProcessHostImpl::FramePriority::kLow, + RenderProcessHostImpl::FramePriority::kNormal); + EXPECT_FALSE(process->IsProcessBackgrounded()); + + RenderProcessHost::SetRunRendererInProcess(false); +} + } // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index cdaf4b1..311756e 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1437,6 +1437,7 @@ priority_(!blink::kLaunchingProcessIsBackgrounded, false /* has_media_stream */, false /* has_foreground_service_worker */, + false /* all_low_priority_frames */, frame_depth_, false /* intersects_viewport */, true /* boost_for_pending_views */ @@ -1716,6 +1717,10 @@ InitializeChannelProxy(); } +bool RenderProcessHostImpl::HasOnlyLowPriorityFrames() { + return (low_priority_frames_ > 0) && (total_frames_ == low_priority_frames_); +} + void RenderProcessHostImpl::InitializeChannelProxy() { scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::IO}); @@ -2638,6 +2643,25 @@ UpdateProcessPriorityInputs(); } +void RenderProcessHostImpl::UpdateFrameWithPriority( + base::Optional<FramePriority> previous_priority, + base::Optional<FramePriority> new_priority) { + if (!base::FeatureList::IsEnabled( + features::kUseFramePriorityInRenderProcessHost)) { + return; + } + + const bool previous_all_low_priority_frames = HasOnlyLowPriorityFrames(); + total_frames_ = + total_frames_ - (previous_priority ? 1 : 0) + (new_priority ? 1 : 0); + low_priority_frames_ = + low_priority_frames_ - + (previous_priority && previous_priority == FramePriority::kLow ? 1 : 0) + + (new_priority && new_priority == FramePriority::kLow ? 1 : 0); + if (previous_all_low_priority_frames != HasOnlyLowPriorityFrames()) + UpdateProcessPriority(); +} + int RenderProcessHostImpl::VisibleClientCount() { return visible_clients_; } @@ -4380,7 +4404,7 @@ visible_clients_ > 0 || base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableRendererBackgrounding), media_stream_count_ > 0, foreground_service_worker_count_ > 0, - frame_depth_, intersects_viewport_, + HasOnlyLowPriorityFrames(), frame_depth_, intersects_viewport_, !!pending_views_ /* boost_for_pending_views */ #if defined(OS_ANDROID) , @@ -4388,11 +4412,11 @@ #endif ); + if (priority_ == priority) + return; const bool background_state_changed = priority_.is_background() != priority.is_background(); const bool visibility_state_changed = priority_.visible != priority.visible; - if (priority_ == priority) - return; TRACE_EVENT2("renderer_host", "RenderProcessHostImpl::UpdateProcessPriority", "should_background", priority.is_background(), @@ -4437,14 +4461,14 @@ } void RenderProcessHostImpl::SendProcessStateToRenderer() { - mojom::RenderProcessState process_state; - if (priority_.is_background()) - process_state = mojom::RenderProcessState::kBackgrounded; - else if (priority_.visible) - process_state = mojom::RenderProcessState::kVisible; - else - process_state = mojom::RenderProcessState::kHidden; - GetRendererInterface()->SetProcessState(process_state); + mojom::RenderProcessBackgroundState background_state = + priority_.is_background() + ? mojom::RenderProcessBackgroundState::kBackgrounded + : mojom::RenderProcessBackgroundState::kForegrounded; + mojom::RenderProcessVisibleState visible_state = + priority_.visible ? mojom::RenderProcessVisibleState::kVisible + : mojom::RenderProcessVisibleState::kHidden; + GetRendererInterface()->SetProcessState(background_state, visible_state); } void RenderProcessHostImpl::OnProcessLaunched() {
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index 3418a7d6..b76dc4a1 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -108,6 +108,7 @@ class RenderFrameMessageFilter; class RenderProcessHostCreationObserver; class RenderProcessHostFactory; +class RenderProcessHostTest; class RenderWidgetHelper; class SiteInstance; class SiteInstanceImpl; @@ -283,6 +284,14 @@ header_client, mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver); + // Update the total and low priority count as indicated by the previous and + // new priorities of the underlying document. The nullopt option is used when + // there is no previous/subsequent navigation (when the frame is added/removed + // from the RenderProcessHostImpl). + void UpdateFrameWithPriority( + base::Optional<FramePriority> previous_priority, + base::Optional<FramePriority> new_priority) override; + // Call this function when it is evident that the child process is actively // performing some operation, for example if we just received an IPC message. void mark_child_process_activity_time() { @@ -465,6 +474,7 @@ get_render_process_host_factory_for_testing(); // Tracks which sites frames are hosted in which RenderProcessHosts. + // TODO(ericrobinson): These don't need to be static. static void AddFrameWithSite(BrowserContext* browser_context, RenderProcessHost* render_process_host, const GURL& site_url); @@ -581,6 +591,7 @@ friend class ChildProcessLauncherBrowserTest_ChildSpawnFail_Test; friend class VisitRelayingRenderProcessHost; friend class StoragePartitonInterceptor; + friend class RenderProcessHostTest; // Use CreateRenderProcessHost() instead of calling this constructor // directly. @@ -588,8 +599,13 @@ StoragePartitionImpl* storage_partition_impl, bool is_for_guests_only); - // Initializes a new IPC::ChannelProxy in |channel_|, which will be connected - // to the next child process launched for this host, if any. + // True if this ChildProcessLauncher has a non-zero number of frames attached + // to it and they're all low priority. Note: This will always return false + // unless features::kUseFramePriorityInProcessHost is enabled. + bool HasOnlyLowPriorityFrames(); + + // Initializes a new IPC::ChannelProxy in |channel_|, which will be + // connected to the next child process launched for this host, if any. void InitializeChannelProxy(); // Resets |channel_|, removing it from the attachment broker if necessary. @@ -836,6 +852,12 @@ // processes of same visibility. It indicates process has frames that // intersect with the viewport. bool intersects_viewport_ = false; + // Tracks the number of low priority frames currently hosted in this process. + // Always 0 unless features::kUseFramePriorityInProcessHost is enabled. + unsigned int low_priority_frames_ = 0; + // Tracks the total number of frames currently hosted in this process. + // Always 0 unless features::kUseFramePriorityInProcessHost is enabled. + unsigned int total_frames_ = 0; #if defined(OS_ANDROID) // Highest importance of all clients that contribute priority. ChildProcessImportance effective_importance_ = ChildProcessImportance::NORMAL;
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 35c741f..671cfc0c 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -395,7 +395,7 @@ if (!using_browser_compositor_) { // DevTools ScreenCast support for Android WebView. - last_devtools_frame_metadata_.emplace(metadata); + last_render_frame_metadata_ = metadata; // Android WebView ignores transparent background. is_transparent = false; } @@ -1143,11 +1143,11 @@ if (!in_sync_copy_contents_) { RenderFrameHost* frame_host = RenderViewHost::From(host())->GetMainFrame(); - if (frame_host && last_devtools_frame_metadata_) { + if (frame_host && last_render_frame_metadata_) { // Update our |root_scroll_offset|, as changes to this value do not // trigger a new RenderFrameMetadata, and it may be out of date. This // is needed for devtools DOM node selection. - DevToolsFrameMetadata updated_metadata = *last_devtools_frame_metadata_; + cc::RenderFrameMetadata updated_metadata = *last_render_frame_metadata_; updated_metadata.root_scroll_offset = gfx::ScrollOffsetToVector2dF(root_scroll_offset); RenderFrameDevToolsAgentHost::SignalSynchronousSwapCompositorFrame(
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 7fe3f394..bf7317b 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -20,12 +20,12 @@ #include "base/memory/weak_ptr.h" #include "base/process/process.h" #include "base/time/time.h" +#include "cc/trees/render_frame_metadata.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" #include "components/viz/common/frame_sinks/begin_frame_source.h" #include "components/viz/common/frame_timing_details_map.h" #include "components/viz/common/quads/selection.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" -#include "content/browser/devtools/devtools_frame_metadata.h" #include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h" #include "content/browser/renderer_host/input/stylus_text_selector.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" @@ -584,9 +584,8 @@ // TODO(ericrk): Make this more robust. bool in_sync_copy_contents_ = false; - // A cached copy of the most up to date DevToolsFrameMetadata, computed from - // either RenderFrameMetadata or CompositorFrameMetadata. - base::Optional<DevToolsFrameMetadata> last_devtools_frame_metadata_; + // A cached copy of the most up to date RenderFrameMetadata. + base::Optional<cc::RenderFrameMetadata> last_render_frame_metadata_; WebContentsAccessibilityAndroid* web_contents_accessibility_ = nullptr;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 448db2a..7563952 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -531,9 +531,6 @@ if (!window_host) return static_cast<gfx::NativeViewAccessible>(NULL); - if (legacy_render_widget_host_HWND_) - return legacy_render_widget_host_HWND_->GetOrCreateWindowRootAccessible(); - BrowserAccessibilityManager* manager = host()->GetOrCreateRootBrowserAccessibilityManager(); if (manager)
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 812cfe34..8607f372 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -7237,6 +7237,13 @@ return nullptr; } +bool WebContentsImpl::IsFrameLowPriority( + const RenderFrameHost* render_frame_host) { + if (!delegate_) + return false; + return delegate_->IsFrameLowPriority(this, render_frame_host); +} + void WebContentsImpl::UpdateWebContentsVisibility(Visibility visibility) { // Occlusion is disabled when |features::kWebContentsOcclusion| is disabled // (for power and speed impact assessment) or when
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 71299edb..26bd8fcc 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -640,6 +640,7 @@ FrameTreeNode* frame_tree_node) override; void OnThemeColorChanged(RenderFrameHostImpl* source, const base::Optional<SkColor>& theme_color) override; + bool IsFrameLowPriority(const RenderFrameHost* render_frame_host) override; // RenderViewHostDelegate ---------------------------------------------------- RenderViewHostDelegateView* GetDelegateView() override;
diff --git a/content/common/renderer.mojom b/content/common/renderer.mojom index 4e4c161..8179ef9f 100644 --- a/content/common/renderer.mojom +++ b/content/common/renderer.mojom
@@ -174,16 +174,26 @@ map<SystemThemeColor, uint32> colors; }; -enum RenderProcessState { - kVisible, - // Hidden render processes can still be foregrounded. For example, a hidden - // renderer playing audio would be foregrounded. - kHidden, - // Refers to a renderer that is hidden and running at background process - // priority. +// The background state for the render process. When backgrounded the process's +// priority will be lower (via base::Process::SetProcessBackgrounded()) if +// allowed on the current platform (as determined by +// base::Process::CanBackgroundProcesses()). +enum RenderProcessBackgroundState { + // The renderer process has not been backgrounded, a hidden renderer may still + // be foregrounded, e.g. when it is playing audio. + kForegrounded, + // The renderer process has been backgrounded, a visible renderer may still + // be backgrounded, e.g. when it is hosting only low priority frames. kBackgrounded, }; +// The visibility state for the renderer process, indicating whether or not any +// of the frames associated with the renderer process are visible. +enum RenderProcessVisibleState { + kVisible, + kHidden, +}; + // The primordial Channel-associated interface implemented by a render process. // This should be used for implementing browser-to-renderer control messages // which need to retain FIFO with respect to legacy IPC messages. @@ -263,7 +273,8 @@ // Tells the renderer process of a change in visibility or background state. - SetProcessState(RenderProcessState process_state); + SetProcessState(RenderProcessBackgroundState background_state, + RenderProcessVisibleState visible_state); // Tells the scheduler about "keep-alive" state which can be due to: // service workers, shared workers, or fetch keep-alive.
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index f2b2365..696db8d4 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -139,7 +139,7 @@ return false; } -network::mojom::URLLoaderFactoryPtrInfo +mojo::PendingRemote<network::mojom::URLLoaderFactory> ContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests( RenderProcessHost* process, network::mojom::NetworkContext* network_context, @@ -147,7 +147,7 @@ header_client, const url::Origin& request_initiator, const base::Optional<net::NetworkIsolationKey>& network_isolation_key) { - return network::mojom::URLLoaderFactoryPtrInfo(); + return mojo::NullRemote(); } void ContentBrowserClient::GetAdditionalViewSourceSchemes( @@ -904,7 +904,7 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) { + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) { return true; }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 7a02c26..73179d6 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h
@@ -32,6 +32,7 @@ #include "media/mojo/mojom/remoting.mojom.h" #include "mojo/public/cpp/bindings/generic_pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/restricted_cookie_manager.mojom-forward.h" #include "services/network/public/mojom/url_loader_factory.mojom-forward.h" @@ -358,9 +359,8 @@ // Cross-Origin Read Blocking enforcement as needed by some extensions). // // If the embedder doesn't want to override the URLLoaderFactory for the given - // |request_initiator|, then it should return an invalid - // mojo::InterfacePtrInfo. - virtual network::mojom::URLLoaderFactoryPtrInfo + // |request_initiator|, then it should return an mojo::NullRemote(). + virtual mojo::PendingRemote<network::mojom::URLLoaderFactory> CreateURLLoaderFactoryForNetworkRequests( RenderProcessHost* process, network::mojom::NetworkContext* network_context, @@ -1568,7 +1568,7 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory); + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory); // Creates an OverlayWindow to be used for Picture-in-Picture. This window // will house the content shown when in Picture-in-Picture mode. This will
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h index 812102b6..a82248cd 100644 --- a/content/public/browser/render_process_host.h +++ b/content/public/browser/render_process_host.h
@@ -85,6 +85,10 @@ public: using iterator = base::IDMap<RenderProcessHost*>::iterator; + // The priority of a frame added to the RenderProcessHost. + // TODO(ericrobinson): Move to RenderProcessHostImpl after Mock refactor. + enum class FramePriority { kLow, kNormal }; + // Priority (or on Android, the importance) that a client contributes to this // RenderProcessHost. Eg a RenderProcessHost with a visible client has higher // priority / importance than a RenderProcessHost with hidden clients only. @@ -159,6 +163,15 @@ // individual priority changes. virtual void UpdateClientPriority(PriorityClient* client) = 0; + // Update the total and low priority count as indicated by the previous and + // new priorities of the underlying document. The nullopt option is used when + // there is no previous/subsequent navigation (when the frame is added/removed + // from the RenderProcessHost). + // TODO(ericrobinson): Move to RenderProcessHostImpl after Mock refactor. + virtual void UpdateFrameWithPriority( + base::Optional<FramePriority> previous_priority, + base::Optional<FramePriority> new_priority) = 0; + // Number of visible (ie |!is_hidden|) PriorityClients. virtual int VisibleClientCount() = 0;
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc index 9dcdf2d..4fffb0c 100644 --- a/content/public/browser/web_contents_delegate.cc +++ b/content/public/browser/web_contents_delegate.cc
@@ -325,4 +325,11 @@ WebContents* source) { return false; } + +bool WebContentsDelegate::IsFrameLowPriority( + const WebContents* web_contents, + const RenderFrameHost* render_frame_host) { + return false; +} + } // namespace content
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index dedaf25a..6c9e6b0 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -670,6 +670,10 @@ // solid color is displayed instead. virtual bool ShouldShowStaleContentOnEviction(WebContents* source); + // Determine if the frame is of a low priority. + virtual bool IsFrameLowPriority(const WebContents* web_contents, + const RenderFrameHost* render_frame_host); + protected: virtual ~WebContentsDelegate();
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 8892630..c72c051 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -549,6 +549,13 @@ const base::Feature kTouchpadAsyncPinchEvents{"TouchpadAsyncPinchEvents", base::FEATURE_ENABLED_BY_DEFAULT}; +// Controls whether the RenderProcessHost uses its frames' priorities for +// determining if it should be backgrounded. When all frames associated with a +// RenderProcessHost are low priority, that process may be backgrounded even if +// those frames are visible. +const base::Feature kUseFramePriorityInRenderProcessHost{ + "UseFramePriorityInRenderProcessHost", base::FEATURE_DISABLED_BY_DEFAULT}; + // Allows developers transfer user activation state to any target window in the // frame tree. const base::Feature kUserActivationPostMessageTransfer{
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 06f72499..52ed2e3 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -121,6 +121,7 @@ CONTENT_EXPORT extern const base::Feature kTimerThrottlingForHiddenFrames; CONTENT_EXPORT extern const base::Feature kTouchpadAsyncPinchEvents; CONTENT_EXPORT extern const base::Feature kTouchpadOverscrollHistoryNavigation; +CONTENT_EXPORT extern const base::Feature kUseFramePriorityInRenderProcessHost; CONTENT_EXPORT extern const base::Feature kUserActivationPostMessageTransfer; CONTENT_EXPORT extern const base::Feature kUserActivationSameOriginVisibility; CONTENT_EXPORT extern const base::Feature kUserActivationV2;
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc index 1830e32b..8445d70 100644 --- a/content/public/test/mock_render_process_host.cc +++ b/content/public/test/mock_render_process_host.cc
@@ -159,6 +159,10 @@ void MockRenderProcessHost::UpdateClientPriority(PriorityClient* client) {} +void MockRenderProcessHost::UpdateFrameWithPriority( + base::Optional<FramePriority> previous_priority, + base::Optional<FramePriority> new_priority) {} + int MockRenderProcessHost::VisibleClientCount() { int count = 0; for (auto* client : priority_clients_) {
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h index fd4afea..d28777f 100644 --- a/content/public/test/mock_render_process_host.h +++ b/content/public/test/mock_render_process_host.h
@@ -87,6 +87,9 @@ void RemoveObserver(RenderProcessHostObserver* observer) override; void ShutdownForBadMessage(CrashReportMode crash_report_mode) override; void UpdateClientPriority(PriorityClient* client) override; + void UpdateFrameWithPriority( + base::Optional<FramePriority> previous_priority, + base::Optional<FramePriority> new_priority) override; int VisibleClientCount() override; unsigned int GetFrameDepth() override; bool GetIntersectsViewport() override;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 8163ba87..6271d81 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -5173,7 +5173,6 @@ void RenderFrameImpl::NavigateBackForwardSoon(int offset, bool has_user_gesture) { - render_view()->NavigateBackForwardSoon(offset, has_user_gesture); Send(new FrameHostMsg_GoToEntryAtOffset(GetRoutingID(), offset, has_user_gesture)); } @@ -5996,9 +5995,6 @@ navigation_state->commit_params().pending_history_list_offset; } - if (commit_type == blink::WebHistoryCommitType::kWebBackForwardCommit) - render_view_->DidCommitProvisionalHistoryLoad(); - return is_new_navigation; }
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index e2cb076..aaf5a4487 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -1632,26 +1632,27 @@ } void RenderThreadImpl::SetProcessState( - mojom::RenderProcessState process_state) { - DCHECK(process_state_ != process_state); + mojom::RenderProcessBackgroundState background_state, + mojom::RenderProcessVisibleState visible_state) { + DCHECK(background_state_ != background_state || + visible_state_ != visible_state); - if (process_state_ == mojom::RenderProcessState::kBackgrounded || - (!process_state_.has_value() && - process_state != mojom::RenderProcessState::kBackgrounded)) { - OnRendererForegrounded(); + if (background_state != background_state_) { + if (background_state == mojom::RenderProcessBackgroundState::kForegrounded) + OnRendererForegrounded(); + else + OnRendererBackgrounded(); } - if (process_state == mojom::RenderProcessState::kVisible) { - OnRendererVisible(); - } else if (process_state_ == mojom::RenderProcessState::kVisible || - !process_state_.has_value()) { - OnRendererHidden(); + if (visible_state != visible_state_) { + if (visible_state == mojom::RenderProcessVisibleState::kVisible) + OnRendererVisible(); + else + OnRendererHidden(); } - if (process_state == mojom::RenderProcessState::kBackgrounded) - OnRendererBackgrounded(); - - process_state_ = process_state; + background_state_ = background_state; + visible_state_ = visible_state; } void RenderThreadImpl::SetIsLockedToSite() { @@ -2306,8 +2307,7 @@ } bool RenderThreadImpl::RendererIsHidden() const { - return process_state_ == mojom::RenderProcessState::kHidden || - process_state_ == mojom::RenderProcessState::kBackgrounded; + return visible_state_ == mojom::RenderProcessVisibleState::kHidden; } void RenderThreadImpl::OnRendererHidden() { @@ -2327,7 +2327,8 @@ } bool RenderThreadImpl::RendererIsBackgrounded() const { - return process_state_ == mojom::RenderProcessState::kBackgrounded; + return background_state_ == + mojom::RenderProcessBackgroundState::kBackgrounded; } void RenderThreadImpl::OnRendererBackgrounded() {
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 7dfca92..16def76 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -508,7 +508,8 @@ void UpdateSystemColorInfo( mojom::UpdateSystemColorInfoParamsPtr params) override; void PurgePluginListCache(bool reload_pages) override; - void SetProcessState(mojom::RenderProcessState process_state) override; + void SetProcessState(mojom::RenderProcessBackgroundState background_state, + mojom::RenderProcessVisibleState visible_state) override; void SetSchedulerKeepActive(bool keep_active) override; void SetIsLockedToSite() override; void EnableV8LowMemoryMode() override; @@ -572,7 +573,8 @@ // Used to keep track of the renderer's backgrounded and visibility state. // Updated via an IPC from the browser process. If nullopt, the browser // process has yet to send an update and the state is unknown. - base::Optional<mojom::RenderProcessState> process_state_; + base::Optional<mojom::RenderProcessBackgroundState> background_state_; + base::Optional<mojom::RenderProcessVisibleState> visible_state_; blink::WebString user_agent_; blink::UserAgentMetadata user_agent_metadata_;
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc index 91dab8b..a2c265a 100644 --- a/content/renderer/render_thread_impl_browsertest.cc +++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -240,9 +240,22 @@ protected: IPC::Sender* sender() { return channel_.get(); } - void SetProcessState(mojom::RenderProcessState process_state) { + void SetBackgroundState( + mojom::RenderProcessBackgroundState background_state) { mojom::Renderer* renderer_interface = thread_; - renderer_interface->SetProcessState(process_state); + const mojom::RenderProcessVisibleState visible_state = + RendererIsHidden() ? mojom::RenderProcessVisibleState::kHidden + : mojom::RenderProcessVisibleState::kVisible; + renderer_interface->SetProcessState(background_state, visible_state); + } + + void SetVisibleState(mojom::RenderProcessVisibleState visible_state) { + mojom::Renderer* renderer_interface = thread_; + const mojom::RenderProcessBackgroundState background_state = + RendererIsBackgrounded() + ? mojom::RenderProcessBackgroundState::kBackgrounded + : mojom::RenderProcessBackgroundState::kForegrounded; + renderer_interface->SetProcessState(background_state, visible_state); } bool RendererIsBackgrounded() { return thread_->RendererIsBackgrounded(); } @@ -304,24 +317,18 @@ } TEST_F(RenderThreadImplBrowserTest, RendererIsBackgrounded) { - SetProcessState(mojom::RenderProcessState::kBackgrounded); + SetBackgroundState(mojom::RenderProcessBackgroundState::kBackgrounded); EXPECT_TRUE(RendererIsBackgrounded()); - SetProcessState(mojom::RenderProcessState::kHidden); - EXPECT_FALSE(RendererIsBackgrounded()); - - SetProcessState(mojom::RenderProcessState::kVisible); + SetBackgroundState(mojom::RenderProcessBackgroundState::kForegrounded); EXPECT_FALSE(RendererIsBackgrounded()); } TEST_F(RenderThreadImplBrowserTest, RendererIsHidden) { - SetProcessState(mojom::RenderProcessState::kBackgrounded); + SetVisibleState(mojom::RenderProcessVisibleState::kHidden); EXPECT_TRUE(RendererIsHidden()); - SetProcessState(mojom::RenderProcessState::kHidden); - EXPECT_TRUE(RendererIsHidden()); - - SetProcessState(mojom::RenderProcessState::kVisible); + SetVisibleState(mojom::RenderProcessVisibleState::kVisible); EXPECT_FALSE(RendererIsHidden()); } @@ -332,27 +339,24 @@ EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); - SetProcessState(mojom::RenderProcessState::kVisible); + SetVisibleState(mojom::RenderProcessVisibleState::kVisible); testing::Mock::VerifyAndClear(main_thread_scheduler_); // Going from a hidden to a visible state should mark the renderer as visible. - // A hidden renderer is already foregrounded. - SetProcessState(mojom::RenderProcessState::kHidden); + SetVisibleState(mojom::RenderProcessVisibleState::kHidden); EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); - SetProcessState(mojom::RenderProcessState::kVisible); + SetVisibleState(mojom::RenderProcessVisibleState::kVisible); testing::Mock::VerifyAndClear(main_thread_scheduler_); - // Going from a backgrounded to a visible state should mark the renderer as - // foregrounded and visible. - SetProcessState(mojom::RenderProcessState::kBackgrounded); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)); + // Going from a visible to a hidden state should mark the renderer as hidden. + EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)).Times(0); + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); - SetProcessState(mojom::RenderProcessState::kVisible); + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)); + SetVisibleState(mojom::RenderProcessVisibleState::kHidden); testing::Mock::VerifyAndClear(main_thread_scheduler_); testing::Mock::AllowLeak(main_thread_scheduler_); @@ -365,27 +369,7 @@ EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); - SetProcessState(mojom::RenderProcessState::kHidden); - testing::Mock::VerifyAndClear(main_thread_scheduler_); - - // Going from a visible to a hidden state should mark the renderer as hidden. - // A visible renderer is already foregrounded. - SetProcessState(mojom::RenderProcessState::kVisible); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)).Times(0); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); - SetProcessState(mojom::RenderProcessState::kHidden); - testing::Mock::VerifyAndClear(main_thread_scheduler_); - - // Going from a backgrounded to a hidden state should mark the renderer as - // foregrounded and hidden. - SetProcessState(mojom::RenderProcessState::kBackgrounded); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); - SetProcessState(mojom::RenderProcessState::kHidden); + SetVisibleState(mojom::RenderProcessVisibleState::kHidden); testing::Mock::VerifyAndClear(main_thread_scheduler_); testing::Mock::AllowLeak(main_thread_scheduler_); @@ -393,32 +377,43 @@ TEST_F(RenderThreadImplBrowserTest, RendererStateTransitionBackgrounded) { // Going from an unknown to a backgrounded state should mark the renderer as - // hidden and backgrounded. - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)); + // backgrounded but not hidden. + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)).Times(0); - SetProcessState(mojom::RenderProcessState::kBackgrounded); + SetBackgroundState(mojom::RenderProcessBackgroundState::kBackgrounded); testing::Mock::VerifyAndClear(main_thread_scheduler_); - // Going from a visible to a backgrounded state should mark the renderer as - // hidden and backgrounded. - SetProcessState(mojom::RenderProcessState::kVisible); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)); - EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)).Times(0); - SetProcessState(mojom::RenderProcessState::kBackgrounded); - testing::Mock::VerifyAndClear(main_thread_scheduler_); - - // Going from a hidden state to a backgrounded state should mark the renderer - // backgrounded. A hidden renderer is already marked as hidden. - SetProcessState(mojom::RenderProcessState::kHidden); - EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)); + // Going from a backgrounded to a foregrounded state should mark the renderer + // as foregrounded. + EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); + EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)); + SetBackgroundState(mojom::RenderProcessBackgroundState::kForegrounded); + testing::Mock::VerifyAndClear(main_thread_scheduler_); + + // Going from a foregrounded to a backgrounded state should mark the renderer + // as backgrounded. + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); + EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)); + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)).Times(0); EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)).Times(0); - SetProcessState(mojom::RenderProcessState::kBackgrounded); + SetBackgroundState(mojom::RenderProcessBackgroundState::kBackgrounded); + testing::Mock::VerifyAndClear(main_thread_scheduler_); + + testing::Mock::AllowLeak(main_thread_scheduler_); +} + +TEST_F(RenderThreadImplBrowserTest, RendererStateTransitionForegrounded) { + // Going from an unknown to a foregrounded state should mark the renderer as + // foregrounded and visible. + EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(false)); + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(true)).Times(0); + EXPECT_CALL(*main_thread_scheduler_, SetRendererBackgrounded(true)).Times(0); + EXPECT_CALL(*main_thread_scheduler_, SetRendererHidden(false)); + SetBackgroundState(mojom::RenderProcessBackgroundState::kForegrounded); testing::Mock::VerifyAndClear(main_thread_scheduler_); testing::Mock::AllowLeak(main_thread_scheduler_);
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 16b6279b..a2c4480 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -1687,21 +1687,6 @@ needs_preferred_size_update_ = true; } -void RenderViewImpl::NavigateBackForwardSoon(int offset, - bool has_user_gesture) { - history_navigation_virtual_time_pauser_ = - RenderThreadImpl::current() - ->GetWebMainThreadScheduler() - ->CreateWebScopedVirtualTimePauser( - "NavigateBackForwardSoon", - blink::WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant); - history_navigation_virtual_time_pauser_.PauseVirtualTime(); -} - -void RenderViewImpl::DidCommitProvisionalHistoryLoad() { - history_navigation_virtual_time_pauser_.UnpauseVirtualTime(); -} - void RenderViewImpl::UpdateBrowserControlsState( BrowserControlsState constraints, BrowserControlsState current,
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 61f38f2..be21dac 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -43,7 +43,6 @@ #include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h" #include "third_party/blink/public/mojom/renderer_preferences.mojom.h" -#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/public/platform/web_input_event.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/web/web_ax_object.h" @@ -204,9 +203,6 @@ // synchronously from the renderer. void SetFocusAndActivateForTesting(bool enable); - void NavigateBackForwardSoon(int offset, bool has_user_gesture); - void DidCommitProvisionalHistoryLoad(); - void UpdateBrowserControlsState(BrowserControlsState constraints, BrowserControlsState current, bool animate); @@ -678,8 +674,6 @@ // is fine. base::ObserverList<RenderViewObserver>::Unchecked observers_; - blink::WebScopedVirtualTimePauser history_navigation_virtual_time_pauser_; - // --------------------------------------------------------------------------- // ADDING NEW DATA? Please see if it fits appropriately in one of the above // sections rather than throwing it randomly at the end. If you're adding a
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn index 6547898..0eca478 100644 --- a/content/shell/android/BUILD.gn +++ b/content/shell/android/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//base/android/jni_generator/config.gni") import("//build/config/android/config.gni") import("//build/config/android/rules.gni") import("//third_party/icu/config.gni") @@ -266,8 +267,12 @@ testonly = true deps = [ ":content_shell_assets", + ":content_shell_java", ":linker_resources", - ":linker_test_apk_all_java", + "//base:base_java", + "//base:jni_java", + "//content/public/android:content_java", + "//ui/android:ui_java", ] android_manifest = chromium_linker_test_manifest android_manifest_dep = ":chromium_linker_test_manifest" @@ -276,24 +281,13 @@ use_chromium_linker = true enable_chromium_linker_tests = true jni_registration_header = _linker_test_jni_registration_header - } - - android_library("linker_test_apk_all_java") { - testonly = true - deps = [ - ":content_shell_java", - ":linker_resources", - "//base:base_java", - "//base:jni_java", - "//content/public/android:content_java", - "//ui/android:ui_java", - ] java_files = [ "linker_test_apk/src/org/chromium/chromium_linker_test_apk/ChromiumLinkerTestActivity.java", "linker_test_apk/src/org/chromium/chromium_linker_test_apk/ChromiumLinkerTestApplication.java", "linker_test_apk/src/org/chromium/chromium_linker_test_apk/LinkerTests.java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + processor_args_javac = [ skip_gen_jni_arg ] } test_runner_script(_linker_test_apk_test_runner_target_name) {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 78f27ed4..1d7fb6a 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -2221,6 +2221,7 @@ "dwrite.lib", "wtsapi32.lib", ] + configs += [ "//build/config/win:delayloads" ] } if (is_mac) { deps += [
diff --git a/content/test/data/accessibility/display-locking/activatable-activated.html b/content/test/data/accessibility/display-locking/activatable-activated.html index e233996d..6be1c7e 100644 --- a/content/test/data/accessibility/display-locking/activatable-activated.html +++ b/content/test/data/accessibility/display-locking/activatable-activated.html
@@ -2,9 +2,9 @@ @BLINK-ALLOW:offscreen --> <div> - <div id="locked" rendersubtree="invisible skip-viewport-activation"> + <div id="locked" rendersubtree="invisible"> <div>child</div> - <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div> + <div id="nested" rendersubtree="invisible">nested locked element!</div> <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div> </div> </div>
diff --git a/content/test/data/accessibility/display-locking/activatable.html b/content/test/data/accessibility/display-locking/activatable.html index a868edf..49a5d52f 100644 --- a/content/test/data/accessibility/display-locking/activatable.html +++ b/content/test/data/accessibility/display-locking/activatable.html
@@ -2,9 +2,9 @@ @BLINK-ALLOW:offscreen --> <div> - <div id="locked" rendersubtree="invisible skip-viewport-activation"> + <div id="locked" rendersubtree="invisible"> <div>child</div> - <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div> + <div id="nested" rendersubtree="invisible">nested locked element!</div> <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div> </div> </div>
diff --git a/content/test/data/accessibility/display-locking/all-committed.html b/content/test/data/accessibility/display-locking/all-committed.html index 5ffc4cf..2266d984 100644 --- a/content/test/data/accessibility/display-locking/all-committed.html +++ b/content/test/data/accessibility/display-locking/all-committed.html
@@ -2,9 +2,9 @@ @BLINK-ALLOW:offscreen --> <div> - <div id="locked" rendersubtree="invisible skip-viewport-activation"> + <div id="locked" rendersubtree="invisible skip-activation"> <div>child</div> - <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div> + <div id="nested" rendersubtree="invisible skip-activation">nested locked element!</div> <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div> <!-- TODO(rakina): Make display:none, visibility:hidden, aria-hidden nodes
diff --git a/content/test/data/accessibility/display-locking/all.html b/content/test/data/accessibility/display-locking/all.html index fbdfd07..32bee4b 100644 --- a/content/test/data/accessibility/display-locking/all.html +++ b/content/test/data/accessibility/display-locking/all.html
@@ -2,9 +2,9 @@ @BLINK-ALLOW:offscreen --> <div> - <div id="locked" rendersubtree="invisible skip-viewport-activation"> + <div id="locked" rendersubtree="invisible"> <div>child</div> - <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div> + <div id="nested" rendersubtree="invisible">nested locked element!</div> <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div> <!-- TODO(rakina): Make display:none, visibility:hidden, aria-hidden nodes
diff --git a/content/test/data/accessibility/display-locking/non-activatable.html b/content/test/data/accessibility/display-locking/non-activatable.html index 8597805a..15f436e 100644 --- a/content/test/data/accessibility/display-locking/non-activatable.html +++ b/content/test/data/accessibility/display-locking/non-activatable.html
@@ -5,6 +5,6 @@ <div id="locked" rendersubtree="invisible skip-activation"> <div>child</div> <div id="nested" rendersubtree="invisible skip-activation">nested locked element!</div> - <div id="activatable" rendersubtree="invisible skip-viewport-activation">activatable locked element</div> + <div id="activatable" rendersubtree="invisible skip-activation">non activatable locked element</div> </div> </div>
diff --git a/extensions/browser/api/media_perception_private/media_perception_api_delegate.h b/extensions/browser/api/media_perception_private/media_perception_api_delegate.h index 62626120..f205acf 100644 --- a/extensions/browser/api/media_perception_private/media_perception_api_delegate.h +++ b/extensions/browser/api/media_perception_private/media_perception_api_delegate.h
@@ -32,7 +32,8 @@ const base::FilePath& mount_point)>; using MediaPerceptionRequestHandler = base::RepeatingCallback<void( - chromeos::media_perception::mojom::MediaPerceptionRequest request)>; + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver)>; virtual ~MediaPerceptionAPIDelegate() {} @@ -54,10 +55,11 @@ virtual void SetMediaPerceptionRequestHandler( MediaPerceptionRequestHandler handler) = 0; - // Receives an incoming media perception request and forwards it to the - // request handler if set. - virtual void ForwardMediaPerceptionRequest( - chromeos::media_perception::mojom::MediaPerceptionRequest request, + // Receives an incoming media perception receiver and forwards it to the + // receiver handler if set. + virtual void ForwardMediaPerceptionReceiver( + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver, content::RenderFrameHost* render_frame_host) = 0; };
diff --git a/extensions/browser/api/media_perception_private/media_perception_api_manager.cc b/extensions/browser/api/media_perception_private/media_perception_api_manager.cc index 68bc3a52..1ee8db21 100644 --- a/extensions/browser/api/media_perception_private/media_perception_api_manager.cc +++ b/extensions/browser/api/media_perception_private/media_perception_api_manager.cc
@@ -143,9 +143,10 @@ } void MediaPerceptionAPIManager::ActivateMediaPerception( - chromeos::media_perception::mojom::MediaPerceptionRequest request) { + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver) { if (media_perception_controller_.is_bound()) - media_perception_controller_->ActivateMediaPerception(std::move(request)); + media_perception_controller_->ActivateMediaPerception(std::move(receiver)); } void MediaPerceptionAPIManager::SetMountPointNonEmptyForTesting() {
diff --git a/extensions/browser/api/media_perception_private/media_perception_api_manager.h b/extensions/browser/api/media_perception_private/media_perception_api_manager.h index db7ef030..d80fd2e 100644 --- a/extensions/browser/api/media_perception_private/media_perception_api_manager.h +++ b/extensions/browser/api/media_perception_private/media_perception_api_manager.h
@@ -15,6 +15,7 @@ #include "chromeos/services/media_perception/public/mojom/media_perception_service.mojom.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/common/api/media_perception_private.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" namespace extensions { @@ -48,7 +49,8 @@ // Handler for clients of the API requesting a MediaPerception Mojo interface. void ActivateMediaPerception( - chromeos::media_perception::mojom::MediaPerceptionRequest request); + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver); // Public functions for MediaPerceptionPrivateAPI implementation. void SetAnalyticsComponent(
diff --git a/extensions/browser/api/media_perception_private/media_perception_private_apitest.cc b/extensions/browser/api/media_perception_private/media_perception_private_apitest.cc index a029f4f..8b1ba6c 100644 --- a/extensions/browser/api/media_perception_private/media_perception_private_apitest.cc +++ b/extensions/browser/api/media_perception_private/media_perception_private_apitest.cc
@@ -19,6 +19,7 @@ #include "extensions/shell/test/shell_apitest.h" #include "extensions/test/extension_test_message_listener.h" #include "extensions/test/result_catcher.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" namespace extensions { @@ -60,8 +61,9 @@ NOTIMPLEMENTED(); } - void ForwardMediaPerceptionRequest( - chromeos::media_perception::mojom::MediaPerceptionRequest request, + void ForwardMediaPerceptionReceiver( + mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception> + receiver, content::RenderFrameHost* render_frame_host) override { NOTIMPLEMENTED(); }
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index b951eb7..b3e8ec7f 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -79,6 +79,7 @@ #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/url_pattern.h" #include "extensions/strings/grit/extensions_strings.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/auth.h" #include "net/base/net_errors.h" #include "net/http/http_util.h" @@ -730,8 +731,8 @@ } auto proxied_receiver = std::move(*factory_receiver); - network::mojom::URLLoaderFactoryPtrInfo target_factory_info; - *factory_receiver = mojo::MakeRequest(&target_factory_info); + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory_remote; + *factory_receiver = target_factory_remote.InitWithNewPipeAndPassReceiver(); std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data; const bool is_navigation = (type == URLLoaderFactoryType::kNavigation); @@ -760,7 +761,7 @@ WebRequestProxyingURLLoaderFactory::StartProxying( browser_context, is_navigation ? -1 : render_process_id, request_id_generator_, std::move(navigation_ui_data), - std::move(proxied_receiver), std::move(target_factory_info), + std::move(proxied_receiver), std::move(target_factory_remote), std::move(header_client_receiver), proxies_.get(), type); return true; }
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc index b4cf75f..38d2a91 100644 --- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc +++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -940,7 +940,7 @@ scoped_refptr<WebRequestAPI::RequestIDGenerator> request_id_generator, std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data, mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory_remote, mojo::PendingReceiver<network::mojom::TrustedURLLoaderHeaderClient> header_client_receiver, WebRequestAPI::ProxySet* proxies, @@ -960,8 +960,8 @@ ->Subscribe(base::BindRepeating(&WebRequestAPI::ProxySet::RemoveProxy, base::Unretained(proxies_), this)); - target_factory_.Bind(std::move(target_factory_info)); - target_factory_.set_connection_error_handler( + target_factory_.Bind(std::move(target_factory_remote)); + target_factory_.set_disconnect_handler( base::BindOnce(&WebRequestProxyingURLLoaderFactory::OnTargetFactoryError, base::Unretained(this))); proxy_receivers_.Add(this, std::move(loader_receiver)); @@ -979,7 +979,7 @@ scoped_refptr<WebRequestAPI::RequestIDGenerator> request_id_generator, std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data, mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory_remote, mojo::PendingReceiver<network::mojom::TrustedURLLoaderHeaderClient> header_client_receiver, WebRequestAPI::ProxySet* proxies, @@ -989,7 +989,7 @@ auto proxy = std::make_unique<WebRequestProxyingURLLoaderFactory>( browser_context, render_process_id, std::move(request_id_generator), std::move(navigation_ui_data), std::move(loader_receiver), - std::move(target_factory_info), std::move(header_client_receiver), + std::move(target_factory_remote), std::move(header_client_receiver), proxies, loader_factory_type); proxies->AddProxy(std::move(proxy));
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h index 704dce7..36795938 100644 --- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h +++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
@@ -20,8 +20,10 @@ #include "extensions/browser/api/web_request/web_request_info.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/completion_once_callback.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" @@ -201,7 +203,8 @@ scoped_refptr<WebRequestAPI::RequestIDGenerator> request_id_generator, std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data, mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> + target_factory_remote, mojo::PendingReceiver<network::mojom::TrustedURLLoaderHeaderClient> header_client_receiver, WebRequestAPI::ProxySet* proxies, @@ -215,7 +218,8 @@ scoped_refptr<WebRequestAPI::RequestIDGenerator> request_id_generator, std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data, mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, - network::mojom::URLLoaderFactoryPtrInfo target_factory_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> + target_factory_remote, mojo::PendingReceiver<network::mojom::TrustedURLLoaderHeaderClient> header_client_receiver, WebRequestAPI::ProxySet* proxies, @@ -269,7 +273,7 @@ scoped_refptr<WebRequestAPI::RequestIDGenerator> request_id_generator_; std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data_; mojo::ReceiverSet<network::mojom::URLLoaderFactory> proxy_receivers_; - network::mojom::URLLoaderFactoryPtr target_factory_; + mojo::Remote<network::mojom::URLLoaderFactory> target_factory_; mojo::Receiver<network::mojom::TrustedURLLoaderHeaderClient> url_loader_header_client_receiver_{this}; // Owns |this|.
diff --git a/extensions/browser/content_hash_fetcher.cc b/extensions/browser/content_hash_fetcher.cc index 668874c5..8eca219 100644 --- a/extensions/browser/content_hash_fetcher.cc +++ b/extensions/browser/content_hash_fetcher.cc
@@ -24,6 +24,7 @@ #include "extensions/browser/verified_contents.h" #include "extensions/common/extension.h" #include "extensions/common/file_util.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/load_flags.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" @@ -85,9 +86,8 @@ resource_request->load_flags = net::LOAD_DISABLE_CACHE; resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit; - network::mojom::URLLoaderFactoryPtr url_loader_factory_ptr; - url_loader_factory_ptr.Bind( - std::move(fetch_key_.url_loader_factory_ptr_info)); + mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_remote( + std::move(fetch_key_.url_loader_factory_remote)); simple_loader_ = network::SimpleURLLoader::Create(std::move(resource_request), traffic_annotation); @@ -96,7 +96,7 @@ kMaxRetries, network::SimpleURLLoader::RetryMode::RETRY_ON_NETWORK_CHANGE); simple_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( - url_loader_factory_ptr.get(), + url_loader_factory_remote.get(), base::BindOnce(&ContentHashFetcher::OnSimpleLoaderComplete, base::Unretained(this))); }
diff --git a/extensions/browser/content_hash_fetcher_unittest.cc b/extensions/browser/content_hash_fetcher_unittest.cc index 997341a..1db2787e 100644 --- a/extensions/browser/content_hash_fetcher_unittest.cc +++ b/extensions/browser/content_hash_fetcher_unittest.cc
@@ -22,6 +22,7 @@ #include "extensions/common/extension_paths.h" #include "extensions/common/file_util.h" #include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "net/http/http_status_code.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" @@ -73,16 +74,16 @@ return nullptr; } - network::mojom::URLLoaderFactoryPtr url_loader_factory_ptr; - test_url_loader_factory_.Clone(mojo::MakeRequest(&url_loader_factory_ptr)); - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info = - url_loader_factory_ptr.PassInterface(); + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote; + test_url_loader_factory_.Clone( + url_loader_factory_remote.InitWithNewPipeAndPassReceiver()); std::unique_ptr<ContentHashResult> result = ContentHashWaiter().CreateAndWaitForCallback( ContentHash::FetchKey(extension_->id(), extension_->path(), extension_->version(), - std::move(url_loader_factory_ptr_info), + std::move(url_loader_factory_remote), fetch_url_, delegate_->GetPublicKey()), ContentVerifierDelegate::VerifierSourceType::SIGNED_HASHES);
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc index 48af209..3150ba8 100644 --- a/extensions/browser/content_verifier.cc +++ b/extensions/browser/content_verifier.cc
@@ -31,6 +31,7 @@ #include "extensions/common/file_util.h" #include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/content_scripts_handler.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/network_context.mojom.h" namespace extensions { @@ -613,16 +614,16 @@ // Create a new mojo pipe. It's safe to pass this around and use immediately, // even though it needs to finish initialization on the UI thread. - network::mojom::URLLoaderFactoryPtr url_loader_factory_ptr; + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote; base::PostTask( FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&ContentVerifier::BindURLLoaderFactoryReceiverOnUIThread, - this, mojo::MakeRequest(&url_loader_factory_ptr))); - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_info = - url_loader_factory_ptr.PassInterface(); + base::BindOnce( + &ContentVerifier::BindURLLoaderFactoryReceiverOnUIThread, this, + url_loader_factory_remote.InitWithNewPipeAndPassReceiver())); return ContentHash::FetchKey( extension_id, extension_root, extension_version, - std::move(url_loader_factory_info), + std::move(url_loader_factory_remote), delegate_->GetSignatureFetchUrl(extension_id, extension_version), delegate_->GetPublicKey()); }
diff --git a/extensions/browser/content_verifier/content_hash.cc b/extensions/browser/content_verifier/content_hash.cc index bed503e..7374bf7c 100644 --- a/extensions/browser/content_verifier/content_hash.cc +++ b/extensions/browser/content_verifier/content_hash.cc
@@ -65,13 +65,14 @@ const ExtensionId& extension_id, const base::FilePath& extension_root, const base::Version& extension_version, - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info, + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote, const GURL& fetch_url, ContentVerifierKey verifier_key) : extension_id(extension_id), extension_root(extension_root), extension_version(extension_version), - url_loader_factory_ptr_info(std::move(url_loader_factory_ptr_info)), + url_loader_factory_remote(std::move(url_loader_factory_remote)), fetch_url(std::move(fetch_url)), verifier_key(verifier_key) {}
diff --git a/extensions/browser/content_verifier/content_hash.h b/extensions/browser/content_verifier/content_hash.h index 111e671..a0831ff5f 100644 --- a/extensions/browser/content_verifier/content_hash.h +++ b/extensions/browser/content_verifier/content_hash.h
@@ -16,6 +16,7 @@ #include "extensions/browser/verified_contents.h" #include "extensions/common/constants.h" #include "extensions/common/extension_id.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "url/gurl.h" @@ -58,19 +59,20 @@ base::Version extension_version; // Fetch parameters. - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info; + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote; GURL fetch_url; // The key used to validate verified_contents.json. ContentVerifierKey verifier_key; - FetchKey( - const ExtensionId& extension_id, - const base::FilePath& extension_root, - const base::Version& extension_version, - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info, - const GURL& fetch_url, - ContentVerifierKey verifier_key); + FetchKey(const ExtensionId& extension_id, + const base::FilePath& extension_root, + const base::Version& extension_version, + mojo::PendingRemote<network::mojom::URLLoaderFactory> + url_loader_factory_remote, + const GURL& fetch_url, + ContentVerifierKey verifier_key); ~FetchKey(); FetchKey(FetchKey&& other);
diff --git a/extensions/browser/content_verifier/content_hash_unittest.cc b/extensions/browser/content_verifier/content_hash_unittest.cc index be29152..1d560cb 100644 --- a/extensions/browser/content_verifier/content_hash_unittest.cc +++ b/extensions/browser/content_verifier/content_hash_unittest.cc
@@ -196,8 +196,8 @@ const std::vector<uint8_t>& content_verifier_public_key) { ContentHash::FetchKey key( extension->id(), extension->path(), extension->version(), - nullptr /* url_loader_factory_ptr_info */, GURL() /* fetch_url */, - content_verifier_public_key); + mojo::NullRemote() /* url_loader_factory_remote */, + GURL() /* fetch_url */, content_verifier_public_key); return ContentHashWaiter().CreateAndWaitForCallback(std::move(key), source_type); }
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 28074fb..a149629c 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1454,6 +1454,9 @@ AUTOTESTPRIVATE_WAITFORDISPLAYROTATION = 1391, AUTOTESTPRIVATE_ARCAPPTRACINGSTART = 1392, AUTOTESTPRIVATE_ARCAPPTRACINGSTOPANDANALYZE = 1393, + AUTOTESTPRIVATE_GETAPPWINDOWLIST = 1394, + AUTOTESTPRIVATE_SETAPPWINDOWSTATE = 1395, + AUTOTESTPRIVATE_CLOSEAPPWINDOW = 1396, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc index e3220c4..131d3c8e 100644 --- a/extensions/browser/process_manager.cc +++ b/extensions/browser/process_manager.cc
@@ -289,6 +289,9 @@ DCHECK(background_hosts_.empty()); content::DevToolsAgentHost::RemoveObserver(this); site_instance_ = nullptr; + + for (auto& observer : observer_list_) + observer.OnProcessManagerShutdown(this); } void ProcessManager::RegisterRenderFrameHost(
diff --git a/extensions/browser/process_manager_observer.h b/extensions/browser/process_manager_observer.h index 7ca7b0a..9a026ea3 100644 --- a/extensions/browser/process_manager_observer.h +++ b/extensions/browser/process_manager_observer.h
@@ -16,6 +16,7 @@ namespace extensions { class Extension; class ExtensionHost; +class ProcessManager; class ProcessManagerObserver : public base::CheckedObserver { public: @@ -41,6 +42,9 @@ virtual void OnExtensionFrameUnregistered( const std::string& extension_id, content::RenderFrameHost* render_frame_host) {} + + // Called when the observed ProcessManager is shutting down. + virtual void OnProcessManagerShutdown(ProcessManager* manager) {} }; } // namespace extensions
diff --git a/extensions/browser/url_loader_factory_manager.cc b/extensions/browser/url_loader_factory_manager.cc index 041c07d6..deae157 100644 --- a/extensions/browser/url_loader_factory_manager.cc +++ b/extensions/browser/url_loader_factory_manager.cc
@@ -32,6 +32,7 @@ #include "extensions/common/manifest_handlers/content_scripts_handler.h" #include "extensions/common/switches.h" #include "extensions/common/user_script.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "url/gurl.h" @@ -307,7 +308,7 @@ } } -network::mojom::URLLoaderFactoryPtrInfo CreateURLLoaderFactory( +mojo::PendingRemote<network::mojom::URLLoaderFactory> CreateURLLoaderFactory( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context, mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* @@ -335,10 +336,10 @@ params->request_initiator_site_lock = url::Origin::Create(extension.url()); // Create the URLLoaderFactory. - network::mojom::URLLoaderFactoryPtrInfo factory_info; - network_context->CreateURLLoaderFactory(mojo::MakeRequest(&factory_info), - std::move(params)); - return factory_info; + mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote; + network_context->CreateURLLoaderFactory( + factory_remote.InitWithNewPipeAndPassReceiver(), std::move(params)); + return factory_remote; } void MarkIsolatedWorldsAsRequiringSeparateURLLoaderFactory( @@ -516,7 +517,8 @@ } // static -network::mojom::URLLoaderFactoryPtrInfo URLLoaderFactoryManager::CreateFactory( +mojo::PendingRemote<network::mojom::URLLoaderFactory> +URLLoaderFactoryManager::CreateFactory( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context, mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>* @@ -535,7 +537,7 @@ // Don't create a factory for something that is not an extension. if (precursor_origin.scheme() != kExtensionScheme) - return network::mojom::URLLoaderFactoryPtrInfo(); + return mojo::NullRemote(); // Find the |extension| associated with |initiator_origin|. const Extension* extension = @@ -545,7 +547,7 @@ // RenderFrameHost::MarkIsolatedWorldAsRequiringSeparateURLLoaderFactory is // called and the time // ContentBrowserClient::CreateURLLoaderFactory is called. - return network::mojom::URLLoaderFactoryPtrInfo(); + return mojo::NullRemote(); } // Figure out if the factory is needed for content scripts VS extension @@ -557,7 +559,7 @@ // Create the factory (but only if really needed). if (!IsSpecialURLLoaderFactoryRequired(*extension, factory_user)) - return network::mojom::URLLoaderFactoryPtrInfo(); + return mojo::NullRemote(); return CreateURLLoaderFactory(process, network_context, header_client, *extension, network_isolation_key); }
diff --git a/extensions/browser/url_loader_factory_manager.h b/extensions/browser/url_loader_factory_manager.h index c9c69e9..25d2cb2 100644 --- a/extensions/browser/url_loader_factory_manager.h +++ b/extensions/browser/url_loader_factory_manager.h
@@ -9,6 +9,7 @@ #include "content/public/browser/navigation_handle.h" #include "extensions/common/extension.h" #include "extensions/common/host_id.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "url/gurl.h" @@ -62,7 +63,7 @@ // default, extensions-agnostic URLLoaderFactory should be used (if either // |initiator_origin| is not associated with an extension, or the extension // doesn't need a special URLLoaderFactory). - static network::mojom::URLLoaderFactoryPtrInfo CreateFactory( + static mojo::PendingRemote<network::mojom::URLLoaderFactory> CreateFactory( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context, mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc index b146f2ed..d927f3d 100644 --- a/extensions/shell/browser/shell_content_browser_client.cc +++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -344,11 +344,11 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) { + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) { return false; } -network::mojom::URLLoaderFactoryPtrInfo +mojo::PendingRemote<network::mojom::URLLoaderFactory> ShellContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context,
diff --git a/extensions/shell/browser/shell_content_browser_client.h b/extensions/shell/browser/shell_content_browser_client.h index 3e32471..99e300bf 100644 --- a/extensions/shell/browser/shell_content_browser_client.h +++ b/extensions/shell/browser/shell_content_browser_client.h
@@ -11,6 +11,8 @@ #include "base/macros.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/web_contents.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "storage/browser/quota/quota_settings.h" class GURL; @@ -100,8 +102,9 @@ ui::PageTransition page_transition, bool has_user_gesture, const base::Optional<url::Origin>& initiating_origin, - network::mojom::URLLoaderFactoryPtr* out_factory) override; - network::mojom::URLLoaderFactoryPtrInfo + mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) + override; + mojo::PendingRemote<network::mojom::URLLoaderFactory> CreateURLLoaderFactoryForNetworkRequests( content::RenderProcessHost* process, network::mojom::NetworkContext* network_context,
diff --git a/headless/BUILD.gn b/headless/BUILD.gn index 6d57d4e67..7d89091f 100644 --- a/headless/BUILD.gn +++ b/headless/BUILD.gn
@@ -749,24 +749,24 @@ } } - # Headless library with child specific dependencies (e.g., renderer). This - # is used when no browser depencendies are needed (e.g. chrome:child_dll). - static_library("headless_shell_child_lib") { - sources = [ - "app/headless_shell.cc", - "app/headless_shell.h", - "app/headless_shell_win.cc", - "public/headless_shell.h", - ] - deps = [ - ":headless_renderer", - "//build:branding_buildflags", - "//content/public/child:child", - "//net", - "//ui/base", - ] + if (is_multi_dll_chrome) { + # Headless library with child specific dependencies (e.g., renderer). This + # is used when no browser depencendies are needed (e.g. chrome:child_dll). + static_library("headless_shell_child_lib") { + sources = [ + "app/headless_shell.cc", + "app/headless_shell.h", + "app/headless_shell_win.cc", + "public/headless_shell.h", + ] + deps = [ + ":headless_renderer", + "//build:branding_buildflags", + "//content/public/child:child", + "//net", + "//ui/base", + ] - if (is_multi_dll_chrome) { defines = [ "CHROME_MULTIPLE_DLL_CHILD" ] sources += [ "lib/browser/headless_web_contents_impl.cc",
diff --git a/infra/config/buckets/try/cq.star b/infra/config/buckets/try/cq.star index 80b0e54..f96ef3a 100644 --- a/infra/config/buckets/try/cq.star +++ b/infra/config/buckets/try/cq.star
@@ -349,7 +349,7 @@ ), luci.cq_tryjob_verifier( builder = 'try/fuchsia-compile-x64-dbg', - experiment_percentage = 5, + experiment_percentage = 20, ), # https://crbug.com/739556; make this non-experimental ASAP. luci.cq_tryjob_verifier(
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 78ad8242..3925bcc 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -185,7 +185,7 @@ > builders: < name: "chromium/try/fuchsia-compile-x64-dbg" - experiment_percentage: 5 + experiment_percentage: 20 > builders: < name: "chromium/try/fuchsia-x64-cast"
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index 73af2b54..cb70ef61 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -331,7 +331,7 @@ * Experiment percentage: 5 * [fuchsia-compile-x64-dbg](https://ci.chromium.org/p/chromium/builders/try/fuchsia-compile-x64-dbg) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+fuchsia-compile-x64-dbg)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+fuchsia-compile-x64-dbg)) - * Experiment percentage: 5 + * Experiment percentage: 20 * [ios-device](https://ci.chromium.org/p/chromium/builders/try/ios-device) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+ios-device)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+ios-device)) * Experiment percentage: 10
diff --git a/ios/chrome/browser/autofill/automation/BUILD.gn b/ios/chrome/browser/autofill/automation/BUILD.gn index 0e51f1e8..b1234b5 100644 --- a/ios/chrome/browser/autofill/automation/BUILD.gn +++ b/ios/chrome/browser/autofill/automation/BUILD.gn
@@ -10,32 +10,86 @@ "automation_action.h", "automation_action.mm", "automation_action_egtest.mm", + "automation_app_interface.h", + "automation_app_interface.mm", "automation_egtest.mm", ] - deps = [ "//base", - "//components/autofill/core/browser:browser", + "//components/autofill/core/browser", + "//components/autofill/ios/browser", "//components/autofill/ios/browser:autofill_test_bundle_data", - "//components/autofill/ios/browser:browser", "//components/strings", "//ios/chrome/app/strings", - "//ios/chrome/browser/autofill:autofill", - "//ios/chrome/browser/infobars", - "//ios/chrome/browser/ui/infobars:infobars_ui", - "//ios/chrome/browser/ui/infobars:test_support", - "//ios/chrome/browser/ui/toolbar/buttons", - "//ios/chrome/browser/ui/toolbar/public", - "//ios/chrome/browser/ui/util", - "//ios/chrome/browser/ui/util", + "//ios/chrome/browser/autofill", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/ui/infobars:constants", "//ios/chrome/test/app:test_support", "//ios/chrome/test/earl_grey:test_support", "//ios/testing/earl_grey:earl_grey_support", - "//ios/web:earl_grey_test_support", "//ios/web/public/js_messaging", "//ios/web/public/test:element_selector", "//ios/web/public/test/http_server:http_server", - "//ui/base", + ] + libs = [ "XCTest.framework" ] +} + +source_set("eg2_tests") { + defines = [ "CHROME_EARL_GREY_2" ] + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ + "automation_action.h", + "automation_action.mm", + "automation_action_egtest.mm", + "automation_app_interface.h", + "automation_egtest.mm", + ] + deps = [ + "//base", + "//base/test:test_support", + "//components/autofill/core/browser", + "//components/autofill/ios/browser:autofill_test_bundle_data", + "//components/strings", + "//ios/chrome/app/strings", + "//ios/chrome/browser/autofill:constants", + "//ios/chrome/browser/ui/infobars:constants", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ios/third_party/earl_grey2:test_lib", + "//ios/web/public/test:element_selector", + "//net:test_support", + ] + libs = [ "XCTest.framework" ] +} + +source_set("eg_app_support+eg2") { + defines = [ "CHROME_EARL_GREY_2" ] + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ + "automation_app_interface.h", + "automation_app_interface.mm", + ] + deps = [ + "//base", + "//components/autofill/core/browser", + "//components/autofill/ios/browser", + "//components/strings", + "//ios/chrome/app/strings", + "//ios/chrome/browser/autofill", + "//ios/chrome/browser/browser_state", + "//ios/chrome/test/app:test_support", + "//ios/testing:nserror_support", + "//ios/testing/earl_grey:eg_app_support+eg2", + "//ios/web/public", + "//ios/web/public/js_messaging", ] libs = [ "XCTest.framework" ] }
diff --git a/ios/chrome/browser/autofill/automation/automation_app_interface.h b/ios/chrome/browser/autofill/automation/automation_app_interface.h new file mode 100644 index 0000000..191cfa3 --- /dev/null +++ b/ios/chrome/browser/autofill/automation/automation_app_interface.h
@@ -0,0 +1,20 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_AUTOFILL_AUTOMATION_AUTOMATION_APP_INTERFACE_H_ +#define IOS_CHROME_BROWSER_AUTOFILL_AUTOMATION_AUTOMATION_APP_INTERFACE_H_ + +#import <Foundation/Foundation.h> + +// AutomationAppInterface contains the app-side implementations for +// automation_egtest helpers which involve app-side classes. +@interface AutomationAppInterface : NSObject + +// Sets autofill automation profile data in app side. Passes JSON format +// NSString to app side, extracts and sets autofill profile in app side. ++ (NSError*)setAutofillAutomationProfile:(NSString*)profileJSON; + +@end + +#endif // IOS_CHROME_BROWSER_AUTOFILL_AUTOMATION_AUTOMATION_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/autofill/automation/automation_app_interface.mm b/ios/chrome/browser/autofill/automation/automation_app_interface.mm new file mode 100644 index 0000000..6f53f72 --- /dev/null +++ b/ios/chrome/browser/autofill/automation/automation_app_interface.mm
@@ -0,0 +1,164 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/autofill/automation/automation_app_interface.h" + +#include "base/guid.h" +#include "base/json/json_reader.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" +#include "components/autofill/core/browser/personal_data_manager.h" +#include "ios/chrome/browser/autofill/personal_data_manager_factory.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/test/app/chrome_test_util.h" +#import "ios/chrome/test/app/tab_test_util.h" +#import "ios/testing/nserror_util.h" +#import "ios/web/public/js_messaging/web_frames_manager.h" +#import "ios/web/public/web_state.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using autofill::PersonalDataManager; +using autofill::PersonalDataManagerFactory; + +namespace { + +// Converts a string (from the test recipe) to the autofill ServerFieldType it +// represents. +autofill::ServerFieldType ServerFieldTypeFromString(const std::string& str, + NSError** error) { + static std::map<const std::string, autofill::ServerFieldType> + string_to_field_type_map; + + // Only init the string to autofill field type map on the first call. + // The test recipe can contain both server and html field types, as when + // creating the recipe either type can be returned from predictions. + // Therefore, store both in this map. + if (string_to_field_type_map.empty()) { + for (size_t i = autofill::NO_SERVER_DATA; + i < autofill::MAX_VALID_FIELD_TYPE; ++i) { + autofill::AutofillType autofill_type( + static_cast<autofill::ServerFieldType>(i)); + string_to_field_type_map[autofill_type.ToString()] = + autofill_type.GetStorableType(); + } + + for (size_t i = autofill::HTML_TYPE_UNSPECIFIED; + i < autofill::HTML_TYPE_UNRECOGNIZED; ++i) { + autofill::AutofillType autofill_type( + static_cast<autofill::HtmlFieldType>(i), autofill::HTML_MODE_NONE); + string_to_field_type_map[autofill_type.ToString()] = + autofill_type.GetStorableType(); + } + } + + if (string_to_field_type_map.find(str) == string_to_field_type_map.end()) { + NSString* error_description = [NSString + stringWithFormat:@"Unable to recognize autofill field type %@!", + base::SysUTF8ToNSString(str)]; + *error = testing::NSErrorWithLocalizedDescription(error_description); + return autofill::UNKNOWN_TYPE; + } + + return string_to_field_type_map[str]; +} + +// Loads the defined autofill profile into the personal data manager, so that +// autofill actions will be suggested when tapping on an autofillable form. +// The autofill profile should be pulled from the test recipe, and consists of +// a list of dictionaries, each mapping one autofill type to one value, like so: +// "autofillProfile": [ +// { "type": "NAME_FIRST", "value": "Satsuki" }, +// { "type": "NAME_LAST", "value": "Yumizuka" }, +// ], +NSError* PrepareAutofillProfileWithValues(const base::Value* autofill_profile) { + if (!autofill_profile) { + return testing::NSErrorWithLocalizedDescription( + @"Unable to find autofill profile in parsed JSON value."); + } + + autofill::AutofillProfile profile(base::GenerateGUID(), + "https://www.example.com/"); + autofill::CreditCard credit_card(base::GenerateGUID(), + "https://www.example.com/"); + + base::span<const base::Value> profile_entries_list = + autofill_profile->GetList(); + + // For each type-value dictionary in the autofill profile list, validate it, + // then add it to the appropriate profile. + for (const auto& it_entry : profile_entries_list) { + const base::DictionaryValue* entry = nullptr; + if (!it_entry.GetAsDictionary(&entry)) { + return testing::NSErrorWithLocalizedDescription( + @"Failed to extract an entry!"); + } + + const base::Value* type_container = entry->FindKey("type"); + if (base::Value::Type::STRING != type_container->type()) { + return testing::NSErrorWithLocalizedDescription(@"Type is not a string!"); + } + const base::Value* value_container = entry->FindKey("value"); + if (base::Value::Type::STRING != value_container->type()) { + return testing::NSErrorWithLocalizedDescription( + @"Value is not a string!"); + } + + const std::string field_type = type_container->GetString(); + NSError* error = nil; + autofill::ServerFieldType type = + ServerFieldTypeFromString(field_type, &error); + if (error) { + return error; + } + + // TODO(crbug.com/895968): Autofill profile and credit card info should be + // loaded from separate fields in the recipe, instead of being grouped + // together. However, need to make sure this change is also performed on + // desktop automation. + const std::string field_value = value_container->GetString(); + if (base::StartsWith(field_type, "HTML_TYPE_CREDIT_CARD_", + base::CompareCase::INSENSITIVE_ASCII) || + base::StartsWith(field_type, "CREDIT_CARD_", + base::CompareCase::INSENSITIVE_ASCII)) { + credit_card.SetRawInfo(type, base::UTF8ToUTF16(field_value)); + } else { + profile.SetRawInfo(type, base::UTF8ToUTF16(field_value)); + } + } + + // Save the profile and credit card generated to the personal data manager. + ios::ChromeBrowserState* browser_state = + chrome_test_util::GetOriginalBrowserState(); + PersonalDataManager* personal_data_manager = + PersonalDataManagerFactory::GetForBrowserState(browser_state); + personal_data_manager->ClearAllLocalData(); + personal_data_manager->AddCreditCard(credit_card); + personal_data_manager->SaveImportedProfile(profile); + + return nil; +} + +} // namespace + +@implementation AutomationAppInterface + ++ (NSError*)setAutofillAutomationProfile:(NSString*)profileJSON { + base::Optional<base::Value> readResult = + base::JSONReader::Read(base::SysNSStringToUTF8(profileJSON)); + if (!readResult.has_value()) { + return testing::NSErrorWithLocalizedDescription( + @"Unable to parse JSON string in app side."); + } + + base::Value recipeRoot = std::move(readResult).value(); + const base::Value* autofillProfile = + recipeRoot.FindKeyOfType("autofillProfile", base::Value::Type::LIST); + return PrepareAutofillProfileWithValues(autofillProfile); +} + +@end
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm index 9eedb4e..0ce9498 100644 --- a/ios/chrome/browser/autofill/automation/automation_egtest.mm +++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -2,51 +2,67 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import <EarlGrey/EarlGrey.h> - #include "base/command_line.h" #include "base/files/file_path.h" #include "base/files/file_util.h" -#include "base/guid.h" #include "base/json/json_reader.h" -#include "base/mac/foundation_util.h" -#include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" -#include "base/strings/utf_string_conversions.h" -#import "base/test/ios/wait_util.h" #include "base/values.h" -#include "components/autofill/core/browser/autofill_manager.h" -#include "components/autofill/core/browser/personal_data_manager.h" -#include "components/autofill/ios/browser/autofill_driver_ios.h" +#include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/common/autofill_features.h" #import "ios/chrome/browser/autofill/automation/automation_action.h" -#import "ios/chrome/browser/autofill/form_suggestion_label.h" -#import "ios/chrome/test/app/tab_test_util.h" +#import "ios/chrome/browser/autofill/automation/automation_app_interface.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" -#import "ios/web/public/js_messaging/web_frames_manager.h" -#import "ios/web/public/test/earl_grey/web_view_actions.h" -#import "ios/web/public/test/earl_grey/web_view_matchers.h" -#include "ios/web/public/test/element_selector.h" -#import "ios/web/public/test/js_test_util.h" -#import "ios/web/public/web_state.h" +#import "ios/testing/earl_grey/app_launch_manager.h" +#import "ios/testing/earl_grey/earl_grey_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +#if defined(CHROME_EARL_GREY_2) +GREY_STUB_CLASS_IN_APP_MAIN_QUEUE(AutomationAppInterface) +#endif // defined(CHROME_EARL_GREY_2) + namespace { + static const char kAutofillAutomationSwitch[] = "autofillautomation"; static const int kRecipeRetryLimit = 5; + +// Private helper method for accessing app interface method. +NSError* SetAutofillAutomationProfile(const std::string& profile_json_string) { + NSString* profile_json_nsstring = + base::SysUTF8ToNSString(profile_json_string); + return [AutomationAppInterface + setAutofillAutomationProfile:profile_json_nsstring]; } +// Loads the recipe file and reads it into std::string. +std::string ReadRecipeJsonFromPath(const base::FilePath& path) { + std::string json_text; + bool read_success = base::ReadFileToString(path, &json_text); + GREYAssert(read_success, @"Unable to read JSON file."); + return json_text; +} + +// Parses recipe std::string into base::Value. +base::Value RecipeJsonToValue(const std::string& recipe_json) { + base::Optional<base::Value> value = base::JSONReader::Read(recipe_json); + GREYAssert(value.has_value(), @"Unable to parse JSON string."); + GREYAssert(value.value().is_dict(), + @"Expecting a dictionary in the recipe JSON string."); + return std::move(value).value(); +} + +} // namespace + // The autofill automation test case is intended to run a script against a // captured web site. It gets the script from the command line. @interface AutofillAutomationTestCase : ChromeTestCase { - bool shouldRecordException; - GURL startUrl; - NSMutableArray<AutomationAction*>* actions_; - std::map<const std::string, autofill::ServerFieldType> - string_to_field_type_map_; + bool _shouldRecordException; + GURL _startURL; + NSMutableArray<AutomationAction*>* _actions; } @end @@ -54,170 +70,54 @@ // Retrieves the path to the recipe file from the command line. + (const base::FilePath)recipePath { - base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); - - GREYAssert(command_line->HasSwitch(kAutofillAutomationSwitch), + base::CommandLine* commandLine(base::CommandLine::ForCurrentProcess()); + GREYAssert(commandLine->HasSwitch(kAutofillAutomationSwitch), @"Missing command line switch %s.", kAutofillAutomationSwitch); base::FilePath path( - command_line->GetSwitchValuePath(kAutofillAutomationSwitch)); - + commandLine->GetSwitchValuePath(kAutofillAutomationSwitch)); GREYAssert(!path.empty(), @"A file name must be specified for command line switch %s.", kAutofillAutomationSwitch); - GREYAssert(path.IsAbsolute(), @"A fully qualified file name must be specified for command " @"line switch %s.", kAutofillAutomationSwitch); - GREYAssert(base::PathExists(path), @"File not found for switch %s.", kAutofillAutomationSwitch); + return path; } -// Loads the recipe file, parse it into Values. -+ (base::Value)parseRecipeAtPath:(const base::FilePath&)path { - std::string json_text; - - bool readSuccess(base::ReadFileToString(path, &json_text)); - GREYAssert(readSuccess, @"Unable to read json file."); - - base::Optional<base::Value> value = base::JSONReader::Read(json_text); - - GREYAssert(value.has_value(), @"Unable to parse json file."); - GREYAssert(value.value().is_dict(), - @"Expecting a dictionary in the JSON file."); - - return std::move(value).value(); -} - -// Converts a string (from the test recipe) to the autofill ServerFieldType it -// represents. -- (autofill::ServerFieldType)serverFieldTypeFromString:(const std::string&)str { - // Lazily init the string to autofill field type map on the first call. - // The test recipe can contain both server and html field types, as when - // creating the recipe either type can be returned from predictions. - // Therefore, we store both in this map. - if (string_to_field_type_map_.empty()) { - for (size_t i = autofill::NO_SERVER_DATA; - i < autofill::MAX_VALID_FIELD_TYPE; ++i) { - autofill::ServerFieldType field_type = - static_cast<autofill::ServerFieldType>(i); - string_to_field_type_map_[autofill::AutofillType(field_type).ToString()] = - field_type; - } - - for (size_t i = autofill::HTML_TYPE_UNSPECIFIED; - i < autofill::HTML_TYPE_UNRECOGNIZED; ++i) { - autofill::AutofillType field_type(static_cast<autofill::HtmlFieldType>(i), - autofill::HTML_MODE_NONE); - string_to_field_type_map_[field_type.ToString()] = - field_type.GetStorableType(); - } - } - - if (string_to_field_type_map_.count(str) == 0) { - NSString* errorStr = [NSString - stringWithFormat:@"Unable to recognize autofill field type %@!", - base::SysUTF8ToNSString(str)]; - GREYAssert(false, errorStr); - } - - return string_to_field_type_map_[str]; -} - -// Loads the defined autofill profile into the personal data manager, so that -// autofill actions will be suggested when tapping on an autofillable form. -// The autofill profile should be pulled from the test recipe, and consists of -// a list of dictionaries, each mapping one autofill type to one value, like so: -// "autofillProfile": [ -// { "type": "NAME_FIRST", "value": "Satsuki" }, -// { "type": "NAME_LAST", "value": "Yumizuka" }, -// ], -- (void)prepareAutofillProfileWithValues:(const base::Value*)autofillProfile { - autofill::AutofillProfile profile(base::GenerateGUID(), - "https://www.example.com/"); - autofill::CreditCard credit_card(base::GenerateGUID(), - "https://www.example.com/"); - - base::span<const base::Value> profile_entries_list = - autofillProfile->GetList(); - - // For each type-value dictionary in the autofill profile list, validate it, - // then add it to the appropriate profile. - for (const auto& it_entry : profile_entries_list) { - const base::DictionaryValue* entry; - - GREYAssert(it_entry.GetAsDictionary(&entry), - @"Failed to extract an entry!"); - - const base::Value* type_container = entry->FindKey("type"); - GREYAssert(base::Value::Type::STRING == type_container->type(), - @"Type is not a string!"); - const std::string field_type = type_container->GetString(); - - const base::Value* value_container = entry->FindKey("value"); - GREYAssert(base::Value::Type::STRING == value_container->type(), - @"Value is not a string!"); - const std::string field_value = value_container->GetString(); - - autofill::ServerFieldType type = - [self serverFieldTypeFromString:field_type]; - - // TODO(crbug.com/895968): Autofill profile and credit card info should be - // loaded from separate fields in the recipe, instead of being grouped - // together. However, we need to make sure this change is also performed on - // desktop automation. - if (base::StartsWith(field_type, "HTML_TYPE_CREDIT_CARD_", - base::CompareCase::INSENSITIVE_ASCII) || - base::StartsWith(field_type, "CREDIT_CARD_", - base::CompareCase::INSENSITIVE_ASCII)) { - credit_card.SetRawInfo(type, base::UTF8ToUTF16(field_value)); - } else { - profile.SetRawInfo(type, base::UTF8ToUTF16(field_value)); - } - } - - // Save the profile and credit card generated to the personal data manager. - web::WebState* web_state = chrome_test_util::GetCurrentWebState(); - web::WebFrame* main_frame = - web_state->GetWebFramesManager()->GetMainWebFrame(); - autofill::AutofillManager* autofill_manager = - autofill::AutofillDriverIOS::FromWebStateAndWebFrame(web_state, - main_frame) - ->autofill_manager(); - autofill::PersonalDataManager* personal_data_manager = - autofill_manager->client()->GetPersonalDataManager(); - - personal_data_manager->ClearAllLocalData(); - personal_data_manager->AddCreditCard(credit_card); - personal_data_manager->SaveImportedProfile(profile); +- (void)launchAppForTestMethod { + [[AppLaunchManager sharedManager] + ensureAppLaunchedWithFeaturesEnabled: + {autofill::features::kAutofillShowTypePredictions} + disabled:{} + forceRestart:NO]; } - (void)setUp { - self->shouldRecordException = true; + self->_shouldRecordException = true; [super setUp]; const base::FilePath recipePath = [[self class] recipePath]; - base::Value recipeRoot = [[self class] parseRecipeAtPath:recipePath]; + std::string recipeJSONText = ReadRecipeJsonFromPath(recipePath); + base::Value recipeRoot = RecipeJsonToValue(recipeJSONText); - const base::Value* autofillProfile = - recipeRoot.FindKeyOfType("autofillProfile", base::Value::Type::LIST); - if (autofillProfile) { - [self prepareAutofillProfileWithValues:autofillProfile]; - } + NSError* error = SetAutofillAutomationProfile(recipeJSONText); + GREYAssertNil(error, error.localizedDescription); // Extract the starting URL. - base::Value* startUrlValue = + base::Value* startURLValue = recipeRoot.FindKeyOfType("startingURL", base::Value::Type::STRING); - GREYAssert(startUrlValue, @"Test file is missing startingURL."); + GREYAssert(startURLValue, @"Test file is missing startingURL."); - const std::string startUrlString(startUrlValue->GetString()); - GREYAssert(!startUrlString.empty(), @"startingURL is an empty value."); + const std::string startURLString(startURLValue->GetString()); + GREYAssert(!startURLString.empty(), @"startingURL is an empty value."); - startUrl = GURL(startUrlString); + _startURL = GURL(startURLString); // Extract the actions. base::Value* actionValue = @@ -227,11 +127,11 @@ base::span<const base::Value> actionsValues(actionValue->GetList()); GREYAssert(actionsValues.size(), @"Test file has empty actions."); - actions_ = [[NSMutableArray alloc] initWithCapacity:actionsValues.size()]; + _actions = [[NSMutableArray alloc] initWithCapacity:actionsValues.size()]; for (auto const& actionValue : actionsValues) { GREYAssert(actionValue.is_dict(), @"Expecting each action to be a dictionary in the JSON file."); - [actions_ addObject:[AutomationAction + [_actions addObject:[AutomationAction actionWithValueDictionary: static_cast<const base::DictionaryValue&>( actionValue)]]; @@ -239,14 +139,14 @@ } // Override the XCTestCase method that records a failure due to an exception. -// This way we can choose whether to report failures during multiple runs of +// This way it can be chosen whether to report failures during multiple runs of // a recipe, and only fail the test if all the runs of the recipe fail. -// We still print the failure even when it is not reported. +// Will still print the failure even when it is not reported. - (void)recordFailureWithDescription:(NSString*)description inFile:(NSString*)filePath atLine:(NSUInteger)lineNumber expected:(BOOL)expected { - if (self->shouldRecordException) { + if (self->_shouldRecordException) { [super recordFailureWithDescription:description inFile:filePath atLine:lineNumber @@ -264,9 +164,9 @@ // This is because any exception reporting will fail the test. NSLog(@"================================================================"); NSLog(@"RECIPE ATTEMPT %d of %d for %@", (i + 1), kRecipeRetryLimit, - base::SysUTF8ToNSString(startUrl.GetContent())); + base::SysUTF8ToNSString(_startURL.GetContent())); - self->shouldRecordException = (i == (kRecipeRetryLimit - 1)); + self->_shouldRecordException = (i == (kRecipeRetryLimit - 1)); if ([self runActionsOnce]) { return; @@ -280,9 +180,9 @@ - (bool)runActionsOnce { @try { // Load the initial page of the recipe. - [ChromeEarlGrey loadURL:startUrl]; + [ChromeEarlGrey loadURL:_startURL]; - for (AutomationAction* action in actions_) { + for (AutomationAction* action in _actions) { [action execute]; } } @catch (NSException* e) {
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index e82f1df..d33b24a 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -346,6 +346,7 @@ "//components/unified_consent", "//ios/chrome/app/strings", "//ios/chrome/browser/autofill", + "//ios/chrome/browser/autofill/automation:eg_app_support+eg2", "//ios/chrome/browser/content_settings:content_settings", "//ios/chrome/browser/ntp:features", "//ios/chrome/browser/ui:feature_flags",
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn index db3ac08..397d6570 100644 --- a/ios/chrome/test/earl_grey2/BUILD.gn +++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -9,6 +9,7 @@ group("all_tests") { testonly = true deps = [ + ":ios_chrome_autofill_automation_eg2tests_module", ":ios_chrome_eg2tests", ":ios_chrome_smoke_eg2tests_module", ":ios_chrome_ui_eg2tests_module", @@ -19,6 +20,14 @@ chrome_ios_eg2_test_app_host("ios_chrome_eg2tests") { } +chrome_ios_eg2_test("ios_chrome_autofill_automation_eg2tests_module") { + xcode_test_application_name = "ios_chrome_eg2tests" + + deps = [ + "//ios/chrome/browser/autofill/automation:eg2_tests", + ] +} + chrome_ios_eg2_test("ios_chrome_smoke_eg2tests_module") { xcode_test_application_name = "ios_chrome_eg2tests"
diff --git a/media/remoting/media_remoting_rpc.proto b/media/remoting/media_remoting_rpc.proto index f4d1129f..b13a1184 100644 --- a/media/remoting/media_remoting_rpc.proto +++ b/media/remoting/media_remoting_rpc.proto
@@ -204,7 +204,7 @@ PIXEL_FORMAT_I444 = 5; PIXEL_FORMAT_NV12 = 6; PIXEL_FORMAT_NV21 = 7; - PIXEL_FORMAT_UYVY = 8; + PIXEL_FORMAT_UYVY = 8 [deprecated = true]; PIXEL_FORMAT_YUY2 = 9; PIXEL_FORMAT_ARGB = 10; PIXEL_FORMAT_XRGB = 11;
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index a07da11..bda8afb 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -448,6 +448,7 @@ UMA_HISTOGRAM_ENUMERATION("Cookie.RequestSameSiteContext", options.same_site_cookie_context(), CookieOptions::SameSiteCookieContext::COUNT); + switch (effective_same_site) { case CookieEffectiveSameSite::STRICT_MODE: if (options.same_site_cookie_context() < @@ -517,6 +518,22 @@ SameSite(), effective_same_site, IsSecure(), options.same_site_cookie_context(), &status); + if (status.IsInclude()) { + UMA_HISTOGRAM_ENUMERATION("Cookie.IncludedRequestEffectiveSameSite", + effective_same_site, + CookieEffectiveSameSite::COUNT); + + if (options.IsDifferentScheme() && + ((effective_same_site == CookieEffectiveSameSite::LAX_MODE) || + (effective_same_site == CookieEffectiveSameSite::STRICT_MODE) || + (effective_same_site == + CookieEffectiveSameSite::LAX_MODE_ALLOW_UNSAFE))) { + UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteDifferentSchemeRequest", + options.same_site_cookie_context_full(), + CookieOptions::SameSiteCookieContext::COUNT); + } + } + // TODO(chlily): Log metrics. return status; }
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc index 0b45d5d..f6294341 100644 --- a/net/cookies/canonical_cookie_unittest.cc +++ b/net/cookies/canonical_cookie_unittest.cc
@@ -714,6 +714,16 @@ CookieEffectiveSameSite::STRICT_MODE, CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=Strict", CookieSameSite::STRICT_MODE, + CookieEffectiveSameSite::STRICT_MODE, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=Strict", CookieSameSite::STRICT_MODE, + CookieEffectiveSameSite::STRICT_MODE, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, // Lax cookies: {"A=2; SameSite=Lax", CookieSameSite::LAX_MODE, CookieEffectiveSameSite::LAX_MODE, @@ -733,6 +743,26 @@ CookieEffectiveSameSite::LAX_MODE, CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=Lax", CookieSameSite::LAX_MODE, + CookieEffectiveSameSite::LAX_MODE, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=Lax", CookieSameSite::LAX_MODE, + CookieEffectiveSameSite::LAX_MODE, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=Lax", CookieSameSite::LAX_MODE, + CookieEffectiveSameSite::LAX_MODE, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=Lax", CookieSameSite::LAX_MODE, + CookieEffectiveSameSite::LAX_MODE, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, // None and Secure cookies: {"A=2; SameSite=None; Secure", CookieSameSite::NO_RESTRICTION, CookieEffectiveSameSite::NO_RESTRICTION, @@ -749,6 +779,26 @@ {"A=2; SameSite=None; Secure", CookieSameSite::NO_RESTRICTION, CookieEffectiveSameSite::NO_RESTRICTION, CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=None; Secure", CookieSameSite::NO_RESTRICTION, + CookieEffectiveSameSite::NO_RESTRICTION, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=None; Secure", CookieSameSite::NO_RESTRICTION, + CookieEffectiveSameSite::NO_RESTRICTION, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=None; Secure", CookieSameSite::NO_RESTRICTION, + CookieEffectiveSameSite::NO_RESTRICTION, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL, + CanonicalCookie::CookieInclusionStatus()}, + {"A=2; SameSite=None; Secure", CookieSameSite::NO_RESTRICTION, + CookieEffectiveSameSite::NO_RESTRICTION, + CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL, CanonicalCookie::CookieInclusionStatus()}}; // Test cases where the default is None (either access semantics is LEGACY, or @@ -1883,6 +1933,22 @@ CookieOptions context_same_site_strict; context_same_site_strict.set_same_site_cookie_context( net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT); + CookieOptions context_same_site_lax_to_secure; + context_same_site_lax_to_secure.set_same_site_cookie_context( + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL); + CookieOptions context_same_site_strict_to_secure; + context_same_site_strict_to_secure.set_same_site_cookie_context( + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL); + CookieOptions context_same_site_lax_to_insecure; + context_same_site_lax_to_insecure.set_same_site_cookie_context( + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL); + CookieOptions context_same_site_strict_to_insecure; + context_same_site_strict_to_insecure.set_same_site_cookie_context( + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL); { CanonicalCookie cookie_same_site_unrestricted( @@ -1899,6 +1965,19 @@ EXPECT_TRUE(cookie_same_site_unrestricted .IsSetPermittedInContext(context_same_site_strict) .IsInclude()); + EXPECT_TRUE(cookie_same_site_unrestricted + .IsSetPermittedInContext(context_same_site_lax_to_secure) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unrestricted + .IsSetPermittedInContext(context_same_site_strict_to_secure) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unrestricted + .IsSetPermittedInContext(context_same_site_lax_to_insecure) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unrestricted + .IsSetPermittedInContext(context_same_site_strict_to_insecure) + .IsInclude()); } { @@ -1917,6 +1996,19 @@ EXPECT_TRUE( cookie_same_site_lax.IsSetPermittedInContext(context_same_site_strict) .IsInclude()); + EXPECT_TRUE(cookie_same_site_lax + .IsSetPermittedInContext(context_same_site_lax_to_secure) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_lax + .IsSetPermittedInContext(context_same_site_strict_to_secure) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_lax + .IsSetPermittedInContext(context_same_site_lax_to_insecure) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_lax + .IsSetPermittedInContext(context_same_site_strict_to_insecure) + .IsInclude()); } { @@ -1938,6 +2030,19 @@ EXPECT_TRUE(cookie_same_site_strict .IsSetPermittedInContext(context_same_site_strict) .IsInclude()); + EXPECT_TRUE(cookie_same_site_strict + .IsSetPermittedInContext(context_same_site_lax_to_secure) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_strict + .IsSetPermittedInContext(context_same_site_strict_to_secure) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_strict + .IsSetPermittedInContext(context_same_site_lax_to_insecure) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_strict + .IsSetPermittedInContext(context_same_site_strict_to_insecure) + .IsInclude()); } // Behavior of UNSPECIFIED depends on an experiment and CookieAccessSemantics. @@ -1963,6 +2068,23 @@ CookieAccessSemantics::UNKNOWN) .IsInclude()); EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_secure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_secure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_insecure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_insecure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified .IsSetPermittedInContext(context_cross_site, CookieAccessSemantics::LEGACY) .IsInclude()); @@ -1975,6 +2097,23 @@ CookieAccessSemantics::LEGACY) .IsInclude()); EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_secure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_secure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_insecure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_insecure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified .IsSetPermittedInContext(context_cross_site, CookieAccessSemantics::NONLEGACY) .HasExactlyExclusionReasonsForTesting( @@ -1988,6 +2127,23 @@ .IsSetPermittedInContext(context_same_site_strict, CookieAccessSemantics::NONLEGACY) .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_secure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_secure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_insecure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_insecure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); } { @@ -2009,6 +2165,23 @@ CookieAccessSemantics::UNKNOWN) .IsInclude()); EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_secure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_secure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_insecure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_insecure, + CookieAccessSemantics::UNKNOWN) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified .IsSetPermittedInContext(context_cross_site, CookieAccessSemantics::LEGACY) .IsInclude()); @@ -2021,6 +2194,23 @@ CookieAccessSemantics::LEGACY) .IsInclude()); EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_secure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_secure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_insecure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_insecure, + CookieAccessSemantics::LEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified .IsSetPermittedInContext(context_cross_site, CookieAccessSemantics::NONLEGACY) .HasExactlyExclusionReasonsForTesting( @@ -2034,6 +2224,23 @@ .IsSetPermittedInContext(context_same_site_strict, CookieAccessSemantics::NONLEGACY) .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_secure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_secure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); + EXPECT_TRUE(cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_lax_to_insecure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); + EXPECT_TRUE( + cookie_same_site_unspecified + .IsSetPermittedInContext(context_same_site_strict_to_insecure, + CookieAccessSemantics::NONLEGACY) + .IsInclude()); } }
diff --git a/net/cookies/cookie_options.h b/net/cookies/cookie_options.h index 46c92f4..1c1aaad1 100644 --- a/net/cookies/cookie_options.h +++ b/net/cookies/cookie_options.h
@@ -16,15 +16,35 @@ class NET_EXPORT CookieOptions { public: + // Mask indicating insecure site-for-cookies and secure request/response. + static const int kToSecureMask = 1 << 5; + // Mask indicating secure site-for-cookies and insecure request/response. + static const int kToInsecureMask = kToSecureMask << 1; + // Relation between the cookie and the navigational environment. - // Ordered from least to most trusted environment. - // Don't renumber, used in histograms. + // CROSS_SITE to SAME_SITE_STRICT are ordered from least to most trusted + // environment. The remaining values are reiterations with additional bits for + // cross-scheme contexts. Don't renumber, used in histograms. enum class SameSiteCookieContext { CROSS_SITE = 0, // Same rules as lax but the http method is unsafe. SAME_SITE_LAX_METHOD_UNSAFE = 1, SAME_SITE_LAX = 2, SAME_SITE_STRICT = 3, + // The CROSS_SCHEME enums are for when the url and site_for_cookies + // differ in their schemes (http vs https). Their values are chosen such + // that the CROSS_SCHEME flag can be bitmasked out. + // SECURE_URL indicates either a request to a secure url or a response from + // a secure url, similarly for INSECURE. + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL = + SAME_SITE_LAX_METHOD_UNSAFE | kToSecureMask, + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL = SAME_SITE_LAX | kToSecureMask, + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL = SAME_SITE_STRICT | kToSecureMask, + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL = + SAME_SITE_LAX_METHOD_UNSAFE | kToInsecureMask, + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL = SAME_SITE_LAX | kToInsecureMask, + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL = + SAME_SITE_STRICT | kToInsecureMask, // Keep last, used for histograms. COUNT @@ -54,10 +74,36 @@ void set_same_site_cookie_context(SameSiteCookieContext context) { same_site_cookie_context_ = context; } + + // Strips off the cross-scheme bits to only return the same-site context. SameSiteCookieContext same_site_cookie_context() const { + return RemoveCrossSchemeBitmask(same_site_cookie_context_); + } + + SameSiteCookieContext same_site_cookie_context_full() const { return same_site_cookie_context_; } + static SameSiteCookieContext ApplyCrossSchemeBitmask( + SameSiteCookieContext context, + int mask) { + int return_value = static_cast<int>(context); + return_value = return_value | mask; + return static_cast<CookieOptions::SameSiteCookieContext>(return_value); + } + + static SameSiteCookieContext RemoveCrossSchemeBitmask( + SameSiteCookieContext context) { + int return_value = static_cast<int>(context); + return_value = return_value & ~(kToSecureMask | kToInsecureMask); + return static_cast<CookieOptions::SameSiteCookieContext>(return_value); + } + + bool IsDifferentScheme() const { + return static_cast<int>(same_site_cookie_context_) & + (kToSecureMask | kToInsecureMask); + } + void set_update_access_time() { update_access_time_ = true; } void set_do_not_update_access_time() { update_access_time_ = false; } bool update_access_time() const { return update_access_time_; }
diff --git a/net/cookies/cookie_util.cc b/net/cookies/cookie_util.cc index 4618c78..f368096 100644 --- a/net/cookies/cookie_util.cc +++ b/net/cookies/cookie_util.cc
@@ -80,19 +80,50 @@ registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); } +CookieOptions::SameSiteCookieContext ComputeSchemeChange( + CookieOptions::SameSiteCookieContext same_site_type, + const GURL& url, + const GURL& site_for_cookies) { + if (site_for_cookies.is_empty()) + return same_site_type; + + DCHECK(same_site_type == + CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT || + same_site_type == CookieOptions::SameSiteCookieContext::SAME_SITE_LAX); + + bool url_secure = url.SchemeIsCryptographic(); + bool site_for_cookies_secure = site_for_cookies.SchemeIsCryptographic(); + + // Check for different schemes and add flag if so. + if (url_secure && !site_for_cookies_secure) { + same_site_type = CookieOptions::ApplyCrossSchemeBitmask( + same_site_type, CookieOptions::kToSecureMask); + } else if (!url_secure && site_for_cookies_secure) { + same_site_type = CookieOptions::ApplyCrossSchemeBitmask( + same_site_type, CookieOptions::kToInsecureMask); + } + + return same_site_type; +} + CookieOptions::SameSiteCookieContext ComputeSameSiteContext( const GURL& url, const GURL& site_for_cookies, const base::Optional<url::Origin>& initiator) { if (MatchesSiteForCookies(url, site_for_cookies)) { + CookieOptions::SameSiteCookieContext same_site_type; if (!initiator || registry_controlled_domains::SameDomainOrHost( url, initiator.value(), registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)) { - return CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT; + same_site_type = CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT; } else { - return CookieOptions::SameSiteCookieContext::SAME_SITE_LAX; + same_site_type = CookieOptions::SameSiteCookieContext::SAME_SITE_LAX; } + + same_site_type = ComputeSchemeChange(same_site_type, url, site_for_cookies); + + return same_site_type; } return CookieOptions::SameSiteCookieContext::CROSS_SITE; } @@ -426,18 +457,27 @@ // but appear like cross-site ones. // // * Otherwise, do not include same-site cookies. - if (attach_same_site_cookies) - return CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT; + if (attach_same_site_cookies) { + return ComputeSchemeChange( + CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, url, + site_for_cookies); + } CookieOptions::SameSiteCookieContext same_site_context = ComputeSameSiteContext(url, site_for_cookies, initiator); + int scheme_bitmask = + static_cast<int>(same_site_context) & + (CookieOptions::kToSecureMask | CookieOptions::kToInsecureMask); + // If the method is safe, the context is Lax. Otherwise, make a note that // the method is unsafe. - if (same_site_context == + if (CookieOptions::RemoveCrossSchemeBitmask(same_site_context) == CookieOptions::SameSiteCookieContext::SAME_SITE_LAX && !net::HttpUtil::IsMethodSafe(http_method)) { - return CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE; + return CookieOptions::ApplyCrossSchemeBitmask( + CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE, + scheme_bitmask); } return same_site_context; } @@ -476,10 +516,13 @@ const GURL& site_for_cookies) { // If the URL is same-site as site_for_cookies it's same-site as all frames // in the tree from the initiator frame up --- including the initiator frame. - if (MatchesSiteForCookies(url, site_for_cookies)) - return CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT; - else + if (MatchesSiteForCookies(url, site_for_cookies)) { + return ComputeSchemeChange( + CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, url, + site_for_cookies); + } else { return CookieOptions::SameSiteCookieContext::CROSS_SITE; + } } bool IsSameSiteByDefaultCookiesEnabled() {
diff --git a/net/cookies/cookie_util_unittest.cc b/net/cookies/cookie_util_unittest.cc index 3f832d6..185176a 100644 --- a/net/cookies/cookie_util_unittest.cc +++ b/net/cookies/cookie_util_unittest.cc
@@ -278,11 +278,18 @@ // This isn't a full on origin check --- subdomains and different schema are // accepted. - EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_LAX, + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL, cookie_util::ComputeSameSiteContextForScriptGet( GURL("https://example.com"), GURL("http://example.com"), url::Origin::Create(GURL("http://from-elsewhere.com")))); + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL, + cookie_util::ComputeSameSiteContextForScriptGet( + GURL("http://example.com"), GURL("https://example.com"), + url::Origin::Create(GURL("http://from-elsewhere.com")))); + EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_LAX, cookie_util::ComputeSameSiteContextForScriptGet( GURL("http://sub.example.com"), GURL("http://sub2.example.com"), @@ -300,6 +307,18 @@ GURL("http://example.com"), GURL("http://example.com"), url::Origin::Create(GURL("http://example.com")))); + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + cookie_util::ComputeSameSiteContextForScriptGet( + GURL("https://example.com"), GURL("http://example.com"), + base::nullopt /*initiator*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL, + cookie_util::ComputeSameSiteContextForScriptGet( + GURL("http://example.com"), GURL("https://example.com"), + base::nullopt /*initiator*/)); + EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, cookie_util::ComputeSameSiteContextForScriptGet( GURL("http://example.com"), GURL("http://example.com"), @@ -337,6 +356,46 @@ url::Origin::Create(GURL("http://from-elsewhere.com")), true /*attach_same_site_cookies*/)); + EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, + cookie_util::ComputeSameSiteContextForRequest( + "GET", GURL("http://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://example.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, + cookie_util::ComputeSameSiteContextForRequest( + "POST", GURL("http://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://example.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "GET", GURL("https://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://example.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "POST", GURL("https://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://example.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "GET", GURL("http://example.com"), GURL("https://example.com"), + url::Origin::Create(GURL("http://example.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "POST", GURL("http://example.com"), GURL("https://example.com"), + url::Origin::Create(GURL("http://example.com")), + false /*attach_same_site_cookies*/)); + // Normally, lax requests also require a safe method. EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_LAX, cookie_util::ComputeSameSiteContextForRequest( @@ -350,11 +409,46 @@ url::Origin::Create(GURL("http://from-elsewhere.com")), false /*attach_same_site_cookies*/)); + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "GET", GURL("https://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://from-elsewhere.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "GET", GURL("http://example.com"), GURL("https://example.com"), + url::Origin::Create(GURL("http://from-elsewhere.com")), + false /*attach_same_site_cookies*/)); + EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE, cookie_util::ComputeSameSiteContextForRequest( "POST", GURL("http://example.com"), GURL("http://example.com"), url::Origin::Create(GURL("http://from-elsewhere.com")), false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "POST", GURL("https://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://from-elsewhere.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "POST", GURL("http://example.com"), GURL("https://example.com"), + url::Origin::Create(GURL("http://from-elsewhere.com")), + false /*attach_same_site_cookies*/)); + + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL, + cookie_util::ComputeSameSiteContextForRequest( + "POST", GURL("https://example.com"), GURL("http://example.com"), + url::Origin::Create(GURL("http://from-elsewhere.com")), + false /*attach_same_site_cookies*/)); } TEST(CookieUtilTest, ComputeSameSiteContextForSet) { @@ -386,7 +480,8 @@ // This isn't a full on origin check --- subdomains and different schema are // accepted. - EXPECT_EQ(CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, + EXPECT_EQ(CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, cookie_util::ComputeSameSiteContextForSubresource( GURL("https://example.com"), GURL("http://example.com")));
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index df4f720..dbb7f97 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -943,9 +943,6 @@ } int SSLClientSocketImpl::DoHandshakeComplete(int result) { - if (in_confirm_handshake_) - MaybeRecordEarlyDataResult(); - if (result < 0) return result; @@ -1372,8 +1369,6 @@ DCHECK_NE(kSSLClientSocketNoPendingResult, signature_result_); pending_read_error_ = ERR_IO_PENDING; } else { - if (pending_read_ssl_error_ == SSL_ERROR_EARLY_DATA_REJECTED) - MaybeRecordEarlyDataResult(); pending_read_error_ = MapLastOpenSSLError( pending_read_ssl_error_, err_tracer, &pending_read_error_info_); } @@ -1391,8 +1386,6 @@ // next call of DoPayloadRead. rv = total_bytes_read; - MaybeRecordEarlyDataResult(); - // Do not treat insufficient data as an error to return in the next call to // DoPayloadRead() - instead, let the call fall through to check SSL_read() // again. The transport may have data available by then. @@ -1456,6 +1449,29 @@ crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); + if (ssl_config_.early_data_enabled && !recorded_early_data_result_) { + // |SSL_peek| will implicitly run |SSL_do_handshake| if needed, but run it + // manually to pick up the reject reason. + int rv = SSL_do_handshake(ssl_.get()); + int ssl_err = SSL_get_error(ssl_.get(), rv); + if (ssl_err == SSL_ERROR_WANT_READ || ssl_err == SSL_ERROR_WANT_WRITE) { + return; + } + + // Since the two-parameter version of the macro (which asks for a max value) + // requires that the max value sentinel be named |kMaxValue|, transform the + // max-value sentinel into a one-past-the-end ("boundary") sentinel by + // adding 1, in order to be able to use the three-parameter macro. + UMA_HISTOGRAM_ENUMERATION("Net.SSLHandshakeEarlyDataReason", + SSL_get_early_data_reason(ssl_.get()), + ssl_early_data_reason_max_value + 1); + recorded_early_data_result_ = true; + if (ssl_err != SSL_ERROR_NONE) { + peek_complete_ = true; + return; + } + } + char byte; int rv = SSL_peek(ssl_.get(), &byte, 1); int ssl_err = SSL_get_error(ssl_.get(), rv); @@ -1817,22 +1833,6 @@ negotiated_protocol_, kProtoLast + 1); } -void SSLClientSocketImpl::MaybeRecordEarlyDataResult() { - DCHECK(ssl_); - if (!ssl_config_.early_data_enabled || recorded_early_data_result_) - return; - - recorded_early_data_result_ = true; - // Since the two-parameter version of the macro (which asks for a max - // value) requires that the max value sentinel be named |kMaxValue|, - // transform the max-value sentinel into a one-past-the-end ("boundary") - // sentinel by adding 1, in order to be able to use the three-parameter - // macro. - UMA_HISTOGRAM_ENUMERATION("Net.SSLHandshakeEarlyDataReason", - SSL_get_early_data_reason(ssl_.get()), - ssl_early_data_reason_max_value + 1); -} - int SSLClientSocketImpl::MapLastOpenSSLError( int ssl_error, const crypto::OpenSSLErrStackTracer& tracer,
diff --git a/net/socket/ssl_client_socket_impl.h b/net/socket/ssl_client_socket_impl.h index 69e755bd..9ffa830 100644 --- a/net/socket/ssl_client_socket_impl.h +++ b/net/socket/ssl_client_socket_impl.h
@@ -201,11 +201,6 @@ // in a UMA histogram. void RecordNegotiatedProtocol() const; - // Records the result of a handshake where early data was requested - // in the corresponding UMA histogram. This will happen at most once - // during the lifetime of the socket. - void MaybeRecordEarlyDataResult(); - // Returns the net error corresponding to the most recent OpenSSL // error. ssl_error is the output of SSL_get_error. int MapLastOpenSSLError(int ssl_error,
diff --git a/services/media_session/audio_focus_manager.cc b/services/media_session/audio_focus_manager.cc index a31d463..3ce95ac2 100644 --- a/services/media_session/audio_focus_manager.cc +++ b/services/media_session/audio_focus_manager.cc
@@ -301,9 +301,9 @@ } void AudioFocusManager::BindToControllerManagerInterface( - mojom::MediaControllerManagerRequest request) { + mojo::PendingReceiver<mojom::MediaControllerManager> receiver) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - controller_bindings_.AddBinding(this, std::move(request)); + controller_receivers_.Add(this, std::move(receiver)); } void AudioFocusManager::RequestAudioFocusInternal(
diff --git a/services/media_session/audio_focus_manager.h b/services/media_session/audio_focus_manager.h index 09127e0..f96b0ef 100644 --- a/services/media_session/audio_focus_manager.h +++ b/services/media_session/audio_focus_manager.h
@@ -12,7 +12,6 @@ #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" -#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote_set.h" @@ -97,9 +96,9 @@ void BindToDebugInterface( mojo::PendingReceiver<mojom::AudioFocusManagerDebug> receiver); - // Bind to a mojom::MediaControllerManagerRequest. + // Bind to a receiver of mojom::MediaControllerManager. void BindToControllerManagerInterface( - mojom::MediaControllerManagerRequest request); + mojo::PendingReceiver<mojom::MediaControllerManager> receiver); private: friend class AudioFocusManagerTest; @@ -166,8 +165,8 @@ // Holds mojo receivers for the Audio Focus Manager Debug API. mojo::ReceiverSet<mojom::AudioFocusManagerDebug> debug_receivers_; - // Holds mojo bindings for the Media Controller Manager API. - mojo::BindingSet<mojom::MediaControllerManager> controller_bindings_; + // Holds mojo receivers for the Media Controller Manager API. + mojo::ReceiverSet<mojom::MediaControllerManager> controller_receivers_; // Weak reference of managed observers. Observers are expected to remove // themselves before being destroyed.
diff --git a/services/network/public/cpp/cookie_manager_mojom_traits.cc b/services/network/public/cpp/cookie_manager_mojom_traits.cc index 067058d8..63619b8 100644 --- a/services/network/public/cpp/cookie_manager_mojom_traits.cc +++ b/services/network/public/cpp/cookie_manager_mojom_traits.cc
@@ -191,6 +191,30 @@ return network::mojom::CookieSameSiteContext::SAME_SITE_LAX_METHOD_UNSAFE; case net::CookieOptions::SameSiteCookieContext::CROSS_SITE: return network::mojom::CookieSameSiteContext::CROSS_SITE; + case net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL: + return network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL; + case net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL: + return network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL; + case net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL: + return network::mojom::CookieSameSiteContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL; + case net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL: + return network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL; + case net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL: + return network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL; + case net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL: + return network::mojom::CookieSameSiteContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL; default: NOTREACHED(); return network::mojom::CookieSameSiteContext::CROSS_SITE; @@ -215,6 +239,36 @@ case network::mojom::CookieSameSiteContext::CROSS_SITE: *output = net::CookieOptions::SameSiteCookieContext::CROSS_SITE; return true; + case network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL: + *output = net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL; + return true; + case network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL: + *output = net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL; + return true; + case network::mojom::CookieSameSiteContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL: + *output = net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL; + return true; + case network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL: + *output = net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL; + return true; + case network::mojom::CookieSameSiteContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL: + *output = net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL; + return true; + case network::mojom::CookieSameSiteContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL: + *output = net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL; + return true; } return false; }
diff --git a/services/network/public/cpp/cookie_manager_mojom_traits_unittest.cc b/services/network/public/cpp/cookie_manager_mojom_traits_unittest.cc index b87238cd..8ebb62f 100644 --- a/services/network/public/cpp/cookie_manager_mojom_traits_unittest.cc +++ b/services/network/public/cpp/cookie_manager_mojom_traits_unittest.cc
@@ -142,7 +142,20 @@ for (net::CookieOptions::SameSiteCookieContext context_state : {net::CookieOptions::SameSiteCookieContext::CROSS_SITE, net::CookieOptions::SameSiteCookieContext::SAME_SITE_LAX, - net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT}) { + net::CookieOptions::SameSiteCookieContext::SAME_SITE_LAX_METHOD_UNSAFE, + net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT, + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL, + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL, + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL, + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL, + net::CookieOptions::SameSiteCookieContext:: + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL}) { net::CookieOptions::SameSiteCookieContext roundtrip; ASSERT_TRUE(SerializeAndDeserializeEnum<mojom::CookieSameSiteContext>( context_state, &roundtrip));
diff --git a/services/network/public/mojom/cookie_manager.mojom b/services/network/public/mojom/cookie_manager.mojom index c69b208..dc06eb89 100644 --- a/services/network/public/mojom/cookie_manager.mojom +++ b/services/network/public/mojom/cookie_manager.mojom
@@ -58,7 +58,13 @@ CROSS_SITE, SAME_SITE_LAX_METHOD_UNSAFE, SAME_SITE_LAX, - SAME_SITE_STRICT + SAME_SITE_STRICT, + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_SECURE_URL, + SAME_SITE_LAX_CROSS_SCHEME_SECURE_URL, + SAME_SITE_STRICT_CROSS_SCHEME_SECURE_URL, + SAME_SITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL, + SAME_SITE_LAX_CROSS_SCHEME_INSECURE_URL, + SAME_SITE_STRICT_CROSS_SCHEME_INSECURE_URL }; // What rules to apply when determining whether access to a particular cookie is
diff --git a/services/video_capture/public/cpp/mock_video_capture_service.cc b/services/video_capture/public/cpp/mock_video_capture_service.cc index f2dbb05b..2c59db2 100644 --- a/services/video_capture/public/cpp/mock_video_capture_service.cc +++ b/services/video_capture/public/cpp/mock_video_capture_service.cc
@@ -4,6 +4,8 @@ #include "services/video_capture/public/cpp/mock_video_capture_service.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + namespace video_capture { MockVideoCaptureService::MockVideoCaptureService() {} @@ -11,19 +13,20 @@ MockVideoCaptureService::~MockVideoCaptureService() = default; void MockVideoCaptureService::ConnectToDeviceFactory( - video_capture::mojom::DeviceFactoryRequest request) { - DoConnectToDeviceFactory(request); + mojo::PendingReceiver<video_capture::mojom::DeviceFactory> receiver) { + DoConnectToDeviceFactory(std::move(receiver)); } void MockVideoCaptureService::ConnectToVideoSourceProvider( - video_capture::mojom::VideoSourceProviderRequest request) { - DoConnectToVideoSourceProvider(request); + mojo::PendingReceiver<video_capture::mojom::VideoSourceProvider> receiver) { + DoConnectToVideoSourceProvider(std::move(receiver)); } #if defined(OS_CHROMEOS) void MockVideoCaptureService::InjectGpuDependencies( - video_capture::mojom::AcceleratorFactoryPtr accelerator_factory) { - DoInjectGpuDependencies(accelerator_factory); + mojo::PendingRemote<video_capture::mojom::AcceleratorFactory> + accelerator_factory) { + DoInjectGpuDependencies(std::move(accelerator_factory)); } #endif // defined(OS_CHROMEOS)
diff --git a/services/video_capture/public/cpp/mock_video_capture_service.h b/services/video_capture/public/cpp/mock_video_capture_service.h index a611ab0..76c5cc1b 100644 --- a/services/video_capture/public/cpp/mock_video_capture_service.h +++ b/services/video_capture/public/cpp/mock_video_capture_service.h
@@ -5,6 +5,7 @@ #ifndef SERVICES_VIDEO_CAPTURE_PUBLIC_CPP_MOCK_VIDEO_CAPTURE_SERVICE_H_ #define SERVICES_VIDEO_CAPTURE_PUBLIC_CPP_MOCK_VIDEO_CAPTURE_SERVICE_H_ +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/video_capture/public/mojom/video_capture_service.mojom.h" #include "testing/gmock/include/gmock/gmock.h" @@ -17,18 +18,22 @@ ~MockVideoCaptureService() override; void ConnectToDeviceFactory( - video_capture::mojom::DeviceFactoryRequest request) override; + mojo::PendingReceiver<video_capture::mojom::DeviceFactory> receiver) + override; void ConnectToVideoSourceProvider( - video_capture::mojom::VideoSourceProviderRequest request) override; + mojo::PendingReceiver<video_capture::mojom::VideoSourceProvider> receiver) + override; #if defined(OS_CHROMEOS) void InjectGpuDependencies( - video_capture::mojom::AcceleratorFactoryPtr accelerator_factory) override; + mojo::PendingRemote<video_capture::mojom::AcceleratorFactory> + accelerator_factory) override; MOCK_METHOD1( DoInjectGpuDependencies, - void(video_capture::mojom::AcceleratorFactoryPtr& accelerator_factory)); + void(mojo::PendingRemote<video_capture::mojom::AcceleratorFactory> + accelerator_factory)); void ConnectToCameraAppDeviceBridge( mojo::PendingReceiver<cros::mojom::CameraAppDeviceBridge>) override {} @@ -39,9 +44,11 @@ MOCK_METHOD1(SetShutdownDelayInSeconds, void(float seconds)); MOCK_METHOD1(DoConnectToDeviceFactory, - void(video_capture::mojom::DeviceFactoryRequest& request)); + void(mojo::PendingReceiver<video_capture::mojom::DeviceFactory> + receiver)); MOCK_METHOD1(DoConnectToVideoSourceProvider, - void(video_capture::mojom::VideoSourceProviderRequest& request)); + void(mojo::PendingReceiver< + video_capture::mojom::VideoSourceProvider> receiver)); MOCK_METHOD1(SetRetryCount, void(int32_t)); };
diff --git a/services/video_capture/public/mojom/video_capture_service.mojom b/services/video_capture/public/mojom/video_capture_service.mojom index e2b55ca..1294e65 100644 --- a/services/video_capture/public/mojom/video_capture_service.mojom +++ b/services/video_capture/public/mojom/video_capture_service.mojom
@@ -31,7 +31,7 @@ // decoding will be performed without gpu acceleration. interface VideoCaptureService { [EnableIf=is_chromeos] - InjectGpuDependencies(AcceleratorFactory accelerator_factory); + InjectGpuDependencies(pending_remote<AcceleratorFactory> accelerator_factory); // Binds a bridge for Chrome OS camera app and device. [EnableIf=is_chromeos] @@ -39,10 +39,10 @@ pending_receiver<cros.mojom.CameraAppDeviceBridge> receiver); // Legacy API. Supports one client per device. - ConnectToDeviceFactory(DeviceFactory& request); + ConnectToDeviceFactory(pending_receiver<DeviceFactory> receiver); // Current API. Supports multiple clients per source. - ConnectToVideoSourceProvider(VideoSourceProvider& request); + ConnectToVideoSourceProvider(pending_receiver<VideoSourceProvider> receiver); // Sets a retry count that is used by the service for logging UMA events in // the context of investigation for https://crbug.com/643068.
diff --git a/services/video_capture/video_capture_service_impl.cc b/services/video_capture/video_capture_service_impl.cc index 39429a02..d24de69 100644 --- a/services/video_capture/video_capture_service_impl.cc +++ b/services/video_capture/video_capture_service_impl.cc
@@ -15,6 +15,9 @@ #include "media/capture/video/video_capture_buffer_pool.h" #include "media/capture/video/video_capture_buffer_tracker.h" #include "media/capture/video/video_capture_system_impl.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/video_capture/device_factory_media_to_mojo_adapter.h" #include "services/video_capture/testing_controls_impl.h" @@ -55,8 +58,9 @@ #if defined(OS_CHROMEOS) void InjectGpuDependencies( - mojom::AcceleratorFactoryPtrInfo accelerator_factory_info) { + mojo::PendingRemote<mojom::AcceleratorFactory> accelerator_factory_info) { DCHECK(gpu_io_task_runner_->RunsTasksInCurrentSequence()); + accelerator_factory_.reset(); accelerator_factory_.Bind(std::move(accelerator_factory_info)); } @@ -80,7 +84,7 @@ scoped_refptr<base::SequencedTaskRunner> gpu_io_task_runner_; #if defined(OS_CHROMEOS) - mojom::AcceleratorFactoryPtr accelerator_factory_; + mojo::Remote<mojom::AcceleratorFactory> accelerator_factory_; #endif // defined(OS_CHROMEOS) base::WeakPtrFactory<GpuDependenciesContext> weak_factory_for_gpu_io_thread_{ @@ -94,7 +98,7 @@ ui_task_runner_(std::move(ui_task_runner)) {} VideoCaptureServiceImpl::~VideoCaptureServiceImpl() { - factory_bindings_.CloseAllBindings(); + factory_receivers_.Clear(); device_factory_.reset(); #if defined(OS_CHROMEOS) @@ -109,12 +113,12 @@ #if defined(OS_CHROMEOS) void VideoCaptureServiceImpl::InjectGpuDependencies( - mojom::AcceleratorFactoryPtr accelerator_factory) { + mojo::PendingRemote<mojom::AcceleratorFactory> accelerator_factory) { LazyInitializeGpuDependenciesContext(); gpu_dependencies_context_->GetTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&GpuDependenciesContext::InjectGpuDependencies, gpu_dependencies_context_->GetWeakPtr(), - accelerator_factory.PassInterface())); + std::move(accelerator_factory))); } void VideoCaptureServiceImpl::ConnectToCameraAppDeviceBridge( @@ -125,15 +129,15 @@ #endif // defined(OS_CHROMEOS) void VideoCaptureServiceImpl::ConnectToDeviceFactory( - mojom::DeviceFactoryRequest request) { + mojo::PendingReceiver<mojom::DeviceFactory> receiver) { LazyInitializeDeviceFactory(); - factory_bindings_.AddBinding(device_factory_.get(), std::move(request)); + factory_receivers_.Add(device_factory_.get(), std::move(receiver)); } void VideoCaptureServiceImpl::ConnectToVideoSourceProvider( - mojom::VideoSourceProviderRequest request) { + mojo::PendingReceiver<mojom::VideoSourceProvider> receiver) { LazyInitializeVideoSourceProvider(); - video_source_provider_->AddClient(std::move(request)); + video_source_provider_->AddClient(std::move(receiver)); } void VideoCaptureServiceImpl::SetRetryCount(int32_t count) {
diff --git a/services/video_capture/video_capture_service_impl.h b/services/video_capture/video_capture_service_impl.h index b6310030..c728764 100644 --- a/services/video_capture/video_capture_service_impl.h +++ b/services/video_capture/video_capture_service_impl.h
@@ -9,9 +9,10 @@ #include "base/memory/scoped_refptr.h" #include "base/threading/thread.h" -#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "services/video_capture/public/mojom/device_factory.mojom.h" #include "services/video_capture/public/mojom/video_capture_service.mojom.h" @@ -34,15 +35,16 @@ // mojom::VideoCaptureService implementation. #if defined(OS_CHROMEOS) - void InjectGpuDependencies( - mojom::AcceleratorFactoryPtr accelerator_factory) override; + void InjectGpuDependencies(mojo::PendingRemote<mojom::AcceleratorFactory> + accelerator_factory) override; void ConnectToCameraAppDeviceBridge( mojo::PendingReceiver<cros::mojom::CameraAppDeviceBridge> receiver) override; #endif // defined(OS_CHROMEOS) - void ConnectToDeviceFactory(mojom::DeviceFactoryRequest request) override; + void ConnectToDeviceFactory( + mojo::PendingReceiver<mojom::DeviceFactory> receiver) override; void ConnectToVideoSourceProvider( - mojom::VideoSourceProviderRequest request) override; + mojo::PendingReceiver<mojom::VideoSourceProvider> receiver) override; void SetRetryCount(int32_t count) override; void BindControlsForTesting( mojo::PendingReceiver<mojom::TestingControls> receiver) override; @@ -56,7 +58,7 @@ void OnLastSourceProviderClientDisconnected(); mojo::Receiver<mojom::VideoCaptureService> receiver_; - mojo::BindingSet<mojom::DeviceFactory> factory_bindings_; + mojo::ReceiverSet<mojom::DeviceFactory> factory_receivers_; std::unique_ptr<VirtualDeviceEnabledDeviceFactory> device_factory_; std::unique_ptr<VideoSourceProviderImpl> video_source_provider_; std::unique_ptr<GpuDependenciesContext> gpu_dependencies_context_;
diff --git a/services/viz/public/mojom/compositing/transferable_resource.mojom b/services/viz/public/mojom/compositing/transferable_resource.mojom index 5207ce5..082fb48 100644 --- a/services/viz/public/mojom/compositing/transferable_resource.mojom +++ b/services/viz/public/mojom/compositing/transferable_resource.mojom
@@ -31,7 +31,6 @@ BGRX_1010102, YVU_420, YUV_420_BIPLANAR, - UYVY_422, P010, };
diff --git a/sql/statement.h b/sql/statement.h index 54e87e37..6144b23 100644 --- a/sql/statement.h +++ b/sql/statement.h
@@ -56,7 +56,7 @@ // be valid. Use is_valid() to check if it's OK. void Assign(scoped_refptr<Database::StatementRef> ref); - // Resets the statement to an uninitialized state corrosponding to + // Resets the statement to an uninitialized state corresponding to // the default constructor, releasing the StatementRef. void Clear();
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index ef858b42..f4730a4 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -4357,6 +4357,61 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-16.04" + } + ], + "named_caches": [ + { + "name": "avd_generic_android23", + "path": ".android" + }, + { + "name": "system_images_android_23_google_apis_x86", + "path": ".emulator_sdk" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 502c3361..19ad361 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -10993,6 +10993,51 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY48I", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "expiration": 10800, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -14072,6 +14117,51 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY49B", + "device_os_type": "userdebug", + "device_type": "flo", + "os": "Android" + } + ], + "expiration": 10800, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -17273,6 +17363,50 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -20349,6 +20483,51 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MRA58Z", + "device_os_type": "userdebug", + "device_type": "flo", + "os": "Android" + } + ], + "expiration": 10800, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -28608,6 +28787,50 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -32412,6 +32635,51 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_cts_tests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index d3f33eb..3faef60 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -7421,6 +7421,51 @@ "--bucket", "chromium-result-details", "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ] + }, + "test": "weblayer_instrumentation_test_apk" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "isolate_coverage_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 2d94169..26d69c9 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -5239,6 +5239,7 @@ 'linux_flavor_specific_chromium_gtests', 'vr_platform_specific_chromium_gtests', 'network_service_android_gtests', + 'weblayer_android_gtests', ], 'android_nougat_gtests': [ @@ -5282,6 +5283,7 @@ 'linux_flavor_specific_chromium_gtests', 'vr_platform_specific_chromium_gtests', 'network_service_android_gtests', + 'weblayer_android_gtests', ], 'android_wpt_scripts': [
diff --git a/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h b/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h index 65e08f1..0fb7d9cf 100644 --- a/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h
@@ -56,9 +56,6 @@ void SetTopLevelBlameContext( base::trace_event::BlameContext* blame_context) override; void SetRendererProcessType(WebRendererProcessType type) override; - WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration duration) override; void OnMainFrameRequestedForInput() override; private:
diff --git a/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h b/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h index 5432871..442fe29 100644 --- a/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h
@@ -64,10 +64,6 @@ MOCK_METHOD0(VirtualTimeResumed, void()); MOCK_METHOD1(SetTopLevelBlameContext, void(base::trace_event::BlameContext*)); MOCK_METHOD1(SetRendererProcessType, void(WebRendererProcessType)); - MOCK_METHOD2(CreateWebScopedVirtualTimePauser, - WebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration)); MOCK_METHOD0(OnMainFrameRequestedForInput, void()); private:
diff --git a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h index 041bf8d9..c2e979a 100644 --- a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
@@ -14,7 +14,6 @@ #include "build/build_config.h" #include "third_party/blink/public/platform/scheduler/web_rail_mode_observer.h" #include "third_party/blink/public/platform/scheduler/web_render_widget_scheduling_state.h" -#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/public/platform/web_common.h" #include "third_party/blink/public/platform/web_input_event.h" #include "third_party/blink/public/platform/web_input_event_result.h" @@ -235,17 +234,6 @@ // once. virtual void SetRendererProcessType(WebRendererProcessType type); - // Returns a WebScopedVirtualTimePauser which can be used to vote for pausing - // virtual time. Virtual time will be paused if any WebScopedVirtualTimePauser - // votes to pause it, and only unpaused only if all - // WebScopedVirtualTimePausers are either destroyed or vote to unpause. Note - // the WebScopedVirtualTimePauser returned by this method is initially - // unpaused. - virtual WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration duration = - WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant); - protected: WebThreadScheduler() = default; DISALLOW_COPY_AND_ASSIGN(WebThreadScheduler);
diff --git a/third_party/blink/renderer/bindings/core/v8/BUILD.gn b/third_party/blink/renderer/bindings/core/v8/BUILD.gn index ce3c5bd..40e897c5 100644 --- a/third_party/blink/renderer/bindings/core/v8/BUILD.gn +++ b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
@@ -90,8 +90,8 @@ "$bindings_core_v8_output_dir/string_or_string_sequence.h", "$bindings_core_v8_output_dir/string_or_trusted_html.cc", "$bindings_core_v8_output_dir/string_or_trusted_html.h", - "$bindings_core_v8_output_dir/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.cc", - "$bindings_core_v8_output_dir/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h", + "$bindings_core_v8_output_dir/string_or_trusted_html_or_trusted_script_or_trusted_script_url.cc", + "$bindings_core_v8_output_dir/string_or_trusted_html_or_trusted_script_or_trusted_script_url.h", "$bindings_core_v8_output_dir/string_or_trusted_script.cc", "$bindings_core_v8_output_dir/string_or_trusted_script.h", "$bindings_core_v8_output_dir/string_or_trusted_script_url.cc", @@ -100,8 +100,6 @@ "$bindings_core_v8_output_dir/string_or_unrestricted_double_sequence.h", "$bindings_core_v8_output_dir/string_treat_null_as_empty_string_or_trusted_script.cc", "$bindings_core_v8_output_dir/string_treat_null_as_empty_string_or_trusted_script.h", - "$bindings_core_v8_output_dir/usv_string_or_trusted_url.cc", - "$bindings_core_v8_output_dir/usv_string_or_trusted_url.h", "$bindings_core_v8_output_dir/usv_string_sequence_sequence_or_usv_string_usv_string_record_or_usv_string.cc", "$bindings_core_v8_output_dir/usv_string_sequence_sequence_or_usv_string_usv_string_record_or_usv_string.h", "$bindings_core_v8_output_dir/unrestricted_double_or_keyframe_animation_options.cc",
diff --git a/third_party/blink/renderer/bindings/modules/BUILD.gn b/third_party/blink/renderer/bindings/modules/BUILD.gn index 3e85261..0f17d1f 100644 --- a/third_party/blink/renderer/bindings/modules/BUILD.gn +++ b/third_party/blink/renderer/bindings/modules/BUILD.gn
@@ -69,7 +69,6 @@ "//third_party/blink/renderer/modules/speech/speech_synthesis_event.idl", "//third_party/blink/renderer/modules/storage/storage_event.idl", "//third_party/blink/renderer/modules/vr/vr_display_event.idl", - "//third_party/blink/renderer/modules/wake_lock/wake_lock_event.idl", "//third_party/blink/renderer/modules/webaudio/audio_processing_event.idl", "//third_party/blink/renderer/modules/webaudio/offline_audio_completion_event.idl", "//third_party/blink/renderer/modules/webgl/webgl_context_event.idl",
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer.cc b/third_party/blink/renderer/core/clipboard/data_transfer.cc index d887455..cd48fc2b 100644 --- a/third_party/blink/renderer/core/clipboard/data_transfer.cc +++ b/third_party/blink/renderer/core/clipboard/data_transfer.cc
@@ -123,8 +123,7 @@ PaintLayerPaintingInfo painting_info( layer, CullRect(EnclosingIntRect(bounding_box)), kGlobalPaintFlattenCompositingLayers, PhysicalOffset()); - PaintLayerFlags flags = kPaintLayerHaveTransparency | - kPaintLayerUncachedClipRects; + PaintLayerFlags flags = kPaintLayerHaveTransparency; PaintRecordBuilder builder; dragged_layout_object->GetDocument().Lifecycle().AdvanceTo(
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index c2180f4..e66c145 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -142,7 +142,6 @@ "trustedtypes/trusted_script_url.idl", "trustedtypes/trusted_type_policy.idl", "trustedtypes/trusted_type_policy_factory.idl", - "trustedtypes/trusted_url.idl", "editing/selection.idl", "events/animation_event.idl", "events/animation_playback_event.idl",
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc index 83b90e0..6c2f080 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -133,6 +133,7 @@ &context_.GetElement(), SelectorChecker::kVisitedMatchEnabled); context.scope = match_request.scope; context.pseudo_id = pseudo_style_request_.pseudo_id; + context.is_from_vtt = match_request.is_from_vtt; unsigned rejected = 0; unsigned fast_rejected = 0;
diff --git a/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc b/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc index 52a5b16..ac9e91b9 100644 --- a/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc +++ b/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc
@@ -73,7 +73,8 @@ CSSValue* ConsumeFontFaceSrcURI(CSSParserTokenRange& range, const CSSParserContext& context) { String url = - css_property_parser_helpers::ConsumeUrlAsStringView(range).ToString(); + css_property_parser_helpers::ConsumeUrlAsStringView(range, &context) + .ToString(); if (url.IsNull()) return nullptr; CSSFontFaceSrcValue* uri_value(CSSFontFaceSrcValue::Create(
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc b/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc index 79e4749..68ed1212 100644 --- a/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc +++ b/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc
@@ -668,13 +668,14 @@ range.ConsumeIncludingWhitespace().Value().ToString()); } -StringView ConsumeUrlAsStringView(CSSParserTokenRange& range) { +StringView ConsumeUrlAsStringView(CSSParserTokenRange& range, + const CSSParserContext* context) { + StringView url; const CSSParserToken& token = range.Peek(); if (token.GetType() == kUrlToken) { range.ConsumeIncludingWhitespace(); - return token.Value(); - } - if (token.FunctionId() == CSSValueID::kUrl) { + url = token.Value(); + } else if (token.FunctionId() == CSSValueID::kUrl) { CSSParserTokenRange url_range = range; CSSParserTokenRange url_args = url_range.ConsumeBlock(); const CSSParserToken& next = url_args.ConsumeIncludingWhitespace(); @@ -683,15 +684,27 @@ DCHECK_EQ(next.GetType(), kStringToken); range = url_range; range.ConsumeWhitespace(); - return next.Value(); + url = next.Value(); } - return StringView(); + // Invalidate the URL if only data URLs are allowed and the protocol is not + // data. + if (!url.IsNull() && + context->ResourceFetchRestriction() == + ResourceFetchRestriction::kOnlyDataUrls && + !ProtocolIs(url.ToString(), "data")) { + // The StringView must be instantiated with an empty string otherwise the + // URL will incorrectly be identified as null. The resource should behave as + // if it failed to load. + url = StringView(""); + } + + return url; } CSSURIValue* ConsumeUrl(CSSParserTokenRange& range, const CSSParserContext* context) { - StringView url = ConsumeUrlAsStringView(range); + StringView url = ConsumeUrlAsStringView(range, context); if (url.IsNull()) return nullptr; String url_string = url.ToString(); @@ -1758,7 +1771,8 @@ CSSParserTokenRange args = ConsumeFunction(range_copy); auto* image_set = MakeGarbageCollected<CSSImageSetValue>(context->Mode()); do { - AtomicString url_value = ConsumeUrlAsStringView(args).ToAtomicString(); + AtomicString url_value = + ConsumeUrlAsStringView(args, context).ToAtomicString(); if (url_value.IsNull()) return nullptr; @@ -1801,7 +1815,7 @@ CSSValue* ConsumeImage(CSSParserTokenRange& range, const CSSParserContext* context, ConsumeGeneratedImagePolicy generated_image) { - AtomicString uri = ConsumeUrlAsStringView(range).ToAtomicString(); + AtomicString uri = ConsumeUrlAsStringView(range, context).ToAtomicString(); if (!uri.IsNull()) return CreateCSSImageValueWithReferrer(uri, context); if (range.Peek().GetType() == kFunctionToken) {
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h b/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h index 550758a5..90e4e387 100644 --- a/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h +++ b/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h
@@ -94,7 +94,8 @@ CSSCustomIdentValue* ConsumeCustomIdent(CSSParserTokenRange&, const CSSParserContext&); CSSStringValue* ConsumeString(CSSParserTokenRange&); -StringView ConsumeUrlAsStringView(CSSParserTokenRange&); +StringView ConsumeUrlAsStringView(CSSParserTokenRange&, + const CSSParserContext*); cssvalue::CSSURIValue* ConsumeUrl(CSSParserTokenRange&, const CSSParserContext*);
diff --git a/third_party/blink/renderer/core/css/resolver/match_request.h b/third_party/blink/renderer/core/css/resolver/match_request.h index 6546de50..1a500f4 100644 --- a/third_party/blink/renderer/core/css/resolver/match_request.h +++ b/third_party/blink/renderer/core/css/resolver/match_request.h
@@ -41,11 +41,13 @@ MatchRequest(RuleSet* rule_set, const ContainerNode* scope = nullptr, const CSSStyleSheet* css_sheet = nullptr, - unsigned style_sheet_index = 0) + unsigned style_sheet_index = 0, + bool is_from_vtt = false) : rule_set(rule_set), scope(scope), style_sheet(css_sheet), - style_sheet_index(style_sheet_index) { + style_sheet_index(style_sheet_index), + is_from_vtt(is_from_vtt) { // Now that we're about to read from the RuleSet, we're done adding more // rules to the set and we should make sure it's compacted. rule_set->CompactRulesIfNeeded(); @@ -55,6 +57,7 @@ Member<const ContainerNode> scope; Member<const CSSStyleSheet> style_sheet; const unsigned style_sheet_index; + bool is_from_vtt; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index 9eeed1d..0eaf3ce 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -58,7 +58,6 @@ #include "third_party/blink/renderer/core/css/css_value_list.h" #include "third_party/blink/renderer/core/css/element_rule_collector.h" #include "third_party/blink/renderer/core/css/font_face.h" -#include "third_party/blink/renderer/core/css/media_query_evaluator.h" #include "third_party/blink/renderer/core/css/page_rule_collector.h" #include "third_party/blink/renderer/core/css/part_names.h" #include "third_party/blink/renderer/core/css/properties/css_property.h" @@ -66,7 +65,6 @@ #include "third_party/blink/renderer/core/css/resolver/css_variable_animator.h" #include "third_party/blink/renderer/core/css/resolver/css_variable_resolver.h" #include "third_party/blink/renderer/core/css/resolver/match_result.h" -#include "third_party/blink/renderer/core/css/resolver/media_query_result.h" #include "third_party/blink/renderer/core/css/resolver/scoped_style_resolver.h" #include "third_party/blink/renderer/core/css/resolver/selector_filter_parent_scope.h" #include "third_party/blink/renderer/core/css/resolver/style_adjuster.h" @@ -90,6 +88,9 @@ #include "third_party/blink/renderer/core/html/custom/custom_element_definition.h" #include "third_party/blink/renderer/core/html/html_iframe_element.h" #include "third_party/blink/renderer/core/html/html_slot_element.h" +#include "third_party/blink/renderer/core/html/track/text_track.h" +#include "third_party/blink/renderer/core/html/track/vtt/vtt_cue.h" +#include "third_party/blink/renderer/core/html/track/vtt/vtt_element.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/media_type_names.h" #include "third_party/blink/renderer/core/probe/core_probes.h" @@ -312,6 +313,38 @@ } } +const static TextTrack* GetTextTrackFromElement(const Element& element) { + if (auto* vtt_element = DynamicTo<VTTElement>(element)) + return vtt_element->GetTrack(); + if (auto* vtt_cue_background_box = DynamicTo<VTTCueBackgroundBox>(element)) + return vtt_cue_background_box->GetTrack(); + return nullptr; +} + +static void MatchVTTRules(const Element& element, + ElementRuleCollector& collector) { + const TextTrack* text_track = GetTextTrackFromElement(element); + if (!text_track) + return; + const HeapVector<Member<CSSStyleSheet>>& styles = + text_track->GetCSSStyleSheets(); + if (!styles.IsEmpty()) { + int style_sheet_index = 0; + collector.ClearMatchedRules(); + for (CSSStyleSheet* style : styles) { + RuleSet* rule_set = + element.GetDocument().GetStyleEngine().RuleSetForSheet(*style); + if (rule_set) { + collector.CollectMatchingRules( + MatchRequest(rule_set, nullptr /* scope */, style, + style_sheet_index, true /* is_from_webvtt */)); + style_sheet_index++; + } + } + collector.SortAndTransferMatchedRules(); + } +} + // Matches rules from the element's scope. The selectors may cross shadow // boundaries during matching, like for :host-context. static void MatchElementScopeRules(const Element& element, @@ -324,6 +357,7 @@ collector.SortAndTransferMatchedRules(); } + MatchVTTRules(element, collector); if (element.IsStyledElement() && element.InlineStyle() && !collector.IsCollectingForPseudoElement()) { // Inline style is immutable as long as there is no CSSOM wrapper.
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc index 5e2ec4b..7bea2586 100644 --- a/third_party/blink/renderer/core/css/selector_checker.cc +++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -88,8 +88,10 @@ return html_select_element && !html_select_element->UsesMenuList(); } -static bool MatchesTagName(const Element& element, - const QualifiedName& tag_q_name) { +static bool MatchesTagName( + const Element& element, + const QualifiedName& tag_q_name, + const SelectorChecker::SelectorCheckingContext& context) { if (tag_q_name == AnyQName()) return true; const AtomicString& local_name = tag_q_name.LocalName(); @@ -105,8 +107,12 @@ return false; } const AtomicString& namespace_uri = tag_q_name.NamespaceURI(); - return namespace_uri == g_star_atom || - namespace_uri == element.namespaceURI(); + if (namespace_uri == g_star_atom) + return true; + // VTT style sheets should apply to a hypothetical document with no namespace + if (context.is_from_vtt) + return namespace_uri.IsEmpty(); + return namespace_uri == element.namespaceURI(); } static Element* ParentElement( @@ -204,6 +210,26 @@ return !ElementTraversal::NextSibling(element, HasTagName(type)); } +bool SelectorChecker::Match(const SelectorCheckingContext& context, + MatchResult& result) const { + DCHECK(context.selector); + if (context.is_from_vtt) + return MatchVTTBlockSelector(context, result); + return MatchSelector(context, result) == kSelectorMatches; +} + +bool SelectorChecker::MatchVTTBlockSelector( + const SelectorCheckingContext& context, + MatchResult& result) const { + DCHECK(context.selector); + if (context.selector->IsLastInTagHistory() || + context.selector->TagHistory()->Specificity() != 0) { + return false; + } + + return MatchSelector(context, result) == kSelectorMatches; +} + // Recursive check of selectors and combinators // It can return 4 different values: // * SelectorMatches - the selector matches the element e @@ -330,6 +356,14 @@ next_context.previous_element = context.element; next_context.pseudo_id = kPseudoIdNone; + // Rules that come from a WebVTT STYLE block apply to a hypothetical + // document with a single empty element with no explicit name, no namespace, + // no attribute, no classes, no IDs, and unknown primary language that acts + // as the originating element for the cue pseudo-elements. This element + // must not be generally selectable. + if (context.is_from_vtt && relation != CSSSelector::kShadowPseudo) + return kSelectorFailsCompletely; + switch (relation) { case CSSSelector::kShadowDeepAsDescendant: Deprecation::CountDeprecation(context.element->GetDocument(), @@ -690,7 +724,7 @@ switch (selector.Match()) { case CSSSelector::kTag: - return MatchesTagName(element, selector.TagQName()); + return MatchesTagName(element, selector.TagQName(), context); case CSSSelector::kClass: return element.HasClass() && element.ClassNames().Contains(selector.Value()); @@ -896,7 +930,8 @@ for (sub_context.selector = selector.SelectorList()->First(); sub_context.selector; sub_context.selector = CSSSelectorList::Next( *sub_context.selector)) { - if (Match(sub_context)) + MatchResult sub_result; + if (MatchSelector(sub_context, sub_result) == kSelectorMatches) return true; } } break; @@ -1150,7 +1185,8 @@ for (sub_context.selector = selector.SelectorList()->First(); sub_context.selector; sub_context.selector = CSSSelectorList::Next( *sub_context.selector)) { - if (Match(sub_context)) + MatchResult sub_result; + if (MatchSelector(sub_context, sub_result) == kSelectorMatches) return true; } return false;
diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h index e89b0fc2..469d7ee2 100644 --- a/third_party/blink/renderer/core/css/selector_checker.h +++ b/third_party/blink/renderer/core/css/selector_checker.h
@@ -115,7 +115,8 @@ in_rightmost_compound(true), has_scrollbar_pseudo(false), has_selection_pseudo(false), - treat_shadow_host_as_normal_scope(false) {} + treat_shadow_host_as_normal_scope(false), + is_from_vtt(false) {} const CSSSelector* selector; Member<Element> element; @@ -128,6 +129,7 @@ bool has_scrollbar_pseudo; bool has_selection_pseudo; bool treat_shadow_host_as_normal_scope; + bool is_from_vtt; }; struct MatchResult { @@ -140,11 +142,7 @@ unsigned specificity; }; - bool Match(const SelectorCheckingContext& context, - MatchResult& result) const { - DCHECK(context.selector); - return MatchSelector(context, result) == kSelectorMatches; - } + bool Match(const SelectorCheckingContext& context, MatchResult& result) const; bool Match(const SelectorCheckingContext& context) const { MatchResult ignore_result; @@ -196,6 +194,8 @@ MatchStatus MatchForPseudoShadow(const SelectorCheckingContext&, const ContainerNode*, MatchResult&) const; + bool MatchVTTBlockSelector(const SelectorCheckingContext& context, + MatchResult& result) const; bool CheckPseudoClass(const SelectorCheckingContext&, MatchResult&) const; bool CheckPseudoElement(const SelectorCheckingContext&, MatchResult&) const; bool CheckScrollbarPseudoClass(const SelectorCheckingContext&,
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index fe3647ab..78f81486 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -67,7 +67,6 @@ #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_element_creation_options.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/bindings/core/v8/v0_custom_element_constructor_builder.h" #include "third_party/blink/renderer/bindings/core/v8/v8_element_creation_options.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h" @@ -278,7 +277,6 @@ #include "third_party/blink/renderer/core/timing/dom_window_performance.h" #include "third_party/blink/renderer/core/timing/window_performance.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/core/xml/parser/xml_document_parser.h" #include "third_party/blink/renderer/core/xml_names.h" #include "third_party/blink/renderer/core/xmlns_names.h" @@ -3864,7 +3862,7 @@ } DOMWindow* Document::open(v8::Isolate* isolate, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, const AtomicString& name, const AtomicString& features, ExceptionState& exception_state) { @@ -3874,7 +3872,7 @@ return nullptr; } - return domWindow()->open(isolate, string_or_url, name, features, + return domWindow()->open(isolate, url_string, name, features, exception_state); }
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index ee2f801..7b14d1e 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -189,7 +189,6 @@ class TextAutosizer; class TransformSource; class TreeWalker; -class USVStringOrTrustedURL; class V8NodeFilter; class ViewportData; class VisitedLinkState; @@ -629,7 +628,7 @@ const AtomicString& replace, ExceptionState&); DOMWindow* open(v8::Isolate*, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, const AtomicString& name, const AtomicString& features, ExceptionState&);
diff --git a/third_party/blink/renderer/core/dom/document.idl b/third_party/blink/renderer/core/dom/document.idl index f49890f..ec4b33c9 100644 --- a/third_party/blink/renderer/core/dom/document.idl +++ b/third_party/blink/renderer/core/dom/document.idl
@@ -116,7 +116,7 @@ // dynamic markup insertion [CallWith=Isolate, CEReactions, CustomElementCallbacks, RaisesException, MeasureAs=DocumentOpenTwoArgs] Document open(optional DOMString type = "text/html", optional DOMString replace = ""); - [CallWith=Isolate, RaisesException, MeasureAs=DocumentOpenThreeArgs] Window open(URLString url, DOMString name, DOMString features); + [CallWith=Isolate, RaisesException, MeasureAs=DocumentOpenThreeArgs] Window open(USVString url, DOMString name, DOMString features); [CEReactions, RaisesException] void close(); [CallWith=Isolate, CEReactions, CustomElementCallbacks, RaisesException] void write(DOMString... text); [CallWith=Isolate, CEReactions, CustomElementCallbacks, RaisesException] void writeln(DOMString... text);
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 24b28a86..71abe56 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -35,10 +35,9 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/scroll_into_view_options_or_boolean.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" -#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/accessibility/ax_context.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/animation/css/css_animations.h" @@ -2168,8 +2167,7 @@ void Element::setAttribute( const AtomicString& local_name, - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& - string_or_TT, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_TT, ExceptionState& exception_state) { if (!Document::IsValidName(local_name)) { exception_state.ThrowDOMException( @@ -2255,16 +2253,6 @@ } } -void Element::setAttribute(const QualifiedName& name, - const USVStringOrTrustedURL& stringOrURL, - ExceptionState& exception_state) { - String valueString = - GetStringFromTrustedURL(stringOrURL, &GetDocument(), exception_state); - if (!exception_state.HadException()) { - setAttribute(name, AtomicString(valueString)); - } -} - ALWAYS_INLINE void Element::SetAttributeInternal( wtf_size_t index, const QualifiedName& name, @@ -3877,8 +3865,7 @@ void Element::setAttributeNS( const AtomicString& namespace_uri, const AtomicString& qualified_name, - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& - string_or_TT, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_TT, ExceptionState& exception_state) { QualifiedName parsed_name = g_any_name; if (!ParseAttributeName(parsed_name, namespace_uri, qualified_name, @@ -5299,18 +5286,6 @@ result.SetString(url.GetString()); } -void Element::GetURLAttribute(const QualifiedName& name, - USVStringOrTrustedURL& result) const { - String url = GetURLAttribute(name); - result.SetUSVString(url); -} - -void Element::FastGetAttribute(const QualifiedName& name, - USVStringOrTrustedURL& result) const { - String attr = FastGetAttribute(name); - result.SetUSVString(attr); -} - void Element::FastGetAttribute(const QualifiedName& name, StringOrTrustedHTML& result) const { String html = FastGetAttribute(name);
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index fc0f084..cd12ff6 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -85,12 +85,11 @@ class ShadowRootInit; class SpaceSplitString; class StringOrTrustedHTML; -class StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL; +class StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL; class StringOrTrustedScript; class StringOrTrustedScriptURL; class StylePropertyMap; class StylePropertyMapReadOnly; -class USVStringOrTrustedURL; class V0CustomElementDefinition; enum class CSSPropertyID; @@ -242,10 +241,9 @@ void setAttribute(const AtomicString& name, const AtomicString& value); // Trusted Types variant for explicit setAttribute() use. - void setAttribute( - const AtomicString&, - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&, - ExceptionState&); + void setAttribute(const AtomicString&, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL&, + ExceptionState&); // Returns attributes that should be checked against Trusted Types virtual const AttrNameToTrustedType& GetCheckedAttributeTypes() const; @@ -265,11 +263,6 @@ const StringOrTrustedScriptURL&, ExceptionState&); - // Trusted Type URL variant - void setAttribute(const QualifiedName&, - const USVStringOrTrustedURL&, - ExceptionState&); - static bool ParseAttributeName(QualifiedName&, const AtomicString& namespace_uri, const AtomicString& qualified_name, @@ -277,7 +270,7 @@ void setAttributeNS( const AtomicString& namespace_uri, const AtomicString& qualified_name, - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL&, ExceptionState&); bool toggleAttribute(const AtomicString&, ExceptionState&); @@ -643,8 +636,6 @@ KURL GetURLAttribute(const QualifiedName&) const; void GetURLAttribute(const QualifiedName&, StringOrTrustedScriptURL&) const; - void GetURLAttribute(const QualifiedName&, USVStringOrTrustedURL&) const; - void FastGetAttribute(const QualifiedName&, USVStringOrTrustedURL&) const; void FastGetAttribute(const QualifiedName&, StringOrTrustedHTML&) const; KURL GetNonEmptyURLAttribute(const QualifiedName&) const;
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc index de7ab12..7b54ad2 100644 --- a/third_party/blink/renderer/core/dom/node.cc +++ b/third_party/blink/renderer/core/dom/node.cc
@@ -607,9 +607,6 @@ void Node::CallApplyScroll(ScrollState& scroll_state) { TRACE_EVENT0("input", "Node::CallApplyScroll"); - // Hits ASSERTs when trying to determine whether we need to scroll on main - // or CC. http://crbug.com/625676. - DisableCompositingQueryAsserts disabler; if (!GetDocument().GetPage()) { // We should always have a Page if we're scrolling. See
diff --git a/third_party/blink/renderer/core/execution_context/agent_metrics_collector_test.cc b/third_party/blink/renderer/core/execution_context/agent_metrics_collector_test.cc index bbe63d4..e76d54a 100644 --- a/third_party/blink/renderer/core/execution_context/agent_metrics_collector_test.cc +++ b/third_party/blink/renderer/core/execution_context/agent_metrics_collector_test.cc
@@ -6,14 +6,12 @@ #include "base/test/simple_test_tick_clock.h" #include "base/time/default_tick_clock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/location.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/testing/histogram_tester.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 4c25b573..665766a 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -82,7 +82,6 @@ #include "third_party/blink/public/web/web_view_client.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_factory.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_node.h" #include "third_party/blink/renderer/core/clipboard/data_transfer.h" @@ -147,7 +146,6 @@ #include "third_party/blink/renderer/core/testing/scoped_fake_plugin_registry.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/bindings/microtask.h" #include "third_party/blink/renderer/platform/cursor.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h" @@ -9613,20 +9611,15 @@ ScriptState::Scope entered_context_scope(script_state); v8::Context::BackupIncumbentScope incumbent_context_scope( script_state->GetContext()); - main_window->open(script_state->GetIsolate(), - USVStringOrTrustedURL::FromTrustedURL( - MakeGarbageCollected<TrustedURL>(destination)), - "frame1", "", exception_state); + main_window->open(script_state->GetIsolate(), destination, "frame1", "", + exception_state); ASSERT_FALSE(remote_client.LastRequest().IsNull()); EXPECT_EQ(remote_client.LastRequest().Url(), WebURL(KURL(destination))); // Pointing a named frame to an empty URL should just return a reference to // the frame's window without navigating it. - DOMWindow* result = - main_window->open(script_state->GetIsolate(), - USVStringOrTrustedURL::FromTrustedURL( - MakeGarbageCollected<TrustedURL>("")), - "frame1", "", exception_state); + DOMWindow* result = main_window->open(script_state->GetIsolate(), "", + "frame1", "", exception_state); EXPECT_EQ(remote_client.LastRequest().Url(), WebURL(KURL(destination))); EXPECT_EQ(result, WebFrame::ToCoreFrame(*remote_frame)->DomWindow());
diff --git a/third_party/blink/renderer/core/frame/history.cc b/third_party/blink/renderer/core/frame/history.cc index 0eef974..36b9bb36 100644 --- a/third_party/blink/renderer/core/frame/history.cc +++ b/third_party/blink/renderer/core/frame/history.cc
@@ -195,6 +195,8 @@ return; if (delta) { + if (Page* page = GetFrame()->GetPage()) + page->HistoryNavigationVirtualTimePauser().PauseVirtualTime(); GetFrame()->Client()->NavigateBackForward(delta); } else { // We intentionally call reload() for the current frame if delta is zero.
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc index 9cd3e52..9795e55 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -37,7 +37,6 @@ #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/bindings/core/v8/v8_void_function.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h" #include "third_party/blink/renderer/core/accessibility/ax_context.h" @@ -1440,7 +1439,7 @@ } DOMWindow* LocalDOMWindow::open(v8::Isolate* isolate, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, const AtomicString& target, const String& features, ExceptionState& exception_state) { @@ -1458,11 +1457,6 @@ return nullptr; } - const String& url_string = - GetStringFromTrustedURL(string_or_url, document_, exception_state); - if (exception_state.HadException()) - return nullptr; - if (!IsCurrentlyDisplayedInFrame()) return nullptr; if (!incumbent_window->GetFrame())
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h index 96a0092..80f0b4e 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.h +++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -71,7 +71,6 @@ class SourceLocation; class StyleMedia; class TrustedTypePolicyFactory; -class USVStringOrTrustedURL; class V8FrameRequestCallback; class V8IdleRequestCallback; class V8VoidFunction; @@ -265,7 +264,7 @@ Element* frameElement() const; DOMWindow* open(v8::Isolate*, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, const AtomicString& target, const String& features, ExceptionState&);
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index b108116e..c246b213 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1362,10 +1362,10 @@ bool should_scroll) { // We want to create the anchor even if we don't need to scroll. This ensures // all the side effects like setting CSS :target are correctly set. - FragmentAnchor* anchor = FragmentAnchor::TryCreate( - url, *frame_, same_document_navigation, should_scroll); + FragmentAnchor* anchor = + FragmentAnchor::TryCreate(url, *frame_, same_document_navigation); - if (anchor) { + if (anchor && should_scroll) { fragment_anchor_ = anchor; fragment_anchor_->Installed();
diff --git a/third_party/blink/renderer/core/frame/location.cc b/third_party/blink/renderer/core/frame/location.cc index 3acc96e..1d21eaa 100644 --- a/third_party/blink/renderer/core/frame/location.cc +++ b/third_party/blink/renderer/core/frame/location.cc
@@ -29,7 +29,7 @@ #include "third_party/blink/renderer/core/frame/location.h" #include "third_party/blink/renderer/bindings/core/v8/binding_security.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/dom_window.h" @@ -37,7 +37,6 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/loader/frame_load_request.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/core/url/dom_url_utils_read_only.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.h" @@ -67,8 +66,8 @@ return url; } -void Location::href(USVStringOrTrustedURL& result) const { - result.SetUSVString(Url().StrippedForUseAsHref()); +String Location::href() const { + return Url().StrippedForUseAsHref(); } String Location::protocol() const { @@ -116,10 +115,7 @@ } String Location::toString() const { - USVStringOrTrustedURL result; - href(result); - DCHECK(result.IsUSVString()); - return result.GetAsUSVString(); + return href(); } String Location::hash() const { @@ -127,17 +123,11 @@ } void Location::setHref(v8::Isolate* isolate, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, ExceptionState& exception_state) { LocalDOMWindow* incumbent_window = IncumbentDOMWindow(isolate); LocalDOMWindow* entered_window = EnteredDOMWindow(isolate); - - const String& url = GetStringFromTrustedURL( - string_or_url, incumbent_window->document(), exception_state); - if (exception_state.HadException()) - return; - - SetLocation(url, incumbent_window, entered_window, &exception_state); + SetLocation(url_string, incumbent_window, entered_window, &exception_state); } void Location::setProtocol(v8::Isolate* isolate, @@ -219,31 +209,19 @@ } void Location::assign(v8::Isolate* isolate, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, ExceptionState& exception_state) { LocalDOMWindow* incumbent_window = IncumbentDOMWindow(isolate); LocalDOMWindow* entered_window = EnteredDOMWindow(isolate); - - const String& url = GetStringFromTrustedURL( - string_or_url, incumbent_window->document(), exception_state); - if (exception_state.HadException()) - return; - - SetLocation(url, incumbent_window, entered_window, &exception_state); + SetLocation(url_string, incumbent_window, entered_window, &exception_state); } void Location::replace(v8::Isolate* isolate, - const USVStringOrTrustedURL& string_or_url, + const String& url_string, ExceptionState& exception_state) { LocalDOMWindow* incumbent_window = IncumbentDOMWindow(isolate); LocalDOMWindow* entered_window = EnteredDOMWindow(isolate); - - const String& url = GetStringFromTrustedURL( - string_or_url, incumbent_window->document(), exception_state); - if (exception_state.HadException()) - return; - - SetLocation(url, incumbent_window, entered_window, &exception_state, + SetLocation(url_string, incumbent_window, entered_window, &exception_state, SetLocationPolicy::kReplaceThisFrame); }
diff --git a/third_party/blink/renderer/core/frame/location.h b/third_party/blink/renderer/core/frame/location.h index 12b6870b..5708dec 100644 --- a/third_party/blink/renderer/core/frame/location.h +++ b/third_party/blink/renderer/core/frame/location.h
@@ -43,7 +43,6 @@ class ExceptionState; class KURL; class LocalDOMWindow; -class USVStringOrTrustedURL; // This class corresponds to the Location interface. Location is the only // interface besides Window that is accessible cross-origin and must handle @@ -58,11 +57,11 @@ DOMWindow* DomWindow() const { return dom_window_.Get(); } - void setHref(v8::Isolate*, const USVStringOrTrustedURL&, ExceptionState&); - void href(USVStringOrTrustedURL&) const; + void setHref(v8::Isolate*, const String&, ExceptionState&); + String href() const; - void assign(v8::Isolate*, const USVStringOrTrustedURL&, ExceptionState&); - void replace(v8::Isolate*, const USVStringOrTrustedURL&, ExceptionState&); + void assign(v8::Isolate*, const String&, ExceptionState&); + void replace(v8::Isolate*, const String&, ExceptionState&); void reload(); void setProtocol(v8::Isolate*, const String&, ExceptionState&);
diff --git a/third_party/blink/renderer/core/frame/location.idl b/third_party/blink/renderer/core/frame/location.idl index bfcda81..dd303cec 100644 --- a/third_party/blink/renderer/core/frame/location.idl +++ b/third_party/blink/renderer/core/frame/location.idl
@@ -32,7 +32,7 @@ CheckSecurity=Receiver, Exposed=Window ] interface Location { - [CallWith=Isolate, RaisesException, Unforgeable] void assign(URLString url); + [CallWith=Isolate, RaisesException, Unforgeable] void assign(USVString url); // |replace|, and *writing* |href| do not require a security check, as they // *change* the page, and thus these do not change any property of an @@ -40,13 +40,13 @@ // However, *reading* |href|, or accessing any component, is a security // problem, since that allows tracking navigation. // https://html.spec.whatwg.org/C/#crossoriginproperties-(-o-) - [CallWith=Isolate, CrossOrigin, RaisesException, Unforgeable] void replace(URLString url); + [CallWith=Isolate, CrossOrigin, RaisesException, Unforgeable] void replace(USVString url); [Unforgeable] void reload(); // TODO(foolip): |ancestorOrigins| should have [Unforgeable, SameObject]. [Unforgeable] readonly attribute DOMStringList ancestorOrigins; - [Affects=Nothing, SetterCallWith=Isolate, CrossOrigin=Setter, RaisesException=Setter, Unforgeable] attribute URLString href; + [Affects=Nothing, SetterCallWith=Isolate, CrossOrigin=Setter, RaisesException=Setter, Unforgeable] attribute USVString href; // TODO(yukishiino): Use [Unforgeable] stringifier instead of toString. [Unforgeable] DOMString toString(); [MeasureAs=LocationOrigin, Unforgeable] readonly attribute USVString origin;
diff --git a/third_party/blink/renderer/core/frame/window.idl b/third_party/blink/renderer/core/frame/window.idl index 0e43da8f..7805477 100644 --- a/third_party/blink/renderer/core/frame/window.idl +++ b/third_party/blink/renderer/core/frame/window.idl
@@ -63,7 +63,7 @@ [CrossOrigin, Custom=Setter] attribute Window opener; [Replaceable, CrossOrigin] readonly attribute Window? parent; [CheckSecurity=ReturnValue, Custom=Getter] readonly attribute Element? frameElement; - [CallWith=Isolate, RaisesException] Window? open(optional URLString url="", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = ""); + [CallWith=Isolate, RaisesException] Window? open(optional USVString url="", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = ""); // indexed properties // https://html.spec.whatwg.org/C/browsers.html#windowproxy-getownproperty
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc index 5e2afac3..e4c3beb 100644 --- a/third_party/blink/renderer/core/html/forms/html_button_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -43,13 +43,6 @@ type_(SUBMIT), is_activated_submit_(false) {} -const AttrNameToTrustedType& HTMLButtonElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"formaction", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - void HTMLButtonElement::setType(const AtomicString& type) { setAttribute(kTypeAttr, type); }
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.h b/third_party/blink/renderer/core/html/forms/html_button_element.h index 0aaf454..ec16b1f 100644 --- a/third_party/blink/renderer/core/html/forms/html_button_element.h +++ b/third_party/blink/renderer/core/html/forms/html_button_element.h
@@ -34,8 +34,6 @@ public: explicit HTMLButtonElement(Document&); - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - void setType(const AtomicString&); const AtomicString& Value() const;
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.idl b/third_party/blink/renderer/core/html/forms/html_button_element.idl index ab21763b..b72d250 100644 --- a/third_party/blink/renderer/core/html/forms/html_button_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_button_element.idl
@@ -25,7 +25,7 @@ ] interface HTMLButtonElement : HTMLElement { [CEReactions, Reflect] attribute boolean disabled; [ImplementedAs=formOwner] readonly attribute HTMLFormElement? form; - [CEReactions, RaisesException=Setter] attribute URLString formAction; + [CEReactions] attribute USVString formAction; [CEReactions] attribute DOMString formEnctype; [CEReactions] attribute DOMString formMethod; [CEReactions, Reflect] attribute boolean formNoValidate;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc index aa18e645..acc3d40 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -24,7 +24,6 @@ #include "third_party/blink/renderer/core/html/forms/html_form_control_element.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/dom/element_traversal.h" #include "third_party/blink/renderer/core/dom/events/event.h" @@ -60,19 +59,16 @@ HTMLElement::Trace(visitor); } -void HTMLFormControlElement::formAction(USVStringOrTrustedURL& result) const { +String HTMLFormControlElement::formAction() const { const AtomicString& action = FastGetAttribute(kFormactionAttr); if (action.IsEmpty()) { - result.SetUSVString(GetDocument().Url()); - return; + return GetDocument().Url(); } - result.SetUSVString( - GetDocument().CompleteURL(StripLeadingAndTrailingHTMLSpaces(action))); + return GetDocument().CompleteURL(StripLeadingAndTrailingHTMLSpaces(action)); } -void HTMLFormControlElement::setFormAction(const USVStringOrTrustedURL& value, - ExceptionState& exception_state) { - setAttribute(kFormactionAttr, value, exception_state); +void HTMLFormControlElement::setFormAction(const AtomicString& value) { + setAttribute(kFormactionAttr, value); } String HTMLFormControlElement::formEnctype() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h index dd72657..a4f9716 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -49,8 +49,8 @@ ~HTMLFormControlElement() override; void Trace(Visitor*) override; - void formAction(USVStringOrTrustedURL&) const; - void setFormAction(const USVStringOrTrustedURL&, ExceptionState&); + String formAction() const; + void setFormAction(const AtomicString&); String formEnctype() const; void setFormEnctype(const AtomicString&); String formMethod() const;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.cc b/third_party/blink/renderer/core/html/forms/html_form_element.cc index 2340e4bc..98908f03 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_form_element.cc
@@ -32,7 +32,6 @@ #include "third_party/blink/renderer/bindings/core/v8/radio_node_list_or_element.h" #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/script_event_listener.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/dom/attribute.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element_traversal.h" @@ -98,12 +97,6 @@ HTMLElement::Trace(visitor); } -const AttrNameToTrustedType& HTMLFormElement::GetCheckedAttributeTypes() const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"action", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - bool HTMLFormElement::MatchesValidityPseudoClasses() const { return true; } @@ -723,13 +716,8 @@ return action_url.GetString(); } -void HTMLFormElement::action(USVStringOrTrustedURL& result) const { - result.SetUSVString(action()); -} - -void HTMLFormElement::setAction(const USVStringOrTrustedURL& value, - ExceptionState& exception_state) { - setAttribute(kActionAttr, value, exception_state); +void HTMLFormElement::setAction(const AtomicString& value) { + setAttribute(kActionAttr, value); } void HTMLFormElement::setEnctype(const AtomicString& value) {
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.h b/third_party/blink/renderer/core/html/forms/html_form_element.h index ae78e4f5..3375fb2 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_element.h +++ b/third_party/blink/renderer/core/html/forms/html_form_element.h
@@ -48,8 +48,6 @@ ~HTMLFormElement() override; void Trace(Visitor*) override; - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - HTMLFormControlsCollection* elements(); void GetNamedElements(const AtomicString&, HeapVector<Member<Element>>&); @@ -57,8 +55,7 @@ HTMLElement* item(unsigned index); String action() const; - void action(USVStringOrTrustedURL&) const; - void setAction(const USVStringOrTrustedURL&, ExceptionState&); + void setAction(const AtomicString&); String enctype() const { return attributes_.EncodingType(); } void setEnctype(const AtomicString&);
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.idl b/third_party/blink/renderer/core/html/forms/html_form_element.idl index 9d7b6360..4a5986bc 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_form_element.idl
@@ -26,7 +26,7 @@ OverrideBuiltins ] interface HTMLFormElement : HTMLElement { [CEReactions, Reflect=accept_charset] attribute DOMString acceptCharset; - [CEReactions, URL, RaisesException=Setter] attribute URLString action; + [CEReactions, URL] attribute USVString action; [CEReactions, Reflect, ReflectOnly=("on","off"), ReflectMissing="on", ReflectInvalid="on"] attribute DOMString autocomplete; [CEReactions, CustomElementCallbacks] attribute DOMString enctype; [CEReactions, CustomElementCallbacks] attribute DOMString encoding;
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index 107d2dc..3927456 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -141,14 +141,6 @@ TextControlElement::Trace(visitor); } -const AttrNameToTrustedType& HTMLInputElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"formaction", SpecificTrustedType::kTrustedURL}, - {"src", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - bool HTMLInputElement::HasPendingActivity() const { return ImageLoader() && ImageLoader()->HasPendingActivity(); }
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h index 0795e67..6a2ddc79 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.h +++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -59,9 +59,6 @@ ~HTMLInputElement() override; void Trace(Visitor*) override; - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - bool HasPendingActivity() const final; DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitspeechchange, kWebkitspeechchange)
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.idl b/third_party/blink/renderer/core/html/forms/html_input_element.idl index fe03008..d30385b 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.idl +++ b/third_party/blink/renderer/core/html/forms/html_input_element.idl
@@ -39,7 +39,7 @@ // The 'files' attribute is intentionally not readonly. // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22682 attribute FileList? files; - [CEReactions, RaisesException=Setter] attribute URLString formAction; + [CEReactions] attribute DOMString formAction; [CEReactions, CustomElementCallbacks] attribute DOMString formEnctype; [CEReactions, CustomElementCallbacks] attribute DOMString formMethod; [CEReactions, Reflect] attribute boolean formNoValidate; @@ -58,7 +58,7 @@ [CEReactions, Reflect] attribute boolean readOnly; [CEReactions, Reflect] attribute boolean required; [CEReactions, RaisesException=Setter, CustomElementCallbacks] attribute unsigned long size; - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute DOMString src; [CEReactions, Reflect] attribute DOMString step; [CEReactions, CustomElementCallbacks] attribute DOMString type; [CEReactions, Reflect=value, CustomElementCallbacks] attribute DOMString defaultValue;
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index a284d4bb..e9a0bc7d 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -28,7 +28,6 @@ #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_prescient_networking.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/dom/user_gesture_indicator.h" #include "third_party/blink/renderer/core/editing/editing_utilities.h" #include "third_party/blink/renderer/core/events/keyboard_event.h" @@ -47,8 +46,6 @@ #include "third_party/blink/renderer/core/loader/ping_loader.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" @@ -214,13 +211,6 @@ HTMLElement::SetActive(active); } -const AttrNameToTrustedType& HTMLAnchorElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"href", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - void HTMLAnchorElement::AttributeChanged( const AttributeModificationParams& params) { HTMLElement::AttributeChanged(params); @@ -308,11 +298,6 @@ setAttribute(kHrefAttr, value); } -void HTMLAnchorElement::setHref(const USVStringOrTrustedURL& stringOrTrustedURL, - ExceptionState& exception_state) { - setAttribute(kHrefAttr, stringOrTrustedURL, exception_state); -} - KURL HTMLAnchorElement::Url() const { return Href(); }
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.h b/third_party/blink/renderer/core/html/html_anchor_element.h index 402055f..f978027e 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.h +++ b/third_party/blink/renderer/core/html/html_anchor_element.h
@@ -58,9 +58,6 @@ kRelationNoOpener = 0x00040000, }; -class ExceptionState; -class USVStringOrTrustedURL; - class CORE_EXPORT HTMLAnchorElement : public HTMLElement, public DOMURLUtils { DEFINE_WRAPPERTYPEINFO(); @@ -69,12 +66,8 @@ HTMLAnchorElement(const QualifiedName&, Document&); ~HTMLAnchorElement() override; - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - KURL Href() const; void SetHref(const AtomicString&); - void setHref(const USVStringOrTrustedURL&, ExceptionState&); const AtomicString& GetName() const;
diff --git a/third_party/blink/renderer/core/html/html_base_element.cc b/third_party/blink/renderer/core/html/html_base_element.cc index 699ed554..e3e89b8 100644 --- a/third_party/blink/renderer/core/html/html_base_element.cc +++ b/third_party/blink/renderer/core/html/html_base_element.cc
@@ -22,13 +22,11 @@ #include "third_party/blink/renderer/core/html/html_base_element.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/dom/attribute.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h" #include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h" #include "third_party/blink/renderer/core/html_names.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" namespace blink { @@ -37,12 +35,6 @@ HTMLBaseElement::HTMLBaseElement(Document& document) : HTMLElement(kBaseTag, document) {} -const AttrNameToTrustedType& HTMLBaseElement::GetCheckedAttributeTypes() const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"href", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - void HTMLBaseElement::ParseAttribute( const AttributeModificationParams& params) { if (params.name == kHrefAttr || params.name == kTargetAttr) @@ -70,10 +62,6 @@ HTMLElement::IsURLAttribute(attribute); } -void HTMLBaseElement::href(USVStringOrTrustedURL& result) const { - result.SetUSVString(href()); -} - KURL HTMLBaseElement::href() const { // This does not use the GetURLAttribute function because that will resolve // relative to the document's base URL; base elements like this one can be @@ -98,9 +86,8 @@ return url; } -void HTMLBaseElement::setHref(const USVStringOrTrustedURL& stringOrUrl, - ExceptionState& exception_state) { - setAttribute(kHrefAttr, stringOrUrl, exception_state); +void HTMLBaseElement::setHref(const AtomicString& url_string) { + setAttribute(kHrefAttr, url_string); } } // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_base_element.h b/third_party/blink/renderer/core/html/html_base_element.h index c7a4207..e79523a 100644 --- a/third_party/blink/renderer/core/html/html_base_element.h +++ b/third_party/blink/renderer/core/html/html_base_element.h
@@ -27,21 +27,14 @@ namespace blink { -class ExceptionState; -class USVStringOrTrustedURL; - class HTMLBaseElement final : public HTMLElement { DEFINE_WRAPPERTYPEINFO(); public: explicit HTMLBaseElement(Document&); - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - KURL href() const; - void href(USVStringOrTrustedURL&) const; - void setHref(const USVStringOrTrustedURL&, ExceptionState&); + void setHref(const AtomicString&); private: bool IsURLAttribute(const Attribute&) const override;
diff --git a/third_party/blink/renderer/core/html/html_base_element.idl b/third_party/blink/renderer/core/html/html_base_element.idl index 40e2384..c9ec787 100644 --- a/third_party/blink/renderer/core/html/html_base_element.idl +++ b/third_party/blink/renderer/core/html/html_base_element.idl
@@ -22,6 +22,6 @@ Exposed=Window, HTMLConstructor ] interface HTMLBaseElement : HTMLElement { - [CEReactions, RaisesException=Setter] attribute URLString href; + [CEReactions] attribute USVString href; [CEReactions, Reflect] attribute DOMString target; };
diff --git a/third_party/blink/renderer/core/html/html_frame_element.cc b/third_party/blink/renderer/core/html/html_frame_element.cc index 16afe15..bba19e5 100644 --- a/third_party/blink/renderer/core/html/html_frame_element.cc +++ b/third_party/blink/renderer/core/html/html_frame_element.cc
@@ -38,13 +38,6 @@ frame_border_(true), frame_border_set_(false) {} -const AttrNameToTrustedType& HTMLFrameElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"src", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - bool HTMLFrameElement::LayoutObjectIsNeeded(const ComputedStyle&) const { // For compatibility, frames render even when display: none is set. return ContentFrame();
diff --git a/third_party/blink/renderer/core/html/html_frame_element.h b/third_party/blink/renderer/core/html/html_frame_element.h index 895c4a2e..f51994b 100644 --- a/third_party/blink/renderer/core/html/html_frame_element.h +++ b/third_party/blink/renderer/core/html/html_frame_element.h
@@ -37,9 +37,6 @@ public: explicit HTMLFrameElement(Document&); - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - bool HasFrameBorder() const { return frame_border_; } bool NoResize() const;
diff --git a/third_party/blink/renderer/core/html/html_frame_element.idl b/third_party/blink/renderer/core/html/html_frame_element.idl index 5a52b78..9de00a3 100644 --- a/third_party/blink/renderer/core/html/html_frame_element.idl +++ b/third_party/blink/renderer/core/html/html_frame_element.idl
@@ -26,7 +26,7 @@ ] interface HTMLFrameElement : HTMLElement { [CEReactions, Reflect] attribute DOMString name; [CEReactions, Reflect] attribute DOMString scrolling; - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; [CEReactions, Reflect] attribute DOMString frameBorder; [CEReactions, Reflect, URL] attribute USVString longDesc; [CEReactions, Reflect] attribute boolean noResize;
diff --git a/third_party/blink/renderer/core/html/html_hyperlink_element_utils.idl b/third_party/blink/renderer/core/html/html_hyperlink_element_utils.idl index e46519a9..61d0a03 100644 --- a/third_party/blink/renderer/core/html/html_hyperlink_element_utils.idl +++ b/third_party/blink/renderer/core/html/html_hyperlink_element_utils.idl
@@ -6,7 +6,7 @@ interface mixin HTMLHyperlinkElementUtils { - [CEReactions, RaisesException=Setter] stringifier attribute URLString href; + [CEReactions] stringifier attribute USVString href; readonly attribute USVString origin; [CEReactions] attribute USVString protocol;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc index ec01780..1b1443d4 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -64,8 +64,7 @@ const AttrNameToTrustedType& HTMLIFrameElement::GetCheckedAttributeTypes() const { DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"src", SpecificTrustedType::kTrustedURL}, - {"srcdoc", SpecificTrustedType::kTrustedHTML}})); + ({{"srcdoc", SpecificTrustedType::kTrustedHTML}})); return attribute_map; }
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.idl b/third_party/blink/renderer/core/html/html_iframe_element.idl index 026dd50..ef2f5e2 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.idl +++ b/third_party/blink/renderer/core/html/html_iframe_element.idl
@@ -20,14 +20,14 @@ // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#htmliframeelement -// The `HTMLString` and `URLString` references below are from Trusted Types: +// The `HTMLString` references below are from Trusted Types: // https://github.com/WICG/trusted-types/, which is still WIP. // https://crbug.com/739170. [ Exposed=Window, HTMLConstructor ] interface HTMLIFrameElement : HTMLElement { - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; [CEReactions, Reflect, RaisesException=Setter] attribute HTMLString srcdoc; [CEReactions, Reflect] attribute DOMString name; [PutForwards=value] readonly attribute DOMTokenList sandbox;
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc index f706e20b..fb6ce59 100644 --- a/third_party/blink/renderer/core/html/html_image_element.cc +++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -62,7 +62,6 @@ #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/style/content_data.h" #include "third_party/blink/renderer/core/svg/graphics/svg_image_for_container.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/network/mime/content_type.h" #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -126,13 +125,6 @@ HTMLElement::Trace(visitor); } -const AttrNameToTrustedType& HTMLImageElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"src", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - void HTMLImageElement::NotifyViewportChanged() { // Re-selecting the source URL in order to pick a more fitting resource // And update the image's intrinsic dimensions when the viewport changes. @@ -626,9 +618,9 @@ } void HTMLImageElement::DidMoveToNewDocument(Document& old_document) { - SelectSourceURL(ImageLoader::kUpdateIgnorePreviousError); GetImageLoader().ElementDidMoveToNewDocument(); HTMLElement::DidMoveToNewDocument(old_document); + SelectSourceURL(ImageLoader::kUpdateIgnorePreviousError); } bool HTMLImageElement::IsServerMap() const {
diff --git a/third_party/blink/renderer/core/html/html_image_element.h b/third_party/blink/renderer/core/html/html_image_element.h index 0ae4d630..83876cf0 100644 --- a/third_party/blink/renderer/core/html/html_image_element.h +++ b/third_party/blink/renderer/core/html/html_image_element.h
@@ -58,9 +58,6 @@ public: class ViewportChangeListener; - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - static HTMLImageElement* CreateForJSConstructor(Document&); static HTMLImageElement* CreateForJSConstructor(Document&, unsigned width); static HTMLImageElement* CreateForJSConstructor(Document&,
diff --git a/third_party/blink/renderer/core/html/html_image_element.idl b/third_party/blink/renderer/core/html/html_image_element.idl index 5a1efad..794e413 100644 --- a/third_party/blink/renderer/core/html/html_image_element.idl +++ b/third_party/blink/renderer/core/html/html_image_element.idl
@@ -28,7 +28,7 @@ NamedConstructor=Image(optional unsigned long width, optional unsigned long height) ] interface HTMLImageElement : HTMLElement { [CEReactions, Reflect] attribute DOMString alt; - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; [CEReactions, Reflect] attribute DOMString srcset; [CEReactions, Reflect] attribute DOMString sizes; [CEReactions, Reflect, ReflectOnly=("anonymous","use-credentials"), ReflectEmpty="anonymous", ReflectInvalid="anonymous"] attribute DOMString? crossOrigin;
diff --git a/third_party/blink/renderer/core/html/html_link_element.cc b/third_party/blink/renderer/core/html/html_link_element.cc index a5239718..88c893f 100644 --- a/third_party/blink/renderer/core/html/html_link_element.cc +++ b/third_party/blink/renderer/core/html/html_link_element.cc
@@ -64,12 +64,6 @@ HTMLLinkElement::~HTMLLinkElement() = default; -const AttrNameToTrustedType& HTMLLinkElement::GetCheckedAttributeTypes() const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"href", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - void HTMLLinkElement::ParseAttribute( const AttributeModificationParams& params) { const QualifiedName& name = params.name;
diff --git a/third_party/blink/renderer/core/html/html_link_element.h b/third_party/blink/renderer/core/html/html_link_element.h index 480e26e..fc24de7 100644 --- a/third_party/blink/renderer/core/html/html_link_element.h +++ b/third_party/blink/renderer/core/html/html_link_element.h
@@ -55,9 +55,6 @@ HTMLLinkElement(Document&, const CreateElementFlags); ~HTMLLinkElement() override; - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - KURL Href() const; const AtomicString& Rel() const; String Media() const { return media_; }
diff --git a/third_party/blink/renderer/core/html/html_link_element.idl b/third_party/blink/renderer/core/html/html_link_element.idl index c2841765..f890890 100644 --- a/third_party/blink/renderer/core/html/html_link_element.idl +++ b/third_party/blink/renderer/core/html/html_link_element.idl
@@ -27,7 +27,7 @@ // FIXME: The disabled attribute has been removed from the spec: // https://www.w3.org/Bugs/Public/show_bug.cgi?id=14703 [Reflect, Measure] attribute boolean disabled; - [Reflect, URL, RaisesException=Setter] attribute URLString href; + [Reflect, URL] attribute USVString href; [CEReactions, Reflect, ReflectOnly=("anonymous","use-credentials"), ReflectEmpty="anonymous", ReflectInvalid="anonymous"] attribute DOMString? crossOrigin; [CEReactions, Reflect] attribute DOMString rel; [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
diff --git a/third_party/blink/renderer/core/html/html_source_element.cc b/third_party/blink/renderer/core/html/html_source_element.cc index ff29f8c..a8739e5 100644 --- a/third_party/blink/renderer/core/html/html_source_element.cc +++ b/third_party/blink/renderer/core/html/html_source_element.cc
@@ -34,7 +34,6 @@ #include "third_party/blink/renderer/core/html/html_picture_element.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h" #include "third_party/blink/renderer/core/html_names.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #define SOURCE_LOG_LEVEL 3 @@ -69,13 +68,6 @@ HTMLSourceElement::~HTMLSourceElement() = default; -const AttrNameToTrustedType& HTMLSourceElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"src", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - void HTMLSourceElement::CreateMediaQueryList(const AtomicString& media) { RemoveMediaQueryListListener(); if (media.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/html/html_source_element.h b/third_party/blink/renderer/core/html/html_source_element.h index e606983..578e2ee 100644 --- a/third_party/blink/renderer/core/html/html_source_element.h +++ b/third_party/blink/renderer/core/html/html_source_element.h
@@ -42,9 +42,6 @@ explicit HTMLSourceElement(Document&); ~HTMLSourceElement() override; - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - const AtomicString& type() const; void setType(const AtomicString&);
diff --git a/third_party/blink/renderer/core/html/html_source_element.idl b/third_party/blink/renderer/core/html/html_source_element.idl index 6ab643a..1e122bb 100644 --- a/third_party/blink/renderer/core/html/html_source_element.idl +++ b/third_party/blink/renderer/core/html/html_source_element.idl
@@ -28,7 +28,7 @@ Exposed=Window, HTMLConstructor ] interface HTMLSourceElement : HTMLElement { - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; [CEReactions] attribute DOMString type; // https://html.spec.whatwg.org/C/#the-source-element-when-used-with-the-picture-element
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index c513a75..89690a3 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -415,13 +415,6 @@ return result; } -const AttrNameToTrustedType& HTMLMediaElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"src", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - bool HTMLMediaElement::IsHLSURL(const KURL& url) { // Keep the same logic as in media_codec_util.h. if (url.IsNull() || url.IsEmpty()) @@ -786,11 +779,6 @@ setAttribute(kSrcAttr, url); } -void HTMLMediaElement::SetSrc(const USVStringOrTrustedURL& stringOrURL, - ExceptionState& exception_state) { - setAttribute(kSrcAttr, stringOrURL, exception_state); -} - void HTMLMediaElement::SetSrcObject(MediaStreamDescriptor* src_object) { DVLOG(1) << "setSrcObject(" << (void*)this << ")"; src_object_ = src_object;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h index d84c16a08..ae90be44 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.h +++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -93,9 +93,6 @@ USING_PRE_FINALIZER(HTMLMediaElement, Dispose); public: - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - bool IsMediaElement() const override { return true; } static MIMETypeRegistry::SupportsType GetSupportsType(const ContentType&); @@ -142,7 +139,6 @@ // network state void SetSrc(const AtomicString&); - void SetSrc(const USVStringOrTrustedURL&, ExceptionState&); const KURL& currentSrc() const { return current_src_; } // Return the URL to be used for downloading the media.
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.idl b/third_party/blink/renderer/core/html/media/html_media_element.idl index af598785..1cb595f5 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.idl +++ b/third_party/blink/renderer/core/html/media/html_media_element.idl
@@ -36,7 +36,7 @@ readonly attribute MediaError? error; // network state - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; // FIXME: attribute MediaProvider? srcObject; crbug.com/387740 readonly attribute DOMString currentSrc; [CEReactions, Reflect, ReflectOnly=("anonymous","use-credentials"), ReflectEmpty="anonymous", ReflectInvalid="anonymous"] attribute DOMString? crossOrigin;
diff --git a/third_party/blink/renderer/core/html/portal/html_portal_element.idl b/third_party/blink/renderer/core/html/portal/html_portal_element.idl index e0d56846..5c2ba00 100644 --- a/third_party/blink/renderer/core/html/portal/html_portal_element.idl +++ b/third_party/blink/renderer/core/html/portal/html_portal_element.idl
@@ -6,7 +6,7 @@ [Exposed=Window, HTMLConstructor, RuntimeEnabled=Portals] interface HTMLPortalElement : HTMLElement { - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; [CEReactions, Reflect, ReflectOnly=("","no-referrer","origin","no-referrer-when-downgrade","origin-when-cross-origin","unsafe-url"), ReflectMissing="", ReflectInvalid=""] attribute DOMString referrerPolicy; [CallWith=ScriptState, RaisesException] Promise<void> activate(optional PortalActivateOptions options);
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.cc b/third_party/blink/renderer/core/html/track/html_track_element.cc index 36fb6fc..f31f4b3 100644 --- a/third_party/blink/renderer/core/html/track/html_track_element.cc +++ b/third_party/blink/renderer/core/html/track/html_track_element.cc
@@ -60,13 +60,6 @@ HTMLTrackElement::~HTMLTrackElement() = default; -const AttrNameToTrustedType& HTMLTrackElement::GetCheckedAttributeTypes() - const { - DEFINE_STATIC_LOCAL(AttrNameToTrustedType, attribute_map, - ({{"src", SpecificTrustedType::kTrustedURL}})); - return attribute_map; -} - Node::InsertionNotificationRequest HTMLTrackElement::InsertedInto( ContainerNode& insertion_point) { DVLOG(TRACK_LOG_LEVEL) << "insertedInto";
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.h b/third_party/blink/renderer/core/html/track/html_track_element.h index e63090ead..4e66620 100644 --- a/third_party/blink/renderer/core/html/track/html_track_element.h +++ b/third_party/blink/renderer/core/html/track/html_track_element.h
@@ -44,9 +44,6 @@ public: explicit HTMLTrackElement(Document&); - // Returns attributes that should be checked against Trusted Types - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - const AtomicString& kind(); void setKind(const AtomicString&);
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.idl b/third_party/blink/renderer/core/html/track/html_track_element.idl index a6d3296..ff4c807dc 100644 --- a/third_party/blink/renderer/core/html/track/html_track_element.idl +++ b/third_party/blink/renderer/core/html/track/html_track_element.idl
@@ -30,7 +30,7 @@ HTMLConstructor ] interface HTMLTrackElement : HTMLElement { [CEReactions] attribute DOMString kind; - [CEReactions, Reflect, URL, RaisesException=Setter] attribute URLString src; + [CEReactions, Reflect, URL] attribute USVString src; [CEReactions, Reflect] attribute DOMString srclang; [CEReactions, Reflect] attribute DOMString label; [CEReactions, Reflect] attribute boolean default;
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.cc b/third_party/blink/renderer/core/layout/layout_embedded_content.cc index 523a69a..859d85d 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.cc
@@ -41,7 +41,7 @@ namespace blink { -LayoutEmbeddedContent::LayoutEmbeddedContent(Element* element) +LayoutEmbeddedContent::LayoutEmbeddedContent(HTMLFrameOwnerElement* element) : LayoutReplaced(element), // Reference counting is used to prevent the part from being destroyed // while inside the EmbeddedContentView code, which might not be able to @@ -62,7 +62,7 @@ cache->Remove(this); } - if (auto* frame_owner = DynamicTo<HTMLFrameOwnerElement>(GetNode())) + if (auto* frame_owner = GetFrameOwnerElement()) frame_owner->SetEmbeddedContentView(nullptr); LayoutReplaced::WillBeDestroyed(); @@ -77,7 +77,7 @@ // Release()). // // But, we've told the system we've destroyed the layoutObject, which happens - // when the DOM node is destroyed. So there is a good change the DOM node this + // when the DOM node is destroyed. So there is a good chance the DOM node this // object points too is invalid, so we have to clear the node so we make sure // we don't access it in the future. ClearNode(); @@ -100,8 +100,8 @@ } EmbeddedContentView* LayoutEmbeddedContent::GetEmbeddedContentView() const { - if (auto* frame_owner_element = DynamicTo<HTMLFrameOwnerElement>(GetNode())) - return frame_owner_element->OwnedEmbeddedContentView(); + if (auto* frame_owner = GetFrameOwnerElement()) + return frame_owner->OwnedEmbeddedContentView(); return nullptr; } @@ -124,7 +124,7 @@ if (plugin_view && plugin_view->CcLayer()) return true; - auto* element = DynamicTo<HTMLFrameOwnerElement>(GetNode()); + auto* element = GetFrameOwnerElement(); if (!element) return false; @@ -268,7 +268,7 @@ return; } - auto* frame_owner = DynamicTo<HTMLFrameOwnerElement>(GetNode()); + auto* frame_owner = GetFrameOwnerElement(); if (!frame_owner) return;
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.h b/third_party/blink/renderer/core/layout/layout_embedded_content.h index 1869147..cde0a2f0 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.h +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.h
@@ -24,6 +24,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_EMBEDDED_CONTENT_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/html/html_frame_owner_element.h" #include "third_party/blink/renderer/core/layout/layout_replaced.h" namespace blink { @@ -36,7 +37,7 @@ // LayoutEmbeddedObject. class CORE_EXPORT LayoutEmbeddedContent : public LayoutReplaced { public: - explicit LayoutEmbeddedContent(Element*); + explicit LayoutEmbeddedContent(HTMLFrameOwnerElement*); ~LayoutEmbeddedContent() override; bool RequiresAcceleratedCompositing() const; @@ -90,6 +91,10 @@ const PhysicalOffset& accumulated_offset, HitTestAction); + HTMLFrameOwnerElement* GetFrameOwnerElement() const { + return To<HTMLFrameOwnerElement>(GetNode()); + } + int ref_count_; };
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content_test.cc b/third_party/blink/renderer/core/layout/layout_embedded_content_test.cc index 0cfa748..4a0d2c0 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content_test.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_content_test.cc
@@ -14,7 +14,7 @@ class OverriddenLayoutEmbeddedContent : public LayoutEmbeddedContent { public: - explicit OverriddenLayoutEmbeddedContent(Element* element) + explicit OverriddenLayoutEmbeddedContent(HTMLFrameOwnerElement* element) : LayoutEmbeddedContent(element) {} const char* GetName() const override {
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_object.cc b/third_party/blink/renderer/core/layout/layout_embedded_object.cc index 6c95dd6..dc65bd1 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_object.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_object.cc
@@ -39,7 +39,7 @@ namespace blink { -LayoutEmbeddedObject::LayoutEmbeddedObject(Element* element) +LayoutEmbeddedObject::LayoutEmbeddedObject(HTMLFrameOwnerElement* element) : LayoutEmbeddedContent(element) { View()->GetFrameView()->SetIsVisuallyNonEmpty(); }
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_object.h b/third_party/blink/renderer/core/layout/layout_embedded_object.h index 31657ba..8aa0c87 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_object.h +++ b/third_party/blink/renderer/core/layout/layout_embedded_object.h
@@ -32,7 +32,7 @@ // plugins. For example, <embed src="foo.html"> does not invoke a plugin. class LayoutEmbeddedObject final : public LayoutEmbeddedContent { public: - LayoutEmbeddedObject(Element*); + LayoutEmbeddedObject(HTMLFrameOwnerElement*); ~LayoutEmbeddedObject() override; enum PluginAvailability {
diff --git a/third_party/blink/renderer/core/layout/layout_iframe.cc b/third_party/blink/renderer/core/layout/layout_iframe.cc index 16d4025..5717da3 100644 --- a/third_party/blink/renderer/core/layout/layout_iframe.cc +++ b/third_party/blink/renderer/core/layout/layout_iframe.cc
@@ -30,7 +30,8 @@ namespace blink { -LayoutIFrame::LayoutIFrame(Element* element) : LayoutEmbeddedContent(element) {} +LayoutIFrame::LayoutIFrame(HTMLFrameOwnerElement* element) + : LayoutEmbeddedContent(element) {} bool LayoutIFrame::ShouldComputeSizeAsReplaced() const { return true;
diff --git a/third_party/blink/renderer/core/layout/layout_iframe.h b/third_party/blink/renderer/core/layout/layout_iframe.h index 33904fe..eab361c 100644 --- a/third_party/blink/renderer/core/layout/layout_iframe.h +++ b/third_party/blink/renderer/core/layout/layout_iframe.h
@@ -32,7 +32,7 @@ class LayoutIFrame final : public LayoutEmbeddedContent { public: - explicit LayoutIFrame(Element*); + explicit LayoutIFrame(HTMLFrameOwnerElement*); const char* GetName() const override { return "LayoutIFrame"; }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc index 1be2597..a30f40c 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
@@ -80,11 +80,17 @@ const NGPhysicalBoxFragment& box = To<NGPhysicalBoxFragment>(child.layout_result->PhysicalFragment()); if (child.children_count <= 1) { + // Compute |has_floating_descendants_| to optimize tree traversal in + // paint. + if (!has_floating_descendants_ && box.IsFloating()) + has_floating_descendants_ = true; + items_.push_back(std::make_unique<NGFragmentItem>(box, 1)); offsets_.push_back(child.offset); ++child_iter; continue; } + DCHECK(!box.IsFloating()); // Children of inline boxes are flattened and added to |items_|, with the // count of descendant items to preserve the tree structure.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h index 7141f3fc..b0265f1832 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h
@@ -25,6 +25,9 @@ public: NGFragmentItemsBuilder(NGBoxFragmentBuilder* box_builder) {} + // Returns true if we have any floating descendants. + bool HasFloatingDescendants() const { return has_floating_descendants_; } + const String& TextContent(bool first_line) const { return UNLIKELY(first_line && first_line_text_content_) ? first_line_text_content_ @@ -75,6 +78,8 @@ // Keeps children of a line until the offset is determined. See |AddLine|. ChildList current_line_; + bool has_floating_descendants_ = false; + #if DCHECK_IS_ON() const NGPhysicalLineBoxFragment* current_line_fragment_ = nullptr; bool is_converted_to_physical_ = false;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc index 3757f8f..6ca6a60 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
@@ -227,6 +227,9 @@ } } + if (!has_floating_descendants_ && items_builder_) + has_floating_descendants_ = items_builder_->HasFloatingDescendants(); + scoped_refptr<const NGPhysicalBoxFragment> fragment = NGPhysicalBoxFragment::Create(this, block_or_line_writing_mode); fragment->CheckType();
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index a5e7afe..1b050b0 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -926,6 +926,9 @@ DCHECK(!IsReloadLoadType(frame_load_type)); DCHECK(frame_->GetDocument()); + if (Page* page = frame_->GetPage()) + page->HistoryNavigationVirtualTimePauser().UnpauseVirtualTime(); + if (!frame_->IsNavigationAllowed()) return mojom::CommitResult::Aborted;
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc index 0f57ce5..8d19bd7 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.cc +++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -1120,6 +1120,10 @@ // TODO(dgozman): make DidCreateScriptContext notification call currently // triggered by installing new document happen here, after commit. } + if (document_loader_->LoadType() == WebFrameLoadType::kBackForward) { + if (Page* page = frame_->GetPage()) + page->HistoryNavigationVirtualTimePauser().UnpauseVirtualTime(); + } // Load the document if needed. document_loader_->StartLoadingResponse();
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc index c5a1faae..53bcdbe 100644 --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc
@@ -918,6 +918,10 @@ page_scheduler_ = std::move(page_scheduler); // The scheduler should be set before the main frame. DCHECK(!main_frame_); + history_navigation_virtual_time_pauser_ = + page_scheduler_->CreateWebScopedVirtualTimePauser( + "HistoryNavigation", + WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant); } bool Page::IsOrdinary() const {
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h index e4a4c367..e2106445 100644 --- a/third_party/blink/renderer/core/page/page.h +++ b/third_party/blink/renderer/core/page/page.h
@@ -26,6 +26,7 @@ #include <memory> #include "base/macros.h" +#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/public/platform/web_text_autosizer_page_info.h" #include "third_party/blink/public/web/web_window_features.h" #include "third_party/blink/renderer/core/core_export.h" @@ -335,6 +336,10 @@ } void ClearMediaFeatureOverrides(); + WebScopedVirtualTimePauser& HistoryNavigationVirtualTimePauser() { + return history_navigation_virtual_time_pauser_; + } + private: friend class ScopedPagePauser; @@ -445,6 +450,8 @@ WebTextAutosizerPageInfo web_text_autosizer_page_info_; + WebScopedVirtualTimePauser history_navigation_virtual_time_pauser_; + DISALLOW_COPY_AND_ASSIGN(Page); };
diff --git a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc index 28b4377..6a35ba8 100644 --- a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc +++ b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.cc
@@ -34,8 +34,7 @@ } // namespace ElementFragmentAnchor* ElementFragmentAnchor::TryCreate(const KURL& url, - LocalFrame& frame, - bool should_scroll) { + LocalFrame& frame) { DCHECK(frame.GetDocument()); Document& doc = *frame.GetDocument(); @@ -84,10 +83,6 @@ if (!anchor_node) return nullptr; - // Element fragment anchors only need to be kept alive if they need scrolling. - if (!should_scroll) - return nullptr; - return MakeGarbageCollected<ElementFragmentAnchor>(*anchor_node, frame); }
diff --git a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h index f51ce60..bef1028 100644 --- a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h
@@ -29,9 +29,7 @@ // Parses the URL fragment and, if possible, creates and returns a fragment // based on an Element in the page. Returns nullptr otherwise. Produces side // effects related to fragment targeting in the page in either case. - static ElementFragmentAnchor* TryCreate(const KURL& url, - LocalFrame& frame, - bool should_scroll); + static ElementFragmentAnchor* TryCreate(const KURL& url, LocalFrame& frame); ElementFragmentAnchor(Node& anchor_node, LocalFrame& frame); ~ElementFragmentAnchor() override = default;
diff --git a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc index db3ebbc..850f81d 100644 --- a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc +++ b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
@@ -15,8 +15,7 @@ FragmentAnchor* FragmentAnchor::TryCreate(const KURL& url, LocalFrame& frame, - bool same_document_navigation, - bool should_scroll) { + bool same_document_navigation) { DCHECK(frame.GetDocument()); FragmentAnchor* anchor = nullptr; @@ -29,7 +28,7 @@ bool text_fragment_anchor_created = false; if (text_fragment_identifiers_enabled) { anchor = TextFragmentAnchor::TryCreateFragmentDirective( - url, frame, same_document_navigation, should_scroll); + url, frame, same_document_navigation); text_fragment_anchor_created = anchor; } @@ -61,7 +60,7 @@ bool element_id_anchor_found = false; if (!anchor) { - anchor = ElementFragmentAnchor::TryCreate(url, frame, should_scroll); + anchor = ElementFragmentAnchor::TryCreate(url, frame); element_id_anchor_found = anchor; }
diff --git a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h index 7550d56..011da8b5 100644 --- a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.h
@@ -32,8 +32,7 @@ // will be performed, for example, setting/clearing :target and svgView(). static FragmentAnchor* TryCreate(const KURL& url, LocalFrame& frame, - bool same_document_navigation, - bool should_scroll); + bool same_document_navigation); FragmentAnchor() = default; virtual ~FragmentAnchor() = default;
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc index 3d8b5cc..451a3f4 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.cc
@@ -77,8 +77,7 @@ TextFragmentAnchor* TextFragmentAnchor::TryCreateFragmentDirective( const KURL& url, LocalFrame& frame, - bool same_document_navigation, - bool should_scroll) { + bool same_document_navigation) { DCHECK(RuntimeEnabledFeatures::TextFragmentIdentifiersEnabled( frame.GetDocument())); @@ -97,16 +96,13 @@ return nullptr; } - return MakeGarbageCollected<TextFragmentAnchor>(selectors, frame, - should_scroll); + return MakeGarbageCollected<TextFragmentAnchor>(selectors, frame); } TextFragmentAnchor::TextFragmentAnchor( const Vector<TextFragmentSelector>& text_fragment_selectors, - LocalFrame& frame, - bool should_scroll) + LocalFrame& frame) : frame_(&frame), - should_scroll_(should_scroll), metrics_(MakeGarbageCollected<TextFragmentAnchorMetrics>( frame_->GetDocument())) { DCHECK(!text_fragment_selectors.IsEmpty()); @@ -138,7 +134,7 @@ if (user_scrolled_ && !did_scroll_into_view_) metrics_->ScrollCancelled(); - first_match_needs_scroll_ = should_scroll_ && !user_scrolled_; + first_match_needs_scroll_ = !user_scrolled_; { // FindMatch might cause scrolling and set user_scrolled_ so reset it when @@ -267,8 +263,8 @@ dismissed_ = true; DCHECK(!element_fragment_anchor_); - element_fragment_anchor_ = ElementFragmentAnchor::TryCreate( - frame_->GetDocument()->Url(), *frame_, should_scroll_); + element_fragment_anchor_ = + ElementFragmentAnchor::TryCreate(frame_->GetDocument()->Url(), *frame_); if (element_fragment_anchor_) { // Schedule a frame so we can invoke the element anchor in // PerformPreRafActions. @@ -288,7 +284,7 @@ if (!did_find_match_ || dismissed_) return true; - DCHECK(!should_scroll_ || did_scroll_into_view_ || user_scrolled_); + DCHECK(did_scroll_into_view_ || user_scrolled_); frame_->GetDocument()->Markers().RemoveMarkersOfTypes( DocumentMarker::MarkerTypes::TextFragment());
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h index 27d3da5..7bcef31 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h
@@ -36,13 +36,11 @@ static TextFragmentAnchor* TryCreateFragmentDirective( const KURL& url, LocalFrame& frame, - bool same_document_navigation, - bool should_scroll); + bool same_document_navigation); TextFragmentAnchor( const Vector<TextFragmentSelector>& text_fragment_selectors, - LocalFrame& frame, - bool should_scroll); + LocalFrame& frame); ~TextFragmentAnchor() override = default; bool Invoke() override; @@ -91,10 +89,6 @@ // Whether the text fragment anchor has been dismissed yet. This should be // kept alive until dismissed so we can remove text highlighting. bool dismissed_ = false; - // Whether we should scroll the anchor into view. This will be false for - // history navigations and reloads, where we want to restore the highlight but - // not scroll into view again. - bool should_scroll_ = false; Member<TextFragmentAnchorMetrics> metrics_;
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc index dbc344b..3f1cac04 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
@@ -5,14 +5,12 @@ #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/editing/markers/document_marker_controller.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/location.h" -#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" #include "third_party/blink/renderer/core/input/event_handler.h" @@ -21,7 +19,6 @@ #include "third_party/blink/renderer/core/scroll/scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" namespace blink { @@ -900,10 +897,9 @@ ScriptState* script_state = ToScriptStateForMainWorld(main_window->GetFrame()); ScriptState::Scope entered_context_scope(script_state); - auto url = USVStringOrTrustedURL::FromTrustedURL( - MakeGarbageCollected<TrustedURL>(destination)); - LocalDOMWindow* child_window = To<LocalDOMWindow>(main_window->open( - script_state->GetIsolate(), url, "frame1", "", ASSERT_NO_EXCEPTION)); + LocalDOMWindow* child_window = To<LocalDOMWindow>( + main_window->open(script_state->GetIsolate(), destination, "frame1", "", + ASSERT_NO_EXCEPTION)); ASSERT_TRUE(child_window); RunPendingTasks(); @@ -1546,46 +1542,6 @@ EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); } -// Ensure we restore the text highlight on page reload -TEST_F(TextFragmentAnchorTest, HighlightOnReload) { - SimRequest request("https://example.com/test.html#:~:text=test", "text/html"); - LoadURL("https://example.com/test.html#:~:text=test"); - const String& html = R"HTML( - <!DOCTYPE html> - <style> - body { - height: 1200px; - } - p { - position: absolute; - top: 1000px; - } - </style> - <p id="text">This is a test page</p> - )HTML"; - request.Complete(html); - - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); - - EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); - - // Tap to dismiss the highlight. - SimulateClick(10, 10); - EXPECT_EQ(0u, GetDocument().Markers().Markers().size()); - - // Reload the page and expect the highlight to be restored. - SimRequest reload_request("https://example.com/test.html#:~:text=test", - "text/html"); - MainFrame().StartReload(WebFrameLoadType::kReload); - reload_request.Complete(html); - - Compositor().BeginFrame(); - RunAsyncMatchingTasks(); - - EXPECT_EQ(1u, GetDocument().Markers().Markers().size()); -} - } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index bccf48421..c5825ef 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -504,6 +504,27 @@ } } +void NGBoxFragmentPainter::PaintFloatingItems(const PaintInfo& paint_info) { + DCHECK(items_); + DCHECK(PhysicalFragment().HasFloatingDescendants()); + + for (const std::unique_ptr<NGFragmentItem>& item : items_->Items()) { + const NGPhysicalBoxFragment* child_fragment = item->BoxFragment(); + if (!child_fragment || child_fragment->HasSelfPaintingLayer() || + !child_fragment->IsFloating()) + continue; + // TODO(kojii): The float is outside of the inline formatting context and + // that it maybe another NG inline formatting context, NG block layout, or + // legacy. NGBoxFragmentPainter can handle only the first case. In order + // to cover more tests for other two cases, we always fallback to legacy, + // which will forward back to NGBoxFragmentPainter if the float is for + // NGBoxFragmentPainter. We can shortcut this for the first case when + // we're more stable. + ObjectPainter(*child_fragment->GetLayoutObject()) + .PaintAllPhasesAtomically(paint_info); + } +} + void NGBoxFragmentPainter::PaintBlockFloatingChildren( const NGPhysicalContainerFragment& container, const PaintInfo& paint_info) { @@ -540,6 +561,10 @@ PaintInlineFloatingChildren(paint_fragment_->Children(), float_paint_info); return; } + if (items_) { + PaintFloatingItems(float_paint_info); + return; + } PaintBlockFloatingChildren(PhysicalFragment(), float_paint_info); }
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h index 9e71632..3eca53d2 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
@@ -110,6 +110,7 @@ const PhysicalOffset& paint_offset); void PaintInlineFloatingChildren(NGPaintFragment::ChildList, const PaintInfo&); + void PaintFloatingItems(const PaintInfo&); void PaintBlockFloatingChildren(const NGPhysicalContainerFragment&, const PaintInfo&); void PaintFloats(const PaintInfo&);
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 51b5d4ec..d3250ac 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -78,17 +78,6 @@ // https://code.google.com/p/chromium/issues/detail?id=343772 DisableCompositingQueryAsserts disabler; - if (paint_layer_.GetCompositingState() != kNotComposited) { - if (painting_info.GetGlobalPaintFlags() & - kGlobalPaintFlattenCompositingLayers) { - // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? That's - // for printing and drag-image. - // FIXME: why isn't the code here global, as opposed to being set on each - // paint() call? - paint_flags |= kPaintLayerUncachedClipRects; - } - } - // Non self-painting layers without self-painting descendants don't need to be // painted as their layoutObject() should properly paint itself. if (!paint_layer_.IsSelfPaintingLayer() && @@ -146,8 +135,8 @@ if (painting_info.GetGlobalPaintFlags() & kGlobalPaintFlattenCompositingLayers) return false; - if (paint_flags & (kPaintLayerPaintingOverlayOverflowControls | - kPaintLayerUncachedClipRects)) + + if (paint_flags & kPaintLayerPaintingOverlayOverflowControls) return false; return true;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painting_info.h b/third_party/blink/renderer/core/paint/paint_layer_painting_info.h index 75dbb3da..397525f 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painting_info.h +++ b/third_party/blink/renderer/core/paint/paint_layer_painting_info.h
@@ -63,7 +63,6 @@ enum PaintLayerFlag { kPaintLayerNoFlag = 0, kPaintLayerHaveTransparency = 1, - kPaintLayerUncachedClipRects = 1 << 2, kPaintLayerPaintingOverlayOverflowControls = 1 << 3, kPaintLayerPaintingCompositingBackgroundPhase = 1 << 4, kPaintLayerPaintingCompositingForegroundPhase = 1 << 5, @@ -137,8 +136,6 @@ if (flags & kPaintLayerHaveTransparency) append("kPaintLayerHaveTransparency"); - if (flags & kPaintLayerUncachedClipRects) - append("kPaintLayerUncachedClipRects"); if (flags & kPaintLayerPaintingOverlayOverflowControls) append("kPaintLayerPaintingOverlayOverflowControls"); if (flags & kPaintLayerPaintingCompositingScrollingPhase)
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc index d21c530d..314bd14 100644 --- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc +++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -1264,10 +1264,6 @@ is_scheduled_ = true; } -const AttrNameToTrustedType& SVGSMILElement::GetCheckedAttributeTypes() const { - return SVGURIReference::GetCheckedAttributeTypes(); -} - void SVGSMILElement::Trace(blink::Visitor* visitor) { visitor->Trace(target_element_); visitor->Trace(target_id_observer_);
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h index 11ea52a4..dbf83e6 100644 --- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h +++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
@@ -124,8 +124,6 @@ virtual bool IsSVGDiscardElement() const { return false; } - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override; - void Trace(blink::Visitor*) override; protected:
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.h b/third_party/blink/renderer/core/svg/svg_a_element.h index 19cfd753..0302bca 100644 --- a/third_party/blink/renderer/core/svg/svg_a_element.h +++ b/third_party/blink/renderer/core/svg/svg_a_element.h
@@ -38,10 +38,6 @@ explicit SVGAElement(Document&); - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Trace(blink::Visitor*) override; private:
diff --git a/third_party/blink/renderer/core/svg/svg_fe_image_element.h b/third_party/blink/renderer/core/svg/svg_fe_image_element.h index a2991133..9d38de5e 100644 --- a/third_party/blink/renderer/core/svg/svg_fe_image_element.h +++ b/third_party/blink/renderer/core/svg/svg_fe_image_element.h
@@ -48,10 +48,6 @@ return preserve_aspect_ratio_.Get(); } - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Dispose(); void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/core/svg/svg_filter_element.h b/third_party/blink/renderer/core/svg/svg_filter_element.h index 46c123b..02c1c25 100644 --- a/third_party/blink/renderer/core/svg/svg_filter_element.h +++ b/third_party/blink/renderer/core/svg/svg_filter_element.h
@@ -68,10 +68,6 @@ // Get the associated SVGResource object, if any. LocalSVGResource* AssociatedResource() const; - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - private: void SvgAttributeChanged(const QualifiedName&) override; void ChildrenChanged(const ChildrenChange&) override;
diff --git a/third_party/blink/renderer/core/svg/svg_gradient_element.h b/third_party/blink/renderer/core/svg/svg_gradient_element.h index ba5f6ee..bd9f7a3 100644 --- a/third_party/blink/renderer/core/svg/svg_gradient_element.h +++ b/third_party/blink/renderer/core/svg/svg_gradient_element.h
@@ -64,10 +64,6 @@ const SVGGradientElement* ReferencedElement() const; void CollectCommonAttributes(GradientAttributes&) const; - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Trace(blink::Visitor*) override; protected:
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.cc b/third_party/blink/renderer/core/svg/svg_image_element.cc index ca72c64..2cf3d02 100644 --- a/third_party/blink/renderer/core/svg/svg_image_element.cc +++ b/third_party/blink/renderer/core/svg/svg_image_element.cc
@@ -223,9 +223,9 @@ } void SVGImageElement::DidMoveToNewDocument(Document& old_document) { - GetImageLoader().UpdateFromElement(ImageLoader::kUpdateIgnorePreviousError); GetImageLoader().ElementDidMoveToNewDocument(); SVGGraphicsElement::DidMoveToNewDocument(old_document); + GetImageLoader().UpdateFromElement(ImageLoader::kUpdateIgnorePreviousError); } } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.h b/third_party/blink/renderer/core/svg/svg_image_element.h index b5e3a36..7c7c3ee0 100644 --- a/third_party/blink/renderer/core/svg/svg_image_element.h +++ b/third_party/blink/renderer/core/svg/svg_image_element.h
@@ -78,10 +78,6 @@ GetImageLoader().SetImageForTest(content); } - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - private: bool IsStructurallyExternal() const override { return !HrefString().IsNull();
diff --git a/third_party/blink/renderer/core/svg/svg_mpath_element.h b/third_party/blink/renderer/core/svg/svg_mpath_element.h index 59e2871..ee6fa88 100644 --- a/third_party/blink/renderer/core/svg/svg_mpath_element.h +++ b/third_party/blink/renderer/core/svg/svg_mpath_element.h
@@ -39,10 +39,6 @@ void TargetPathChanged(); - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Trace(blink::Visitor*) override; private:
diff --git a/third_party/blink/renderer/core/svg/svg_pattern_element.h b/third_party/blink/renderer/core/svg/svg_pattern_element.h index 1a4e2cbf..45b7af1 100644 --- a/third_party/blink/renderer/core/svg/svg_pattern_element.h +++ b/third_party/blink/renderer/core/svg/svg_pattern_element.h
@@ -80,10 +80,6 @@ const SVGPatternElement* ReferencedElement() const; - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Trace(blink::Visitor*) override; private:
diff --git a/third_party/blink/renderer/core/svg/svg_text_path_element.h b/third_party/blink/renderer/core/svg/svg_text_path_element.h index 17c7f3c8..0576602 100644 --- a/third_party/blink/renderer/core/svg/svg_text_path_element.h +++ b/third_party/blink/renderer/core/svg/svg_text_path_element.h
@@ -66,10 +66,6 @@ return spacing_.Get(); } - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Trace(blink::Visitor*) override; private:
diff --git a/third_party/blink/renderer/core/svg/svg_uri_reference.cc b/third_party/blink/renderer/core/svg/svg_uri_reference.cc index 47221fbc..99471e10 100644 --- a/third_party/blink/renderer/core/svg/svg_uri_reference.cc +++ b/third_party/blink/renderer/core/svg/svg_uri_reference.cc
@@ -151,13 +151,4 @@ observer = nullptr; } -const AttrNameToTrustedType& SVGURIReference::GetCheckedAttributeTypes() { - DEFINE_STATIC_LOCAL( - AttrNameToTrustedType, attribute_map, - ({ - {svg_names::kHrefAttr.LocalName(), SpecificTrustedType::kTrustedURL}, - })); - return attribute_map; -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_uri_reference.h b/third_party/blink/renderer/core/svg/svg_uri_reference.h index 8d24052..a98cf44 100644 --- a/third_party/blink/renderer/core/svg/svg_uri_reference.h +++ b/third_party/blink/renderer/core/svg/svg_uri_reference.h
@@ -81,8 +81,6 @@ // JS API SVGAnimatedHref* href() const { return href_.Get(); } - static const AttrNameToTrustedType& GetCheckedAttributeTypes(); - void Trace(blink::Visitor*) override; protected:
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.h b/third_party/blink/renderer/core/svg/svg_use_element.h index 136f541..3209a63 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.h +++ b/third_party/blink/renderer/core/svg/svg_use_element.h
@@ -61,10 +61,6 @@ void DispatchPendingEvent(); Path ToClipPath() const; - const AttrNameToTrustedType& GetCheckedAttributeTypes() const override { - return SVGURIReference::GetCheckedAttributeTypes(); - } - void Trace(blink::Visitor*) override; private:
diff --git a/third_party/blink/renderer/core/trustedtypes/BUILD.gn b/third_party/blink/renderer/core/trustedtypes/BUILD.gn index c0fdf30..196ce74be 100644 --- a/third_party/blink/renderer/core/trustedtypes/BUILD.gn +++ b/third_party/blink/renderer/core/trustedtypes/BUILD.gn
@@ -18,7 +18,5 @@ "trusted_type_policy_factory.h", "trusted_types_util.cc", "trusted_types_util.h", - "trusted_url.cc", - "trusted_url.h", ] }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.cc b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.cc index c172c1f..cc197c6 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.cc
@@ -7,7 +7,6 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_script.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/to_v8.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -38,12 +37,6 @@ return CreateScriptURL(script_state->GetIsolate(), input, exception_state); } -TrustedURL* TrustedTypePolicy::createURL(ScriptState* script_state, - const String& input, - ExceptionState& exception_state) { - return CreateURL(script_state->GetIsolate(), input, exception_state); -} - TrustedHTML* TrustedTypePolicy::CreateHTML(v8::Isolate* isolate, const String& input, ExceptionState& exception_state) { @@ -105,25 +98,6 @@ return MakeGarbageCollected<TrustedScriptURL>(script_url); } -TrustedURL* TrustedTypePolicy::CreateURL(v8::Isolate* isolate, - const String& input, - ExceptionState& exception_state) { - if (!policy_options_->createURL()) { - exception_state.ThrowTypeError( - "Policy " + name_ + - "'s TrustedTypePolicyOptions did not specify a 'createURL' member."); - return nullptr; - } - v8::TryCatch try_catch(isolate); - String url; - if (!policy_options_->createURL()->Invoke(nullptr, input).To(&url)) { - DCHECK(try_catch.HasCaught()); - exception_state.RethrowV8Exception(try_catch.Exception()); - return nullptr; - } - return MakeGarbageCollected<TrustedURL>(url); -} - String TrustedTypePolicy::name() const { return name_; }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h index 17b014d..dff1663 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h
@@ -17,7 +17,6 @@ class TrustedHTML; class TrustedScript; class TrustedScriptURL; -class TrustedURL; class CORE_EXPORT TrustedTypePolicy final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -30,7 +29,6 @@ TrustedScriptURL* CreateScriptURL(v8::Isolate*, const String&, ExceptionState&); - TrustedURL* CreateURL(v8::Isolate*, const String&, ExceptionState&); // IDL generates calls with ScriptState*, which contains the Isolate*. // These methods all call the Isolate* variant. @@ -39,7 +37,6 @@ TrustedScriptURL* createScriptURL(ScriptState*, const String&, ExceptionState&); - TrustedURL* createURL(ScriptState*, const String&, ExceptionState&); String name() const;
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl index 60f712be..f1767d8 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy.idl
@@ -4,7 +4,7 @@ // https://github.com/wicg/trusted-types -typedef (DOMString or TrustedHTML or TrustedScript or TrustedScriptURL or TrustedURL) TrustedString; +typedef (DOMString or TrustedHTML or TrustedScript or TrustedScriptURL) TrustedString; [ Exposed=Window, @@ -14,5 +14,4 @@ [CallWith=ScriptState, RaisesException, Unforgeable] TrustedHTML createHTML(DOMString input); [CallWith=ScriptState, RaisesException, Unforgeable] TrustedScript createScript(DOMString input); [CallWith=ScriptState, RaisesException, Unforgeable] TrustedScriptURL createScriptURL(DOMString input); - [CallWith=ScriptState, RaisesException, Unforgeable] TrustedURL createURL(DOMString input); };
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc index a746409e..a143e40 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc
@@ -9,7 +9,6 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_trusted_html.h" #include "third_party/blink/renderer/bindings/core/v8/v8_trusted_script.h" #include "third_party/blink/renderer/bindings/core/v8/v8_trusted_script_url.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_trusted_url.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -111,14 +110,6 @@ wrapper_type_info->Equals(V8TrustedScriptURL::GetWrapperTypeInfo()); } -bool TrustedTypePolicyFactory::isURL(ScriptState* script_state, - const ScriptValue& script_value) { - const WrapperTypeInfo* wrapper_type_info = - GetWrapperTypeInfoFromScriptValue(script_state, script_value); - return wrapper_type_info && - wrapper_type_info->Equals(V8TrustedURL::GetWrapperTypeInfo()); -} - TrustedHTML* TrustedTypePolicyFactory::emptyHTML() const { return empty_html_.Get(); } @@ -136,20 +127,8 @@ bool is_not_property : 1; bool is_not_attribute : 1; } kTypeTable[] = { - {"a", "href", nullptr, SpecificTrustedType::kTrustedURL}, - {"area", "href", nullptr, SpecificTrustedType::kTrustedURL}, - {"audio", "src", nullptr, SpecificTrustedType::kTrustedURL}, - {"base", "href", nullptr, SpecificTrustedType::kTrustedURL}, - {"button", "formAction", nullptr, SpecificTrustedType::kTrustedURL}, {"embed", "src", nullptr, SpecificTrustedType::kTrustedScriptURL}, - {"form", "action", nullptr, SpecificTrustedType::kTrustedURL}, - {"frame", "src", nullptr, SpecificTrustedType::kTrustedURL}, - {"iframe", "src", nullptr, SpecificTrustedType::kTrustedURL}, {"iframe", "srcdoc", nullptr, SpecificTrustedType::kTrustedHTML}, - {"img", "src", nullptr, SpecificTrustedType::kTrustedURL}, - {"input", "formAction", nullptr, SpecificTrustedType::kTrustedURL}, - {"input", "src", nullptr, SpecificTrustedType::kTrustedURL}, - {"link", "href", nullptr, SpecificTrustedType::kTrustedURL}, {"object", "codeBase", nullptr, SpecificTrustedType::kTrustedScriptURL}, {"object", "data", nullptr, SpecificTrustedType::kTrustedScriptURL}, {"script", "innerText", nullptr, SpecificTrustedType::kTrustedScript, false, @@ -159,9 +138,6 @@ true}, {"script", "textContent", nullptr, SpecificTrustedType::kTrustedScript, false, true}, - {"source", "src", nullptr, SpecificTrustedType::kTrustedURL}, - {"track", "src", nullptr, SpecificTrustedType::kTrustedURL}, - {"video", "src", nullptr, SpecificTrustedType::kTrustedURL}, {"*", "innerHTML", nullptr, SpecificTrustedType::kTrustedHTML, false, true}, {"*", "outerHTML", nullptr, SpecificTrustedType::kTrustedHTML, false, true}, {"*", "on*", nullptr, SpecificTrustedType::kTrustedScript, true, false}, @@ -202,8 +178,6 @@ return "TrustedScript"; case SpecificTrustedType::kTrustedScriptURL: return "TrustedScriptURL"; - case SpecificTrustedType::kTrustedURL: - return "TrustedURL"; case SpecificTrustedType::kNone: return String(); }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.idl b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.idl index c8f95b1..751bd3b 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.idl +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.idl
@@ -15,7 +15,6 @@ [CallWith=ScriptState, Unforgeable] boolean isHTML(any checkedObject); [CallWith=ScriptState, Unforgeable] boolean isScript(any checkedObject); [CallWith=ScriptState, Unforgeable] boolean isScriptURL(any checkedObject); - [CallWith=ScriptState, Unforgeable] boolean isURL(any checkedObject); [Unforgeable] readonly attribute TrustedHTML emptyHTML; // Trusted Types metadata, following the proposal in:
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc index 8791c6b4..067574ff 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
@@ -7,10 +7,9 @@ #include "third_party/blink/public/mojom/reporting/reporting.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" -#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/node.h" @@ -21,7 +20,6 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -37,11 +35,9 @@ kAnyTrustedTypeAssignment, kTrustedHTMLAssignment, kTrustedScriptAssignment, - kTrustedURLAssignment, kTrustedScriptURLAssignment, kTrustedHTMLAssignmentAndDefaultPolicyFailed, kTrustedScriptAssignmentAndDefaultPolicyFailed, - kTrustedURLAssignmentAndDefaultPolicyFailed, kTrustedScriptURLAssignmentAndDefaultPolicyFailed, kTextNodeScriptAssignment, kTextNodeScriptAssignmentAndDefaultPolicyFailed, @@ -55,8 +51,6 @@ return "This document requires 'TrustedHTML' assignment."; case kTrustedScriptAssignment: return "This document requires 'TrustedScript' assignment."; - case kTrustedURLAssignment: - return "This document requires 'TrustedURL' assignment."; case kTrustedScriptURLAssignment: return "This document requires 'TrustedScriptURL' assignment."; case kTrustedHTMLAssignmentAndDefaultPolicyFailed: @@ -65,9 +59,6 @@ case kTrustedScriptAssignmentAndDefaultPolicyFailed: return "This document requires 'TrustedScript' assignment and the " "'default' policy failed to execute."; - case kTrustedURLAssignmentAndDefaultPolicyFailed: - return "This document requires 'TrustedURL' assignment and the 'default' " - "policy failed to execute."; case kTrustedScriptURLAssignmentAndDefaultPolicyFailed: return "This document requires 'TrustedScriptURL' assignment and the " "'default' policy failed to execute."; @@ -154,7 +145,7 @@ } String GetStringFromTrustedType( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_trusted_type, const ExecutionContext* execution_context, ExceptionState& exception_state) { @@ -174,14 +165,12 @@ return string_or_trusted_type.GetAsTrustedScript()->toString(); if (string_or_trusted_type.IsTrustedScriptURL()) return string_or_trusted_type.GetAsTrustedScriptURL()->toString(); - if (string_or_trusted_type.IsTrustedURL()) - return string_or_trusted_type.GetAsTrustedURL()->toString(); return string_or_trusted_type.GetAsString(); } String GetStringFromTrustedTypeWithoutCheck( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_trusted_type) { if (string_or_trusted_type.IsTrustedHTML()) return string_or_trusted_type.GetAsTrustedHTML()->toString(); @@ -189,8 +178,6 @@ return string_or_trusted_type.GetAsTrustedScript()->toString(); if (string_or_trusted_type.IsTrustedScriptURL()) return string_or_trusted_type.GetAsTrustedScriptURL()->toString(); - if (string_or_trusted_type.IsTrustedURL()) - return string_or_trusted_type.GetAsTrustedURL()->toString(); if (string_or_trusted_type.IsString()) return string_or_trusted_type.GetAsString(); @@ -198,7 +185,7 @@ } String GetStringFromSpecificTrustedType( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_trusted_type, SpecificTrustedType specific_trusted_type, const ExecutionContext* execution_context, @@ -239,17 +226,6 @@ return GetStringFromTrustedScriptURL(string_or_trusted_script_url, execution_context, exception_state); } - case SpecificTrustedType::kTrustedURL: { - USVStringOrTrustedURL string_or_trusted_url = - string_or_trusted_type.IsTrustedURL() - ? USVStringOrTrustedURL::FromTrustedURL( - string_or_trusted_type.GetAsTrustedURL()) - : USVStringOrTrustedURL::FromUSVString( - GetStringFromTrustedTypeWithoutCheck( - string_or_trusted_type)); - return GetStringFromTrustedURL(string_or_trusted_url, execution_context, - exception_state); - } } } @@ -407,49 +383,6 @@ return result->toString(); } -String GetStringFromTrustedURL(USVStringOrTrustedURL string_or_trusted_url, - const ExecutionContext* execution_context, - ExceptionState& exception_state) { - DCHECK(!string_or_trusted_url.IsNull()); - if (string_or_trusted_url.IsTrustedURL()) { - return string_or_trusted_url.GetAsTrustedURL()->toString(); - } - - DCHECK(string_or_trusted_url.IsUSVString()); - String string = string_or_trusted_url.GetAsUSVString(); - - bool require_trusted_type = RequireTrustedTypesCheck(execution_context); - if (!require_trusted_type) { - return string; - } - - TrustedTypePolicy* default_policy = GetDefaultPolicy(execution_context); - if (!default_policy) { - if (TrustedTypeFail(kTrustedURLAssignment, execution_context, - exception_state, string)) { - return g_empty_string; - } - return string; - } - - TrustedURL* result = default_policy->CreateURL( - execution_context->GetIsolate(), string, exception_state); - if (exception_state.HadException()) { - return g_empty_string; - } - - if (result->toString().IsNull()) { - if (TrustedTypeFail(kTrustedURLAssignmentAndDefaultPolicyFailed, - execution_context, exception_state, string)) { - return g_empty_string; - } else { - return string; - } - } - - return result->toString(); -} - Node* TrustedTypesCheckForHTMLScriptElement(Node* child, Document* doc, ExceptionState& exception_state) {
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h index fc84a0b4..bf9d5dbd 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h
@@ -15,29 +15,27 @@ class ExceptionState; class Node; class StringOrTrustedHTML; -class StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL; +class StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL; class StringOrTrustedScript; class StringOrTrustedScriptURL; -class USVStringOrTrustedURL; enum class SpecificTrustedType { kNone, kTrustedHTML, kTrustedScript, kTrustedScriptURL, - kTrustedURL, }; String CORE_EXPORT GetStringFromTrustedType( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL&, const ExecutionContext*, ExceptionState&); String CORE_EXPORT GetStringFromTrustedTypeWithoutCheck( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&); + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL&); String CORE_EXPORT GetStringFromSpecificTrustedType( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL&, + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL&, SpecificTrustedType, const ExecutionContext*, ExceptionState&); @@ -62,10 +60,6 @@ const ExecutionContext*, ExceptionState&); -String CORE_EXPORT GetStringFromTrustedURL(USVStringOrTrustedURL, - const ExecutionContext*, - ExceptionState&); - // For <script> elements, we need to treat insertion of DOM text nodes // as equivalent to string assignment. This checks the child-node to be // inserted and runs all of the Trusted Types checks if it's a text node.
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc index fa08769e..29619bd4 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util_test.cc
@@ -7,10 +7,9 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html.h" -#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url_or_trusted_url.h" +#include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_html_or_trusted_script_or_trusted_script_url.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_trusted_script_url.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" @@ -18,7 +17,6 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_html.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_script.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_script_url.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -26,7 +24,7 @@ // Functions for checking throwing cases. void GetStringFromTrustedTypeThrows( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_trusted_type) { auto* document = MakeGarbageCollected<Document>(); document->GetContentSecurityPolicy()->DidReceiveHeader( @@ -92,28 +90,9 @@ exception_state.ClearException(); } -void GetStringFromTrustedURLThrows( - const USVStringOrTrustedURL& string_or_trusted_url) { - auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600)); - Document& document = dummy_page_holder->GetDocument(); - document.GetContentSecurityPolicy()->DidReceiveHeader( - "trusted-types *", kContentSecurityPolicyHeaderTypeEnforce, - kContentSecurityPolicyHeaderSourceMeta); - document.SetRequireTrustedTypesForTesting(); - document.GetContentSecurityPolicy()->RequireTrustedTypes(); - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - ASSERT_FALSE(exception_state.HadException()); - String s = GetStringFromTrustedURL(string_or_trusted_url, &document, - exception_state); - EXPECT_TRUE(exception_state.HadException()); - EXPECT_EQ(ESErrorType::kTypeError, exception_state.CodeAs<ESErrorType>()); - exception_state.ClearException(); -} - // Functions for checking non-throwing cases. void GetStringFromTrustedTypeWorks( - const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL& + const StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL& string_or_trusted_type, String expected) { auto* document = MakeGarbageCollected<Document>(); @@ -171,105 +150,63 @@ ASSERT_EQ(s, expected); } -void GetStringFromTrustedURLWorks( - const USVStringOrTrustedURL& string_or_trusted_url, - String expected) { - auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600)); - Document& document = dummy_page_holder->GetDocument(); - document.GetContentSecurityPolicy()->DidReceiveHeader( - "trusted-types *", kContentSecurityPolicyHeaderTypeEnforce, - kContentSecurityPolicyHeaderSourceMeta); - V8TestingScope scope; - DummyExceptionStateForTesting exception_state; - String s = GetStringFromTrustedURL(string_or_trusted_url, &document, - exception_state); - ASSERT_EQ(s, expected); -} - // GetStringFromTrustedType() tests TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedHTML) { auto* html = MakeGarbageCollected<TrustedHTML>("A string"); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedHTML(html); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL::FromTrustedHTML( + html); GetStringFromTrustedTypeWorks(trusted_value, "A string"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedScript) { auto* script = MakeGarbageCollected<TrustedScript>("A string"); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedScript(script); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL::FromTrustedScript( + script); GetStringFromTrustedTypeWorks(trusted_value, "A string"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedScriptURL) { String url_address = "http://www.example.com/"; auto* script_url = MakeGarbageCollected<TrustedScriptURL>(url_address); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedScriptURL(script_url); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL:: + FromTrustedScriptURL(script_url); GetStringFromTrustedTypeWorks(trusted_value, "http://www.example.com/"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedScriptURL_Relative) { String url_address = "relative/url.html"; auto* script_url = MakeGarbageCollected<TrustedScriptURL>(url_address); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedScriptURL(script_url); - GetStringFromTrustedTypeWorks(trusted_value, "relative/url.html"); -} - -TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedURL) { - String url_address = "http://www.example.com/"; - auto* url = MakeGarbageCollected<TrustedURL>(url_address); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedURL(url); - GetStringFromTrustedTypeWorks(trusted_value, "http://www.example.com/"); -} - -TEST(TrustedTypesUtilTest, GetStringFromTrustedType_TrustedURL_Relative) { - String url_address = "relative/url.html"; - auto* url = MakeGarbageCollected<TrustedURL>(url_address); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedURL(url); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL:: + FromTrustedScriptURL(script_url); GetStringFromTrustedTypeWorks(trusted_value, "relative/url.html"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedType_String) { - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - string_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromString("A string"); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL string_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL::FromString( + "A string"); GetStringFromTrustedTypeThrows(string_value); } // GetStringFromTrustedTypeWithoutCheck() tests TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_TrustedHTML) { auto* html = MakeGarbageCollected<TrustedHTML>("A string"); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedHTML(html); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL::FromTrustedHTML( + html); String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); ASSERT_EQ(s, "A string"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_TrustedScript) { auto* script = MakeGarbageCollected<TrustedScript>("A string"); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedScript(script); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL::FromTrustedScript( + script); String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); ASSERT_EQ(s, "A string"); } @@ -278,37 +215,24 @@ GetStringFromTrustedTypeWithoutCheck_TrustedScriptURL) { String url_address = "http://www.example.com/"; auto* script_url = MakeGarbageCollected<TrustedScriptURL>(url_address); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedScriptURL(script_url); - String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); - ASSERT_EQ(s, "http://www.example.com/"); -} - -TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_TrustedURL) { - String url_address = "http://www.example.com/"; - auto* url = MakeGarbageCollected<TrustedURL>(url_address); - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - trusted_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromTrustedURL(url); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL trusted_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL:: + FromTrustedScriptURL(script_url); String s = GetStringFromTrustedTypeWithoutCheck(trusted_value); ASSERT_EQ(s, "http://www.example.com/"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_String) { - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL - string_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL:: - FromString("A string"); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL string_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL::FromString( + "A string"); String s = GetStringFromTrustedTypeWithoutCheck(string_value); ASSERT_EQ(s, "A string"); } TEST(TrustedTypesUtilTest, GetStringFromTrustedTypeWithoutCheck_Null) { - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL null_value = - StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURLOrTrustedURL(); + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL null_value = + StringOrTrustedHTMLOrTrustedScriptOrTrustedScriptURL(); String s = GetStringFromTrustedTypeWithoutCheck(null_value); ASSERT_EQ(s, ""); } @@ -355,19 +279,4 @@ StringOrTrustedScriptURL::FromString("A string"); GetStringFromTrustedScriptURLThrows(string_value); } - -// GetStringFromTrustedURL tests -TEST(TrustedTypesUtilTest, GetStringFromTrustedURL_TrustedURL) { - String url_address = "http://www.example.com/"; - auto* url = MakeGarbageCollected<TrustedURL>(url_address); - USVStringOrTrustedURL trusted_value = - USVStringOrTrustedURL::FromTrustedURL(url); - GetStringFromTrustedURLWorks(trusted_value, "http://www.example.com/"); -} - -TEST(TrustedTypesUtilTest, GetStringFromTrustedURL_String) { - USVStringOrTrustedURL string_value = - USVStringOrTrustedURL::FromUSVString("A string"); - GetStringFromTrustedURLThrows(string_value); -} } // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_url.cc b/third_party/blink/renderer/core/trustedtypes/trusted_url.cc deleted file mode 100644 index b8b46e3..0000000 --- a/third_party/blink/renderer/core/trustedtypes/trusted_url.cc +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" - -namespace blink { - -TrustedURL::TrustedURL(const String& url) : url_(url) {} - -String TrustedURL::toString() const { - return url_; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_url.h b/third_party/blink/renderer/core/trustedtypes/trusted_url.h deleted file mode 100644 index 755f1b29..0000000 --- a/third_party/blink/renderer/core/trustedtypes/trusted_url.h +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_URL_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_URL_H_ - -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace blink { - -class CORE_EXPORT TrustedURL final : public ScriptWrappable { - DEFINE_WRAPPERTYPEINFO(); - - public: - explicit TrustedURL(const String& url); - - // TrustedURL.idl - String toString() const; - - private: - const String url_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_URL_H_
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_url.idl b/third_party/blink/renderer/core/trustedtypes/trusted_url.idl deleted file mode 100644 index b611563..0000000 --- a/third_party/blink/renderer/core/trustedtypes/trusted_url.idl +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://github.com/wicg/trusted-types - -typedef (USVString or TrustedURL) URLString; - -[ - Exposed=Window, - RuntimeEnabled=TrustedDOMTypes -] interface TrustedURL { - stringifier; -};
diff --git a/third_party/blink/renderer/core/url/dom_url_utils_read_only.cc b/third_party/blink/renderer/core/url/dom_url_utils_read_only.cc index ad8b1027..5a08967 100644 --- a/third_party/blink/renderer/core/url/dom_url_utils_read_only.cc +++ b/third_party/blink/renderer/core/url/dom_url_utils_read_only.cc
@@ -26,24 +26,18 @@ #include "third_party/blink/renderer/core/url/dom_url_utils_read_only.h" -#include "third_party/blink/renderer/bindings/core/v8/usv_string_or_trusted_url.h" -#include "third_party/blink/renderer/core/trustedtypes/trusted_url.h" #include "third_party/blink/renderer/platform/weborigin/known_ports.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" namespace blink { -String DOMURLUtilsReadOnly::href(ExceptionState&) { +String DOMURLUtilsReadOnly::href() { const KURL& kurl = Url(); if (kurl.IsNull()) return Input(); return kurl.GetString(); } -void DOMURLUtilsReadOnly::href(USVStringOrTrustedURL& result) { - result.SetUSVString(href()); -} - String DOMURLUtilsReadOnly::origin(const KURL& kurl) { if (kurl.IsNull()) return "";
diff --git a/third_party/blink/renderer/core/url/dom_url_utils_read_only.h b/third_party/blink/renderer/core/url/dom_url_utils_read_only.h index ef99f711..7ca57a57 100644 --- a/third_party/blink/renderer/core/url/dom_url_utils_read_only.h +++ b/third_party/blink/renderer/core/url/dom_url_utils_read_only.h
@@ -28,23 +28,18 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_URL_DOM_URL_UTILS_READ_ONLY_H_ #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/forward.h" namespace blink { -class ExceptionState; -class USVStringOrTrustedURL; - class CORE_EXPORT DOMURLUtilsReadOnly { public: virtual KURL Url() const = 0; virtual String Input() const = 0; virtual ~DOMURLUtilsReadOnly() = default; - void href(USVStringOrTrustedURL&); - String href(ExceptionState& = ASSERT_NO_EXCEPTION); + String href(); static String origin(const KURL&); String origin() { return origin(Url()); }
diff --git a/third_party/blink/renderer/devtools/front_end/color_picker/Spectrum.js b/third_party/blink/renderer/devtools/front_end/color_picker/Spectrum.js index b382d33..e0ede60 100644 --- a/third_party/blink/renderer/devtools/front_end/color_picker/Spectrum.js +++ b/third_party/blink/renderer/devtools/front_end/color_picker/Spectrum.js
@@ -135,7 +135,6 @@ /** @type {!Map.<string, !ColorPicker.Spectrum.Palette>} */ this._palettes = new Map(); this._palettePanel = this.contentElement.createChild('div', 'palette-panel'); - this._palettePanel.addEventListener('keydown', this._onPalettePanelKeydown.bind(this)); this._palettePanelShowing = false; this._paletteSectionContainer = this.contentElement.createChild('div', 'spectrum-palette-container'); this._paletteContainer = this._paletteSectionContainer.createChild('div', 'spectrum-palette'); @@ -241,9 +240,10 @@ const title = this._palettePanel.createChild('div', 'palette-title'); title.textContent = Common.UIString('Color Palettes'); const toolbar = new UI.Toolbar('', this._palettePanel); - const closeButton = new UI.ToolbarButton('Return to color picker', 'largeicon-delete'); - closeButton.addEventListener(UI.ToolbarButton.Events.Click, this._togglePalettePanel.bind(this, false)); - toolbar.appendToolbarItem(closeButton); + this._closeButton = new UI.ToolbarButton(ls`Return to color picker`, 'largeicon-delete'); + this._closeButton.addEventListener(UI.ToolbarButton.Events.Click, this._togglePalettePanel.bind(this, false)); + this._closeButton.element.addEventListener('keydown', this._onCloseBtnKeydown.bind(this)); + toolbar.appendToolbarItem(this._closeButton); for (const palette of this._palettes.values()) { this._palettePanel.appendChild(this._createPreviewPaletteElement(palette)); } @@ -267,8 +267,8 @@ /** * @param {!Event} event */ - _onPalettePanelKeydown(event) { - if (isEscKey(event)) { + _onCloseBtnKeydown(event) { + if (isEscKey(event) || isEnterOrSpaceKey(event)) { this._togglePalettePanel(false); event.consume(true); } @@ -283,7 +283,7 @@ return; } if (this._palettePanelShowing) { - this._palettePanel.focus({preventScroll: true}); + this._closeButton.element.focus({preventScroll: true}); } else { this.contentElement.focus(); } @@ -317,6 +317,8 @@ const animationDelay = animate ? i * 100 / palette.colors.length : 0; const colorElement = this._createPaletteColor(palette.colors[i], palette.colorNames[i], animationDelay); colorElement.tabIndex = -1; + UI.ARIAUtils.markAsButton(colorElement); + UI.ARIAUtils.setAccessibleName(colorElement, ls`Color ${palette.colors[i]}`); colorElement.addEventListener( 'mousedown', this._paletteColorSelected.bind(this, palette.colors[i], palette.colorNames[i], palette.matchUserFormat)); @@ -334,6 +336,7 @@ shadow = colorElement.createChild('div', 'spectrum-palette-color spectrum-palette-color-shadow'); shadow.style.background = palette.colors[i]; colorElement.title = ls`${palette.colors[i]}. Long-click to show alternate shades.`; + UI.ARIAUtils.setAccessibleName(colorElement, colorElement.title); new UI.LongClickController(colorElement, this._showLightnessShades.bind(this, colorElement, palette.colors[i])); } this._paletteContainer.appendChild(colorElement); @@ -393,6 +396,8 @@ for (let i = shades.length - 1; i >= 0; i--) { const shadeElement = this._createPaletteColor(shades[i], undefined /* colorName */, i * 200 / shades.length + 100); + UI.ARIAUtils.markAsButton(shadeElement); + UI.ARIAUtils.setAccessibleName(shadeElement, ls`Color ${shades[i]}`); shadeElement.addEventListener('mousedown', this._paletteColorSelected.bind(this, shades[i], shades[i], false)); this._shadesContainer.appendChild(shadeElement); }
diff --git a/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp b/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp index 0537b085..dd54a73 100644 --- a/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp +++ b/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp
@@ -27,6 +27,9 @@ <message name="IDS_DEVTOOLS_a03d142f9d52eae6793de3951b4b58f9" desc="Screen reader reads this text when palette switcher button receives focus"> Preview palettes </message> + <message name="IDS_DEVTOOLS_aba9beb2d259a7cff58a65229dcbbaf4" desc="Aria label which declares hex value of a swatch in the Color Picker"> + Color <ph name="PALETTE_COLORS_I_">$1s<ex>#969696</ex></ph> + </message> <message name="IDS_DEVTOOLS_b201b2e7e7a20df48b625f20c2f0933e" desc="Title text content in Spectrum of the Color Picker"> Color Palettes </message> @@ -36,6 +39,9 @@ <message name="IDS_DEVTOOLS_bbe0cb0a04956e97e8fc70f519d10e0d" desc="Color element title in Spectrum of the Color Picker"> <ph name="PALETTE_COLORS_I_">$1s<ex>#9c1724</ex></ph>. Long-click to show alternate shades. </message> + <message name="IDS_DEVTOOLS_c5bdbf2fd625704541f51288fd37b726" desc="Label for close button in Color Picker"> + Return to color picker + </message> <message name="IDS_DEVTOOLS_d1e2107b34fa404fabd54bcce4fd858f" desc="Tooltip text that appears when hovering over the largeicon add button in the Spectrum of the Color Picker"> Add to palette </message>
diff --git a/third_party/blink/renderer/devtools/front_end/ui/ViewManager.js b/third_party/blink/renderer/devtools/front_end/ui/ViewManager.js index be19b53..32264cb 100644 --- a/third_party/blink/renderer/devtools/front_end/ui/ViewManager.js +++ b/third_party/blink/renderer/devtools/front_end/ui/ViewManager.js
@@ -228,7 +228,9 @@ UI.ARIAUtils.markAsLink(this._titleElement); this._titleExpandIcon = UI.Icon.create('smallicon-triangle-right', 'title-expand-icon'); this._titleElement.appendChild(this._titleExpandIcon); - this._titleElement.createTextChild(view.title()); + const titleText = view.title(); + this._titleElement.createTextChild(titleText); + UI.ARIAUtils.setAccessibleName(this._titleElement, titleText); this._titleElement.tabIndex = 0; this._titleElement.addEventListener('click', this._toggleExpanded.bind(this), false); this._titleElement.addEventListener('keydown', this._onTitleKeyDown.bind(this), false);
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc index 87a4e50..909f84af 100644 --- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc +++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -11,7 +11,6 @@ #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/dom/node_list.h" -#include "third_party/blink/renderer/core/dom/text.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/inspector/identifiers_factory.h" @@ -725,8 +724,6 @@ Document* document = inspected_frames_->Root()->GetDocument(); if (!document) return Response::Error("No document."); - if (document->View()->NeedsLayout() || document->NeedsLayoutTreeUpdate()) - document->UpdateStyleAndLayout(); *nodes = std::make_unique<protocol::Array<protocol::Accessibility::AXNode>>(); AXContext ax_context(*document); AXObjectCacheImpl& cache = ToAXObjectCacheImpl(ax_context.GetAXObjectCache());
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index fe8647e..0cb0b74 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -354,7 +354,6 @@ "vr/vr_pose.idl", "vr/vr_stage_parameters.idl", "wake_lock/wake_lock.idl", - "wake_lock/wake_lock_event.idl", "wake_lock/wake_lock_sentinel.idl", "webaudio/analyser_node.idl", "webaudio/audio_buffer.idl", @@ -803,7 +802,6 @@ "storage/storage_event_init.idl", "vr/vr_display_event_init.idl", "vr/vr_layer_init.idl", - "wake_lock/wake_lock_event_init.idl", "webaudio/analyser_options.idl", "webaudio/audio_buffer_options.idl", "webaudio/audio_buffer_source_options.idl",
diff --git a/third_party/blink/renderer/modules/wake_lock/BUILD.gn b/third_party/blink/renderer/modules/wake_lock/BUILD.gn index d9feea5..e77edec 100644 --- a/third_party/blink/renderer/modules/wake_lock/BUILD.gn +++ b/third_party/blink/renderer/modules/wake_lock/BUILD.gn
@@ -10,8 +10,6 @@ "navigator_wake_lock.h", "wake_lock.cc", "wake_lock.h", - "wake_lock_event.cc", - "wake_lock_event.h", "wake_lock_sentinel.cc", "wake_lock_sentinel.h", "wake_lock_state_record.cc",
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_event.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock_event.cc deleted file mode 100644 index 866fbaeb..0000000 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_event.cc +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/modules/wake_lock/wake_lock_event.h" - -#include "base/logging.h" -#include "third_party/blink/renderer/modules/event_interface_modules_names.h" -#include "third_party/blink/renderer/modules/wake_lock/wake_lock_event_init.h" -#include "third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.h" -#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" - -namespace blink { - -// static -WakeLockEvent* WakeLockEvent::Create(const AtomicString& type, - const WakeLockEventInit* initializer) { - DCHECK(initializer->hasLock()); - return MakeGarbageCollected<WakeLockEvent>(type, initializer); -} - -WakeLockEvent::WakeLockEvent(const AtomicString& type, - const WakeLockEventInit* initializer) - : Event(type, initializer), lock_(initializer->lock()) { - DCHECK_NE(nullptr, lock_); -} - -WakeLockEvent::WakeLockEvent(const AtomicString& type, WakeLockSentinel* lock) - : Event(type, Bubbles::kNo, Cancelable::kNo), lock_(lock) {} - -WakeLockEvent::~WakeLockEvent() = default; - -WakeLockSentinel* WakeLockEvent::lock() const { - return lock_; -} - -const AtomicString& WakeLockEvent::InterfaceName() const { - return event_interface_names::kWakeLockEvent; -} - -void WakeLockEvent::Trace(blink::Visitor* visitor) { - visitor->Trace(lock_); - Event::Trace(visitor); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_event.h b/third_party/blink/renderer/modules/wake_lock/wake_lock_event.h deleted file mode 100644 index 228a4b13..0000000 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_event.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_EVENT_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_EVENT_H_ - -#include "third_party/blink/renderer/core/dom/events/event.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -#include "third_party/blink/renderer/platform/wtf/forward.h" - -namespace blink { - -class WakeLockEventInit; -class WakeLockSentinel; - -class WakeLockEvent final : public Event { - DEFINE_WRAPPERTYPEINFO(); - - public: - static WakeLockEvent* Create(const AtomicString& type, - const WakeLockEventInit* initializer); - - WakeLockEvent(const AtomicString& type, const WakeLockEventInit* initializer); - WakeLockEvent(const AtomicString& type, WakeLockSentinel* lock); - ~WakeLockEvent() override; - - // Web-exposed APIs. - WakeLockSentinel* lock() const; - - // Event overrides. - const AtomicString& InterfaceName() const override; - void Trace(blink::Visitor* visitor) override; - - private: - const Member<WakeLockSentinel> lock_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_EVENT_H_
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_event.idl b/third_party/blink/renderer/modules/wake_lock/wake_lock_event.idl deleted file mode 100644 index 9ad1cfb5..0000000 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_event.idl +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -[ - SecureContext, - Exposed=(DedicatedWorker,Window), - Constructor(DOMString type, WakeLockEventInit init), - RuntimeEnabled=WakeLock -] interface WakeLockEvent : Event { - readonly attribute WakeLockSentinel lock; -};
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_event_init.idl b/third_party/blink/renderer/modules/wake_lock/wake_lock_event_init.idl deleted file mode 100644 index 40d203e..0000000 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_event_init.idl +++ /dev/null
@@ -1,7 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -dictionary WakeLockEventInit : EventInit { - required WakeLockSentinel lock; -};
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc b/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc index 9a3ad58ced..cbdc8be 100644 --- a/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc +++ b/third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.cc
@@ -5,10 +5,9 @@ #include "third_party/blink/renderer/modules/wake_lock/wake_lock_sentinel.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/event_target_modules_names.h" -#include "third_party/blink/renderer/modules/wake_lock/wake_lock_event.h" -#include "third_party/blink/renderer/modules/wake_lock/wake_lock_event_init.h" #include "third_party/blink/renderer/modules/wake_lock/wake_lock_state_record.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" @@ -69,8 +68,7 @@ manager_->UnregisterSentinel(this); manager_.Clear(); - DispatchEvent( - *MakeGarbageCollected<WakeLockEvent>(event_type_names::kRelease, this)); + DispatchEvent(*Event::Create(event_type_names::kRelease)); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc b/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc index de8a33e0..e136083 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_param_timeline.cc
@@ -621,6 +621,25 @@ if (n_events == 0) return false; + // Handle the case where the first event (of certain types) is in the + // future. Then, no sample-accurate processing is needed because the event + // hasn't started. + if (events_[0]->Time() > + (current_frame + audio_utilities::kRenderQuantumFrames) / sample_rate) { + switch (events_[0]->GetType()) { + case ParamEvent::kSetTarget: + case ParamEvent::kSetValue: + case ParamEvent::kSetValueCurve: + // If the first event is one of these types, and the event starts + // after the end of the current render quantum, we don't need to do + // the slow sample-accurate path. + return false; + default: + // Handle other event types below. + break; + } + } + // If there are at least 2 events in the timeline, assume there are timeline // values. This could be optimized to be more careful, but checking is // complicated and keeping this consistent with |ValuesForFrameRangeImpl()|
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h index c4868211..9016968c 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -199,11 +199,6 @@ // For hosting this GraphicsLayer in a native layer hierarchy. cc::PictureLayer* CcLayer() const; - // Return a string with a human readable form of the layer tree. If debug is - // true, pointers for the layers and timing data will be included in the - // returned string. - String GetLayerTreeAsTextForTesting(LayerTreeFlags = kLayerTreeNormal) const; - void UpdateTrackingRasterInvalidations(); void ResetTrackedRasterInvalidations(); bool HasTrackedRasterInvalidations() const;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 2383941..82e3dde7 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1484,6 +1484,7 @@ }, { name: "Serial", + origin_trial_feature_name: "Serial", status: {"Android": "", "default": "experimental"}, }, {
diff --git a/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc b/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc index ce590849..4633243e 100644 --- a/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc +++ b/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc
@@ -121,6 +121,11 @@ return false; } bool RequestBeginMainFrameNotExpected(bool) override { return false; } + WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( + const String& name, + WebScopedVirtualTimePauser::VirtualTaskDuration) override { + return WebScopedVirtualTimePauser(); + } private: DISALLOW_COPY_AND_ASSIGN(DummyPageScheduler);
diff --git a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc index 74e6c82b..ac27cae4 100644 --- a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
@@ -200,13 +200,6 @@ NOTREACHED(); } -WebScopedVirtualTimePauser WebThreadScheduler::CreateWebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration duration) { - NOTREACHED(); - return WebScopedVirtualTimePauser(); -} - void WebThreadScheduler::OnMainFrameRequestedForInput() { NOTREACHED(); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index f7641b6..ef8f006 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -97,7 +97,7 @@ if (is_backgrounded) { return "renderer_backgrounded"; } else { - return "renderer_visible"; + return "renderer_foregrounded"; } } @@ -371,12 +371,12 @@ &main_thread_scheduler_impl->tracing_controller_, RAILModeToString), renderer_hidden(false, - "Scheduler.Hidden", + "RendererVisibility", main_thread_scheduler_impl, &main_thread_scheduler_impl->tracing_controller_, HiddenStateToString), renderer_backgrounded(kLaunchingProcessIsBackgrounded, - "RendererVisibility", + "RendererPriority", main_thread_scheduler_impl, &main_thread_scheduler_impl->tracing_controller_, BackgroundStateToString), @@ -2314,14 +2314,6 @@ main_thread_only().process_type = type; } -WebScopedVirtualTimePauser -MainThreadSchedulerImpl::CreateWebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration duration) { - return WebScopedVirtualTimePauser(this, duration, - WebString(WTF::String(name))); -} - PendingUserInputInfo MainThreadSchedulerImpl::GetPendingUserInputInfo() const { base::AutoLock lock(any_thread_lock_); return any_thread().pending_input_monitor.Info();
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 2748d22..6c4c59b 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -215,9 +215,6 @@ void AddRAILModeObserver(RAILModeObserver* observer) override; void RemoveRAILModeObserver(RAILModeObserver const* observer) override; void SetRendererProcessType(WebRendererProcessType type) override; - WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration duration) override; PendingUserInputInfo GetPendingUserInputInfo() const override; bool IsBeginMainFrameScheduled() const override; @@ -856,7 +853,7 @@ renderer_pause_count; // Renderer is paused if non-zero. TraceableState<RAILMode, TracingCategoryName::kInfo> rail_mode_for_tracing; // Don't use except for tracing. - TraceableState<bool, TracingCategoryName::kDebug> renderer_hidden; + TraceableState<bool, TracingCategoryName::kTopLevel> renderer_hidden; TraceableState<bool, TracingCategoryName::kTopLevel> renderer_backgrounded; TraceableState<bool, TracingCategoryName::kDefault> keep_active_fetch_or_worker;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc index ae46068..afd86e3 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -3213,9 +3213,9 @@ scheduler_->SetVirtualTimePolicy( PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading); - WebScopedVirtualTimePauser pauser = - scheduler_->CreateWebScopedVirtualTimePauser( - "test", WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant); + WebScopedVirtualTimePauser pauser( + scheduler_.get(), + WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant, "test"); base::TimeTicks before = scheduler_->GetVirtualTimeDomain()->Now(); EXPECT_TRUE(scheduler_->VirtualTimeAllowedToAdvance()); @@ -3234,9 +3234,9 @@ scheduler_->SetVirtualTimePolicy( PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading); - WebScopedVirtualTimePauser pauser = - scheduler_->CreateWebScopedVirtualTimePauser( - "test", WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant); + WebScopedVirtualTimePauser pauser( + scheduler_.get(), + WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant, "test"); base::TimeTicks before = scheduler_->GetVirtualTimeDomain()->Now(); pauser.PauseVirtualTime(); @@ -3254,9 +3254,9 @@ scheduler_->SetVirtualTimePolicy( PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading); - WebScopedVirtualTimePauser pauser = - scheduler_->CreateWebScopedVirtualTimePauser( - "test", WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant); + WebScopedVirtualTimePauser pauser( + scheduler_.get(), + WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant, "test"); // Test will pass if the queue without virtual is the last one in the // iteration order. Create 100 of them and ensure that it is created in the
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc index 1779e61..c565d53 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -768,6 +768,12 @@ return nullptr; } +WebScopedVirtualTimePauser PageSchedulerImpl::CreateWebScopedVirtualTimePauser( + const String& name, + WebScopedVirtualTimePauser::VirtualTaskDuration duration) { + return WebScopedVirtualTimePauser(main_thread_scheduler_, duration, name); +} + // static const char PageSchedulerImpl::kHistogramPageLifecycleStateTransition[] = "PageScheduler.PageLifecycleStateTransition";
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h index 4de806f0..e1370f47 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
@@ -77,6 +77,9 @@ bool IsExemptFromBudgetBasedThrottling() const override; bool OptedOutFromAggressiveThrottlingForTest() const override; bool RequestBeginMainFrameNotExpected(bool new_state) override; + WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( + const WTF::String& name, + WebScopedVirtualTimePauser::VirtualTaskDuration) override; // Virtual for testing. virtual void ReportIntervention(const String& message);
diff --git a/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h index 43e6e76..3d7dde32 100644 --- a/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h
@@ -7,6 +7,7 @@ #include <memory> #include "third_party/blink/public/platform/blame_context.h" +#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h" #include "third_party/blink/renderer/platform/scheduler/public/page_lifecycle_state.h" @@ -140,6 +141,16 @@ // Returns true if the request has been succcessfully relayed to the // compositor. virtual bool RequestBeginMainFrameNotExpected(bool new_state) = 0; + + // Returns a WebScopedVirtualTimePauser which can be used to vote for pausing + // virtual time. Virtual time will be paused if any WebScopedVirtualTimePauser + // votes to pause it, and only unpaused only if all + // WebScopedVirtualTimePausers are either destroyed or vote to unpause. Note + // the WebScopedVirtualTimePauser returned by this method is initially + // unpaused. + virtual WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( + const String& name, + WebScopedVirtualTimePauser::VirtualTaskDuration) = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h b/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h index a089527..904f54f2 100644 --- a/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h
@@ -78,6 +78,11 @@ bool RequestBeginMainFrameNotExpected(bool new_state) override { return false; } + WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser( + const String& name, + WebScopedVirtualTimePauser::VirtualTaskDuration) override { + return WebScopedVirtualTimePauser(); + } private: bool is_audio_playing_;
diff --git a/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc index 17766c3..1cc63847 100644 --- a/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc
@@ -9,7 +9,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "third_party/blink/renderer/platform/scheduler/public/thread.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { namespace scheduler { @@ -106,13 +105,5 @@ void WebFakeThreadScheduler::OnMainFrameRequestedForInput() {} -WebScopedVirtualTimePauser -WebFakeThreadScheduler::CreateWebScopedVirtualTimePauser( - const char* name, - WebScopedVirtualTimePauser::VirtualTaskDuration duration) { - return WebScopedVirtualTimePauser(nullptr, duration, - WebString(WTF::String(name))); -} - } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem index 401398d..40b7994 100644 --- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem +++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem
@@ -533,7 +533,6 @@ crbug.com/982194 external/wpt/contacts/contacts-select.https.window.html [ Failure ] crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-002.xht [ Failure ] crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-004.xht [ Failure ] -crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-5.html [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-001.html [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-002.html [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/intrinsic-size-float-and-line.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index ac59955..5e093f7 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -260,6 +260,9 @@ # Display locking failures +# MSAN failure +crbug.com/996625 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Skip ] + crbug.com/849459 fragmentation/repeating-thead-under-repeating-thead.html [ Failure ] # These tests are no longer applicable in BlinkGenPropertyTree mode. @@ -5590,6 +5593,10 @@ crbug.com/999209 virtual/lazyload-image/http/tests/lazyload/style-dimension.html [ Timeout ] +crbug.com/1015130 external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html [ Failure Pass ] +crbug.com/1015130 virtual/scalefactor200/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html [ Failure Pass ] +crbug.com/1015130 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html [ Failure Pass ] + # These tests are missing test automation crbug.com/998917 external/wpt/native-file-system/native_FileSystemDirectoryHandle-getDirectory.tentative.https.manual.window.html [ Skip ] crbug.com/998917 external/wpt/native-file-system/native_FileSystemDirectoryHandle-getEntries.tentative.https.manual.window.html [ Skip ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index e2540fa..de79185 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -162421,6 +162421,9 @@ "infrastructure/expected-fail/unhandled-rejection-expected.txt": [ [] ], + "infrastructure/metadata/infrastructure/assumptions/ahem.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini": [ [] ], @@ -162496,6 +162499,9 @@ "infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini": [ [] ], + "infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini": [ [] ], @@ -162505,6 +162511,9 @@ "infrastructure/metadata/infrastructure/testdriver/actions/pause.html.ini": [ [] ], + "infrastructure/metadata/infrastructure/testdriver/bless.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini": [ [] ], @@ -462467,8 +462476,12 @@ "f25f6e088fa06fbcd38b62929309e761b0060988", "testharness" ], + "infrastructure/metadata/infrastructure/assumptions/ahem.html.ini": [ + "8587775d8fc86891605a1509d3062a2c08f56a31", + "support" + ], "infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini": [ - "c9fbabede6d695cd3795e4390b35da0454ffcc34", + "c6f136d9715e86db9952dd6eac80b09b7782eed8", "support" ], "infrastructure/metadata/infrastructure/assumptions/document-fonts-ready.html.ini": [ @@ -462567,6 +462580,10 @@ "9ae71a6e73e22a855c69d3269936d71c17d6e9e5", "support" ], + "infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini": [ + "fb4b51df66dfe434934f0f0110340e7e2d122f10", + "support" + ], "infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini": [ "894f4a11df81be8e164898ab2091e1cc64175290", "support" @@ -462579,6 +462596,10 @@ "657d2a2492605557dcc62f02dca36364cf3007fd", "support" ], + "infrastructure/metadata/infrastructure/testdriver/bless.html.ini": [ + "d652b02787fb13e70fa5008a5b5f656dbacda8a3", + "support" + ], "infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini": [ "e2bfbf8fb8fb71003bd06a8356fec3a074395040", "support" @@ -501520,7 +501541,7 @@ "support" ], "tools/ci/azure/install_safari.yml": [ - "bfb6afc332b1b85d7c322e19066708f034e9ac77", + "2c4a25c83a494ad798e80664f417c53c3ec40ab8", "support" ], "tools/ci/azure/pip_install.yml": [
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/ahem.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/ahem.html.ini new file mode 100644 index 0000000..8587775d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/ahem.html.ini
@@ -0,0 +1,3 @@ +[ahem.html] + expected: + if product == "safari": FAIL # system fonts not loaded since macOS Mojave
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini index c9fbabede..c6f136d 100644 --- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini
@@ -2,7 +2,10 @@ expected: if product == "safari": ERROR # https://bugs.webkit.org/show_bug.cgi?id=190775 - [<audio> autoplay] expected: if product == "safari": FAIL # https://bugs.webkit.org/show_bug.cgi?id=190775 + + [<video> autoplay] + expected: + if product == "safari": TIMEOUT # https://bugs.webkit.org/show_bug.cgi?id=190775
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini new file mode 100644 index 0000000..fb4b51d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini
@@ -0,0 +1,4 @@ +[elementTiming.html] + [TestDriver actions: element timing] + expected: + if product == "safari": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/bless.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/bless.html.ini new file mode 100644 index 0000000..d652b02 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/bless.html.ini
@@ -0,0 +1,31 @@ +[bless.html] + expected: + if product == "safari": TIMEOUT + + [functions in the absence of a `body` element] + expected: + if product == "safari": TIMEOUT + + [user activation] + expected: + if product == "safari": NOTRUN + + [no action function provided] + expected: + if product == "safari": NOTRUN + + [synchronous return value] + expected: + if product == "safari": NOTRUN + + [synchronous error] + expected: + if product == "safari": NOTRUN + + [asynchronous return value] + expected: + if product == "safari": NOTRUN + + [asynchronous error] + expected: + if product == "safari": NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/trusted-types.tentative.idl b/third_party/blink/web_tests/external/wpt/interfaces/trusted-types.tentative.idl index 6ff45e7..be58b63 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/trusted-types.tentative.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/trusted-types.tentative.idl
@@ -3,7 +3,6 @@ typedef (DOMString or TrustedHTML) HTMLString; typedef (DOMString or TrustedScript) ScriptString; typedef (DOMString or TrustedScriptURL) ScriptURLString; -typedef (USVString or TrustedURL) URLString; [Exposed=(Window, Worker)] interface TrustedHTML { @@ -21,11 +20,6 @@ }; [Exposed=(Window, Worker)] -interface TrustedURL { - stringifier; -}; - -[Exposed=(Window, Worker)] interface TrustedTypePolicyFactory { [Unforgeable] TrustedTypePolicy createPolicy(DOMString policyName, TrustedTypePolicyOptions policyOptions); // All the policy object names that have been created @@ -38,14 +32,12 @@ [Unforgeable] TrustedHTML createHTML(DOMString input); [Unforgeable] TrustedScript createScript(DOMString input); [Unforgeable] TrustedScriptURL createScriptURL(DOMString input); - [Unforgeable] TrustedURL createURL(DOMString input); }; dictionary TrustedTypePolicyOptions { CreateHTMLCallback createHTML; CreateScriptCallback createScript; CreateURLCallback createScriptURL; - CreateURLCallback createURL; }; callback CreateHTMLCallback = DOMString (DOMString input);
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html new file mode 100644 index 0000000..a49a83f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html
@@ -0,0 +1,47 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>LargestContentfulPaint compared with FirstPaint and FirstContentfulPaint on single text page.</title> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + async_test(function (t) { + if (!window.PerformancePaintTiming) { + assert_unreached("PerformancePaintTiming is not implemented"); + } + if (!window.LargestContentfulPaint) { + assert_unreached("LargestContentfulPaint is not implemented"); + } + let firstPaintTime = 0; + let firstContentfulPaintTime = 0; + let largestContentfulPaintTime = 0; + const observer = new PerformanceObserver( + t.step_func(function(entryList) { + entryList.getEntries().forEach(entry => { + if (entry.name === 'first-paint') { + assert_equals(firstPaintTime, 0, 'Only one first-paint entry.'); + assert_equals(entry.entryType, 'paint'); + firstPaintTime = entry.startTime; + } else if (entry.name === 'first-contentful-paint') { + assert_equals(firstContentfulPaintTime, 0, 'Only one first-contentful-paint entry.'); + assert_equals(entry.entryType, 'paint'); + firstContentfulPaintTime = entry.startTime; + } else { + assert_equals(largestContentfulPaintTime, 0, 'Only one largest-contentful-paint entry.'); + assert_equals(entry.entryType, 'largest-contentful-paint'); + largestContentfulPaintTime = entry.renderTime; + } + if (firstPaintTime && firstContentfulPaintTime && largestContentfulPaintTime) { + assert_less_than_equal(firstPaintTime, firstContentfulPaintTime, 'FP should be less than or equal to FCP.'); + assert_equals(firstContentfulPaintTime, largestContentfulPaintTime, 'FCP should equal LCP.'); + t.done(); + } + }); + }) + ); + observer.observe({type: 'largest-contentful-paint', buffered: true}); + observer.observe({type: 'paint', buffered: true}); + }, 'FCP and LCP are the same when there is a single text element in the page.'); +</script> +<p>Text</p> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/tools/ci/azure/install_safari.yml b/third_party/blink/web_tests/external/wpt/tools/ci/azure/install_safari.yml index bfb6afc..2c4a25c8 100644 --- a/third_party/blink/web_tests/external/wpt/tools/ci/azure/install_safari.yml +++ b/third_party/blink/web_tests/external/wpt/tools/ci/azure/install_safari.yml
@@ -5,12 +5,8 @@ steps: - ${{ if eq(parameters.channel, 'preview') }}: - script: | - # This is equivalent to `Homebrew/homebrew-cask-versions/safari-technology-preview`, - # but the raw URL is used to bypass caching. - # Safari Technology Preview version 83 includes a regression that - # interferes with results collection. The version of the installation - # script referenced here installs STP at version 82. - HOMEBREW_NO_AUTO_UPDATE=1 brew cask install https://raw.githubusercontent.com/Homebrew/homebrew-cask-versions/dbde508bb83254c53be4eb6387dbd9fbf9797a35/Casks/safari-technology-preview.rb + # Pinned to Safari Technology Preview version 94. + HOMEBREW_NO_AUTO_UPDATE=1 brew cask install https://raw.githubusercontent.com/Homebrew/homebrew-cask-versions/02e2aff2d578cc7d8545cf035bffa45293bb1de1/Casks/safari-technology-preview.rb sudo "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --enable defaults write com.apple.SafariTechnologyPreview WebKitJavaScriptCanOpenWindowsAutomatically 1 defaults write com.apple.SafariTechnologyPreview ExperimentalServerTimingEnabled 1
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttribute.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttribute.tentative.html index a284b2f..cd66179 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttribute.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttribute.tentative.html
@@ -6,29 +6,6 @@ </head> <body> <script> - // TrustedURL Assignments - let testCases = [ - [ 'a', 'href' ], - [ 'area', 'href' ], - [ 'base', 'href' ], - [ 'frame', 'src' ], - [ 'iframe', 'src' ], - [ 'img', 'src' ], - [ 'input', 'src' ], - [ 'link', 'href' ], - [ 'video', 'src' ], - [ 'object', 'data' ], - [ 'object', 'codeBase' ], - [ 'source', 'src' ], - [ 'track', 'src' ] - ]; - - testCases.forEach(c => { - test(t => { - assert_element_accepts_trusted_url_explicit_set(window, c, t, c[0], c[1], RESULTS.URL); - }, c[0] + "." + c[1] + " assigned via policy (successful URL transformation)"); - }); - // TrustedScriptURL Assignments let scriptTestCases = [ [ 'embed', 'src' ], @@ -54,8 +31,8 @@ // Other attributes can be assigned with TrustedTypes or strings or null values test(t => { - assert_element_accepts_trusted_url_explicit_set(window, 'arel', t, 'a', 'rel', RESULTS.URL); - }, "a.rel assigned via policy (successful URL transformation)"); + assert_element_accepts_trusted_script_url_explicit_set(window, 'scriptsrc1', t, 'script', 'src', RESULTS.SCRIPTURL); + }, "script.src assigned via policy (successful script transformation)"); test(t => { assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', 'A string', 'A string');
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttributeNS.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttributeNS.tentative.html index 374e6a9..67e8236 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttributeNS.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/Element-setAttributeNS.tentative.html
@@ -18,10 +18,8 @@ assert_element_accepts_trusted_script_url_set_ns(window, '2', t, 'a', 'b', RESULTS.SCRIPTURL); }, "Element.setAttributeNS assigned via policy (successful ScriptURL transformation)"); - test(t => { - assert_element_accepts_trusted_url_set_ns(window, '3', t, 'a', 'b', RESULTS.URL); - }, "Element.setAttributeNS assigned via policy (successful URL transformation)"); - +// TODO: Is there any non-URL, namespaced accessor left? +/* test(t => { let p = createURL_policy(window, '5'); let url = p.createURL(INPUTS.URL); @@ -31,5 +29,6 @@ let attr_node = elem.getAttributeNodeNS("http://www.w3.org/1999/xlink", "href"); assert_equals(attr_node.value + "", RESULTS.URL); }, "Element.setAttributeNS accepts a URL on <svg:image xlink:href/>"); +*/ </script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/HTMLElement-generic.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/HTMLElement-generic.tentative.html index d1fafa7..3ec6cfa60 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/HTMLElement-generic.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/HTMLElement-generic.tentative.html
@@ -7,28 +7,6 @@ <body> <script> var testnb = 0; - // TrustedURL Assignments - const URLTestCases = [ - [ 'a', 'href' ], - [ 'area', 'href' ], - [ 'base', 'href' ], - [ 'frame', 'src' ], - [ 'iframe', 'src' ], - [ 'img', 'src' ], - [ 'input', 'src' ], - [ 'link', 'href' ], - [ 'video', 'src' ], - [ 'object', 'data' ], - [ 'object', 'codeBase' ], - [ 'source', 'src' ], - [ 'track', 'src' ] - ]; - - URLTestCases.forEach(c => { - test(t => { - assert_element_accepts_trusted_url(window, ++testnb, t, c[0], c[1], RESULTS.URL); - }, c[0] + "." + c[1] + " assigned via policy (successful URL transformation)"); - }); // TrustedScriptURL Assignments const scriptURLTestCases = [
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/Location-assign.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/Location-assign.tentative.html deleted file mode 100644 index 62f98e9..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/Location-assign.tentative.html +++ /dev/null
@@ -1,13 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> -<body> -<script> - test(t => { - let p = createURL_policy(window, 1); - let url = p.createURL(location.href + "#xxx"); - location.assign(url); - assert_equals("" + url, location.href, "location href"); - }, "location.assign via policy (successful URL transformation)."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/Location-href.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/Location-href.tentative.html deleted file mode 100644 index bacadf6..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/Location-href.tentative.html +++ /dev/null
@@ -1,13 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> -<body> -<script> - test(t => { - let p = createURL_policy(window, 1); - let url = p.createURL(location.href + "#xxx"); - location.href = url; - assert_equals("" + url, location.href, "location href"); - }, "location.href assigned via policy (successful URL transformation)."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/Location-replace.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/Location-replace.tentative.html deleted file mode 100644 index 4fb53d02..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/Location-replace.tentative.html +++ /dev/null
@@ -1,13 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> -<body> -<script> - test(t => { - let p = createURL_policy(window, 1); - let url = p.createURL(location.href + "#xxx"); - location.replace(url); - assert_equals("" + url, location.href, "location href"); - }, "location.replace via policy (successful URL transformation)."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicy-createXXX.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicy-createXXX.tentative.html index 73ed8c7..34fbf558 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicy-createXXX.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicy-createXXX.tentative.html
@@ -12,10 +12,8 @@ createScript: s => s }); assert_throws(new TypeError(), _ => { p1.createScriptURL("foo"); }); - assert_throws(new TypeError(), _ => { p1.createURL("foo"); }); const p2 = trustedTypes.createPolicy("policyURLAndScriptURL", { - createURL: s => s, createScriptURL: s => s }); assert_throws(new TypeError(), _ => { p2.createHTML("foo"); }); @@ -26,23 +24,18 @@ const noopPolicy = { createHTML: (s) => s, createScriptURL: (s) => s, - createURL: (s) => s, createScript: (s) => s, }; policy = trustedTypes.createPolicy(Math.random(), noopPolicy, true); let el = document.createElement("div"); - el.title = policy.createHTML(INPUTS.URL); - assert_equals(el.title, INPUTS.URL); - - el.title = policy.createURL(INPUTS.HTML); - assert_equals(el.title, INPUTS.HTML); + el.title = policy.createHTML(INPUTS.SCRIPTURL); + assert_equals(el.title, INPUTS.SCRIPTURL); }, "Attributes without type constraints will work as before."); test(t => { const policy = trustedTypes.createPolicy("nullpolicy", null); assert_throws(new TypeError(), _ => { policy.createScriptURL("foo"); }); - assert_throws(new TypeError(), _ => { policy.createURL("foo"); }); assert_throws(new TypeError(), _ => { policy.createHTML("foo"); }); assert_throws(new TypeError(), _ => { policy.createScript("foo"); }); }, "trustedTypes.createPolicy(.., null) creates empty policy."); @@ -95,7 +88,6 @@ const testCases = [ [TrustedHTML, "createHTML", "whatever", stringTestCases], [TrustedScript, "createScript", "whatever", stringTestCases], - [TrustedURL, "createURL", INPUTS.SCRIPTURL, urlTestCases], [TrustedScriptURL, "createScriptURL", INPUTS.SCRIPTURL, urlTestCases], ];
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html index 05c7301..8608bcc 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html
@@ -224,79 +224,4 @@ p.createURL(INPUTS.URL); }); }, "createScriptURL defined - calling undefined callbacks throws"); - - - //URL tests - function createURLTest(policyName, policy, expectedURL, t) { - let p = window.trustedTypes.createPolicy(policyName, policy); - let url = p.createURL(INPUTS.URL); - assert_true(url instanceof TrustedURL); - assert_true(trustedTypes.isURL(url)); - assert_equals(url + "", expectedURL); - } - - test(t => { - createURLTest('TestPolicyURL1', { createURL: s => s }, INPUTS.URL, t); - }, "url = identity function"); - - test(t => { - createURLTest('TestPolicyURL2', { createURL: s => null }, "", t); - }, "url = null"); - - var URLstr = '#x'; - test(t => { - createURLTest('TestPolicyURL3', { createURL: s => s + URLstr }, INPUTS.URL + URLstr, t); - }, "url = string + global string"); - - var URLx = 'global'; - test(t => { - createURLTest('TestPolicyURL4', { createURL: s => { URLx = s; return s; } }, INPUTS.URL, t); - assert_equals(URLx, INPUTS.URL); - }, "url = identity function, global string changed"); - - test(t => { - let p = window.trustedTypes.createPolicy('TestPolicyURL5', { - createURL: s => { throw new Error(); } - }); - assert_throws(new Error(), _ => { - p.createURL(INPUTS.URL); - }); - }, "url = callback that throws"); - - function getURL(s) { - return s + this.bar; - } - - var obj = { - "bar": "#x" - } - - test(t => { - createURLTest('TestPolicyURL6', { createURL: getURL.bind(obj) }, INPUTS.URL + "#x", t); - }, "url = this bound to an object"); - - var bar = "#x"; - test(t => { - createURLTest('TestPolicyURL7', { createURL: s => getURL(s) }, INPUTS.URL + bar, t); - }, "url = this without bind"); - - test(t => { - let p = window.trustedTypes.createPolicy('TestPolicyURL8', null); - assert_throws(new TypeError(), _ => { - p.createURL(INPUTS.URL); - }); - }, "url - calling undefined callback throws"); - - test(t => { - let p = window.trustedTypes.createPolicy('TestPolicyURL9', { createURL: createURLJS }); - assert_throws(new TypeError(), _ => { - p.createHTML(INPUTS.HTML); - }); - assert_throws(new TypeError(), _ => { - p.createScript(INPUTS.SCRIPT); - }); - assert_throws(new TypeError(), _ => { - p.createScriptURL(INPUTS.SCRIPTURL); - }); - }, "createURL defined - calling undefined callbacks throws"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-getPropertyType.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-getPropertyType.tentative.html index f9ba8f27..0e5a0f5 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-getPropertyType.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-getPropertyType.tentative.html
@@ -8,10 +8,11 @@ <div id="target"></div> <script> test(t => { - assert_equals(trustedTypes.getPropertyType("a", "href"), "TrustedURL"); - assert_equals(trustedTypes.getPropertyType("a", "id"), null); - assert_equals(trustedTypes.getPropertyType("a", "b"), null); - }, "sanity check trustedTypes.getPropertyType for the HTML a element."); + assert_equals(trustedTypes.getPropertyType("script", "text"), "TrustedScript"); + assert_equals(trustedTypes.getPropertyType("script", "src"), "TrustedScriptURL"); + assert_equals(trustedTypes.getPropertyType("script", "id"), null); + assert_equals(trustedTypes.getPropertyType("script", "b"), null); + }, "sanity check trustedTypes.getPropertyType for the HTML script element."); test(t => { assert_equals(trustedTypes.getAttributeType("img", "onerror"), "TrustedScript"); @@ -28,11 +29,9 @@ test(t => { // returns the proper type for attribute-related properties assert_equals(trustedTypes.getPropertyType("script", "src"), "TrustedScriptURL"); - assert_equals(trustedTypes.getPropertyType("img", "src"), "TrustedURL"); // is case insensitive for tag names assert_equals(trustedTypes.getPropertyType("SCRIPT", "src"), "TrustedScriptURL"); - assert_equals(trustedTypes.getPropertyType("ImG", "src"), "TrustedURL"); // is case sensitive for property names assert_equals(trustedTypes.getPropertyType("script", "sRc"), null); @@ -53,7 +52,6 @@ test(t => { // returns the proper type assert_equals(trustedTypes.getAttributeType('script', 'src'), 'TrustedScriptURL'); - assert_equals(trustedTypes.getAttributeType('img', 'src'), 'TrustedURL'); // ignores attributes from unknown namespaces assert_equals(trustedTypes.getAttributeType( @@ -61,11 +59,9 @@ // is case insensitive for element names assert_equals(trustedTypes.getAttributeType('SCRIPT', 'src'), 'TrustedScriptURL'); - assert_equals(trustedTypes.getAttributeType('imG', 'src'), 'TrustedURL'); // is case insensitive for the attribute names assert_equals(trustedTypes.getAttributeType('script', 'SRC'), 'TrustedScriptURL'); - assert_equals(trustedTypes.getAttributeType('imG', 'srC'), 'TrustedURL'); // supports the inline event handlers assert_equals(trustedTypes.getAttributeType('img', 'onerror'), 'TrustedScript'); @@ -82,7 +78,6 @@ // Spot testing some values. assert_equals(map["script"].attributes.src, "TrustedScriptURL"); - assert_equals(map["img"].attributes.src, "TrustedURL"); assert_equals(map["*"].properties.innerHTML, "TrustedHTML"); assert_equals(map["foo"], undefined);
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html index efaac5d..c620451 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html
@@ -10,7 +10,6 @@ const noopPolicy = { 'createHTML': (s) => s, 'createScriptURL': (s) => s, - 'createURL': (s) => s, 'createScript': (s) => s, }; @@ -65,23 +64,6 @@ assert_false(trustedTypes.isScriptURL(script3)); }, 'TrustedTypePolicyFactory.isScriptURL requires the object to be created via policy.'); - // isURL tests - test(t => { - const p = trustedTypes.createPolicy('url', noopPolicy); - let url = p.createURL(INPUTS.URL); - - assert_true(trustedTypes.isURL(url)); - let url2 = Object.create(url); - - // instanceof can pass, but we rely on isScript - assert_true(url2 instanceof TrustedURL); - assert_false(trustedTypes.isURL(url2)); - - let url3 = Object.assign({}, url, {toString: () => 'fake'}); - - assert_false(trustedTypes.isURL(url3)); - }, 'TrustedTypePolicyFactory.isURL requires the object to be created via policy.'); - // Test non-object parameters. test(t => { assert_false(trustedTypes.isHTML(null)); @@ -94,11 +76,6 @@ assert_false(trustedTypes.isScript(0.5)); assert_false(trustedTypes.isScript('test')); assert_false(trustedTypes.isScript({})); - assert_false(trustedTypes.isURL(null)); - assert_false(trustedTypes.isURL(123)); - assert_false(trustedTypes.isURL(0.5)); - assert_false(trustedTypes.isURL('test')); - assert_false(trustedTypes.isURL({})); assert_false(trustedTypes.isScriptURL(null)); assert_false(trustedTypes.isScriptURL(123)); assert_false(trustedTypes.isScriptURL(0.5)); @@ -126,30 +103,19 @@ assert_false(trustedTypes.isScriptURL({})); }, 'TrustedTypePolicyFactory.isScriptURL cannot be redefined.'); - test(t => { - try { trustedTypes.isURL = () => 'fake'; } catch { } - assert_false(trustedTypes.isURL({})); - }, 'TrustedTypePolicyFactory.isURL cannot be redefined.'); - // Redefinition tests, via Object.defineProperty. test(t => { - try { Object.defineProperty(TrustedTypes, 'isHTML', () => 'fake'); } catch { } + try { Object.defineProperty(trustedTypes, 'isHTML', () => 'fake'); } catch { } assert_false(trustedTypes.isHTML({})); }, 'TrustedTypePolicyFactory.IsHTML cannot be redefined via defineProperty.'); test(t => { - try { Object.defineProperty(TrustedTypes, 'isScript', () => 'fake'); } catch { } + try { Object.defineProperty(trustedTypes, 'isScript', () => 'fake'); } catch { } assert_false(trustedTypes.isScript({})); }, 'TrustedTypePolicyFactory.isScript cannot be redefined via definePropert.'); test(t => { - try { Object.defineProperty(TrustedTypes, 'isScriptURL', () => 'fake'); } catch { } + try { Object.defineProperty(trustedTypes, 'isScriptURL', () => 'fake'); } catch { } assert_false(trustedTypes.isScriptURL({})); }, 'TrustedTypePolicyFactory.isScriptURL cannot be redefined via definePropert.'); - - test(t => { - try { Object.defineProperty(TrustedTypes, 'isURL', () => 'fake'); } catch { } - assert_false(trustedTypes.isURL({})); - }, 'TrustedTypePolicyFactory.isURL cannot be redefined via definePropert.'); - </script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-metadata.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-metadata.tentative.html index 70f77b1b..da7d1b4 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-metadata.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/TrustedTypePolicyFactory-metadata.tentative.html
@@ -8,18 +8,15 @@ <body> <div id="target"></div> <script> - const policy = trustedTypes.createPolicy("anythinggoes", { "createHTML": x => x, "createScript": x => x, - "createURL": x => x, "createScriptURL": x => x, }); const create_value = { "TrustedHTML": policy.createHTML("hello"), "TrustedScript": policy.createScript("x => x + x"), - "TrustedURL": policy.createURL("https://url.invalid/"), "TrustedScriptURL": policy.createScriptURL("https://url.invalid/blubb.js"), null: "empty", }; @@ -34,8 +31,7 @@ // Also add several event handlers (onclick). let elements = ['madeup', 'b']; let properties = ['madeup', 'id', "onerror", "onclick"]; - const types = [null, "TrustedHTML", "TrustedScript", "TrustedScriptURL", - "TrustedURL"]; + const types = [null, "TrustedHTML", "TrustedScript", "TrustedScriptURL"]; // We'll wrap construction of the elements/properties list in a test, mainly // so we'll get decent error messages when it might fail. @@ -112,6 +108,11 @@ // return and hence skip the result comparison. case "outerHTML": return; + // URL-typed accessors + case "src": + if (elem == "iframe") + return; + break; // Properties starting with "on" are usually error handlers, // which will parse their input as a function. In this case, // also skip the result comparison. @@ -142,6 +143,5 @@ } } } - </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/Window-open.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/Window-open.tentative.html deleted file mode 100644 index 172d566e..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/Window-open.tentative.html +++ /dev/null
@@ -1,25 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> -<body> -<script> - // helper functions for the tests - function testWindowOpen(t, win, testNumber) { - let p = createURL_policy(window, testNumber); - let url = p.createURL(INPUTS.URL); - let child_window = win.open(url, "", ""); - child_window.onload = t.step_func_done(_ => { - assert_equals(child_window.location.href, "" + url); - child_window.close(); - }); - } - - test(t => { - testWindowOpen(t, window, 1); - }, "window.open via policy (successful URL transformation)."); - - test(t => { - testWindowOpen(t, document, 2); - }, "document.open via policy (successful URL transformation)."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html index 3cae5d29..1d6f3f6 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html
@@ -11,33 +11,6 @@ <script> const nullPolicy = trustedTypes.createPolicy('NullPolicy', {createScript: s => s}); - // TrustedURL Assignments - const URLTestCases = [ - [ 'a', 'href' ], - [ 'area', 'href' ], - [ 'base', 'href' ], - [ 'button', 'formAction' ], - [ 'form', 'action' ], - [ 'frame', 'src' ], - [ 'iframe', 'src' ], - [ 'img', 'src' ], - [ 'input', 'formAction' ], - [ 'input', 'src' ], - [ 'link', 'href' ], - [ 'video', 'src' ], - [ 'source', 'src' ], - [ 'track', 'src' ] - ]; - - URLTestCases.forEach(c => { - test(t => { - assert_element_accepts_trusted_url_explicit_set(window, c, t, c[0], c[1], RESULTS.URL); - assert_throws_no_trusted_type_explicit_set(c[0], c[1], 'A string'); - assert_throws_no_trusted_type_explicit_set(c[0], c[1], null); - assert_throws_no_trusted_type_explicit_set(c[0], c[1], nullPolicy.createScript('script')); - }, c[0] + "." + c[1] + " accepts only TrustedURL"); - }); - // TrustedScriptURL Assignments const scriptURLTestCases = [ [ 'embed', 'src' ], @@ -83,24 +56,17 @@ }); test(t => { - let el = document.createElement('iframe'); + let el = document.createElement('script'); assert_throws(new TypeError(), _ => { el.setAttribute('SrC', INPUTS.URL); }); assert_equals(el.src, ''); - }, "`Element.prototype.setAttribute.SrC = string` throws."); + }, "`Script.prototype.setAttribute.SrC = string` throws."); // After default policy creation string and null assignments implicitly call createXYZ - let p = window.trustedTypes.createPolicy("default", { createURL: createURLJS, createScriptURL: createScriptURLJS, createHTML: createHTMLJS, createScript: createScriptJS }, true); - URLTestCases.forEach(c => { - test(t => { - assert_element_accepts_trusted_type(c[0], c[1], INPUTS.URL, RESULTS.URL); - assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null")); - }, c[0] + "." + c[1] + " accepts string and null after default policy was created."); - }); - + let p = window.trustedTypes.createPolicy("default", { createScriptURL: createScriptURLJS, createHTML: createHTMLJS, createScript: createScriptJS }, true); scriptURLTestCases.forEach(c => { test(t => { assert_element_accepts_trusted_type(c[0], c[1], INPUTS.SCRIPTURL, RESULTS.SCRIPTURL); @@ -124,10 +90,6 @@ // Other attributes can be assigned with TrustedTypes or strings or null values test(t => { - assert_element_accepts_trusted_url_explicit_set(window, 'arel', t, 'a', 'rel', RESULTS.URL); - }, "a.rel assigned via policy (successful URL transformation)"); - - test(t => { assert_element_accepts_non_trusted_type_explicit_set('a', 'rel', 'A string', 'A string'); }, "a.rel accepts strings"); @@ -136,14 +98,14 @@ }, "a.rel accepts null"); test(t => { - let div = document.createElement('div'); - let span = document.createElement('span'); + let embed = document.createElement('embed'); + let script = document.createElement('script'); - div.setAttribute('src', INPUTS.URL); - let attr = div.getAttributeNode('src'); - div.removeAttributeNode(attr); - span.setAttributeNode(attr); + embed.setAttribute('src', INPUTS.SCRIPTURL); + let attr = embed.getAttributeNode('src'); + embed.removeAttributeNode(attr); + script.setAttributeNode(attr); - assert_equals(span.getAttribute('src'), INPUTS.URL); - }, "`span.src = setAttributeNode(div.src)` with string works."); + assert_equals(script.getAttribute('src'), RESULTS.SCRIPTURL); + }, "`script.src = setAttributeNode(embed.src)` with string works."); </script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html index 76a639a..5754521 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html
@@ -21,10 +21,6 @@ assert_element_accepts_trusted_script_url_set_ns(window, '2', t, 'a', 'b', RESULTS.SCRIPTURL); }, "Element.setAttributeNS assigned via policy (successful ScriptURL transformation)"); - test(t => { - assert_element_accepts_trusted_url_set_ns(window, '3', t, 'a', 'b', RESULTS.URL); - }, "Element.setAttributeNS assigned via policy (successful URL transformation)"); - // Unknown, namespaced attributes should not be TT checked: test(t => { assert_element_accepts_non_trusted_type_set_ns('a', 'b', 'A string', 'A string'); @@ -35,84 +31,12 @@ }, "Element.setAttributeNS accepts null for non-specced accessor"); // Setup trusted values for use in subsequent tests. - const url = createURL_policy(window, '4').createURL(INPUTS.URL); const script_url = createScriptURL_policy(window, '5').createScriptURL(INPUTS.ScriptURL); const html = createHTML_policy(window, '6').createHTML(INPUTS.HTML); const script = createScript_policy(window, '7').createScript(INPUTS.Script); - // SVG elements that use xlink:href (SVGURIReference) and that expect - // TrustedURL. - // There a number of affected elements, and there are several ways to set - // a namespaced attribute. Let's iterate over all combinations. const xlink = "http://www.w3.org/1999/xlink"; const svg = "http://www.w3.org/2000/svg"; - const elems = [ "a", "animate", "animateMotion", "animateTransform", - "discard", "feImage", "filter", "image", "linearGradient", - "mpath", "pattern", "radialGradient", "set", "textPath", - "use" ]; - - // There are multiple ways to set a namespaced attribute. Let's encapsulate - // each in a function. - const variants = { - "setAttributeNS with prefix": (element_name, value) => { - let elem = document.createElementNS(svg, element_name); - elem.setAttributeNS(xlink, "xlink:href", value); - return elem; - }, - "setAttributeNS without prefix": (element_name, value) => { - let elem = document.createElementNS(svg, element_name); - elem.setAttributeNS(xlink, "href", value); - return elem; - }, - "setAttribute with prefix": (element_name, value) => { - let elem = document.createElementNS(svg, element_name); - // Create the namespaced attribute with setAttributeNS. Then refer - // to it with the prefix in setAttribute. This test will break - // if either setAttributeNS or setAttribtue functionality it broken. - elem.setAttributeNS(xlink, "xlink:href", url); - elem.setAttribute("xlink:href", value); - return elem; - } - }; - for (const e of elems) { - for (const variant in variants) { - // Assigning a TrustedURL works. - test(t => { - let elem = variants[variant](e, url); - assert_equals("" + RESULTS.URL, - elem.getAttributeNodeNS(xlink, "href").value); - }, "Assigning TrustedURL to <svg:" + e + "> works via " + variant); - - // Assigning things that ought to not work. - const values = ["abc", null, script_url, html, script]; - values.forEach((value, index) => { - test(t => { - assert_throws(new TypeError(), _ => { variants[variant](e, value); }); - }, "Blocking non-TrustedURL assignment to <svg:" + e + "> via " + - variant + " value no " + index); - }); - } - } - - // Test 'synchronization' of 'xlink:href'. - test(t => { - // ..setAttribute("xlink:href") will behave differently, depending on - // whether the element already has an attribute by that name. Make sure - // that Trusted Type handling respects that difference. - - // Case 1: "xlink:href" on an empty element: This is an unknown attribute - // not processed by SVG, and string assignment should work. - let elem1 = document.createElementNS(svg, "a"); - elem1.setAttribute("xlink:href", "abc"); - - // Case 2: "xlink:href", after a namespaced attribute has been set: Now - // this mirrors the SVG attribute, and string assignment should fail. - let elem2 = document.createElementNS(svg, "a"); - elem2.setAttributeNS(xlink, "xlink:href", url); - assert_throws(new TypeError(), _ => { - elem2.setAttribute("xlink:href", "abc"); - }); - }, "Test synchronized, namespaced attributes."); // svg:script xlink:href=... expects a TrustedScriptURL. // Assigning a TrustedScriptURL works. @@ -126,7 +50,7 @@ // Assigning things that ought to not work. test(t => { let elem = document.createElementNS(svg, "script"); - const values = [ "abc", null, url, html, script ]; + const values = [ "abc", null, html, script ]; for (const v of values) { assert_throws(new TypeError(), _ => { elem.setAttributeNS(xlink, "href", v);
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative-expected.txt index ab07bc3..a0a879cc 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative-expected.txt +++ b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative-expected.txt
@@ -1,38 +1,10 @@ This is a testharness.js-based test. -PASS a.href accepts only TrustedURL -PASS area.href accepts only TrustedURL -PASS base.href accepts only TrustedURL -PASS button.formAction accepts only TrustedURL -PASS form.action accepts only TrustedURL -PASS frame.src accepts only TrustedURL -PASS iframe.src accepts only TrustedURL -PASS img.src accepts only TrustedURL -PASS input.formAction accepts only TrustedURL -PASS input.src accepts only TrustedURL -PASS link.href accepts only TrustedURL -PASS video.src accepts only TrustedURL -PASS source.src accepts only TrustedURL -PASS track.src accepts only TrustedURL PASS embed.src accepts only TrustedScriptURL PASS object.codeBase accepts only TrustedScriptURL PASS object.data accepts only TrustedScriptURL PASS script.src accepts only TrustedScriptURL PASS div.innerHTML accepts only TrustedHTML PASS iframe.srcdoc accepts only TrustedHTML -PASS a.href accepts string and null after default policy was created -PASS area.href accepts string and null after default policy was created -PASS base.href accepts string and null after default policy was created -PASS button.formAction accepts string and null after default policy was created -PASS form.action accepts string and null after default policy was created -PASS frame.src accepts string and null after default policy was created -PASS iframe.src accepts string and null after default policy was created -PASS img.src accepts string and null after default policy was created -PASS input.formAction accepts string and null after default policy was created -PASS input.src accepts string and null after default policy was created -PASS link.href accepts string and null after default policy was created -PASS video.src accepts string and null after default policy was created -PASS source.src accepts string and null after default policy was created -PASS track.src accepts string and null after default policy was created PASS embed.src accepts string and null after default policy was created PASS object.codeBase accepts string and null after default policy was created PASS object.data accepts string and null after default policy was created
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html index 89d1216..84ff83bc 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html
@@ -10,32 +10,6 @@ <body> <script> var testnb = 0; - // TrustedURL Assignments - const URLTestCases = [ - [ 'a', 'href' ], - [ 'area', 'href' ], - [ 'base', 'href' ], - [ 'button', 'formAction' ], - [ 'form', 'action' ], - [ 'frame', 'src' ], - [ 'iframe', 'src' ], - [ 'img', 'src' ], - [ 'input', 'formAction' ], - [ 'input', 'src' ], - [ 'link', 'href' ], - [ 'video', 'src' ], - [ 'source', 'src' ], - [ 'track', 'src' ] - ]; - - URLTestCases.forEach(c => { - test(t => { - assert_element_accepts_trusted_url(window, ++testnb, t, c[0], c[1], RESULTS.URL); - assert_throws_no_trusted_type(c[0], c[1], 'A string'); - assert_throws_no_trusted_type(c[0], c[1], null); - }, c[0] + "." + c[1] + " accepts only TrustedURL"); - }); - // TrustedScriptURL Assignments const scriptURLTestCases = [ [ 'embed', 'src' ], @@ -69,14 +43,7 @@ }); // After default policy creation string and null assignments implicitly call createHTML - let p = window.trustedTypes.createPolicy("default", { createURL: createURLJS, createScriptURL: createScriptURLJS, createHTML: createHTMLJS }, true); - - URLTestCases.forEach(c => { - test(t => { - assert_element_accepts_trusted_type(c[0], c[1], INPUTS.URL, RESULTS.URL); - assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null")); - }, c[0] + "." + c[1] + " accepts string and null after default policy was created"); - }); + let p = window.trustedTypes.createPolicy("default", { createScriptURL: createScriptURLJS, createHTML: createHTMLJS }, true); scriptURLTestCases.forEach(c => { test(t => {
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html deleted file mode 100644 index 8e89d0d..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-assign.tentative.html +++ /dev/null
@@ -1,53 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="support/helper.sub.js"></script> - - <meta http-equiv="Content-Security-Policy" content="trusted-types *"> -</head> -<body> -<script> - // TrustedURL assignments do not throw. - test(t => { - let p = createURL_policy(window, 1); - let url = p.createURL(location.href + "#xxx"); - location.assign(url); - assert_equals("" + url, location.href, "location href"); - }, "location.assign via policy (successful URL transformation)."); - - // String assignments throw. - test(t => { - let href = location.href; - assert_throws(new TypeError(), _ => { - location.assign("A string"); - }); - assert_equals(location.href, href); - }, "`location.assign = string` throws"); - - // Null assignment throws. - test(t => { - let href = location.href; - assert_throws(new TypeError(), _ => { - location.assign(null); - }); - assert_equals(location.href, href); - }, "`location.assign = null` throws"); - - // Create default policy. Applies to all subsequent tests. - let p = window.trustedTypes.createPolicy("default", - { createURL: createLocationURLJS }, true); - - // After default policy creation string assignment implicitly calls createURL. - test(t => { - location.assign("abcdefg"); - assert_true(location.href.endsWith("#abcdefg")); - }, "`location.assign = string` via default policy (successful URL transformation)."); - - // After default policy creation null assignment implicitly calls createURL. - test(t => { - location.assign(null); - assert_true(location.href.endsWith("#null")); - }, "`location.assign = null` via default policy does not throw."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html deleted file mode 100644 index 998ee21..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-href.tentative.html +++ /dev/null
@@ -1,53 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="support/helper.sub.js"></script> - - <meta http-equiv="Content-Security-Policy" content="trusted-types *"> -</head> -<body> -<script> - // TrustedURL assignments do not throw. - test(t => { - let p = createURL_policy(window, 1); - let url = p.createURL(location.href + "#xxx"); - location.href = url; - assert_equals("" + url, location.href, "location href"); - }, "location.href assigned via policy (successful URL transformation)."); - - // String assignments throw. - test(t => { - let href = location.href; - assert_throws(new TypeError(), _ => { - location.href = 'A string'; - }); - assert_equals(location.href, href); - }, "`location.href = string` throws"); - - // Null assignment throws. - test(t => { - let href = location.href; - assert_throws(new TypeError(), _ => { - location.href = null; - }); - assert_equals(location.href, href); - }, "`location.href = null` throws"); - - // Create default policy. Applies to all subsequent tests. - let p = window.trustedTypes.createPolicy("default", - { createURL: createLocationURLJS }, true); - - // After default policy creation string assignment implicitly calls createURL. - test(t => { - location.href = "xxxx"; - assert_true(location.href.endsWith("#xxxx")); - }, "`location.href = string` via default policy (successful URL transformation)."); - - // After default policy creation null assignment implicitly calls createURL. - test(t => { - location.href = null; - assert_true(location.href.endsWith("#null")); - }, "`location.href = null` assigned via default policy does not throw."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html deleted file mode 100644 index e85bb646..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Location-replace.tentative.html +++ /dev/null
@@ -1,53 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="support/helper.sub.js"></script> - - <meta http-equiv="Content-Security-Policy" content="trusted-types *"> -</head> -<body> -<script> - // TrustedURL replacements do not throw. - test(t => { - let p = createURL_policy(window, 1); - let url = p.createURL(location.href + "#xxx"); - location.replace(url); - assert_equals("" + url, location.href, "location href"); - }, "location.replace via policy (successful URL transformation)."); - - // String replacements throw. - test(t => { - let href = location.href; - assert_throws(new TypeError(), _ => { - location.replace("A string"); - }); - assert_equals(location.href, href); - }, "`location.replace = string` throws"); - - // Null replacement throws. - test(t => { - let href = location.href; - assert_throws(new TypeError(), _ => { - location.replace(null); - }); - assert_equals(location.href, href); - }, "`location.replace = null` throws"); - - // Create default policy. Applies to all subsequent tests. - let p = window.trustedTypes.createPolicy("default", - { createURL: createLocationURLJS }, true); - - // After default policy creation string assignment implicitly calls createURL. - test(t => { - location.replace("potato"); - assert_true(location.href.endsWith("#potato")); - }, "`location.replace = string` via default policy (successful URL transformation)."); - - // After default policy creation null assignment implicitly calls createURL. - test(t => { - location.replace(null); - assert_true(location.href.endsWith("#null")); - }, "`location.replace = null` via default policy (successful URL transformation)."); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html deleted file mode 100644 index e9c1c79..0000000 --- a/third_party/blink/web_tests/external/wpt/trusted-types/block-string-assignment-to-Window-open.tentative.html +++ /dev/null
@@ -1,85 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="support/helper.sub.js"></script> - - <meta http-equiv="Content-Security-Policy" content="trusted-types *"> -</head> -<body> -<script> - var testnb = 0; - // helper functions for the tests - function testWindowOpen(t, win, nb) { - let p = createURL_policy(window, nb); - let url = p.createURL(INPUTS.URL); - let child_window = win.open(url, "", ""); - t.add_cleanup(_ => child_window.close()); - child_window.onload = t.step_func_done(_ => { - assert_equals(child_window.location.href, "" + url); - }); - } - - function testWindowThrows(t, url, win, nb) { - let p = createURL_policy(window, nb); - assert_throws(new TypeError(), _ => { - let child_window = win.open(url, "", ""); - }); - } - - function testWindowDoesntThrow(t, url, expected, win) { - let child_window = win.open(url, "", ""); - t.add_cleanup(_ => child_window.close()); - child_window.onload = t.step_func_done(_ => { - assert_equals(child_window.location.href, expected); - }); - } - - // TrustedURL assignments do not throw. - test(t => { - testWindowOpen(t, window, ++testnb); - }, "window.open via policy (successful URL transformation)."); - - test(t => { - testWindowOpen(t, document, ++testnb); - }, "document.open via policy (successful URL transformation)."); - - // String assignments throw. - test(t => { - testWindowThrows(t, 'A string', window, ++testnb); - }, "`window.open(string)` throws."); - - test(t => { - testWindowThrows(t, 'A string', document, ++testnb); - }, "`document.open(string)` throws."); - - // Null assignment throws. - test(t => { - testWindowThrows(t, null, window, ++testnb); - }, "`window.open(null)` throws."); - - test(t => { - testWindowThrows(t, null, document, ++testnb); - }, "`document.open(null)` throws."); - - // After default policy creation string assignment implicitly calls createURL. - let p = window.trustedTypes.createPolicy("default", { createURL: createURLJS }, true); - test(t => { - testWindowDoesntThrow(t, INPUTS.URL, RESULTS.URL, window); - }, "'window.open(string)' assigned via default policy (successful URL transformation)."); - - test(t => { - testWindowDoesntThrow(t, INPUTS.URL, RESULTS.URL, document); - }, "'document.open(string)' assigned via default policy (successful URL transformation)."); - - test(t => { - testWindowDoesntThrow(t, null, "null", window); - }, "'window.open(null)' assigned via default policy does not throw."); - - test(t => { - testWindowDoesntThrow(t, null, "null", document); - }, "'document.open(null)' assigned via default policy does not throw."); -</script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/default-policy-report-only.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/default-policy-report-only.tentative.html index 1a54fd62..ba23d7a3 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/default-policy-report-only.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/default-policy-report-only.tentative.html
@@ -39,7 +39,6 @@ }, "Count SecurityPolicyViolation events."); const testCases = [ - [ "a", "href"], [ "script", "src" ], [ "div", "innerHTML" ], [ "script", "text" ], @@ -71,7 +70,6 @@ } trustedTypes.createPolicy("default", { - createURL: policy, createScriptURL: policy, createHTML: policy, createScript: policy @@ -105,6 +103,6 @@ }); // Trigger the exit condition in the "Count" promise test above. -try { document.createElement("a").href = "done"; } catch (e) {} +try { document.createElement("script").text = "done"; } catch (e) {} </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/default-policy.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/default-policy.tentative.html index 672eccf..955cdfaa 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/default-policy.tentative.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/default-policy.tentative.html
@@ -39,7 +39,6 @@ }, "Count SecurityPolicyViolation events."); const testCases = [ - [ "a", "href"], [ "script", "src" ], [ "div", "innerHTML" ], [ "script", "text" ], @@ -71,7 +70,6 @@ } trustedTypes.createPolicy("default", { - createURL: policy, createScriptURL: policy, createHTML: policy, createScript: policy @@ -105,6 +103,6 @@ }); // Trigger the exit condition in the "Count" promise test above. -try { document.createElement("a").href = "done"; } catch (e) {} +try { document.createElement("script").text = "done"; } catch (e) {} </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/idlharness.window.js b/third_party/blink/web_tests/external/wpt/trusted-types/idlharness.window.js index 4c1ee6e0..7be9615 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/idlharness.window.js +++ b/third_party/blink/web_tests/external/wpt/trusted-types/idlharness.window.js
@@ -11,7 +11,6 @@ TrustedHTML: ['window.trustedTypes.createPolicy("SomeName1", { createHTML: s => s }).createHTML("A string")'], TrustedScript: ['window.trustedTypes.createPolicy("SomeName2", { createScript: s => s }).createScript("A string")'], TrustedScriptURL: ['window.trustedTypes.createPolicy("SomeName3", { createScriptURL: s => s }).createScriptURL("A string")'], - TrustedURL: ['window.trustedTypes.createPolicy("SomeName4", { createURL: s => s }).createURL("A string")'] }); }, 'Trusted Types'
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/support/helper.sub.js b/third_party/blink/web_tests/external/wpt/trusted-types/support/helper.sub.js index d63ff54a..d13ad567 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/support/helper.sub.js +++ b/third_party/blink/web_tests/external/wpt/trusted-types/support/helper.sub.js
@@ -2,14 +2,12 @@ HTML: "Hi, I want to be transformed!", SCRIPT: "Hi, I want to be transformed!", SCRIPTURL: "http://this.is.a.scripturl.test/", - URL: "http://hello.i.am.an.url/" }; const RESULTS = { HTML: "Quack, I want to be a duck!", SCRIPT: "Meow, I want to be a cat!", SCRIPTURL: "http://this.is.a.successful.test/", - URL: "http://hooray.i.am.successfully.transformed/" }; function createHTMLJS(html) { @@ -26,19 +24,6 @@ return scripturl.replace("scripturl", "successful"); } -function createURLJS(url) { - return url.replace("hello", "hooray") - .replace("an.url", "successfully.transformed"); -} - -// When testing location.href (& friends), we have the problem that assigning -// to the new location will navigate away from the test. To fix this, we'll -// have a policy that will just stick the argument into the fragment identifier -// of the current location.href. -function createLocationURLJS(value) { - return location.href.replace(/#.*/g, "") + "#" + value; -} - function createHTML_policy(win, c) { return win.trustedTypes.createPolicy('SomeHTMLPolicyName' + c, { createHTML: createHTMLJS }); } @@ -51,10 +36,6 @@ return win.trustedTypes.createPolicy('SomeScriptURLPolicyName' + c, { createScriptURL: createScriptURLJS }); } -function createURL_policy(win, c) { - return win.trustedTypes.createPolicy('SomeURLPolicyName' + c, { createURL: createURLJS }); -} - function assert_element_accepts_trusted_html(win, c, t, tag, attribute, expected) { let p = createHTML_policy(win, c); let html = p.createHTML(INPUTS.HTML); @@ -73,12 +54,6 @@ assert_element_accepts_trusted_type(tag, attribute, scripturl, expected); } -function assert_element_accepts_trusted_url(win, c, t, tag, attribute, expected) { - let p = createURL_policy(win, c); - let url = p.createURL(INPUTS.URL); - assert_element_accepts_trusted_type(tag, attribute, url, expected); -} - function assert_element_accepts_trusted_type(tag, attribute, value, expected) { let elem = document.createElement(tag); elem[attribute] = value; @@ -112,12 +87,6 @@ assert_element_accepts_trusted_type_explicit_set(tag, attribute, scripturl, expected); } -function assert_element_accepts_trusted_url_explicit_set(win, c, t, tag, attribute, expected) { - let p = createURL_policy(win, c); - let url = p.createURL(INPUTS.URL); - assert_element_accepts_trusted_type_explicit_set(tag, attribute, url, expected); -} - function assert_element_accepts_trusted_type_explicit_set(tag, attribute, value, expected) { let elem = document.createElement(tag); elem.setAttribute(attribute, value); @@ -163,12 +132,6 @@ assert_element_accepts_trusted_type_set_ns(tag, attribute, scripturl, expected); } -function assert_element_accepts_trusted_url_set_ns(win, c, t, tag, attribute, expected) { - let p = createURL_policy(win, c); - let url = p.createURL(INPUTS.URL); - assert_element_accepts_trusted_type_set_ns(tag, attribute, url, expected); -} - function assert_element_accepts_trusted_type_set_ns(tag, attribute, value, expected) { let elem = document.createElement(tag); elem.setAttributeNS(namespace, attribute, value);
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-report-only.tentative.https.html b/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-report-only.tentative.https.html index 1a17d529..bf0a1eb 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-report-only.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-report-only.tentative.https.html
@@ -7,14 +7,14 @@ <body> <!-- Some elements for the tests to act on. --> - <a id="anchor" href="#">anchor</a> <div id="div"></div> <script id="script-src" src=""></script> <script id="script"></script> + <script id="script2"></script> <script> // CSP insists the "trusted-types: ..." directives are deliverd as headers - // (rather than as "<meta http-equiv" tags). This test assumes the following + // (rather than as "meta http-equiv" tags). This test assumes the following // headers are set in the .headers file: // // Content-Security-Policy-Report-Only: trusted-types ...; report-uri ... @@ -39,17 +39,16 @@ const policy = trustedTypes.createPolicy("two", { createHTML: id, createScriptURL: id, - createURL: id, createScript: id, }); - - +/* promise_test(t => { let p = expect_violation("trusted-types two"); - document.getElementById("anchor").href = "#abc"; - assert_true(document.getElementById("anchor").href.endsWith("#abc")); + document.getElementById("script").src = "#abc"; + assert_true(document.getElementById("script").src.endsWith("#abc")); return p; - }, "Trusted Type violation report-only: assign string to url"); + }, "Trusted Type violation report-only: assign string to script url"); +*/ promise_test(t => { let p = expect_violation("trusted-types two"); @@ -74,7 +73,7 @@ promise_test(t => { let p = expect_violation("trusted-types two"); - document.getElementById("anchor").href = "#def"; + document.getElementById("script").src = "#def"; return p.then(report => { assert_equals(report.documentURI, "" + window.location); assert_equals(report.disposition, "report"); @@ -83,7 +82,5 @@ assert_true(report.originalPolicy.startsWith("trusted-types two;")); }); }, "Trusted Type violation report: check report contents"); - </script> - </body>
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-reporting.tentative.https.html b/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-reporting.tentative.https.html index 6a79fec0..10a951fa 100644 --- a/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-reporting.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-reporting.tentative.https.html
@@ -77,7 +77,6 @@ const a_policy = { createHTML: id, createScriptURL: id, - createURL: id, createScript: id, }; @@ -127,9 +126,9 @@ promise_test(t => { let p = promise_violation("trusted-types two")(); - expect_throws(_ => document.getElementById("anchor").href = url); + expect_throws(_ => document.getElementById("script").src = url); return p; - }, "Trusted Type violation report: assign string to url"); + }, "Trusted Type violation report: assign string to script url"); promise_test(t => { let p = promise_violation("trusted-types two")(); @@ -139,10 +138,10 @@ promise_test(t => { let p = promise_flush()(); - document.getElementById("anchor").href = policy_one.createURL("#"); + document.getElementById("script").text = policy_one.createScript("2+2;"); flush(); return p; - }, "Trusted Type violation report: assign trusted URL to url; no report"); + }, "Trusted Type violation report: assign trusted script to script; no report"); promise_test(t => { let p = promise_flush()(); @@ -165,10 +164,10 @@ let p = Promise.resolve() .then(promise_violation("trusted-types two")) .then(expect_blocked_uri("trusted-types-sink")) - .then(expect_sample("HTMLAnchorElement.href")); - expect_throws(_ => { document.getElementById("anchor").href = "" }); + .then(expect_sample("HTMLScriptElement.src")); + expect_throws(_ => { document.getElementById("script").src = "" }); return p; - }, "Trusted Type violation report: sample for .href assignment"); + }, "Trusted Type violation report: sample for script.src assignment"); promise_test(t => { let p = Promise.resolve() @@ -210,24 +209,24 @@ // refer to the DOM elements being modified, so that Custom Elements cannot // "mask" the underlying DOM mechanism (for reporting). if (customElements) { - class CustomLink extends HTMLAnchorElement {}; - customElements.define("custom-link", CustomLink, { extends: "a" }); + class CustomScript extends HTMLScriptElement {}; + customElements.define("custom-script", CustomScript, { extends: "script" }); promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types one")) .then(expect_blocked_uri("trusted-types-sink")) - .then(expect_sample("HTMLAnchorElement.href")) + .then(expect_sample("HTMLScriptElement.src")) .then(expect_sample("abc")); - expect_throws(_ => document.getElementById("customlink").href = "abc"); + expect_throws(_ => document.getElementById("customscript").src = "abc"); return p; }, "Trusted Type violation report: sample for custom element assignment"); } + </script> <!-- Some elements for the tests to act on. --> - <a id="anchor" href="">anchor</a> <div id="div"></div> <script id="script"></script> - <a id="customlink" is="custom-link" href="a"></a> + <script id="customscript" is="custom-script" src="a"></script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/background.png b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/background.png new file mode 100644 index 0000000..6d16cc8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/background.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority-ref.html new file mode 100644 index 0000000..b479029 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority-ref.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Reference for Embedded Style: Cascade Priority</title> +<style> +::cue { + color: green; +} +::cue { + background: green; +} +::cue { + opacity: 0.5; +} +</style> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority.html new file mode 100644 index 0000000..db6822e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_cascade_priority.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Embedded Style: Cascade Priority</title> +<link rel="match" href="embedded_style_cascade_priority-ref.html"> +<link rel="help" href="https://w3c.github.io/webvtt/#obtaining-css-boxes"> +<script src="/common/reftest-wait.js"></script> +<style> +/* Embedded style should take precedence over author style, so the cue color should be green. */ +::cue { + color: red; +} +</style> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_cascade_priority.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_imports_blocked-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_imports_blocked-ref.html new file mode 100644 index 0000000..1cb9d24c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_imports_blocked-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Reference for Embedded Style: Imports Blocked</title> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_imports_blocked.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_imports_blocked.html new file mode 100644 index 0000000..1ffdf078 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_imports_blocked.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Embedded Style: Imports Blocked</title> +<link rel="match" href="embedded_style_imports_blocked-ref.html"> +<link rel="help" href="https://w3c.github.io/webvtt/#obtaining-css-boxes"> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_imports_blocked.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_invalid_format-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_invalid_format-ref.html new file mode 100644 index 0000000..698ac7b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_invalid_format-ref.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Reference for Embedded Style: Invalid Format</title> +<style> +::cue { + color: green; +} +::cue(v[voice=Voice1]) +{ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==) +} +</style> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_invalid_format.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_invalid_format.html new file mode 100644 index 0000000..746816f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_invalid_format.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Embedded Style: Invalid Format</title> +<link rel="match" href="embedded_style_invalid_format-ref.html"> +<link rel="help" href="https://w3c.github.io/webvtt/#obtaining-css-boxes"> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_invalid_format.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries-ref.html new file mode 100644 index 0000000..f99172e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries-ref.html
@@ -0,0 +1,4 @@ +<!DOCTYPE html> +<title>Embedded Style: Media Queries</title> +<style>iframe {width:100%; height:500px}</style> +<iframe src="support/embedded_style_media_queries-iframe-ref.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries.html new file mode 100644 index 0000000..010314dd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries.html
@@ -0,0 +1,19 @@ +<!doctype html> +<html class="reftest-wait"> +<title>Embedded Style: Media Queries</title> +<link rel="match" href="embedded_style_media_queries-ref.html"> +<script src="/common/reftest-wait.js"></script> +<style>iframe {width:100%; height:500px}</style> +<script> + onload = function() { + let iframeWindow = document.querySelector('iframe').contentWindow; + iframeWindow.requestAnimationFrame(() => { + iframeWindow.requestAnimationFrame(() => { + setTimeout(function() { + takeScreenshot(); + }, 100); + }); + }); + }; +</script> +<iframe src="support/embedded_style_media_queries-iframe.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries_resized-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries_resized-ref.html new file mode 100644 index 0000000..5f1e0b96 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries_resized-ref.html
@@ -0,0 +1,4 @@ +<!DOCTYPE html> +<title>Embedded Style: Media Queries Resize Frame</title> +<style>iframe {width:100%; height:300px}</style> +<iframe src="support/embedded_style_media_queries_resized-iframe-ref.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries_resized.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries_resized.html new file mode 100644 index 0000000..703d7367 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries_resized.html
@@ -0,0 +1,20 @@ +<!doctype html> +<html class="reftest-wait"> +<title>Embedded Style: Media Queries Resize Frame</title> +<link rel="match" href="embedded_style_media_queries_resized-ref.html"> +<script src="/common/reftest-wait.js"></script> +<style>iframe {width:100%; height:500px}</style> +<script> + onload = function() { + document.getElementById("form-iframe").style.height = "300px"; + let iframeWindow = document.querySelector('iframe').contentWindow; + iframeWindow.requestAnimationFrame(() => { + iframeWindow.requestAnimationFrame(() => { + setTimeout(function() { + takeScreenshot(); + }, 100); + }); + }); + }; +</script> +<iframe id="form-iframe" src="support/embedded_style_media_queries_resized-iframe.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_multiple_tracks-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_multiple_tracks-ref.html new file mode 100644 index 0000000..4b956da --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_multiple_tracks-ref.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Reference for Embedded Style: Multiple Tracks, style only applies to the track it was sourced for</title> +<style> +::cue(v[voice=Voice1]) { + color: green; +} +</style> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_without_style.vtt"> + <script> + document.getElementsByTagName('track')[0].track.mode = 'showing'; + document.getElementsByTagName('track')[1].track.mode = 'showing'; + </script> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_multiple_tracks.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_multiple_tracks.html new file mode 100644 index 0000000..3c82027 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_multiple_tracks.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Embedded Style: Multiple Tracks, style only applies to the track it was sourced for</title> +<link rel="match" href="embedded_style_multiple_tracks-ref.html"> +<link rel="help" href="https://w3c.github.io/webvtt/#obtaining-css-boxes"> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_multiple_tracks1.vtt"> + <track src="support/embedded_style_multiple_tracks2.vtt"> + <script> + document.getElementsByTagName('track')[0].track.mode = 'showing'; + document.getElementsByTagName('track')[1].track.mode = 'showing'; + </script> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_selectors-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_selectors-ref.html new file mode 100644 index 0000000..b3afb367 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_selectors-ref.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Reference for Embedded Style: Selectors</title> +<style> +::cue(b) { + background: green; + color: green; +} +::cue(i) { + background: lime; + color: lime; +} +::cue { + font-size: 11px; +} +</style> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_selectors.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_selectors.html new file mode 100644 index 0000000..55db5c7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_selectors.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Embedded Style: Selectors</title> +<link rel="match" href="embedded_style_selectors-ref.html"> +<link rel="help" href="https://w3c.github.io/webvtt/#obtaining-css-boxes"> +<script src="/common/reftest-wait.js"></script> + +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_selectors.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls-ref.html new file mode 100644 index 0000000..6eca0450 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls-ref.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Reference for Embedded Style: URLs, only allow data URLs</title> +<style> +::cue(v[voice=Voice1]) +{ + background: url(data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7) +} +::cue(b) +{ + background: url("support/invalid.png") +} +::cue(i) +{ + background: url("support/invalid.png") +} +</style> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls.html new file mode 100644 index 0000000..2faff05 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_urls.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Embedded Style: URLs, only allow data URLs</title> +<link rel="match" href="embedded_style_urls-ref.html"> +<link rel="help" href="https://w3c.github.io/webvtt/#obtaining-css-boxes"> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/embedded_style_urls.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_cascade_priority.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_cascade_priority.vtt new file mode 100644 index 0000000..9471b32b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_cascade_priority.vtt
@@ -0,0 +1,25 @@ +WEBVTT + +NOTE +opacity: 0.5; should apply. +color: green; should apply. +background: green; should apply because multiple STYLE blocks are supported. + +STYLE +::cue { + opacity: 0.5; +} +::cue { + color: green; +} + +STYLE +::cue { + background: green; +} + +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle + +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_imports_blocked.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_imports_blocked.vtt new file mode 100644 index 0000000..11a84af --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_imports_blocked.vtt
@@ -0,0 +1,14 @@ +WEBVTT + +NOTE +@import rules are prohibited in WebVTT files. + +STYLE +@import "imported_style.css" +@import url("imported_style.css") + +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle + +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_invalid_format.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_invalid_format.vtt new file mode 100644 index 0000000..51c231a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_invalid_format.vtt
@@ -0,0 +1,79 @@ +WEBVTT + +NOTE +Only color: green; and the green background-image should apply. All other style blocks are invalid. + +::cue { + background: red; +} + +STYLE + +::cue { + background: red; +} + +STYLE +::cue(v[voice=Voice1]) +{ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg== + +STYLE +::cue { + back + +STYLE +ground: red; +} + +STYLE +::cue { + color: green; +} + +S T Y L E +::cue { + background: red; +} + + STYLE +::cue { + background: red; +} + +STYLE { +::cue { + background: red; +} +} + +::cue { + background: red; +} + +STYLE Invalid +::cue { + background: red; +} + +style +::cue { + background: red; +} + +STYLE +<!--::cue {--> + background: red; +} + +STYLE +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle + +STYLE +::cue { + background: red; +} + +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries-iframe-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries-iframe-ref.html new file mode 100644 index 0000000..f08a607 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries-iframe-ref.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>Reference for Embedded Style: Media Queries</title> +<style> +video { + outline: solid; + width: 320px; + height: 240px; +} +::cue { + color: green; +} +</style> +<video autoplay onplaying="this.onplaying = null; this.pause();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries-iframe.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries-iframe.html new file mode 100644 index 0000000..e27ca604 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries-iframe.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>Embedded Style: Media Queries</title> +<style> +video { + outline: solid; + width: 320px; + height: 240px; +} +</style> +<video autoplay onplaying="this.onplaying = null; this.pause();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="embedded_style_media_queries.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries.vtt new file mode 100644 index 0000000..1b875cd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries.vtt
@@ -0,0 +1,34 @@ +WEBVTT +NOTE +color: red; should not apply because it is overriden by color: green. +color: green; should apply because the screen width is less than 1000px. +background: green; should only apply in the resized test case where the screen is resized to 300px. +background: red; should not apply because the screen width is greater than 100px. +STYLE +::cue +{ + color: red; +} +@media only screen and (max-height: 1000px) { + ::cue + { + color: green; + } +} +@media only screen and (max-height: 400px) { + ::cue + { + background: green; + } +} +} +@media only screen and (max-height: 100px) { + ::cue + { + background: red; + } +} +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries_resized-iframe-ref.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries_resized-iframe-ref.html new file mode 100644 index 0000000..ab7553e2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries_resized-iframe-ref.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>Reference for Embedded Style: Media Queries Resize Frame</title> +<style> +video { + outline: solid; + width: 320px; + height: 240px; +} +::cue { + color: green; + background: green; +} +</style> +<video autoplay onplaying="this.onplaying = null; this.pause();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="embedded_style_without_style.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries_resized-iframe.html b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries_resized-iframe.html new file mode 100644 index 0000000..f4bfeea --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_media_queries_resized-iframe.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>Embedded Style: Media Queries Resize Frame</title> +<style> +video { + outline: solid; + width: 320px; + height: 240px; +} +</style> +<video autoplay onplaying="this.onplaying = null; this.pause();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="embedded_style_media_queries.vtt" default> +</video> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_multiple_tracks1.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_multiple_tracks1.vtt new file mode 100644 index 0000000..a756c3c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_multiple_tracks1.vtt
@@ -0,0 +1,12 @@ +WEBVTT + +NOTE +The style in this file should not apply to cues from other text tracks. + +STYLE +::cue { + color: green; +} + +00:00:00.000 --> 00:00:05.000 +This <i>is</i> a <b>test</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_multiple_tracks2.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_multiple_tracks2.vtt new file mode 100644 index 0000000..c13757d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_multiple_tracks2.vtt
@@ -0,0 +1,4 @@ +WEBVTT + +00:00:00.000 --> 00:00:05.000 +Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_selectors.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_selectors.vtt new file mode 100644 index 0000000..258f9c8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_selectors.vtt
@@ -0,0 +1,48 @@ +WEBVTT +NOTE +The first five selectors should apply. The rest should not apply because they do +not apply to a hypothetical document with a single empty element with no explicit +name, no namespace, no attribute, no classes, no IDs, and unknown primary language +that acts as the originating element for the cue pseudo-elements. +STYLE +@namespace html url(http://www.w3.org/1999/xhtml); +*|*::cue(b) { + background: green; +} +|*::cue(i) { + color: lime; +} +::cue(i) { + background: lime; +} +*::cue(b) { + color: green; +} +::cue { + font-size: 11px; +} +video::cue { + background: red; +} +i { + color: red; +} +* { + color: red; +} +* ::cue(i) { + color: red; +} +* > *::cue(i) { + color: red; +} +* + *::cue(i) { + color: red; +} +html|*::cue(i) { + color: red; +} +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_urls.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_urls.vtt new file mode 100644 index 0000000..db526deb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_urls.vtt
@@ -0,0 +1,21 @@ +WEBVTT +NOTE +Background for Voice1 should apply. +The other two backgrounds should not render because non-data URLs are not supported. +STYLE +::cue(v[voice=Voice1]) +{ + background: url(data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7) +} +::cue(b) +{ + background: url("support/background.png") +} +::cue(i) { + background: url("support/background.png"); + background: -webkit-image-set(url("support/background.png") 1x, url("support/background.png") 2x); +} +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_without_style.vtt b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_without_style.vtt new file mode 100644 index 0000000..321a094f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/embedded_style_without_style.vtt
@@ -0,0 +1,7 @@ +WEBVTT + +00:00:00.000 --> 00:00:05.000 +<v Voice1>This <i>is</i> a <b>test</b> subtitle + +00:00:00.000 --> 00:00:05.000 +<v Voice2>Here <i>is</i> a <b>second</b> subtitle
diff --git a/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/imported_style.css b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/imported_style.css new file mode 100644 index 0000000..391dd74 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webvtt/rendering/cues-with-video/processing-model/support/imported_style.css
@@ -0,0 +1,3 @@ +::cue { + color: red; +}
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/geometry/layer-due-to-layer-children-deep-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/geometry/layer-due-to-layer-children-deep-expected.png deleted file mode 100644 index 0d320820..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/geometry/layer-due-to-layer-children-deep-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/geometry/layer-due-to-layer-children-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/geometry/layer-due-to-layer-children-expected.png deleted file mode 100644 index 75438dca..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/geometry/layer-due-to-layer-children-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/overflow/nested-render-surfaces-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/overflow/nested-render-surfaces-expected.png deleted file mode 100644 index 825aa9b6..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/overflow/nested-render-surfaces-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/fast/dom/scroll-reveal-left-overflow-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/fast/dom/scroll-reveal-left-overflow-expected.png deleted file mode 100644 index f5d6dae..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/fast/dom/scroll-reveal-left-overflow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/fast/events/touch/compositor-touch-hit-rects-animation-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/fast/events/touch/compositor-touch-hit-rects-animation-expected.txt deleted file mode 100644 index d6e91002..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/fast/events/touch/compositor-touch-hit-rects-animation-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This test verifies the hit test regions are updated correctly when composited layer are created and destroyed without triggering layout update during fast path animation. - -[object HTMLDivElement]: layer(800x600) has hit test rect (200,200 50x50) - -[object HTMLDivElement]: layer(50x50) has hit test rect (0,0 50x50) - -[object HTMLDivElement]: layer(800x600) has hit test rect (175,175 100x100) - - -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-4-and-click-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-4-and-click-expected.png deleted file mode 100644 index fb54268..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-4-and-click-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-5-and-click-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-5-and-click-expected.png deleted file mode 100644 index c69ce951..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-5-and-click-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-9-and-click-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-9-and-click-expected.png deleted file mode 100644 index f39e51a2..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-add-summary-9-and-click-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-3-and-click-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-3-and-click-expected.png deleted file mode 100644 index 28f7886..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-3-and-click-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-6-and-click-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-6-and-click-expected.png deleted file mode 100644 index 33f9eef..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-6-and-click-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/video-surface-layer/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/video-surface-layer/media/video-zoom-controls-expected.png deleted file mode 100644 index a8089edb..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/virtual/video-surface-layer/media/video-zoom-controls-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/serial-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/serial-origin-trial-interfaces.html new file mode 100644 index 0000000..b59fe552 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/serial-origin-trial-interfaces.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- Generate token with the command: +generate_token.py http://127.0.0.1:8000 Serial --expire-timestamp=2000000000 +-- --> +<meta http-equiv="origin-trial" content="At0SGGQC1y/viEH1bb+J0N7TA5ZWcC2RlOG3l/ZpDjqo49ctt3m+xjw0p/Jnxh4IN2F5343SciSAI/cZxA7HHwAAAABOeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiU2VyaWFsIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9" /> +<title>Serial - interfaces exposed by origin trial</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../../resources/origin-trials-helper.js"></script> +<script> +test(t => { + OriginTrialsHelper.check_properties_exist(this, + { + 'Navigator': ['serial'], + 'SerialPort': ['close', 'getSignals', 'open', 'readable', 'setSignals', + 'writable'], + 'Serial': ['getPorts', 'requestPort'], + }, + ); +}, "Serial related interfaces in Origin-Trial enabled document."); + +</script>
diff --git a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js index 4177283..df05bd0 100644 --- a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js +++ b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
@@ -1,17 +1,20 @@ (async function(testRunner) { var {page, session, dp} = await testRunner.startHTML(` - <div id='activatable' rendersubtree='invisible skip-viewport-activation'> + <div id='activatable' rendersubtree='invisible-activatable'> locked <div id='child'> child <div id='grandChild'>grandChild</div> </div> <div id='invisible' style='display:none'>invisible</div> - <div id='nested' rendersubtree='invisible skip-viewport-activation'>nested</div> + <div id='nested' rendersubtree='invisible-activatable'>nested</div> text </div> - <div id='nonActivatable' rendersubtree='invisible skip-activation'>nonActivatable text</div> + <div id='nonActivatable' rendersubtree='invisible'>nonActivatable text</div> <div id='normal'>normal text</div> + <script> + activatable.getBoundingClientRect(); // Force layout + </script> `, 'Tests accessibility values of display locked nodes'); const dumpAccessibilityNodesFromList = (await testRunner.loadScript('../resources/accessibility-dumpAccessibilityNodesFromList.js'))(testRunner, session);
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt index dd04540..3e128bf 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1518,10 +1518,6 @@ [Worker] attribute @@toStringTag [Worker] method constructor [Worker] method request -[Worker] interface WakeLockEvent : Event -[Worker] attribute @@toStringTag -[Worker] getter lock -[Worker] method constructor [Worker] interface WakeLockSentinel : EventTarget [Worker] attribute @@toStringTag [Worker] getter onrelease
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 5d9a5c1..e3b3b80 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -8139,10 +8139,6 @@ method getAttributeType method getPropertyType method getTypeMapping -interface TrustedURL - attribute @@toStringTag - method constructor - method toString interface UIEvent : Event attribute @@toStringTag getter detail @@ -8468,10 +8464,6 @@ attribute @@toStringTag method constructor method request -interface WakeLockEvent : Event - attribute @@toStringTag - getter lock - method constructor interface WakeLockSentinel : EventTarget attribute @@toStringTag getter onrelease
diff --git a/third_party/blink/web_tests/wpt_internal/wake-lock/wakelock-onrelease.https.html b/third_party/blink/web_tests/wpt_internal/wake-lock/wakelock-onrelease.https.html new file mode 100644 index 0000000..d43579e --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/wake-lock/wakelock-onrelease.https.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<link rel="help" href="https://w3c.github.io/wake-lock/#the-onrelease-attribute"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +// TODO(https://crbug.com/1015327): Move this to WPT once we can change +// permissions via testdriver.js. + +async_test(async t => { + window.testRunner.setPermission('wake-lock-screen', 'granted', location.origin, location.origin); + + const lock = await navigator.wakeLock.request("screen"); + lock.onrelease = t.step_func_done((ev) => { + assert_class_string(ev, "Event", "release() must fire an Event object"); + assert_equals(ev.target, lock, "The event's target must be the lock that was acquired"); + assert_true(ev.isTrusted); + assert_false(ev.bubbles); + assert_false(ev.cancelable); + }); + await lock.release(); +}, "Test onreleased event's basic properties"); +</script>
diff --git a/third_party/jsoncpp/BUILD.gn b/third_party/jsoncpp/BUILD.gn index f2f48b9..fd203e9 100644 --- a/third_party/jsoncpp/BUILD.gn +++ b/third_party/jsoncpp/BUILD.gn
@@ -51,16 +51,18 @@ } } -fuzzer_test("jsoncpp_fuzzer") { - sources = [ - "fuzzers/json_fuzzer.cc", - ] +if (build_with_chromium) { + fuzzer_test("jsoncpp_fuzzer") { + sources = [ + "fuzzers/json_fuzzer.cc", + ] - deps = [ - ":jsoncpp", - ] + deps = [ + ":jsoncpp", + ] - include_dirs = [ "generated" ] + include_dirs = [ "generated" ] - dict = "//testing/libfuzzer/fuzzers/dicts/json.dict" + dict = "//testing/libfuzzer/fuzzers/dicts/json.dict" + } }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 721a1fe..57a374a7 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -20899,6 +20899,9 @@ <int value="1391" label="AUTOTESTPRIVATE_WAITFORDISPLAYROTATION"/> <int value="1392" label="AUTOTESTPRIVATE_ARCAPPTRACINGSTART"/> <int value="1393" label="AUTOTESTPRIVATE_ARCAPPTRACINGSTOPANDANALYZE"/> + <int value="1394" label="AUTOTESTPRIVATE_GETAPPWINDOWLIST"/> + <int value="1395" label="AUTOTESTPRIVATE_SETAPPWINDOWSTATE"/> + <int value="1396" label="AUTOTESTPRIVATE_CLOSEAPPWINDOW"/> </enum> <enum name="ExtensionIconState"> @@ -53980,6 +53983,18 @@ <int value="1" label="Lax method unsafe"/> <int value="2" label="Laxly same-site"/> <int value="3" label="Strictly same-site"/> + <int value="33" + label="Lax method unsafe insecure site-for-cookies to secure request"/> + <int value="34" + label="Laxly same-site insecure site-for-cookies to secure request"/> + <int value="35" + label="Strictly same-site insecure site-for-cookies to secure request"/> + <int value="65" + label="Lax method unsafe secure site-for-cookies to insecure request"/> + <int value="66" + label="Laxly same-site secure site-for-cookies to insecure request"/> + <int value="67" + label="Strictly same-site secure site-for-cookies to insecure request"/> </enum> <enum name="SamlInSessionPasswordChangeEvent">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 9fe791b9..0b1267d0 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -16186,7 +16186,8 @@ </summary> </histogram> -<histogram name="Blink.Sms.Receive.TimeCancelOnKeyboardDismissal" units="ms"> +<histogram name="Blink.Sms.Receive.TimeCancelOnKeyboardDismissal" units="ms" + expires_after="M82"> <owner>goto@chromium.org</owner> <owner>reillyg@chromium.org</owner> <owner>juncai@chromium.org</owner> @@ -16197,7 +16198,8 @@ </summary> </histogram> -<histogram name="Blink.Sms.Receive.TimeCancelOnSuccess" units="ms"> +<histogram name="Blink.Sms.Receive.TimeCancelOnSuccess" units="ms" + expires_after="M82"> <owner>goto@chromium.org</owner> <owner>reillyg@chromium.org</owner> <owner>ayui@chromium.org</owner> @@ -17239,7 +17241,7 @@ </histogram> <histogram name="Bluetooth.Android.GATTConnection.Disconnected.Result" - enum="AndroidGATTConnectionErrorCodes"> + enum="AndroidGATTConnectionErrorCodes" expires_after="M82"> <owner>odejesush@chromium.org</owner> <owner>ortuno@chromium.org</owner> <owner>reillyg@chromium.org</owner> @@ -17250,7 +17252,7 @@ </histogram> <histogram name="Bluetooth.Android.GATTConnection.Failure.Result" - enum="AndroidGATTConnectionErrorCodes"> + enum="AndroidGATTConnectionErrorCodes" expires_after="M82"> <owner>odejesush@chromium.org</owner> <owner>ortuno@chromium.org</owner> <owner>reillyg@chromium.org</owner> @@ -17261,7 +17263,7 @@ </histogram> <histogram name="Bluetooth.Android.GATTConnection.Success.Result" - enum="AndroidGATTConnectionErrorCodes"> + enum="AndroidGATTConnectionErrorCodes" expires_after="M82"> <owner>odejesush@chromium.org</owner> <owner>ortuno@chromium.org</owner> <owner>reillyg@chromium.org</owner> @@ -17476,7 +17478,8 @@ </summary> </histogram> -<histogram name="Bluetooth.Web.Android" enum="AndroidGATTStatusResult"> +<histogram name="Bluetooth.Web.Android" enum="AndroidGATTStatusResult" + expires_after="M82"> <!-- Name completed by histogram_suffixes name="AndroidGATTEvents" --> <owner>odejesush@chromium.org</owner> @@ -17518,7 +17521,7 @@ </histogram> <histogram name="Bluetooth.Web.Characteristic.ReadValue.Outcome" - enum="WebBluetoothGATTOperationOutcome"> + enum="WebBluetoothGATTOperationOutcome" expires_after="M82"> <owner>odejesush@chromium.org</owner> <owner>ortuno@chromium.org</owner> <owner>reillyg@chromium.org</owner> @@ -17531,7 +17534,7 @@ </histogram> <histogram name="Bluetooth.Web.Characteristic.StartNotifications.Outcome" - enum="WebBluetoothGATTOperationOutcome"> + enum="WebBluetoothGATTOperationOutcome" expires_after="M82"> <owner>odejesush@chromium.org</owner> <owner>ortuno@chromium.org</owner> <owner>reillyg@chromium.org</owner> @@ -17666,7 +17669,7 @@ </histogram> <histogram name="Bluetooth.Web.GetCharacteristics.Characteristic" - enum="GATTCharacteristicHash"> + enum="GATTCharacteristicHash" expires_after="M82"> <owner>odejesush@chromium.org</owner> <owner>ortuno@chromium.org</owner> <owner>reillyg@chromium.org</owner> @@ -25083,6 +25086,16 @@ </summary> </histogram> +<histogram name="Cookie.IncludedRequestEffectiveSameSite" + enum="CookieEffectiveSameSite" expires_after="M90"> + <owner>bingler@chromium.org</owner> + <owner>chlily@chromium.org</owner> + <summary> + The value of the effective samesite for cookies that will be included in a + request. Logged once per successful inclusion. + </summary> +</histogram> + <histogram name="Cookie.KillDatabaseResult" enum="BooleanSuccess" expires_after="M82"> <owner>morlovich@chromium.org</owner> @@ -25209,6 +25222,17 @@ </summary> </histogram> +<histogram name="Cookie.SameSiteDifferentSchemeRequest" + enum="SameSiteCookieContext" expires_after="M90"> + <owner>bingler@chromium.org</owner> + <owner>kaustubhag@chromium.org</owner> + <summary> + The value of the SameSiteCookieContext if a Lax or Strict cookie is being + sent http-to-https or https-to-http for the site-for-cookies to the request. + Logged once per cookie sent with the above conditions. + </summary> +</histogram> + <histogram name="Cookie.SameSiteNoneIsSecure" enum="Boolean" expires_after="M90"> <owner>chlily@chromium.org</owner> @@ -29579,7 +29603,8 @@ </summary> </histogram> -<histogram name="DataUse.ContentType.UserTrafficKB" enum="DataUseContentType"> +<histogram name="DataUse.ContentType.UserTrafficKB" enum="DataUseContentType" + expires_after="M82"> <owner>rajendrant@chromium.org</owner> <owner>bengr@chromium.org</owner> <summary> @@ -36710,7 +36735,7 @@ </histogram> <histogram base="true" name="Enterprise.AutoEnrollmentRequestNetworkErrorCode" - enum="NetErrorCodes"> + enum="NetErrorCodes" expires_after="M82"> <!-- Name completed by histogram_suffixes name="EnterpriseAutoEnrollmentType". --> <owner>pmarko@chromium.org</owner> @@ -59612,7 +59637,7 @@ </summary> </histogram> -<histogram name="ManagedUsers.SafeSitesDelay" units="ms"> +<histogram name="ManagedUsers.SafeSitesDelay" units="ms" expires_after="M82"> <owner>treib@chromium.org</owner> <owner>escordeiro@chromium.org</owner> <owner>menegola@chromium.org</owner> @@ -128979,7 +129004,8 @@ </summary> </histogram> -<histogram name="Security.SafetyTips.OpenTime.DismissWithEsc" units="ms"> +<histogram name="Security.SafetyTips.OpenTime.DismissWithEsc" units="ms" + expires_after="M82"> <owner>jdeblasio@chromium.org</owner> <owner>estark@chromium.org</owner> <owner>livvielin@chromium.org</owner> @@ -132358,7 +132384,8 @@ </summary> </histogram> -<histogram name="SessionStorageContext.ReadVersionError" enum="LevelDBStatus"> +<histogram name="SessionStorageContext.ReadVersionError" enum="LevelDBStatus" + expires_after="M82"> <owner>dmurph@chromium.org</owner> <summary> The reason reading the schema version of the SessionStorage database failed. @@ -133269,7 +133296,7 @@ </histogram> <histogram name="Setup.Install.DeleteIExecuteCommandClassKey" - enum="BooleanDeletedOrNot"> + enum="BooleanDeletedOrNot" expires_after="M82"> <owner>grt@chromium.org</owner> <summary> Hit following a successful install or update when the COM registration for @@ -133368,7 +133395,8 @@ </summary> </histogram> -<histogram name="Setup.Install.PeakPagefileUsage" units="KB"> +<histogram name="Setup.Install.PeakPagefileUsage" units="KB" + expires_after="M82"> <owner>huangs@chromium.org</owner> <summary> The peak page file usage by setup.exe in KB during install or uninstall @@ -133376,7 +133404,8 @@ </summary> </histogram> -<histogram name="Setup.Install.PeakWorkingSetSize" units="KB"> +<histogram name="Setup.Install.PeakWorkingSetSize" units="KB" + expires_after="M82"> <owner>huangs@chromium.org</owner> <summary> The peak working set size of setup.exe in KB during install or uninstall @@ -133393,7 +133422,8 @@ </summary> </histogram> -<histogram name="Setup.Install.Result" enum="SetupInstallResult"> +<histogram name="Setup.Install.Result" enum="SetupInstallResult" + expires_after="M82"> <owner>grt@chromium.org</owner> <owner>bcwhite@chromium.org</owner> <summary> @@ -162336,7 +162366,7 @@ </histogram> <histogram name="WebRTC.Video.Screenshare.BandwidthLimitedResolutionsDisabled" - units="disabled resolutions"> + units="disabled resolutions" expires_after="M82"> <owner>sprang@chromium.org</owner> <summary> For frames that are limited in resolution due to bandwidth, the average
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index 38f238d..f77fd1a 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -56,7 +56,6 @@ # are okay with potentially encountering issues. GTEST_CONVERSION_WHITELIST = [ 'angle_perftests', - 'browser_tests', 'cc_perftests', 'components_perftests', 'gpu_perftests',
diff --git a/ui/accessibility/ax_node_position_unittest.cc b/ui/accessibility/ax_node_position_unittest.cc index 78f35a4..24cd0a5 100644 --- a/ui/accessibility/ax_node_position_unittest.cc +++ b/ui/accessibility/ax_node_position_unittest.cc
@@ -1732,6 +1732,19 @@ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, root_.id, 0 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsLeafTextPosition(); + ASSERT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); + EXPECT_EQ(button_.id, test_position->anchor_id()); + EXPECT_EQ(0, test_position->text_offset()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); + + text_position = AXNodePosition::CreateTextPosition( tree_.data().tree_id, text_field_.id, 0 /* text_offset */, ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); @@ -1755,9 +1768,7 @@ EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); - // Even though upstream affinity doesn't make sense on a leaf node, there is - // no need to reset it to downstream. - EXPECT_EQ(ax::mojom::TextAffinity::kUpstream, test_position->affinity()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); // Create a text position on the root, pointing to the line break character // inside the text field but with an upstream affinity which will cause the @@ -1774,9 +1785,7 @@ EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); - // Even though upstream affinity doesn't make sense on a leaf node, there is - // no need to reset it to downstream. - EXPECT_EQ(ax::mojom::TextAffinity::kUpstream, test_position->affinity()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); // Create a text position pointing to the line break character inside the text // field but with an upstream affinity which will cause the leaf text position @@ -1791,9 +1800,7 @@ EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); - // Even though upstream affinity doesn't make sense on a leaf node, there is - // no need to reset it to downstream. - EXPECT_EQ(ax::mojom::TextAffinity::kUpstream, test_position->affinity()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); // Create a text position on the root, pointing to the line break character // inside the text field. @@ -1863,9 +1870,67 @@ EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(3, test_position->text_offset()); - // Even though upstream affinity doesn't make sense on a leaf node, there is - // no need to reset it to downstream. - EXPECT_EQ(ax::mojom::TextAffinity::kUpstream, test_position->affinity()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); +} + +TEST_F(AXPositionTest, AsLeafTextPositionWithTextPositionAndEmptyTextSandwich) { + // This test updates the tree structure to test a specific edge case - + // AsLeafTextPosition when there is an empty leaf text node between + // two non-empty text nodes. + AXNodePosition::SetTree(nullptr); + + AXNodeData root_data; + root_data.id = 1; + root_data.role = ax::mojom::Role::kRootWebArea; + + AXNodeData text_data; + text_data.id = 2; + text_data.role = ax::mojom::Role::kInlineTextBox; + text_data.SetName("some text"); + + AXNodeData button_data; + button_data.id = 3; + button_data.role = ax::mojom::Role::kButton; + button_data.SetName(""); + + AXNodeData more_text_data; + more_text_data.id = 4; + more_text_data.role = ax::mojom::Role::kInlineTextBox; + more_text_data.SetName("more text"); + + root_data.child_ids = {text_data.id, button_data.id, more_text_data.id}; + + std::unique_ptr<AXTree> new_tree = + CreateAXTree({root_data, text_data, button_data, more_text_data}); + AXNodePosition::SetTree(new_tree.get()); + + // Create a text position on the root pointing to just after the + // first static text leaf node. + TestPositionType text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, root_data.id, 9 /* text_offset */, + ax::mojom::TextAffinity::kDownstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + TestPositionType test_position = text_position->AsLeafTextPosition(); + ASSERT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); + EXPECT_EQ(button_data.id, test_position->anchor_id()); + EXPECT_EQ(0, test_position->text_offset()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); + + text_position = AXNodePosition::CreateTextPosition( + tree_.data().tree_id, root_data.id, 9 /* text_offset */, + ax::mojom::TextAffinity::kUpstream); + ASSERT_NE(nullptr, text_position); + ASSERT_TRUE(text_position->IsTextPosition()); + test_position = text_position->AsLeafTextPosition(); + ASSERT_NE(nullptr, test_position); + EXPECT_TRUE(test_position->IsTextPosition()); + EXPECT_EQ(tree_.data().tree_id, test_position->tree_id()); + EXPECT_EQ(text_data.id, test_position->anchor_id()); + EXPECT_EQ(9, test_position->text_offset()); + EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); } TEST_F(AXPositionTest, CreatePositionAtStartOfAnchorWithNullPosition) {
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h index e439ce0..e9cd43c 100644 --- a/ui/accessibility/ax_position.h +++ b/ui/accessibility/ax_position.h
@@ -817,29 +817,49 @@ if (IsNullPosition() || !AnchorChildCount()) return AsTextPosition(); - AXPositionInstance tree_position = AsTreePosition(); // Adjust the text offset. // No need to check for "before text" positions here because they are only // present on leaf anchor nodes. - int adjusted_offset = AsTextPosition()->text_offset_; - AXPositionInstance child_position = tree_position->CreateChildPositionAt(0); - DCHECK(child_position); - for (int i = 1; - i <= tree_position->child_index_ && - i < tree_position->AnchorChildCount() && adjusted_offset > 0; - ++i) { - adjusted_offset -= child_position->MaxTextOffsetInParent(); - child_position = tree_position->CreateChildPositionAt(i); + AXPositionInstance text_position = AsTextPosition(); + int adjusted_offset = text_position->text_offset_; + do { + AXPositionInstance child_position = + text_position->CreateChildPositionAt(0); DCHECK(child_position); - } - child_position = child_position->AsTextPosition(); - child_position->text_offset_ = adjusted_offset; - // Maintain affinity from parent so that we'll be able to choose the correct - // leaf anchor if the text offset is right on the boundary between two - // leaves. - child_position->affinity_ = affinity_; - return child_position->AsLeafTextPosition(); + // If the text offset corresponds to multiple child positions because some + // of the children have empty text, the condition "adjusted_offset > 0" + // below ensures that the first child will be chosen. + for (int i = 1; + i < text_position->AnchorChildCount() && adjusted_offset > 0; ++i) { + const int max_text_offset_in_parent = + child_position->MaxTextOffsetInParent(); + if (adjusted_offset < max_text_offset_in_parent) { + break; + } + if (affinity_ == ax::mojom::TextAffinity::kUpstream && + adjusted_offset == max_text_offset_in_parent) { + // Maintain upstream affinity so that we'll be able to choose the + // correct leaf anchor if the text offset is right on the boundary + // between two leaves. + child_position->affinity_ = ax::mojom::TextAffinity::kUpstream; + break; + } + child_position = text_position->CreateChildPositionAt(i); + adjusted_offset -= max_text_offset_in_parent; + } + + text_position = std::move(child_position); + } while (text_position->AnchorChildCount()); + + DCHECK(text_position); + DCHECK(text_position->IsLeafTextPosition()); + text_position->text_offset_ = adjusted_offset; + // Leaf Text positions are always downstream since there is no ambiguity + // as to whether it refers to the end of the current or the start of + // the next line. + text_position->affinity_ = ax::mojom::TextAffinity::kDownstream; + return text_position; } // Searches backwards and forwards from this position until it finds the given
diff --git a/ui/accessibility/platform/ax_fragment_root_win.cc b/ui/accessibility/platform/ax_fragment_root_win.cc index a4380c4..945c653 100644 --- a/ui/accessibility/platform/ax_fragment_root_win.cc +++ b/ui/accessibility/platform/ax_fragment_root_win.cc
@@ -193,13 +193,26 @@ return map_[widget]; } + ui::AXFragmentRootWin* GetFragmentRootParentOf( + gfx::NativeViewAccessible accessible) const { + for (const auto& entry : map_) { + if (entry.second->GetChildNodeDelegate()->GetNativeViewAccessible() == + accessible) + return entry.second; + } + return nullptr; + } + private: std::unordered_map<gfx::AcceleratedWidget, AXFragmentRootWin*> map_; }; AXFragmentRootWin::AXFragmentRootWin(gfx::AcceleratedWidget widget, - AXFragmentRootDelegateWin* delegate) - : widget_(widget), delegate_(delegate) { + AXFragmentRootDelegateWin* delegate, + bool is_controller_for_root) + : widget_(widget), + delegate_(delegate), + is_controller_for_root_(is_controller_for_root) { platform_node_ = ui::AXFragmentRootPlatformNodeWin::Create(this); AXFragmentRootMapWin::GetInstance().AddFragmentRoot(widget, this); } @@ -215,6 +228,13 @@ return AXFragmentRootMapWin::GetInstance().GetFragmentRoot(widget); } +// static +AXFragmentRootWin* AXFragmentRootWin::GetFragmentRootParentOf( + gfx::NativeViewAccessible accessible) { + return AXFragmentRootMapWin::GetInstance().GetFragmentRootParentOf( + accessible); +} + gfx::NativeViewAccessible AXFragmentRootWin::GetNativeViewAccessible() { return platform_node_.Get(); } @@ -239,6 +259,25 @@ return nullptr; } +gfx::NativeViewAccessible AXFragmentRootWin::GetNextSibling() { + int child_index = GetIndexInParentOfChild(); + if (child_index >= 0) { + AXPlatformNodeDelegate* parent = GetParentNodeDelegate(); + if (parent && child_index < (parent->GetChildCount() - 1)) + return GetParentNodeDelegate()->ChildAtIndex(child_index + 1); + } + + return nullptr; +} + +gfx::NativeViewAccessible AXFragmentRootWin::GetPreviousSibling() { + int child_index = GetIndexInParentOfChild(); + if (child_index > 0) + return GetParentNodeDelegate()->ChildAtIndex(child_index - 1); + + return nullptr; +} + gfx::NativeViewAccessible AXFragmentRootWin::HitTestSync(int x, int y) { AXPlatformNodeDelegate* child_delegate = GetChildNodeDelegate(); if (child_delegate) @@ -274,7 +313,15 @@ return nullptr; } -AXPlatformNodeDelegate* AXFragmentRootWin::GetChildNodeDelegate() { +AXPlatformNodeDelegate* AXFragmentRootWin::GetParentNodeDelegate() const { + gfx::NativeViewAccessible parent = delegate_->GetParentOfAXFragmentRoot(); + if (parent) + return ui::AXPlatformNode::FromNativeViewAccessible(parent)->GetDelegate(); + + return nullptr; +} + +AXPlatformNodeDelegate* AXFragmentRootWin::GetChildNodeDelegate() const { gfx::NativeViewAccessible child = delegate_->GetChildOfAXFragmentRoot(); if (child) return ui::AXPlatformNode::FromNativeViewAccessible(child)->GetDelegate(); @@ -282,4 +329,26 @@ return nullptr; } +int AXFragmentRootWin::GetIndexInParentOfChild() const { + AXPlatformNodeDelegate* parent = GetParentNodeDelegate(); + + if (!parent) + return 0; + + AXPlatformNodeDelegate* child = GetChildNodeDelegate(); + if (child) { + int child_count = parent->GetChildCount(); + for (int child_index = 0; child_index < child_count; child_index++) { + if (ui::AXPlatformNode::FromNativeViewAccessible( + parent->ChildAtIndex(child_index)) + ->GetDelegate() == child) + return child_index; + } + } + + NOTREACHED(); + + return -1; +} + } // namespace ui
diff --git a/ui/accessibility/platform/ax_fragment_root_win.h b/ui/accessibility/platform/ax_fragment_root_win.h index a765aebe..3626e86 100644 --- a/ui/accessibility/platform/ax_fragment_root_win.h +++ b/ui/accessibility/platform/ax_fragment_root_win.h
@@ -20,16 +20,26 @@ // deserialize the document for an iframe before the host document. Because of // this, and because COM rules require that the list of interfaces returned by // QueryInterface remain static over the lifetime of an object instance, we -// implement IRawElementProviderFragmentRoot on its own node, with the root of -// our internal accessibility tree as its sole child. +// implement IRawElementProviderFragmentRoot on its own node for each HWND, with +// the root of our internal accessibility tree for that HWND as its sole child. // // Since UIA derives some information from the underlying HWND hierarchy, we // expose one fragment root per HWND. The class that owns the HWND is expected // to own the corresponding AXFragmentRootWin. +// +// The usual way for UI Automation to obtain a fragment root is through +// WM_GETOBJECT. However, if there's a relation such as "Controller For" +// between element A in one window and element B in another window, UIA might +// call element A to discover the relation, receive a pointer to element B, +// then ask element B for its fragment root, without having sent WM_GETOBJECT +// to element B's window. +// The is_controller_for_root_ boolean member variable is used to determine +// whether this is a fragment root witha "Controller For" relation. class AX_EXPORT AXFragmentRootWin : public ui::AXPlatformNodeDelegateBase { public: AXFragmentRootWin(gfx::AcceleratedWidget widget, - AXFragmentRootDelegateWin* delegate); + AXFragmentRootDelegateWin* delegate, + bool is_controller_for_root = false); ~AXFragmentRootWin() override; // Fragment roots register themselves in a map upon creation and unregister @@ -38,6 +48,11 @@ static AXFragmentRootWin* GetForAcceleratedWidget( gfx::AcceleratedWidget widget); + // If the given NativeViewAccessible is the direct descendant of a fragment + // root, return the corresponding fragment root. + static AXFragmentRootWin* GetFragmentRootParentOf( + gfx::NativeViewAccessible accessible); + // Returns the NativeViewAccessible for this fragment root. gfx::NativeViewAccessible GetNativeViewAccessible() override; @@ -47,11 +62,18 @@ // content views or false if it should be excluded. bool IsControlElement(); + // If a child node is available, return its delegate. + AXPlatformNodeDelegate* GetChildNodeDelegate() const; + + bool IsControllerFor() const { return is_controller_for_root_; } + private: // AXPlatformNodeDelegate overrides. gfx::NativeViewAccessible GetParent() override; int GetChildCount() override; gfx::NativeViewAccessible ChildAtIndex(int index) override; + gfx::NativeViewAccessible GetNextSibling() override; + gfx::NativeViewAccessible GetPreviousSibling() override; gfx::NativeViewAccessible HitTestSync(int x, int y) override; gfx::NativeViewAccessible GetFocus() override; const ui::AXUniqueId& GetUniqueId() const override; @@ -59,13 +81,20 @@ AXPlatformNode* GetFromTreeIDAndNodeID(const ui::AXTreeID& ax_tree_id, int32_t id) override; - // If a child node is available, return its delegate. - AXPlatformNodeDelegate* GetChildNodeDelegate(); + // A fragment root does not correspond to any node in the platform neutral + // accessibility tree. Rather, the fragment root's child is a child of the + // fragment root's parent. This helper computes the child's index in the + // parent's array of children. + int GetIndexInParentOfChild() const; + + // If a parent node is available, return its delegate. + AXPlatformNodeDelegate* GetParentNodeDelegate() const; gfx::AcceleratedWidget widget_; AXFragmentRootDelegateWin* const delegate_; Microsoft::WRL::ComPtr<ui::AXFragmentRootPlatformNodeWin> platform_node_; ui::AXUniqueId unique_id_; + bool is_controller_for_root_; }; } // namespace ui
diff --git a/ui/accessibility/platform/ax_fragment_root_win_unittest.cc b/ui/accessibility/platform/ax_fragment_root_win_unittest.cc index 7c0447a..40a0afd 100644 --- a/ui/accessibility/platform/ax_fragment_root_win_unittest.cc +++ b/ui/accessibility/platform/ax_fragment_root_win_unittest.cc
@@ -269,4 +269,181 @@ EXPECT_EQ(result.type(), VT_EMPTY); } +TEST_F(AXFragmentRootTest, TestUIAMultipleFragmentRoots) { + // Consider the following platform-neutral tree: + // + // N1 + // _____/ \_____ + // / \ + // N2---N3---N4---N5 + // / \ / \ + // N6---N7 N8---N9 + // + // N3 and N5 are nodes for which we need a fragment root. This will correspond + // to the following tree in UIA: + // + // U1 + // _____/ \_____ + // / \ + // U2---R3---U4---R5 + // | | + // U3 U5 + // / \ / \ + // U6---U7 U8---U9 + + ui::AXNodeData top_fragment_root_n1; + top_fragment_root_n1.id = 1; + + ui::AXNodeData sibling_n2; + sibling_n2.id = 2; + + ui::AXNodeData child_fragment_root_n3; + child_fragment_root_n3.id = 3; + + ui::AXNodeData sibling_n6; + sibling_n6.id = 6; + ui::AXNodeData sibling_n7; + sibling_n7.id = 7; + + child_fragment_root_n3.child_ids = {6, 7}; + + ui::AXNodeData sibling_n4; + sibling_n4.id = 4; + + ui::AXNodeData child_fragment_root_n5; + child_fragment_root_n5.id = 5; + + ui::AXNodeData sibling_n8; + sibling_n8.id = 8; + ui::AXNodeData sibling_n9; + sibling_n9.id = 9; + + child_fragment_root_n5.child_ids = {8, 9}; + top_fragment_root_n1.child_ids = {2, 3, 4, 5}; + + ui::AXTreeUpdate update; + update.has_tree_data = true; + update.root_id = top_fragment_root_n1.id; + update.nodes = {top_fragment_root_n1, + sibling_n2, + child_fragment_root_n3, + sibling_n6, + sibling_n7, + sibling_n4, + child_fragment_root_n5, + sibling_n8, + sibling_n9}; + update.tree_data.tree_id = ui::AXTreeID::CreateNewAXTreeID(); + + Init(update); + InitFragmentRoot(); + + AXNode* root_node = GetRootNode(); + + // Set up other fragment roots + AXNode* child_fragment_root_n3_node = root_node->children()[1]; + std::unique_ptr<TestFragmentRootDelegate> n3_fragment_root_delegate = + std::make_unique<TestFragmentRootDelegate>(); + std::unique_ptr<AXFragmentRootWin> n3_fragment_root(InitNodeAsFragmentRoot( + child_fragment_root_n3_node, n3_fragment_root_delegate.get())); + + AXNode* child_fragment_root_n5_node = root_node->children()[3]; + std::unique_ptr<TestFragmentRootDelegate> n5_fragment_root_delegate = + std::make_unique<TestFragmentRootDelegate>(); + std::unique_ptr<AXFragmentRootWin> n5_fragment_root(InitNodeAsFragmentRoot( + child_fragment_root_n5_node, n5_fragment_root_delegate.get())); + + // Test navigation from root fragment + ComPtr<IRawElementProviderFragmentRoot> root_fragment_root = + GetFragmentRoot(); + ComPtr<IRawElementProviderFragment> root_fragment; + root_fragment_root.As(&root_fragment); + + ComPtr<IRawElementProviderFragment> test_fragment; + EXPECT_HRESULT_SUCCEEDED( + root_fragment->Navigate(NavigateDirection_Parent, &test_fragment)); + EXPECT_EQ(nullptr, test_fragment.Get()); + + EXPECT_HRESULT_SUCCEEDED( + root_fragment->Navigate(NavigateDirection_NextSibling, &test_fragment)); + EXPECT_EQ(nullptr, test_fragment.Get()); + + EXPECT_HRESULT_SUCCEEDED(root_fragment->Navigate( + NavigateDirection_PreviousSibling, &test_fragment)); + EXPECT_EQ(nullptr, test_fragment.Get()); + + EXPECT_HRESULT_SUCCEEDED( + root_fragment->Navigate(NavigateDirection_FirstChild, &test_fragment)); + ComPtr<IUnknown> root_child_unknown = test_fragment_root_delegate_->child_; + ComPtr<IRawElementProviderFragment> root_child_fragment; + root_child_unknown.As(&root_child_fragment); + EXPECT_EQ(root_child_fragment.Get(), test_fragment.Get()); + + EXPECT_HRESULT_SUCCEEDED( + root_fragment->Navigate(NavigateDirection_LastChild, &test_fragment)); + EXPECT_EQ(root_child_fragment.Get(), test_fragment.Get()); + + // Test navigation from first child root (R3) + ComPtr<IRawElementProviderFragmentRoot> n3_fragment_root_provider; + n3_fragment_root->GetNativeViewAccessible()->QueryInterface( + IID_PPV_ARGS(&n3_fragment_root_provider)); + + ComPtr<IRawElementProviderFragment> n3_fragment; + n3_fragment_root_provider.As(&n3_fragment); + EXPECT_HRESULT_SUCCEEDED( + n3_fragment->Navigate(NavigateDirection_Parent, &test_fragment)); + EXPECT_EQ(root_child_fragment.Get(), test_fragment.Get()); + + AXNode* sibling_n2_node = root_node->children()[0]; + EXPECT_HRESULT_SUCCEEDED( + n3_fragment->Navigate(NavigateDirection_PreviousSibling, &test_fragment)); + EXPECT_EQ(IRawElementProviderFragmentFromNode(sibling_n2_node).Get(), + test_fragment.Get()); + + AXNode* sibling_n4_node = root_node->children()[2]; + EXPECT_HRESULT_SUCCEEDED( + n3_fragment->Navigate(NavigateDirection_NextSibling, &test_fragment)); + EXPECT_EQ(IRawElementProviderFragmentFromNode(sibling_n4_node).Get(), + test_fragment.Get()); + + EXPECT_HRESULT_SUCCEEDED( + n3_fragment->Navigate(NavigateDirection_FirstChild, &test_fragment)); + EXPECT_EQ( + IRawElementProviderFragmentFromNode(child_fragment_root_n3_node).Get(), + test_fragment.Get()); + EXPECT_HRESULT_SUCCEEDED( + n3_fragment->Navigate(NavigateDirection_LastChild, &test_fragment)); + EXPECT_EQ( + IRawElementProviderFragmentFromNode(child_fragment_root_n3_node).Get(), + test_fragment.Get()); + + // Test navigation from second child root (R5) + ComPtr<IRawElementProviderFragmentRoot> n5_fragment_root_provider; + n5_fragment_root->GetNativeViewAccessible()->QueryInterface( + IID_PPV_ARGS(&n5_fragment_root_provider)); + + ComPtr<IRawElementProviderFragment> n5_fragment; + n5_fragment_root_provider.As(&n5_fragment); + EXPECT_HRESULT_SUCCEEDED( + n5_fragment->Navigate(NavigateDirection_Parent, &test_fragment)); + EXPECT_EQ(root_child_fragment.Get(), test_fragment.Get()); + EXPECT_HRESULT_SUCCEEDED( + n5_fragment->Navigate(NavigateDirection_NextSibling, &test_fragment)); + EXPECT_EQ(nullptr, test_fragment.Get()); + EXPECT_HRESULT_SUCCEEDED( + n5_fragment->Navigate(NavigateDirection_PreviousSibling, &test_fragment)); + EXPECT_EQ(IRawElementProviderFragmentFromNode(sibling_n4_node).Get(), + test_fragment.Get()); + EXPECT_HRESULT_SUCCEEDED( + n5_fragment->Navigate(NavigateDirection_FirstChild, &test_fragment)); + EXPECT_EQ( + IRawElementProviderFragmentFromNode(child_fragment_root_n5_node).Get(), + test_fragment.Get()); + EXPECT_HRESULT_SUCCEEDED( + n5_fragment->Navigate(NavigateDirection_LastChild, &test_fragment)); + EXPECT_EQ( + IRawElementProviderFragmentFromNode(child_fragment_root_n5_node).Get(), + test_fragment.Get()); +} + } // namespace ui
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 6f73e22..eacadc4 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -3611,39 +3611,94 @@ *element_provider = nullptr; - AXPlatformNodeBase* neighbor = nullptr; + // + // Navigation to a fragment root node: + // + // In order for the platform-neutral accessibility tree to support IA2 and UIA + // simultaneously, we handle navigation to and from fragment roots in UIA + // specific code. Consider the following platform-neutral tree: + // + // N1 + // _____/ \_____ + // / \ + // N2---N3---N4---N5 + // / \ / \ + // N6---N7 N8---N9 + // + // N3 and N5 are nodes for which we need a fragment root. This will correspond + // to the following tree in UIA: + // + // U1 + // _____/ \_____ + // / \ + // U2---R3---U4---R5 + // | | + // U3 U5 + // / \ / \ + // U6---U7 U8---U9 + // + // Ux is the platform node for Nx. + // R3 and R5 are the fragment root nodes for U3 and U5 respectively. + // + // Navigation has the following behaviors: + // + // 1. Parent navigation: If source node Ux is the child of a fragment root, + // return Rx. Otherwise, consult the platform-neutral tree. + // 2. First/last child navigation: If target node Ux is the child of a + // fragment root and the source node isn't Rx, return Rx. Otherwise, return + // Ux. + // 3. Next/previous sibling navigation: + // a. If source node Ux is the child of a fragment root, return nullptr. + // b. If target node Ux is the child of a fragment root, return Rx. + // Otherwise, return Ux. + // + // Note that the condition in 3b is a special case of the condition in 2. In + // 3b, the source node is never Rx. So in the code, we collapse them to a + // common implementation. + // + // Navigation from an Rx node is set up by delegate APIs on AXFragmentRootWin. + // + gfx::NativeViewAccessible neighbor = nullptr; switch (direction) { - case NavigateDirection_Parent: - neighbor = FromNativeViewAccessible(GetParent()); - break; + case NavigateDirection_Parent: { + // 1. If source node Ux is the child of a fragment root, return Rx. + // Otherwise, consult the platform-neutral tree. + AXFragmentRootWin* fragment_root = + AXFragmentRootWin::GetFragmentRootParentOf(GetNativeViewAccessible()); + if (UNLIKELY(fragment_root) && !fragment_root->IsControllerFor()) { + neighbor = fragment_root->GetNativeViewAccessible(); + } else { + neighbor = GetParent(); + } + } break; case NavigateDirection_FirstChild: - if (GetChildCount() > 0) { - neighbor = GetFirstChild(); - DCHECK(neighbor); - DCHECK(FromNativeViewAccessible(neighbor->GetParent()) == this); - } + if (GetChildCount() > 0) + neighbor = GetFirstChild()->GetNativeViewAccessible(); break; case NavigateDirection_LastChild: - if (GetChildCount() > 0) { - neighbor = GetLastChild(); - DCHECK(neighbor); - DCHECK(FromNativeViewAccessible(neighbor->GetParent()) == this); - } + if (GetChildCount() > 0) + neighbor = GetLastChild()->GetNativeViewAccessible(); break; case NavigateDirection_NextSibling: - neighbor = GetNextSibling(); - if (neighbor != nullptr) { - DCHECK(neighbor->GetParent() == GetParent()); + // 3a. If source node Ux is the child of a fragment root, return nullptr. + if (AXFragmentRootWin::GetFragmentRootParentOf( + GetNativeViewAccessible()) == nullptr) { + AXPlatformNodeBase* neighbor_node = GetNextSibling(); + if (neighbor_node) + neighbor = neighbor_node->GetNativeViewAccessible(); } break; case NavigateDirection_PreviousSibling: - neighbor = GetPreviousSibling(); - if (neighbor != nullptr) { - DCHECK(neighbor->GetParent() == GetParent()); + // 3a. If source node Ux is the child of a fragment root, return nullptr. + if (AXFragmentRootWin::GetFragmentRootParentOf( + GetNativeViewAccessible()) == nullptr) { + AXPlatformNodeBase* neighbor_node = GetPreviousSibling(); + if (neighbor_node) + neighbor = neighbor_node->GetNativeViewAccessible(); } break; @@ -3652,9 +3707,17 @@ break; } - if (neighbor != nullptr) { - static_cast<AXPlatformNodeWin*>(neighbor)->QueryInterface( - IID_PPV_ARGS(element_provider)); + if (neighbor) { + if (direction != NavigateDirection_Parent) { + // 2 / 3b. If target node Ux is the child of a fragment root and the + // source node isn't Rx, return Rx. + AXFragmentRootWin* fragment_root = + AXFragmentRootWin::GetFragmentRootParentOf(neighbor); + if (UNLIKELY(fragment_root && fragment_root != GetDelegate() && + !fragment_root->IsControllerFor())) + neighbor = fragment_root->GetNativeViewAccessible(); + } + neighbor->QueryInterface(IID_PPV_ARGS(element_provider)); } return S_OK;
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc index 92a7e4bf..5ae4b77 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -286,6 +286,18 @@ return QueryInterfaceFromNode<IRawElementProviderFragment>(GetRootNode()); } +Microsoft::WRL::ComPtr<IRawElementProviderFragment> +AXPlatformNodeWinTest::IRawElementProviderFragmentFromNode(AXNode* node) { + AXPlatformNode* platform_node = AXPlatformNodeFromNode(node); + gfx::NativeViewAccessible native_view = + platform_node->GetNativeViewAccessible(); + ComPtr<IUnknown> unknown_node = native_view; + ComPtr<IRawElementProviderFragment> fragment_node; + unknown_node.As(&fragment_node); + + return fragment_node; +} + ComPtr<IAccessible> AXPlatformNodeWinTest::IAccessibleFromNode(AXNode* node) { return QueryInterfaceFromNode<IAccessible>(node); } @@ -368,11 +380,19 @@ void AXPlatformNodeWinTest::InitFragmentRoot() { test_fragment_root_delegate_ = std::make_unique<TestFragmentRootDelegate>(); - test_fragment_root_delegate_->child_ = - AXPlatformNodeFromNode(GetRootNode())->GetNativeViewAccessible(); + ax_fragment_root_.reset(InitNodeAsFragmentRoot( + GetRootNode(), test_fragment_root_delegate_.get())); +} - ax_fragment_root_ = std::make_unique<ui::AXFragmentRootWin>( - gfx::kMockAcceleratedWidget, test_fragment_root_delegate_.get()); +AXFragmentRootWin* AXPlatformNodeWinTest::InitNodeAsFragmentRoot( + AXNode* node, + TestFragmentRootDelegate* delegate) { + delegate->child_ = AXPlatformNodeFromNode(node)->GetNativeViewAccessible(); + if (node->parent()) + delegate->parent_ = + AXPlatformNodeFromNode(node->parent())->GetNativeViewAccessible(); + + return new AXFragmentRootWin(gfx::kMockAcceleratedWidget, delegate); } ComPtr<IRawElementProviderFragmentRoot>
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.h b/ui/accessibility/platform/ax_platform_node_win_unittest.h index fa95718..136bd095 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.h +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.h
@@ -66,6 +66,8 @@ GetIRawElementProviderSimpleFromChildIndex(int child_index); Microsoft::WRL::ComPtr<IRawElementProviderFragment> GetRootIRawElementProviderFragment(); + Microsoft::WRL::ComPtr<IRawElementProviderFragment> + IRawElementProviderFragmentFromNode(AXNode* node); Microsoft::WRL::ComPtr<IAccessible> IAccessibleFromNode(AXNode* node); Microsoft::WRL::ComPtr<IAccessible> GetRootIAccessible(); Microsoft::WRL::ComPtr<IAccessible2> ToIAccessible2( @@ -81,6 +83,8 @@ Microsoft::WRL::ComPtr<IAccessibleTableCell> GetCellInTable(); void InitFragmentRoot(); + AXFragmentRootWin* InitNodeAsFragmentRoot(AXNode* node, + TestFragmentRootDelegate* delegate); Microsoft::WRL::ComPtr<IRawElementProviderFragmentRoot> GetFragmentRoot(); using PatternSet = std::unordered_set<LONG>;
diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc index e68fae8..b8c08bc 100644 --- a/ui/aura/window_tree_host.cc +++ b/ui/aura/window_tree_host.cc
@@ -38,6 +38,7 @@ #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/icc_profile.h" +#include "ui/gfx/overlay_transform_utils.h" #include "ui/gfx/switches.h" #include "ui/platform_window/platform_window_init_properties.h" @@ -160,6 +161,14 @@ return invert; } +void WindowTreeHost::SetDisplayTransformHint(gfx::OverlayTransform transform) { + if (compositor()->display_transform() == transform) + return; + + compositor()->SetDisplayTransformHint(transform); + UpdateCompositorScaleAndSize(); +} + gfx::Transform WindowTreeHost::GetRootTransformForLocalEventCoordinates() const { return GetRootTransform(); @@ -184,6 +193,20 @@ window()->SetBounds(transformed_bounds_in_pixels); } +void WindowTreeHost::UpdateCompositorScaleAndSize() { + gfx::Rect new_bounds = GetBoundsInPixels(); + if (compositor_->display_transform() == gfx::OVERLAY_TRANSFORM_ROTATE_90 || + compositor_->display_transform() == gfx::OVERLAY_TRANSFORM_ROTATE_270) { + new_bounds.Transpose(); + } + + // Allocate a new LocalSurfaceId for the new size or scale factor. + window_->AllocateLocalSurfaceId(); + ScopedLocalSurfaceIdValidator lsi_validator(window()); + compositor_->SetScaleAndSize(device_scale_factor_, new_bounds.size(), + window_->GetLocalSurfaceIdAllocation()); +} + void WindowTreeHost::ConvertDIPToScreenInPixels(gfx::Point* point) const { ConvertDIPToPixels(point); gfx::Point location = GetLocationOnScreenInPixels(); @@ -457,16 +480,12 @@ // these two. if (!compositor_) return; + display::Display display = display::Screen::GetScreen()->GetDisplayNearestWindow(window()); device_scale_factor_ = display.device_scale_factor(); UpdateRootWindowSizeInPixels(); - - // Allocate a new LocalSurfaceId for the new state. - window_->AllocateLocalSurfaceId(); - ScopedLocalSurfaceIdValidator lsi_validator(window()); - compositor_->SetScaleAndSize(device_scale_factor_, new_size_in_pixels, - window_->GetLocalSurfaceIdAllocation()); + UpdateCompositorScaleAndSize(); for (WindowTreeHostObserver& observer : observers_) observer.OnHostResized(this);
diff --git a/ui/aura/window_tree_host.h b/ui/aura/window_tree_host.h index 850424d3..36b2c941 100644 --- a/ui/aura/window_tree_host.h +++ b/ui/aura/window_tree_host.h
@@ -28,6 +28,7 @@ #include "ui/events/event_source.h" #include "ui/events/platform_event.h" #include "ui/gfx/native_widget_types.h" +#include "ui/gfx/overlay_transform.h" namespace gfx { class Point; @@ -100,6 +101,8 @@ virtual void SetRootTransform(const gfx::Transform& transform); virtual gfx::Transform GetInverseRootTransform() const; + void SetDisplayTransformHint(gfx::OverlayTransform transform); + // These functions are used in event translation for translating the local // coordinates of LocatedEvents. Default implementation calls to non-local // ones (e.g. GetRootTransform()). @@ -114,6 +117,10 @@ // allows for inconsistencies. void UpdateRootWindowSizeInPixels(); + // Updates the compositor's size and scale from display size, scale and + // transform hint. + void UpdateCompositorScaleAndSize(); + // Converts |point| from the root window's coordinate system to native // screen's. void ConvertDIPToScreenInPixels(gfx::Point* point) const;
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index 37e903b..ba864403 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -447,6 +447,14 @@ } } +void Compositor::SetDisplayTransformHint(gfx::OverlayTransform transform) { + if (display_transform_ == transform) + return; + + display_transform_ = transform; + context_factory_private_->SetDisplayTransformHint(this, display_transform_); +} + void Compositor::SetBackgroundColor(SkColor color) { host_->set_background_color(color);
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 17b9c783..e8ae619 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h
@@ -37,6 +37,7 @@ #include "ui/gfx/geometry/vector2d.h" #include "ui/gfx/gpu_memory_buffer.h" #include "ui/gfx/native_widget_types.h" +#include "ui/gfx/overlay_transform.h" namespace base { class SingleThreadTaskRunner; @@ -156,6 +157,11 @@ virtual void AddVSyncParameterObserver( Compositor* compositor, viz::mojom::VSyncParameterObserverPtr observer) = 0; + + // Set the transform/rotation info for the display output surface that this + // compositor represents. + virtual void SetDisplayTransformHint(Compositor* compositor, + gfx::OverlayTransform transform) = 0; }; // This class abstracts the creation of the 3D context for the compositor. It is @@ -290,6 +296,10 @@ const gfx::ColorSpace& color_space, float sdr_white_level = gfx::ColorSpace::kDefaultSDRWhiteLevel); + // Set the transform/rotation info for the display output surface. + void SetDisplayTransformHint(gfx::OverlayTransform transform); + gfx::OverlayTransform display_transform() const { return display_transform_; } + // Returns the size of the widget that is being drawn to in pixel coordinates. const gfx::Size& size() const { return size_; } @@ -513,6 +523,8 @@ const char* trace_environment_name_; + gfx::OverlayTransform display_transform_ = gfx::OVERLAY_TRANSFORM_NONE; + base::WeakPtrFactory<Compositor> context_creation_weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(Compositor);
diff --git a/ui/compositor/host/host_context_factory_private.cc b/ui/compositor/host/host_context_factory_private.cc index ce20a9b..b511d3ca 100644 --- a/ui/compositor/host/host_context_factory_private.cc +++ b/ui/compositor/host/host_context_factory_private.cc
@@ -143,6 +143,8 @@ compositor_data.display_private->Resize(compositor->size()); compositor_data.display_private->SetOutputIsSecure( compositor_data.output_is_secure); + compositor_data.display_private->SetDisplayTransformHint( + compositor->display_transform()); // Create LayerTreeFrameSink with the browser end of CompositorFrameSink. cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params; @@ -313,6 +315,17 @@ } } +void HostContextFactoryPrivate::SetDisplayTransformHint( + Compositor* compositor, + gfx::OverlayTransform transform) { + auto iter = compositor_data_map_.find(compositor); + if (iter == compositor_data_map_.end()) + return; + + if (iter->second.display_private) + iter->second.display_private->SetDisplayTransformHint(transform); +} + HostContextFactoryPrivate::CompositorData::CompositorData() = default; HostContextFactoryPrivate::CompositorData::CompositorData( CompositorData&& other) = default;
diff --git a/ui/compositor/host/host_context_factory_private.h b/ui/compositor/host/host_context_factory_private.h index 36f9e80..f910207b 100644 --- a/ui/compositor/host/host_context_factory_private.h +++ b/ui/compositor/host/host_context_factory_private.h
@@ -90,6 +90,8 @@ void AddVSyncParameterObserver( Compositor* compositor, viz::mojom::VSyncParameterObserverPtr observer) override; + void SetDisplayTransformHint(Compositor* compositor, + gfx::OverlayTransform transform) override; private: struct CompositorData {
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h index 6dd96c5e..0e1c66c 100644 --- a/ui/compositor/test/in_process_context_factory.h +++ b/ui/compositor/test/in_process_context_factory.h
@@ -99,6 +99,8 @@ void AddVSyncParameterObserver( ui::Compositor* compositor, viz::mojom::VSyncParameterObserverPtr observer) override {} + void SetDisplayTransformHint(Compositor* compositor, + gfx::OverlayTransform transform) override {} void AddObserver(ContextFactoryObserver* observer) override; void RemoveObserver(ContextFactoryObserver* observer) override; bool SyncTokensRequiredForDisplayCompositor() override;
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js index 3b0eb6ba..4a59ff6 100644 --- a/ui/login/display_manager.js +++ b/ui/login/display_manager.js
@@ -786,10 +786,6 @@ screen.style.height = height + 'px'; screen.style.margin = 'auto'; } - - if (this.showingViewsLogin) { - chrome.send('updateOobeDialogSize', [width, height]); - } }, /**
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc index 8b3c2a2c..33094ed 100644 --- a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc +++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -324,7 +324,7 @@ } TEST_F(DrmOverlayValidatorTest, RejectYUVBuffersIfNotSupported) { - // Check case where buffer storage format is already UYVY but planes dont + // Check case where buffer storage format is already YUV 420 but planes don't // support it. overlay_params_.back().buffer_size = overlay_rect_.size(); overlay_params_.back().display_rect = gfx::RectF(overlay_rect_); @@ -391,7 +391,7 @@ EXPECT_EQ(returns.back(), ui::OVERLAY_STATUS_ABLE); // This configuration should not be promoted to Overlay when either of the - // controllers dont support UYVY format. + // controllers don't support YUV 420 format. // Check case where we dont have support for packed formats in Mirrored CRTC. crtc_states[1].planes[1].formats = {DRM_FORMAT_XRGB8888};
diff --git a/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc b/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc index 233b9be..b7a7a17 100644 --- a/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc +++ b/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc
@@ -68,7 +68,7 @@ DRM_FORMAT_R8, DRM_FORMAT_GR88, DRM_FORMAT_ABGR8888, DRM_FORMAT_XBGR8888, DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB2101010, DRM_FORMAT_XBGR2101010, DRM_FORMAT_RGB565, - DRM_FORMAT_UYVY, DRM_FORMAT_NV12, DRM_FORMAT_YVU420}; + DRM_FORMAT_NV12, DRM_FORMAT_YVU420}; base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI);
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc index e5c489e..2eccf53 100644 --- a/ui/platform_window/x11/x11_window.cc +++ b/ui/platform_window/x11/x11_window.cc
@@ -65,6 +65,7 @@ } config.bounds = properties.bounds; + config.icon = properties.icon; config.force_show_in_taskbar = properties.force_show_in_taskbar; config.keep_on_top = properties.keep_on_top; config.visible_on_all_workspaces = properties.visible_on_all_workspaces;
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index a4649b8..b06c12c2 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -515,7 +515,8 @@ // to element B's window. // So we create the fragment root now to ensure it's ready if asked for. if (::switches::IsExperimentalAccessibilityPlatformUIAEnabled()) - ax_fragment_root_ = std::make_unique<ui::AXFragmentRootWin>(hwnd(), this); + ax_fragment_root_ = + std::make_unique<ui::AXFragmentRootWin>(hwnd(), this, true); // Disable pen flicks (http://crbug.com/506977) base::win::DisableFlicks(hwnd());
diff --git a/weblayer/app/content_main_delegate_impl.cc b/weblayer/app/content_main_delegate_impl.cc index 94798ce6..287761e 100644 --- a/weblayer/app/content_main_delegate_impl.cc +++ b/weblayer/app/content_main_delegate_impl.cc
@@ -7,6 +7,7 @@ #include <iostream> #include "base/base_switches.h" +#include "base/command_line.h" #include "base/cpu.h" #include "base/lazy_instance.h" #include "base/logging.h" @@ -22,8 +23,12 @@ #if defined(OS_ANDROID) #include "base/android/apk_assets.h" +#include "base/android/locale_utils.h" +#include "base/i18n/rtl.h" #include "base/posix/global_descriptors.h" #include "content/public/browser/android/compositor.h" +#include "ui/base/resource/resource_bundle_android.h" +#include "ui/base/ui_base_switches.h" #include "weblayer/browser/android_descriptors.h" #endif @@ -118,34 +123,49 @@ void ContentMainDelegateImpl::InitializeResourceBundle() { #if defined(OS_ANDROID) - // On Android, the renderer runs with a different UID and can never access - // the file system. Use the file descriptor passed in at launch time. - auto* global_descriptors = base::GlobalDescriptors::GetInstance(); - int pak_fd = global_descriptors->MaybeGet(kPakDescriptor); - base::MemoryMappedFile::Region pak_region; - if (pak_fd >= 0) { - pak_region = global_descriptors->GetRegion(kPakDescriptor); - } else { - pak_fd = base::android::OpenApkAsset( - std::string("assets/") + params_.pak_name, &pak_region); - if (pak_fd < 0) { - base::FilePath pak_file; - bool r = base::PathService::Get(base::DIR_ANDROID_APP_DATA, &pak_file); - DCHECK(r); - pak_file = pak_file.Append(FILE_PATH_LITERAL("paks")); - pak_file = pak_file.AppendASCII(params_.pak_name); - int flags = base::File::FLAG_OPEN | base::File::FLAG_READ; - pak_fd = base::File(pak_file, flags).TakePlatformFile(); - pak_region = base::MemoryMappedFile::Region::kWholeFile; + const base::CommandLine& command_line = + *base::CommandLine::ForCurrentProcess(); + + bool is_browser_process = + command_line.GetSwitchValueASCII(switches::kProcessType).empty(); + if (is_browser_process) { + ui::SetLocalePaksStoredInApk(true); + std::string locale = ui::ResourceBundle::InitSharedInstanceWithLocale( + base::android::GetDefaultLocaleString(), nullptr, + ui::ResourceBundle::LOAD_COMMON_RESOURCES); + if (locale.empty()) { + LOG(WARNING) << "Failed to load locale .pak from apk."; } - global_descriptors->Set(kPakDescriptor, pak_fd, pak_region); + base::i18n::SetICUDefaultLocale(locale); + + // Try to directly mmap the resources.pak from the apk. Fall back to load + // from file, using PATH_SERVICE, otherwise. + base::FilePath pak_file_path; + base::PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_file_path); + pak_file_path = pak_file_path.AppendASCII("resources.pak"); + ui::LoadMainAndroidPackFile("assets/resources.pak", pak_file_path); + } else { + base::i18n::SetICUDefaultLocale( + command_line.GetSwitchValueASCII(switches::kLang)); + + auto* global_descriptors = base::GlobalDescriptors::GetInstance(); + int pak_fd = global_descriptors->Get(kWebLayerLocalePakDescriptor); + base::MemoryMappedFile::Region pak_region = + global_descriptors->GetRegion(kWebLayerLocalePakDescriptor); + ui::ResourceBundle::InitSharedInstanceWithPakFileRegion(base::File(pak_fd), + pak_region); + + std::pair<int, ui::ScaleFactor> extra_paks[] = { + {kWebLayerMainPakDescriptor, ui::SCALE_FACTOR_NONE}, + {kWebLayer100PercentPakDescriptor, ui::SCALE_FACTOR_100P}}; + + for (const auto& pak_info : extra_paks) { + pak_fd = global_descriptors->Get(pak_info.first); + pak_region = global_descriptors->GetRegion(pak_info.first); + ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion( + base::File(pak_fd), pak_region, pak_info.second); + } } - DCHECK_GE(pak_fd, 0); - // This is clearly wrong. See crbug.com/330930 - ui::ResourceBundle::InitSharedInstanceWithPakFileRegion(base::File(pak_fd), - pak_region); - ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion( - base::File(pak_fd), pak_region, ui::SCALE_FACTOR_100P); #else base::FilePath pak_file; bool r = base::PathService::Get(base::DIR_ASSETS, &pak_file);
diff --git a/weblayer/app/entry_point.cc b/weblayer/app/entry_point.cc index b2cac033..2b8535d 100644 --- a/weblayer/app/entry_point.cc +++ b/weblayer/app/entry_point.cc
@@ -9,7 +9,7 @@ namespace { bool NativeInit(base::android::LibraryProcessType) { - return weblayer::OnJNIOnLoadInit("weblayer_support.pak"); + return weblayer::OnJNIOnLoadInit(); } } // namespace
diff --git a/weblayer/app/jni_onload.cc b/weblayer/app/jni_onload.cc index 154438c..ed5d3b6 100644 --- a/weblayer/app/jni_onload.cc +++ b/weblayer/app/jni_onload.cc
@@ -18,12 +18,11 @@ }; // This is called by the VM when the shared library is first loaded. -bool OnJNIOnLoadInit(const std::string& pak_name) { +bool OnJNIOnLoadInit() { if (!content::android::OnJNIOnLoadInit()) return false; weblayer::MainParams params; params.delegate = new weblayer::MainDelegateImpl; - params.pak_name = pak_name; params.brand = "WebLayer"; base::android::SetVersionNumber(PRODUCT_VERSION);
diff --git a/weblayer/app/jni_onload.h b/weblayer/app/jni_onload.h index 520c6e5..5b05b04e 100644 --- a/weblayer/app/jni_onload.h +++ b/weblayer/app/jni_onload.h
@@ -9,7 +9,7 @@ namespace weblayer { -bool OnJNIOnLoadInit(const std::string& pak_name); +bool OnJNIOnLoadInit(); } // namespace weblayer
diff --git a/weblayer/browser/android_descriptors.h b/weblayer/browser/android_descriptors.h index f6f5252..55b17fc 100644 --- a/weblayer/browser/android_descriptors.h +++ b/weblayer/browser/android_descriptors.h
@@ -12,7 +12,9 @@ // This is a list of global descriptor keys to be used with the // base::GlobalDescriptors object (see base/posix/global_descriptors.h) enum { - kPakDescriptor = kContentIPCDescriptorMax + 1, + kWebLayerLocalePakDescriptor = kContentIPCDescriptorMax + 1, + kWebLayerMainPakDescriptor, + kWebLayer100PercentPakDescriptor, }; } // namespace weblayer
diff --git a/weblayer/browser/browser_controller_impl.cc b/weblayer/browser/browser_controller_impl.cc index 4be05e6c..008165e 100644 --- a/weblayer/browser/browser_controller_impl.cc +++ b/weblayer/browser/browser_controller_impl.cc
@@ -237,7 +237,7 @@ // If |processing_enter_fullscreen_| is true, it means the callback is being // called while processing EnterFullscreenModeForTab(). WebContents doesn't // deal well with this. FATAL as Android generally doesn't run with DCHECKs. - LOG_IF(FATAL, !processing_enter_fullscreen_) + LOG_IF(FATAL, processing_enter_fullscreen_) << "exiting fullscreen while entering fullscreen is not supported"; web_contents_->ExitFullscreen(/* will_cause_resize */ false); }
diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc index 114469f0..e13b80b 100644 --- a/weblayer/browser/content_browser_client_impl.cc +++ b/weblayer/browser/content_browser_client_impl.cc
@@ -31,8 +31,8 @@ #include "weblayer/public/main.h" #if defined(OS_ANDROID) -#include "base/android/apk_assets.h" #include "base/android/path_utils.h" +#include "ui/base/resource/resource_bundle_android.h" #include "weblayer/browser/android_descriptors.h" #endif @@ -141,10 +141,15 @@ int child_process_id, content::PosixFileDescriptorInfo* mappings) { #if defined(OS_ANDROID) - mappings->ShareWithRegion( - kPakDescriptor, - base::GlobalDescriptors::GetInstance()->Get(kPakDescriptor), - base::GlobalDescriptors::GetInstance()->GetRegion(kPakDescriptor)); + base::MemoryMappedFile::Region region; + int fd = ui::GetMainAndroidPackFd(®ion); + mappings->ShareWithRegion(kWebLayerMainPakDescriptor, fd, region); + + fd = ui::GetCommonResourcesPackFd(®ion); + mappings->ShareWithRegion(kWebLayer100PercentPakDescriptor, fd, region); + + fd = ui::GetLocalePackFd(®ion); + mappings->ShareWithRegion(kWebLayerLocalePakDescriptor, fd, region); #endif } #endif // defined(OS_LINUX) || defined(OS_ANDROID)
diff --git a/weblayer/browser/fullscreen_delegate_proxy.cc b/weblayer/browser/fullscreen_delegate_proxy.cc index 46ae748..7f6ce3c 100644 --- a/weblayer/browser/fullscreen_delegate_proxy.cc +++ b/weblayer/browser/fullscreen_delegate_proxy.cc
@@ -19,7 +19,7 @@ JNIEnv* env, jobject obj, BrowserController* browser_controller) - : browser_controller_(browser_controller), java_observer_(env, obj) { + : browser_controller_(browser_controller), java_delegate_(env, obj) { browser_controller_->SetFullscreenDelegate(this); } @@ -30,12 +30,12 @@ void FullscreenDelegateProxy::EnterFullscreen(base::OnceClosure exit_closure) { exit_fullscreen_closure_ = std::move(exit_closure); Java_FullscreenDelegateProxy_enterFullscreen(AttachCurrentThread(), - java_observer_); + java_delegate_); } void FullscreenDelegateProxy::ExitFullscreen() { Java_FullscreenDelegateProxy_exitFullscreen(AttachCurrentThread(), - java_observer_); + java_delegate_); } void FullscreenDelegateProxy::DoExitFullscreen(
diff --git a/weblayer/browser/fullscreen_delegate_proxy.h b/weblayer/browser/fullscreen_delegate_proxy.h index d28b57b..2630c3be 100644 --- a/weblayer/browser/fullscreen_delegate_proxy.h +++ b/weblayer/browser/fullscreen_delegate_proxy.h
@@ -36,7 +36,7 @@ private: BrowserController* browser_controller_; - base::android::ScopedJavaGlobalRef<jobject> java_observer_; + base::android::ScopedJavaGlobalRef<jobject> java_delegate_; base::OnceClosure exit_fullscreen_closure_; DISALLOW_COPY_AND_ASSIGN(FullscreenDelegateProxy);
diff --git a/weblayer/browser/java/BUILD.gn b/weblayer/browser/java/BUILD.gn index f1f772a..8fc8ae14 100644 --- a/weblayer/browser/java/BUILD.gn +++ b/weblayer/browser/java/BUILD.gn
@@ -4,12 +4,17 @@ import("//build/config/android/config.gni") import("//build/config/android/rules.gni") +import("//weblayer/variables.gni") android_resources("weblayer_resources") { resource_dirs = [] custom_package = "org.chromium.weblayer_private" } +generate_locale_config_srcjar("weblayer_locale_config") { + java_package = weblayer_locale_config_java_package +} + android_library("java") { java_files = [ "org/chromium/weblayer_private/BrowserControllerImpl.java", @@ -37,6 +42,8 @@ "//content/public/android:content_java", "//ui/android:ui_java", ] + srcjar_deps = [ ":weblayer_locale_config" ] + jar_excluded_patterns = [ "*/LocaleConfig.class" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java index 80a7811..069eaca8 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
@@ -60,7 +60,7 @@ Context context = ObjectWrapper.unwrap(webLayerContextWrapper, Context.class); ContextUtils.initApplicationContext(context); - ResourceBundle.setNoAvailableLocalePaks(); + ResourceBundle.setAvailablePakLocales(new String[] {}, LocaleConfig.UNCOMPRESSED_LOCALES); PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX); ChildProcessCreationParams.set(context.getPackageName(), false /* isExternalService */,
diff --git a/weblayer/public/java/org/chromium/weblayer/BrowserController.java b/weblayer/public/java/org/chromium/weblayer/BrowserController.java index ff1aa7c..3af8ac8 100644 --- a/weblayer/public/java/org/chromium/weblayer/BrowserController.java +++ b/weblayer/public/java/org/chromium/weblayer/BrowserController.java
@@ -40,6 +40,7 @@ mImpl.setFullscreenDelegateClient(mFullscreenDelegateClient); } else { mImpl.setFullscreenDelegateClient(null); + mFullscreenDelegateClient = null; } } catch (RemoteException e) { throw new APICallException(e);
diff --git a/weblayer/shell/android/BUILD.gn b/weblayer/shell/android/BUILD.gn index 1ff9881..a91ee77 100644 --- a/weblayer/shell/android/BUILD.gn +++ b/weblayer/shell/android/BUILD.gn
@@ -7,6 +7,7 @@ import("//build/config/android/rules.gni") import("//third_party/icu/config.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") +import("//weblayer/variables.gni") android_assets("weblayer_shell_assets") { testonly = true @@ -206,30 +207,14 @@ output = weblayer_support_manifest } -android_assets("weblayer_support_assets") { - testonly = true - - sources = [ - "$root_out_dir/weblayer_support.pak", - ] - disable_compression = true - deps = [ - "//third_party/icu:icu_assets", - "//weblayer/shell:support_pak", - ] - if (use_v8_context_snapshot) { - deps += [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ] - } else { - deps += [ "//v8:v8_external_startup_data_assets" ] - } -} - android_apk("weblayer_support_apk") { testonly = true deps = [ - ":weblayer_support_assets", ":weblayer_support_manifest", + "//android_webview:locale_pak_assets", + "//android_webview:monochrome_webview_assets", + "//android_webview:pak_file_assets", "//base:base_java", "//weblayer/browser/java", ] @@ -249,6 +234,8 @@ android_manifest_dep = ":weblayer_support_manifest" shared_resources = true + locale_config_java_packages = [ weblayer_locale_config_java_package ] + native_lib_version_rule = "//build/util:chrome_version_json" _native_lib_file = rebase_path("$root_gen_dir/CHROME_VERSION.json", root_build_dir) @@ -265,10 +252,13 @@ deps = [ "//base:base_java_test_support", "//content/public/test/android:content_java_test_support", + "//net/android:net_java_test_support", "//third_party/android_support_test_runner:runner_java", ] java_files = [ "javatests/src/org/chromium/weblayer/test/BrowserObserverTest.java", + "javatests/src/org/chromium/weblayer/test/EventUtils.java", + "javatests/src/org/chromium/weblayer/test/FullscreenDelegateTest.java", "javatests/src/org/chromium/weblayer/test/NavigationTest.java", "javatests/src/org/chromium/weblayer/test/SmokeTest.java", "javatests/src/org/chromium/weblayer/test/RenderingTest.java", @@ -276,5 +266,11 @@ "javatests/src/org/chromium/weblayer/test/FragmentRestoreTest.java", "shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java", ] - additional_apks = [ "//weblayer/shell/android:weblayer_support_apk" ] + additional_apks = [ + "//weblayer/shell/android:weblayer_support_apk", + "//net/android:net_test_support_apk", + ] + data = [ + "//weblayer/test/data/", + ] }
diff --git a/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/EventUtils.java b/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/EventUtils.java new file mode 100644 index 0000000..5a4485d3 --- /dev/null +++ b/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/EventUtils.java
@@ -0,0 +1,31 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.weblayer.test; + +import android.os.SystemClock; +import android.view.MotionEvent; +import android.view.View; + +/** + * Utilities related to event generation. + */ +public final class EventUtils { + private EventUtils() {} + + /** + * Asynchronously posts a touch-down and touch-up event at the center of the supplied View. + */ + public static void simulateTouchCenterOfView(final View view) { + view.post(() -> { + long eventTime = SystemClock.uptimeMillis(); + float x = (float) (view.getRight() - view.getLeft()) / 2; + float y = (float) (view.getBottom() - view.getTop()) / 2; + view.dispatchTouchEvent( + MotionEvent.obtain(eventTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0)); + view.dispatchTouchEvent( + MotionEvent.obtain(eventTime, eventTime, MotionEvent.ACTION_UP, x, y, 0)); + }); + } +}
diff --git a/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FragmentRestoreTest.java b/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FragmentRestoreTest.java index f8fd29a..713c761 100644 --- a/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FragmentRestoreTest.java +++ b/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FragmentRestoreTest.java
@@ -11,6 +11,7 @@ import org.junit.runner.RunWith; import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.DisabledTest; @RunWith(BaseJUnit4ClassRunner.class) public class FragmentRestoreTest { @@ -19,6 +20,7 @@ @Test @SmallTest + @DisabledTest public void successfullyLoadsUrlAfterRotation() { mActivityTestRule.launchShellWithUrl("about:blank");
diff --git a/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FullscreenDelegateTest.java b/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FullscreenDelegateTest.java new file mode 100644 index 0000000..0da8e976 --- /dev/null +++ b/weblayer/shell/android/javatests/src/org/chromium/weblayer/test/FullscreenDelegateTest.java
@@ -0,0 +1,126 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.weblayer.test; + +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.content_public.browser.test.util.Criteria; +import org.chromium.content_public.browser.test.util.CriteriaHelper; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.net.test.EmbeddedTestServer; +import org.chromium.weblayer.FullscreenDelegate; +import org.chromium.weblayer.shell.WebLayerShellActivity; + +/** + * Tests that FullscreenDelegate methods are invoked as expected. + */ +@RunWith(BaseJUnit4ClassRunner.class) +public class FullscreenDelegateTest { + @Rule + public WebLayerShellActivityTestRule mActivityTestRule = new WebLayerShellActivityTestRule(); + + private EmbeddedTestServer mTestServer; + private WebLayerShellActivity mActivity; + private Delegate mDelegate; + + private static class Delegate extends FullscreenDelegate { + public int mEnterFullscreenCount; + public int mExitFullscreenCount; + public Runnable mExitFullscreenRunnable; + + @Override + public void enterFullscreen(Runnable exitFullscreenRunner) { + mEnterFullscreenCount++; + mExitFullscreenRunnable = exitFullscreenRunner; + } + + @Override + public void exitFullscreen() { + mExitFullscreenCount++; + } + + public void waitForFullscreen() { + CriteriaHelper.pollInstrumentationThread(new Criteria() { + @Override + public boolean isSatisfied() { + return mEnterFullscreenCount == 1; + } + }, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, CriteriaHelper.DEFAULT_POLLING_INTERVAL); + } + + public void waitForExitFullscreen() { + CriteriaHelper.pollInstrumentationThread(new Criteria() { + @Override + public boolean isSatisfied() { + return mExitFullscreenCount == 1; + } + }, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, CriteriaHelper.DEFAULT_POLLING_INTERVAL); + } + } + + @Before + public void setUp() { + mTestServer = new EmbeddedTestServer(); + mTestServer.initializeNative(InstrumentationRegistry.getInstrumentation().getContext(), + EmbeddedTestServer.ServerHTTPSSetting.USE_HTTP); + mTestServer.addDefaultHandlers("weblayer/test/data"); + Assert.assertTrue(mTestServer.start(0)); + + String url = mTestServer.getURL("/fullscreen.html"); + mActivity = mActivityTestRule.launchShellWithUrl(url); + Assert.assertNotNull(mActivity); + mActivityTestRule.waitForNavigation(url); + mDelegate = new Delegate(); + TestThreadUtils.runOnUiThreadBlocking( + () -> { mActivity.getBrowserController().setFullscreenDelegate(mDelegate); }); + + // First touch enters fullscreen. + EventUtils.simulateTouchCenterOfView(mActivity.getWindow().getDecorView()); + mDelegate.waitForFullscreen(); + Assert.assertEquals(1, mDelegate.mEnterFullscreenCount); + } + + @After + public void tearDown() { + mTestServer.stopAndDestroyServer(); + } + + @Test + @SmallTest + public void testFullscreen() { + // Second touch exits. + EventUtils.simulateTouchCenterOfView(mActivity.getWindow().getDecorView()); + mDelegate.waitForExitFullscreen(); + Assert.assertEquals(1, mDelegate.mExitFullscreenCount); + } + + @Test + @SmallTest + public void testExitFullscreenWhenDelegateCleared() { + // Clearing the FullscreenDelegate should exit fullscreen. + TestThreadUtils.runOnUiThreadBlocking( + () -> { mActivity.getBrowserController().setFullscreenDelegate(null); }); + mDelegate.waitForExitFullscreen(); + Assert.assertEquals(1, mDelegate.mExitFullscreenCount); + } + + @Test + @SmallTest + public void testExitFullscreenUsingRunnable() { + // Running the runnable supplied to the delegate should exit fullscreen. + TestThreadUtils.runOnUiThreadBlocking(mDelegate.mExitFullscreenRunnable); + mDelegate.waitForExitFullscreen(); + Assert.assertEquals(1, mDelegate.mExitFullscreenCount); + } +}
diff --git a/weblayer/test/data/fullscreen.html b/weblayer/test/data/fullscreen.html new file mode 100644 index 0000000..c27289ab --- /dev/null +++ b/weblayer/test/data/fullscreen.html
@@ -0,0 +1,15 @@ +<html> + <body> + <p id='x'></p> + </body> + <script> + function toggleFullscreen() { + if (!document.fullscreenElement) { + document.getElementById('x').requestFullscreen(); + } else { + document.exitFullscreen(); + } + } + document.addEventListener('touchstart', function(e) { toggleFullscreen(); }, false); + </script> +</html>
diff --git a/weblayer/variables.gni b/weblayer/variables.gni new file mode 100644 index 0000000..ea0cbdb1 --- /dev/null +++ b/weblayer/variables.gni
@@ -0,0 +1,5 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +weblayer_locale_config_java_package = "org.chromium.weblayer_private"