Revert "Fix delegated ink trails in OOPIF"
This reverts commit b8c06872c6cfa5a1be26bd0f801aa1f350538fd7.
Reason for revert: crbug.com/1215704
Original change's description:
> Fix delegated ink trails in OOPIF
>
> Today, delegated ink trails do not work in OOPIFs. The
> RenderFrameMetadata with the delegated ink flag set on it arrives in a
> provider held by RenderWidgetHostImpl that is associated with the OOPIF.
> This makes sense, but the issue is that the OOPIF's view is a
> RenderWidgetHostViewChildFrame, which does not hold an EventHandler.
> Then, when future pointerevents arrive in the browser, they are not
> checking the correct widget for a delegated ink flag. Therefore, points
> are not being forwarded for delegated ink trails.
>
> This fix moves the place that we decide to forward delegated ink points
> into the RenderWidgetHostInputEventRouter, which is slightly later in
> the execution. By doing this, hit testing will have occurred and we
> will have the RenderWidgetHostViewChildFrame as the target, allowing us
> to directly query that view's widget for a delegated ink flag. Then
> forwarding will work as it did from RenderWidgetHostViewEventHandler.
>
> Bug: 1052145
> Change-Id: I0b22b98ae73be97217c0b45cf2e5c3e6a4e32577
> Cq-Do-Not-Cancel-Tryjobs: true
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2857102
> Reviewed-by: Ken Buchanan <kenrb@chromium.org>
> Reviewed-by: Jonathan Ross <jonross@chromium.org>
> Reviewed-by: Scott Violet <sky@chromium.org>
> Reviewed-by: Daniel Libby <dlibby@microsoft.com>
> Commit-Queue: Mario Bianucci <mabian@microsoft.com>
> Cr-Commit-Position: refs/heads/master@{#888498}
Bug: 1052145, 1215704
Change-Id: I501df4b3fe9736cbed5d677ae72906cb331bb347
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2935138
Auto-Submit: François Doray <fdoray@chromium.org>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Commit-Queue: François Doray <fdoray@chromium.org>
Owners-Override: François Doray <fdoray@chromium.org>
Cr-Commit-Position: refs/heads/master@{#888609}
diff --git a/content/browser/renderer_host/render_frame_metadata_provider_impl.h b/content/browser/renderer_host/render_frame_metadata_provider_impl.h
index 3d68f96..bfcd03de 100644
--- a/content/browser/renderer_host/render_frame_metadata_provider_impl.h
+++ b/content/browser/renderer_host/render_frame_metadata_provider_impl.h
@@ -60,7 +60,6 @@
private:
friend class FakeRenderWidgetHostViewAura;
- friend class DelegatedInkPointTest;
// Paired with the mojom::RenderFrameMetadataObserverClient overrides, these
// methods are enqueued in |frame_token_message_queue_|. They are invoked when
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc
index b2e08a8..893c804 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router.cc
+++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -14,7 +14,6 @@
#include "base/metrics/histogram_macros.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
-#include "base/trace_event/trace_event.h"
#include "components/viz/common/features.h"
#include "components/viz/common/hit_test/hit_test_region_list.h"
#include "components/viz/common/quads/surface_draw_quad.h"
@@ -28,7 +27,6 @@
#include "content/public/browser/render_widget_host_iterator.h"
#include "third_party/blink/public/common/input/web_input_event.h"
#include "ui/base/layout.h"
-#include "ui/compositor/compositor.h"
#include "ui/gfx/geometry/dip_util.h"
namespace {
@@ -643,14 +641,6 @@
mouse_capture_target_ = target;
}
- if (target) {
- ui::EventType type = mouse_event.GetTypeAsUiEventType();
- bool hovering =
- (type ^ ui::ET_MOUSE_DRAGGED) && (type ^ ui::ET_MOUSE_PRESSED);
- ForwardDelegatedInkPoint(target, root_view, mouse_event, mouse_event,
- hovering);
- }
-
DCHECK(target_location.has_value());
blink::WebMouseEvent event = mouse_event;
event.SetPositionInWidget(target_location->x(), target_location->y());
@@ -875,11 +865,6 @@
base::debug::DumpWithoutCrashing();
}
- if (touch_target_) {
- ForwardDelegatedInkPoint(touch_target_, root_view, touch_event,
- touch_event.touches[0], touch_event.hovering);
- }
-
TouchEventAckQueue::TouchEventSource event_source =
is_emulated_touchevent
? TouchEventAckQueue::TouchEventSource::EmulatedTouchEvent
@@ -2003,71 +1988,4 @@
event_targeter_->SetIsAutoScrollInProgress(is_autoscroll_in_progress);
}
-bool IsMoveEvent(ui::EventType type) {
- return type == ui::ET_MOUSE_MOVED || type == ui::ET_MOUSE_DRAGGED ||
- type == ui::ET_TOUCH_MOVED;
-}
-
-void RenderWidgetHostInputEventRouter::ForwardDelegatedInkPoint(
- RenderWidgetHostViewBase* target_view,
- RenderWidgetHostViewBase* root_view,
- const blink::WebInputEvent& input_event,
- const blink::WebPointerProperties& pointer_properties,
- bool hovering) {
- const absl::optional<cc::DelegatedInkBrowserMetadata>& metadata =
- target_view->host()
- ->render_frame_metadata_provider()
- ->LastRenderFrameMetadata()
- .delegated_ink_metadata;
-
- if (IsMoveEvent(input_event.GetTypeAsUiEventType()) && metadata &&
- hovering == metadata.value().delegated_ink_is_hovering) {
- if (!delegated_ink_point_renderer_.is_bound()) {
- ui::Compositor* compositor = target_view->GetCompositor();
-
- // The remote can't be bound if the compositor is null, so bail if that
- // is the case so we don't crash by trying to use an unbound remote.
- if (!compositor)
- return;
-
- TRACE_EVENT_INSTANT0("input",
- "Binding mojo interface for delegated ink points.",
- TRACE_EVENT_SCOPE_THREAD);
- compositor->SetDelegatedInkPointRenderer(
- delegated_ink_point_renderer_.BindNewPipeAndPassReceiver());
- delegated_ink_point_renderer_.reset_on_disconnect();
- }
-
- gfx::PointF position = pointer_properties.PositionInWidget();
- root_view->TransformPointToRootSurface(&position);
- position.Scale(target_view->GetDeviceScaleFactor());
-
- gfx::DelegatedInkPoint delegated_ink_point(
- position, input_event.TimeStamp(), pointer_properties.id);
- TRACE_EVENT_INSTANT1("input",
- "Forwarding delegated ink point from browser.",
- TRACE_EVENT_SCOPE_THREAD, "delegated point",
- delegated_ink_point.ToString());
-
- // Calling this will result in IPC calls to get |delegated_ink_point| to
- // viz. The decision to do this here was made with the understanding that
- // the IPC overhead will result in a minor increase in latency for getting
- // this event to the renderer. However, by sending it here, the event is
- // given the greatest possible chance to make it to viz before
- // DrawAndSwap() is called, allowing more points to be drawn as part of
- // the delegated ink trail, and thus reducing user perceived latency.
- delegated_ink_point_renderer_->StoreDelegatedInkPoint(delegated_ink_point);
- ended_delegated_ink_trail_ = false;
- } else if (delegated_ink_point_renderer_.is_bound() &&
- !ended_delegated_ink_trail_) {
- // Let viz know that the most recent point it received from us is probably
- // the last point the user is inking, so it shouldn't predict anything
- // beyond it.
- TRACE_EVENT_INSTANT0("input", "Delegated ink trail ended",
- TRACE_EVENT_SCOPE_THREAD);
- delegated_ink_point_renderer_->ResetPrediction();
- ended_delegated_ink_trail_ = true;
- }
-}
-
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.h b/content/browser/renderer_host/render_widget_host_input_event_router.h
index b850e9e..3550833 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router.h
+++ b/content/browser/renderer_host/render_widget_host_input_event_router.h
@@ -23,10 +23,8 @@
#include "content/browser/renderer_host/render_widget_host_view_base_observer.h"
#include "content/browser/renderer_host/render_widget_targeter.h"
#include "content/common/content_export.h"
-#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/input/input_event_result.mojom-shared.h"
#include "ui/gfx/geometry/vector2d_conversions.h"
-#include "ui/gfx/mojom/delegated_ink_point_renderer.mojom.h"
#include "ui/gfx/transform.h"
namespace blink {
@@ -34,7 +32,6 @@
class WebInputEvent;
class WebMouseEvent;
class WebMouseWheelEvent;
-class WebPointerProperties;
class WebTouchEvent;
}
@@ -335,18 +332,6 @@
void SetTouchscreenGestureTarget(RenderWidgetHostViewBase* target,
bool moved_recently = false);
- void ForwardDelegatedInkPoint(
- RenderWidgetHostViewBase* target_view,
- RenderWidgetHostViewBase* root_view,
- const blink::WebInputEvent& input_event,
- const blink::WebPointerProperties& pointer_properties,
- bool hovering);
-
- void FlushForTest() { delegated_ink_point_renderer_.FlushForTesting(); }
- bool IsDelegatedInkRendererBoundForTest() {
- return delegated_ink_point_renderer_.is_bound();
- }
-
FrameSinkIdOwnerMap owner_map_;
TargetMap touchscreen_gesture_target_map_;
RenderWidgetHostViewBase* touch_target_ = nullptr;
@@ -444,18 +429,6 @@
// Used to prevent multiple dumps.
bool has_dumped_ = false;
- // Remote end of the connection for sending delegated ink points to viz to
- // support the delegated ink trails feature.
- mojo::Remote<gfx::mojom::DelegatedInkPointRenderer>
- delegated_ink_point_renderer_;
- // Used to know if we have already told viz to reset prediction because the
- // final point of the delegated ink trail has been sent. True when prediction
- // has already been reset for the most recent trail, false otherwise. This
- // flag helps make sure that we don't send more IPCs than necessary to viz to
- // reset prediction. Sending extra IPCs wouldn't impact correctness, but can
- // impact performance due to the IPC overhead.
- bool ended_delegated_ink_trail_ = false;
-
base::WeakPtrFactory<RenderWidgetHostInputEventRouter> weak_ptr_factory_{
this};
@@ -477,8 +450,6 @@
InputEventRouterWheelTargetTest);
FRIEND_TEST_ALL_PREFIXES(SitePerProcessMacBrowserTest,
InputEventRouterTouchpadGestureTargetTest);
- FRIEND_TEST_ALL_PREFIXES(SitePerProcessDelegatedInkBrowserTest,
- MetadataAndPointGoThroughOOPIF);
};
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc b/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc
index 9db386e..fe41ab1 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc
@@ -31,13 +31,6 @@
#include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
#include "third_party/blink/public/mojom/input/touch_event.mojom.h"
-#if defined(USE_AURA)
-#include "ui/aura/test/aura_test_helper.h"
-#include "ui/aura/test/test_screen.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/gfx/mojom/delegated_ink_point_renderer.mojom.h"
-#endif // defined(USE_AURA)
-
namespace content {
namespace {
@@ -107,15 +100,10 @@
void Reset() { last_gesture_seen_ = blink::WebInputEvent::Type::kUndefined; }
- void SetCompositor(ui::Compositor* compositor) { compositor_ = compositor; }
- ui::Compositor* GetCompositor() override { return compositor_; }
-
private:
blink::WebInputEvent::Type last_gesture_seen_ =
blink::WebInputEvent::Type::kUndefined;
uint32_t unique_id_for_last_touch_ack_ = 0;
-
- ui::Compositor* compositor_;
};
class StubHitTestQuery : public viz::HitTestQuery {
@@ -348,8 +336,6 @@
RenderWidgetHostViewBase* gesture_target,
bool should_cancel);
- void FlushInkRenderer() { rwhier()->FlushForTest(); }
-
BrowserTaskEnvironment task_environment_;
MockRenderWidgetHostDelegate delegate_;
@@ -1059,505 +1045,4 @@
base::RunLoop().RunUntilIdle();
}
-#if defined(USE_AURA)
-// Mock the DelegatedInkPointRenderer to grab the delegated ink points as they
-// are shipped off to viz from the browser process.
-class MockDelegatedInkPointRenderer
- : public gfx::mojom::DelegatedInkPointRenderer {
- public:
- explicit MockDelegatedInkPointRenderer(
- mojo::PendingReceiver<gfx::mojom::DelegatedInkPointRenderer> receiver)
- : receiver_(this, std::move(receiver)) {}
-
- void StoreDelegatedInkPoint(const gfx::DelegatedInkPoint& point) override {
- delegated_ink_point_ = point;
- }
-
- bool HasDelegatedInkPoint() { return delegated_ink_point_.has_value(); }
-
- gfx::DelegatedInkPoint GetDelegatedInkPoint() {
- gfx::DelegatedInkPoint point = delegated_ink_point_.value();
- delegated_ink_point_.reset();
- return point;
- }
-
- void ClearDelegatedInkPoint() { delegated_ink_point_.reset(); }
-
- void ResetPrediction() override { prediction_reset_ = true; }
- bool GetPredictionState() {
- bool state = prediction_reset_;
- prediction_reset_ = false;
- return state;
- }
-
- void FlushForTesting() { receiver_.FlushForTesting(); }
-
- void ResetReceiver() { receiver_.reset(); }
- bool ReceiverIsBound() { return receiver_.is_bound(); }
-
- private:
- mojo::Receiver<gfx::mojom::DelegatedInkPointRenderer> receiver_;
- absl::optional<gfx::DelegatedInkPoint> delegated_ink_point_;
- bool prediction_reset_ = false;
-};
-
-// MockCompositor class binds the mojo interfaces so that the ink points are
-// shipped to the browser process. Uses values from the real compositor to be
-// created, but a fake FrameSinkId must be used so that it hasn't already been
-// registered.
-class MockCompositor : public ui::Compositor {
- public:
- explicit MockCompositor(ui::Compositor* compositor)
- : ui::Compositor(viz::FrameSinkId(5, 5),
- compositor->context_factory(),
- compositor->task_runner(),
- compositor->is_pixel_canvas()) {}
-
- void SetDelegatedInkPointRenderer(
- mojo::PendingReceiver<gfx::mojom::DelegatedInkPointRenderer> receiver)
- override {
- delegated_ink_point_renderer_ =
- std::make_unique<MockDelegatedInkPointRenderer>(std::move(receiver));
- }
-
- MockDelegatedInkPointRenderer* delegated_ink_point_renderer() {
- return delegated_ink_point_renderer_.get();
- }
-
- private:
- std::unique_ptr<MockDelegatedInkPointRenderer> delegated_ink_point_renderer_;
-};
-
-enum TestEvent { kMouseEvent, kTouchEvent };
-enum HoveringState { kHovering, kNotHovering };
-
-class DelegatedInkPointTest
- : public RenderWidgetHostInputEventRouterTest,
- public testing::WithParamInterface<std::tuple<TestEvent, HoveringState>> {
- public:
- DelegatedInkPointTest() = default;
-
- void SetUp() override {
- RenderWidgetHostInputEventRouterTest::SetUp();
-
- aura_test_helper_ = std::make_unique<aura::test::AuraTestHelper>(
- ImageTransportFactory::GetInstance()->GetContextFactory());
- aura_test_helper_->SetUp();
-
- compositor_ = std::make_unique<MockCompositor>(
- aura_test_helper_->GetHost()->compositor());
- view_root_->SetCompositor(compositor_.get());
- }
-
- void TearDown() override {
- aura_test_helper_->TearDown();
- compositor_.reset();
- RenderWidgetHostInputEventRouterTest::TearDown();
- }
-
- TestEvent GetEventParam() { return std::get<0>(GetParam()); }
- HoveringState GetHoverParam() { return std::get<1>(GetParam()); }
-
- void SetInkMetadataFlagOnRenderFrameMetadata(bool delegated_ink) {
- SetInkMetadataFlagOnSpecificHost(delegated_ink, widget_host_root_.get());
- }
-
- void SetInkMetadataFlagOnSpecificHost(bool delegated_ink,
- RenderWidgetHostImpl* widget_host) {
- cc::RenderFrameMetadata metadata;
- if (delegated_ink) {
- metadata.delegated_ink_metadata = cc::DelegatedInkBrowserMetadata(
- GetHoverParam() == HoveringState::kHovering);
- }
- widget_host->render_frame_metadata_provider()
- ->SetLastRenderFrameMetadataForTest(metadata);
- }
-
- void SendEvent(bool match_test_hovering_state,
- gfx::PointF point,
- base::TimeTicks timestamp = base::TimeTicks::Now()) {
- SendEvent(match_test_hovering_state, point, timestamp,
- /*use_enter_event*/ false, /*use_exit_event*/ false);
- }
-
- void SendEvent(bool match_test_hovering_state,
- const gfx::PointF& point,
- base::TimeTicks timestamp,
- bool use_enter_event,
- bool use_exit_event) {
- DCHECK(!(use_enter_event && use_exit_event));
-
- // Hovering creates and sends ui::MouseEvents with
- // ET_MOUSE_{MOVED,ENTERED,EXITED} types, so do the same here in hovering
- // scenarios.
- if (GetEventParam() == TestEvent::kTouchEvent &&
- !Hovering(match_test_hovering_state)) {
- blink::WebInputEvent::Type event_type =
- blink::WebInputEvent::Type::kTouchMove;
- blink::WebTouchPoint::State touch_state =
- blink::WebTouchPoint::State::kStateMoved;
- if (use_enter_event) {
- event_type = blink::WebInputEvent::Type::kTouchStart;
- touch_state = blink::WebTouchPoint::State::kStatePressed;
- // Set this now so that if we are going to send a enter event anyway,
- // we don't send two.
- sent_touch_press_ = true;
- }
- if (use_exit_event) {
- event_type = blink::WebInputEvent::Type::kTouchEnd;
- touch_state = blink::WebTouchPoint::State::kStateReleased;
- }
-
- // Touch needs a pressed event first to properly handle future move
- // events.
- SendTouchPress(point);
-
- blink::WebTouchEvent touch_event(
- event_type, blink::WebInputEvent::kNoModifiers, timestamp);
- touch_event.touches_length = 1;
- touch_event.touches[0].id = kPointerId;
- touch_event.touches[0].SetPositionInWidget(point);
- touch_event.touches[0].state = touch_state;
- touch_event.unique_touch_event_id = GetTouchId();
-
- rwhier()->RouteTouchEvent(view_root_.get(), &touch_event,
- ui::LatencyInfo(ui::SourceEventType::TOUCH));
-
- // Need to send a new press event after ending the previous touch.
- if (use_exit_event)
- sent_touch_press_ = false;
- } else {
- blink::WebInputEvent::Type event_type =
- blink::WebInputEvent::Type::kMouseMove;
- if (use_enter_event)
- event_type = blink::WebInputEvent::Type::kMouseEnter;
- if (use_exit_event)
- event_type = blink::WebInputEvent::Type::kMouseLeave;
-
- int modifiers = 0;
- if (!Hovering(match_test_hovering_state))
- modifiers = blink::WebInputEvent::kLeftButtonDown;
-
- blink::WebMouseEvent mouse_event(event_type, modifiers, timestamp,
- kPointerId);
- mouse_event.SetPositionInWidget(point);
-
- rwhier()->RouteMouseEvent(view_root_.get(), &mouse_event,
- ui::LatencyInfo(ui::SourceEventType::MOUSE));
- }
- }
-
- void SetDeviceScaleFactor(float dsf) {
- aura_test_helper_->GetTestScreen()->SetDeviceScaleFactor(dsf);
- }
-
- MockCompositor* compositor() { return compositor_.get(); }
-
- int32_t GetExpectedPointerId() const { return kPointerId; }
-
- private:
- void SendTouchPress(const gfx::PointF& requested_touch_location) {
- DCHECK(GetEventParam() == TestEvent::kTouchEvent);
- if (sent_touch_press_)
- return;
-
- // Location of the press event doesn't matter, so long as it doesn't exactly
- // match the location of the subsequent move event. If they match, then the
- // move event is dropped.
- gfx::PointF point(requested_touch_location.x() + 2.f,
- requested_touch_location.y() + 2.f);
-
- // Send a TouchStart/End sequence.
- blink::WebTouchEvent press(
- blink::WebInputEvent::Type::kTouchStart,
- blink::WebInputEvent::kNoModifiers,
- blink::WebInputEvent::GetStaticTimeStampForTests());
- press.touches_length = 1;
- press.touches[0].id = kPointerId;
- press.touches[0].SetPositionInWidget(point);
- press.touches[0].state = blink::WebTouchPoint::State::kStatePressed;
- press.unique_touch_event_id = GetTouchId();
-
- rwhier()->RouteTouchEvent(view_root_.get(), &press,
- ui::LatencyInfo(ui::SourceEventType::TOUCH));
- sent_touch_press_ = true;
- }
-
- bool Hovering(bool match_test_hovering_state) {
- return (GetHoverParam() == HoveringState::kHovering &&
- match_test_hovering_state) ||
- (GetHoverParam() == HoveringState::kNotHovering &&
- !match_test_hovering_state);
- }
-
- // Unique touch id is unique per event, so always increment before providing
- // a new one.
- int GetTouchId() { return ++unique_touch_id_; }
-
- // Pointer id to use in these tests. It must be consistent throughout a single
- // test for some of the touch variations.
- const int32_t kPointerId = 5;
-
- // Touch events are ignored if a press isn't sent first, so use this to track
- // if we have already sent a touch press event yet or not.
- bool sent_touch_press_ = false;
-
- // Most recently used unique touch id for blink::WebTouchEvents
- int unique_touch_id_ = 0;
-
- // Helper for creating a compositor and setting the device scale factor.
- std::unique_ptr<aura::test::AuraTestHelper> aura_test_helper_;
-
- // Mock compositor used for getting the delegated ink points that are
- // forwarded.
- std::unique_ptr<MockCompositor> compositor_;
-};
-
-struct DelegatedInkPointTestPassToString {
- std::string operator()(
- const testing::TestParamInfo<std::tuple<TestEvent, HoveringState>> type)
- const {
- std::string suffix;
-
- if (std::get<0>(type.param) == TestEvent::kMouseEvent)
- suffix.append("Mouse");
- else
- suffix.append("Touch");
-
- if (std::get<1>(type.param) == HoveringState::kHovering)
- suffix.append("Hovering");
- else
- suffix.append("NotHovering");
-
- return suffix;
- }
-};
-
-INSTANTIATE_TEST_SUITE_P(
- DelegatedInkTrails,
- DelegatedInkPointTest,
- testing::Combine(
- testing::Values(TestEvent::kMouseEvent, TestEvent::kTouchEvent),
- testing::Values(HoveringState::kHovering, HoveringState::kNotHovering)),
- DelegatedInkPointTestPassToString());
-
-// Tests to confirm that input events are correctly forwarded to the UI
-// Compositor when DelegatedInkTrails should be drawn, and stops forwarding when
-// they no longer should be drawn.
-TEST_P(DelegatedInkPointTest, EventForwardedToCompositor) {
- // First confirm that the flag is false by default and the point is not sent.
- SendEvent(true, gfx::PointF(15, 15));
- MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
- compositor()->delegated_ink_point_renderer();
-
- EXPECT_FALSE(delegated_ink_point_renderer);
-
- // Then set it to true and confirm that the DelegatedInkPointRenderer is
- // initialized, the connection is made and the point makes it to the renderer.
- SetInkMetadataFlagOnRenderFrameMetadata(true);
- gfx::DelegatedInkPoint expected_point(
- gfx::PointF(10, 10), base::TimeTicks::Now(), GetExpectedPointerId());
- SendEvent(true, expected_point.point(), expected_point.timestamp());
-
- delegated_ink_point_renderer = compositor()->delegated_ink_point_renderer();
- EXPECT_TRUE(delegated_ink_point_renderer);
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- gfx::DelegatedInkPoint actual_point =
- delegated_ink_point_renderer->GetDelegatedInkPoint();
- EXPECT_EQ(expected_point.point(), actual_point.point());
- EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
- EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
-
- // Then try changing the scale factor to confirm it affects the point
- // correctly.
- const float scale = 2.6f;
- SetDeviceScaleFactor(scale);
- gfx::PointF unscaled_point(15, 15);
- base::TimeTicks unscaled_time = base::TimeTicks::Now();
-
- SendEvent(true, unscaled_point, unscaled_time);
- delegated_ink_point_renderer->FlushForTesting();
-
- unscaled_point.Scale(scale);
- expected_point = gfx::DelegatedInkPoint(unscaled_point, unscaled_time,
- GetExpectedPointerId());
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- actual_point = delegated_ink_point_renderer->GetDelegatedInkPoint();
- EXPECT_EQ(expected_point.point(), actual_point.point());
- EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
- EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
-
- // Confirm that prediction is reset when the API is no longer being used and
- // |delegated_ink_metadata| is not set.
- SetInkMetadataFlagOnRenderFrameMetadata(false);
-
- SendEvent(true, gfx::PointF(25, 25));
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- EXPECT_TRUE(delegated_ink_point_renderer->GetPredictionState());
-
- // Finally, confirm that nothing is sent after the prediction has been reset
- // when the delegated ink flag on the render frame metadata is false.
- SendEvent(true, gfx::PointF(46, 46));
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- EXPECT_FALSE(delegated_ink_point_renderer->GetPredictionState());
-}
-
-// Confirm that the interface is rebound if the receiver disconnects.
-TEST_P(DelegatedInkPointTest, MojoInterfaceReboundOnDisconnect) {
- // First make sure the connection exists.
- SetInkMetadataFlagOnRenderFrameMetadata(true);
- SendEvent(true, gfx::PointF(15, 15));
-
- MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
- compositor()->delegated_ink_point_renderer();
-
- EXPECT_TRUE(delegated_ink_point_renderer);
- EXPECT_TRUE(delegated_ink_point_renderer->ReceiverIsBound());
-
- // Reset the receiver and flush the remote to confirm it is no longer bound.
- delegated_ink_point_renderer->ResetReceiver();
- FlushInkRenderer();
-
- EXPECT_FALSE(delegated_ink_point_renderer->ReceiverIsBound());
-
- // Confirm that it now gets reconnected correctly.
- SendEvent(true, gfx::PointF(25, 25));
-
- delegated_ink_point_renderer = compositor()->delegated_ink_point_renderer();
-
- EXPECT_TRUE(delegated_ink_point_renderer);
- EXPECT_TRUE(delegated_ink_point_renderer->ReceiverIsBound());
-}
-
-// Test to confirm that forwarding points to viz will stop and prediction is
-// reset if the state of hovering differs between what is expected and the
-// received points.
-TEST_P(DelegatedInkPointTest, StopForwardingOnHoverStateChange) {
- // First send a point and make sure it makes it to the renderer.
- SetInkMetadataFlagOnRenderFrameMetadata(true);
- SendEvent(true, gfx::PointF(15, 15));
-
- MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
- compositor()->delegated_ink_point_renderer();
- EXPECT_TRUE(delegated_ink_point_renderer);
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- delegated_ink_point_renderer->ClearDelegatedInkPoint();
-
- // Now send a point that doesn't match the state of hovering on the metadata
- // to confirm that it isn't sent and ResetPrediction is called.
- SendEvent(false, gfx::PointF(20, 20));
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- EXPECT_TRUE(delegated_ink_point_renderer->GetPredictionState());
-
- // Send another that doesn't match to confirm the end trail point is only sent
- // once.
- SendEvent(false, gfx::PointF(25, 25));
- delegated_ink_point_renderer->FlushForTesting();
- EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
-
- // Send one that does match again to confirm that points will start sending
- // again if the hovering state starts matching again.
- SendEvent(true, gfx::PointF(30, 30));
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- EXPECT_FALSE(delegated_ink_point_renderer->GetPredictionState());
-}
-
-// Confirm that only move events are forwarded, not enter/exit or equivalent
-// events.
-TEST_P(DelegatedInkPointTest, IgnoreEnterAndExitEvents) {
- // First set everything up and try forwarding a point, confirming that it is
- // sent as expected.
- SetInkMetadataFlagOnRenderFrameMetadata(true);
- gfx::DelegatedInkPoint expected_point(
- gfx::PointF(10, 10), base::TimeTicks::Now(), GetExpectedPointerId());
- SendEvent(true, expected_point.point(), expected_point.timestamp());
-
- MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
- compositor()->delegated_ink_point_renderer();
- EXPECT_TRUE(delegated_ink_point_renderer);
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- gfx::DelegatedInkPoint actual_point =
- delegated_ink_point_renderer->GetDelegatedInkPoint();
- EXPECT_EQ(expected_point.point(), actual_point.point());
- EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
- EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
-
- // Now try with an exit event.
- SendEvent(true, gfx::PointF(42, 19), base::TimeTicks::Now(),
- /*use_enter_event=*/false, /*use_exit_event=*/true);
- delegated_ink_point_renderer->FlushForTesting();
- EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
-
- // Try sending an enter event and confirm it is not forwarded.
- SendEvent(true, gfx::PointF(12, 12), base::TimeTicks::Now(),
- /*use_enter_event=*/true, /*use_exit_event=*/false);
- delegated_ink_point_renderer->FlushForTesting();
- EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
-
- // Finally, confirm that sending move events will work again without issue.
- expected_point = gfx::DelegatedInkPoint(
- gfx::PointF(20, 21), base::TimeTicks::Now(), GetExpectedPointerId());
- SendEvent(true, expected_point.point(), expected_point.timestamp());
-
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- actual_point = delegated_ink_point_renderer->GetDelegatedInkPoint();
- EXPECT_EQ(expected_point.point(), actual_point.point());
- EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
- EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
-}
-
-// This test confirms that points can be forwarded when using delegated ink in
-// a child frame, such as an OOPIF.
-TEST_P(DelegatedInkPointTest, ForwardPointsToChildFrame) {
- // Make the child frame, set the delegated ink flag on it, give it a
- // compositor, and set it as the hit test result so that the input router
- // sends points to it.
- ChildViewState child = MakeChildView(view_root_.get());
- SetInkMetadataFlagOnSpecificHost(true, child.widget_host.get());
- child.view->SetCompositor(compositor());
- view_root_->SetHittestResult(child.view.get(), false);
-
- // Send a point and confirm that it is forwarded, meaning that it correctly
- // checked the metadata flag on the child frame's widget.
- gfx::DelegatedInkPoint expected_point(
- gfx::PointF(10, 10), base::TimeTicks::Now(), GetExpectedPointerId());
- SendEvent(true, expected_point.point(), expected_point.timestamp(), false,
- false);
-
- MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
- compositor()->delegated_ink_point_renderer();
- EXPECT_TRUE(delegated_ink_point_renderer);
- delegated_ink_point_renderer->FlushForTesting();
-
- EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
- gfx::DelegatedInkPoint actual_point =
- delegated_ink_point_renderer->GetDelegatedInkPoint();
- EXPECT_EQ(expected_point.point(), actual_point.point());
- EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
- EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
-
- // Reset's the hit test result on the root so that we don't crash on
- // destruction.
- rwhier()->OnRenderWidgetHostViewBaseDestroyed(child.view.get());
-}
-
-#endif // defined(USE_AURA)
-
} // namespace content
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 053eaaf..d8365d0 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1855,10 +1855,10 @@
}
viz::FrameSinkId RenderWidgetHostViewAura::GetRootFrameSinkId() {
- if (!GetCompositor())
+ if (!window_ || !window_->GetHost() || !window_->GetHost()->compositor())
return viz::FrameSinkId();
- return GetCompositor()->frame_sink_id();
+ return window_->GetHost()->compositor()->frame_sink_id();
}
viz::SurfaceId RenderWidgetHostViewAura::GetCurrentSurfaceId() const {
@@ -2377,7 +2377,7 @@
UpdateLegacyWin();
#endif
- delegated_frame_host_->AttachToCompositor(GetCompositor());
+ delegated_frame_host_->AttachToCompositor(window_->GetHost()->compositor());
}
void RenderWidgetHostViewAura::RemovingFromRootWindow() {
@@ -2730,11 +2730,4 @@
tooltip_observer_for_testing_->OnTooltipTextUpdated(tooltip_text);
}
-ui::Compositor* RenderWidgetHostViewAura::GetCompositor() {
- if (!window_ || !window_->GetHost())
- return nullptr;
-
- return window_->GetHost()->compositor();
-}
-
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index ea2aee1..b881bdc 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -373,8 +373,6 @@
MouseWheelPhaseHandler* GetMouseWheelPhaseHandler() override;
- ui::Compositor* GetCompositor() override;
-
protected:
~RenderWidgetHostViewAura() override;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index a90ac41..466e96ff 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -120,6 +120,7 @@
#include "ui/events/keycodes/keyboard_code_conversion.h"
#include "ui/events/test/event_generator.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/mojom/delegated_ink_point_renderer.mojom.h"
#include "ui/gfx/selection_bound.h"
#include "ui/wm/core/window_util.h"
@@ -285,6 +286,9 @@
return event_handler()->pointer_state();
}
+ // Flush the mojo remote on the event handler for testing purposes.
+ void FlushForTest() { event_handler()->FlushForTest(); }
+
void SetRenderFrameMetadata(cc::RenderFrameMetadata metadata) {
host()->render_frame_metadata_provider()->SetLastRenderFrameMetadataForTest(
metadata);
@@ -6754,4 +6758,428 @@
#endif // defined(OS_WIN)
+// Mock the DelegatedInkPointRenderer to grab the delegated ink points as they
+// are shipped off to viz from the browser process.
+class MockDelegatedInkPointRenderer
+ : public gfx::mojom::DelegatedInkPointRenderer {
+ public:
+ explicit MockDelegatedInkPointRenderer(
+ mojo::PendingReceiver<gfx::mojom::DelegatedInkPointRenderer> receiver)
+ : receiver_(this, std::move(receiver)) {}
+
+ void StoreDelegatedInkPoint(const gfx::DelegatedInkPoint& point) override {
+ delegated_ink_point_ = point;
+ }
+
+ bool HasDelegatedInkPoint() { return delegated_ink_point_.has_value(); }
+
+ gfx::DelegatedInkPoint GetDelegatedInkPoint() {
+ gfx::DelegatedInkPoint point = delegated_ink_point_.value();
+ delegated_ink_point_.reset();
+ return point;
+ }
+
+ void ClearDelegatedInkPoint() { delegated_ink_point_.reset(); }
+
+ void ResetPrediction() override { prediction_reset_ = true; }
+ bool GetPredictionState() {
+ bool state = prediction_reset_;
+ prediction_reset_ = false;
+ return state;
+ }
+
+ void FlushForTesting() { receiver_.FlushForTesting(); }
+
+ void ResetReceiver() { receiver_.reset(); }
+ bool ReceiverIsBound() { return receiver_.is_bound(); }
+
+ private:
+ mojo::Receiver<gfx::mojom::DelegatedInkPointRenderer> receiver_;
+ absl::optional<gfx::DelegatedInkPoint> delegated_ink_point_;
+ bool prediction_reset_ = false;
+};
+
+// MockCompositor class binds the mojo interfaces so that the ink points are
+// shipped to the browser process. Uses values from the real compositor to be
+// created, but a fake FrameSinkId must be used so that it hasn't already been
+// registered.
+class MockCompositor : public ui::Compositor {
+ public:
+ explicit MockCompositor(ui::Compositor* compositor)
+ : ui::Compositor(viz::FrameSinkId(5, 5),
+ compositor->context_factory(),
+ compositor->task_runner(),
+ compositor->is_pixel_canvas()) {}
+
+ void SetDelegatedInkPointRenderer(
+ mojo::PendingReceiver<gfx::mojom::DelegatedInkPointRenderer> receiver)
+ override {
+ delegated_ink_point_renderer_ =
+ std::make_unique<MockDelegatedInkPointRenderer>(std::move(receiver));
+ }
+
+ MockDelegatedInkPointRenderer* delegated_ink_point_renderer() {
+ return delegated_ink_point_renderer_.get();
+ }
+
+ private:
+ std::unique_ptr<MockDelegatedInkPointRenderer> delegated_ink_point_renderer_;
+};
+
+enum TestEvent { kMouseEvent, kTouchEvent };
+enum HoveringState { kHovering, kNotHovering };
+
+class DelegatedInkPointTest
+ : public RenderWidgetHostViewAuraTest,
+ public testing::WithParamInterface<std::tuple<TestEvent, HoveringState>> {
+ public:
+ DelegatedInkPointTest() = default;
+
+ void SetUp() override {
+ RenderWidgetHostViewAuraTest::SetUp();
+
+ InitViewForFrame(nullptr);
+ aura_test_helper_->GetTestScreen()->SetDeviceScaleFactor(1.0f);
+
+ real_compositor_ = view_->GetNativeView()->layer()->GetCompositor();
+ compositor_ = std::make_unique<MockCompositor>(
+ aura_test_helper_->GetHost()->compositor());
+ view_->GetNativeView()->layer()->SetCompositorForTesting(compositor_.get());
+ }
+
+ void TearDown() override {
+ // Restore the view's compositor to the old value so it no longer references
+ // the MockCompositor that is about to be destructed. This also ensures
+ // that the view can be properly destroyed by TearDown().
+ view_->GetNativeView()->layer()->SetCompositorForTesting(real_compositor_);
+ compositor_.reset();
+ RenderWidgetHostViewAuraTest::TearDown();
+ }
+
+ TestEvent GetEventParam() { return std::get<0>(GetParam()); }
+ HoveringState GetHoverParam() { return std::get<1>(GetParam()); }
+
+ void SetInkMetadataFlagOnRenderFrameMetadata(bool delegated_ink) {
+ cc::RenderFrameMetadata metadata;
+ if (delegated_ink) {
+ metadata.delegated_ink_metadata = cc::DelegatedInkBrowserMetadata(
+ GetHoverParam() == HoveringState::kHovering);
+ }
+ view_->SetRenderFrameMetadata(metadata);
+ }
+
+ void SendEvent(bool match_test_hovering_state,
+ gfx::PointF point,
+ base::TimeTicks timestamp = ui::EventTimeForNow()) {
+ SendEvent(match_test_hovering_state, point, timestamp,
+ /*use_enter_event*/ false, /*use_exit_event*/ false);
+ }
+
+ void SendEvent(bool match_test_hovering_state,
+ const gfx::PointF& point,
+ base::TimeTicks timestamp,
+ bool use_enter_event,
+ bool use_exit_event) {
+ DCHECK(!(use_enter_event && use_exit_event));
+
+ // Hovering creates and sends ui::MouseEvents with
+ // ET_MOUSE_{MOVED,ENTERED,EXITED} types, so do the same here in hovering
+ // scenarios.
+ if (GetEventParam() == TestEvent::kTouchEvent &&
+ !Hovering(match_test_hovering_state)) {
+ ui::EventType event_type = ui::ET_TOUCH_MOVED;
+ if (use_enter_event)
+ event_type = ui::ET_TOUCH_PRESSED;
+ if (use_exit_event)
+ event_type = ui::ET_TOUCH_RELEASED;
+
+ // Touch needs a pressed event first to properly handle future move
+ // events.
+ SendTouchPress(point);
+
+ ui::TouchEvent touch_event(
+ event_type, point, point, timestamp,
+ ui::PointerDetails(ui::EventPointerType::kTouch, kPointerId));
+ view_->OnTouchEvent(&touch_event);
+
+ // Need to send a new press event after ending the previous touch.
+ if (use_exit_event)
+ sent_touch_press_ = false;
+ } else {
+ ui::EventPointerType pointer_type = ui::EventPointerType::kMouse;
+ if (GetEventParam() == TestEvent::kTouchEvent) {
+ DCHECK(Hovering(match_test_hovering_state));
+ pointer_type = ui::EventPointerType::kPen;
+ }
+
+ ui::EventType event_type = ui::ET_MOUSE_MOVED;
+ if (use_enter_event)
+ event_type = ui::ET_MOUSE_ENTERED;
+ if (use_exit_event)
+ event_type = ui::ET_MOUSE_EXITED;
+
+ int flags =
+ Hovering(match_test_hovering_state) ? 0 : ui::EF_LEFT_MOUSE_BUTTON;
+ ui::MouseEvent mouse_event(event_type, point, point, timestamp, flags, 0,
+ ui::PointerDetails(pointer_type, kPointerId));
+ view_->OnMouseEvent(&mouse_event);
+ }
+ }
+
+ MockCompositor* compositor() { return compositor_.get(); }
+
+ int32_t GetExpectedPointerId() const { return kPointerId; }
+
+ private:
+ void SendTouchPress(const gfx::PointF& requested_touch_location) {
+ DCHECK(GetEventParam() == TestEvent::kTouchEvent);
+ if (sent_touch_press_)
+ return;
+
+ // Location of the press event doesn't matter, so long as it doesn't exactly
+ // match the location of the subsequent move event. If they match, then the
+ // move event is dropped.
+ gfx::PointF point(requested_touch_location.x() + 2.f,
+ requested_touch_location.y() + 2.f);
+
+ ui::TouchEvent press(
+ ui::ET_TOUCH_PRESSED, point, point, ui::EventTimeForNow(),
+ ui::PointerDetails(ui::EventPointerType::kTouch, kPointerId));
+
+ view_->OnTouchEvent(&press);
+ sent_touch_press_ = true;
+ }
+
+ bool Hovering(bool match_test_hovering_state) {
+ return (GetHoverParam() == HoveringState::kHovering &&
+ match_test_hovering_state) ||
+ (GetHoverParam() == HoveringState::kNotHovering &&
+ !match_test_hovering_state);
+ }
+
+ // Pointer id to use in these tests. It must be consistent throughout a single
+ // test for some of the touch variations.
+ const int32_t kPointerId = 5;
+
+ // Touch events are ignored if a press isn't sent first, so use this to track
+ // if we have already sent a touch press event yet or not.
+ bool sent_touch_press_ = false;
+
+ // The real compositor that was contained by the |view_| and must be replaced
+ // before tear down, and the mock compositor used for getting the delegated
+ // ink points.
+ ui::Compositor* real_compositor_;
+ std::unique_ptr<MockCompositor> compositor_;
+};
+
+struct DelegatedInkPointTestPassToString {
+ std::string operator()(
+ const testing::TestParamInfo<std::tuple<TestEvent, HoveringState>> type)
+ const {
+ std::string suffix;
+
+ if (std::get<0>(type.param) == TestEvent::kMouseEvent)
+ suffix.append("Mouse");
+ else
+ suffix.append("Touch");
+
+ if (std::get<1>(type.param) == HoveringState::kHovering)
+ suffix.append("Hovering");
+ else
+ suffix.append("NotHovering");
+
+ return suffix;
+ }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ DelegatedInkTrails,
+ DelegatedInkPointTest,
+ testing::Combine(
+ testing::Values(TestEvent::kMouseEvent, TestEvent::kTouchEvent),
+ testing::Values(HoveringState::kHovering, HoveringState::kNotHovering)),
+ DelegatedInkPointTestPassToString());
+
+// Tests to confirm that input events are correctly forwarded to the UI
+// Compositor when DelegatedInkTrails should be drawn, and stops forwarding when
+// they no longer should be drawn.
+TEST_P(DelegatedInkPointTest, EventForwardedToCompositor) {
+ // First confirm that the flag is false by default and the point is not sent.
+ SendEvent(true, gfx::PointF(15, 15));
+ MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
+ compositor()->delegated_ink_point_renderer();
+
+ EXPECT_FALSE(delegated_ink_point_renderer);
+
+ // Then set it to true and confirm that the DelegatedInkPointRenderer is
+ // initialized, the connection is made and the point makes it to the renderer.
+ SetInkMetadataFlagOnRenderFrameMetadata(true);
+ gfx::DelegatedInkPoint expected_point(
+ gfx::PointF(10, 10), base::TimeTicks::Now(), GetExpectedPointerId());
+ SendEvent(true, expected_point.point(), expected_point.timestamp());
+
+ delegated_ink_point_renderer = compositor()->delegated_ink_point_renderer();
+ EXPECT_TRUE(delegated_ink_point_renderer);
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ gfx::DelegatedInkPoint actual_point =
+ delegated_ink_point_renderer->GetDelegatedInkPoint();
+ EXPECT_EQ(expected_point.point(), actual_point.point());
+ EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
+ EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
+
+ // Then try changing the scale factor to confirm it affects the point
+ // correctly.
+ const float scale = 2.6f;
+ aura_test_helper_->GetTestScreen()->SetDeviceScaleFactor(scale);
+ gfx::PointF unscaled_point(15, 15);
+ base::TimeTicks unscaled_time = base::TimeTicks::Now();
+
+ SendEvent(true, unscaled_point, unscaled_time);
+ delegated_ink_point_renderer->FlushForTesting();
+
+ unscaled_point.Scale(scale);
+ expected_point = gfx::DelegatedInkPoint(unscaled_point, unscaled_time,
+ GetExpectedPointerId());
+
+ EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ actual_point = delegated_ink_point_renderer->GetDelegatedInkPoint();
+ EXPECT_EQ(expected_point.point(), actual_point.point());
+ EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
+ EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
+
+ // Confirm that prediction is reset when the API is no longer being used and
+ // |delegated_ink_metadata| is not set.
+ SetInkMetadataFlagOnRenderFrameMetadata(false);
+
+ SendEvent(true, gfx::PointF(25, 25));
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ EXPECT_TRUE(delegated_ink_point_renderer->GetPredictionState());
+
+ // Finally, confirm that nothing is sent after the prediction has been reset
+ // when the delegated ink flag on the render frame metadata is false.
+ SendEvent(true, gfx::PointF(46, 46));
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ EXPECT_FALSE(delegated_ink_point_renderer->GetPredictionState());
+}
+
+// Confirm that the interface is rebound if the receiver disconnects.
+TEST_P(DelegatedInkPointTest, MojoInterfaceReboundOnDisconnect) {
+ // First make sure the connection exists.
+ SetInkMetadataFlagOnRenderFrameMetadata(true);
+ SendEvent(true, gfx::PointF(15, 15));
+
+ MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
+ compositor()->delegated_ink_point_renderer();
+
+ EXPECT_TRUE(delegated_ink_point_renderer);
+ EXPECT_TRUE(delegated_ink_point_renderer->ReceiverIsBound());
+
+ // Reset the receiver and flush the remote to confirm it is no longer bound.
+ delegated_ink_point_renderer->ResetReceiver();
+ view_->FlushForTest();
+
+ EXPECT_FALSE(delegated_ink_point_renderer->ReceiverIsBound());
+
+ // Confirm that it now gets reconnected correctly.
+ SendEvent(true, gfx::PointF(25, 25));
+
+ delegated_ink_point_renderer = compositor()->delegated_ink_point_renderer();
+
+ EXPECT_TRUE(delegated_ink_point_renderer);
+ EXPECT_TRUE(delegated_ink_point_renderer->ReceiverIsBound());
+}
+
+// Test to confirm that forwarding points to viz will stop and prediction is
+// reset if the state of hovering differs between what is expected and the
+// received points.
+TEST_P(DelegatedInkPointTest, StopForwardingOnHoverStateChange) {
+ // First send a point and make sure it makes it to the renderer.
+ SetInkMetadataFlagOnRenderFrameMetadata(true);
+ SendEvent(true, gfx::PointF(15, 15));
+
+ MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
+ compositor()->delegated_ink_point_renderer();
+ EXPECT_TRUE(delegated_ink_point_renderer);
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ delegated_ink_point_renderer->ClearDelegatedInkPoint();
+
+ // Now send a point that doesn't match the state of hovering on the metadata
+ // to confirm that it isn't sent and ResetPrediction is called.
+ SendEvent(false, gfx::PointF(20, 20));
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ EXPECT_TRUE(delegated_ink_point_renderer->GetPredictionState());
+
+ // Send another that doesn't match to confirm the end trail point is only sent
+ // once.
+ SendEvent(false, gfx::PointF(25, 25));
+ delegated_ink_point_renderer->FlushForTesting();
+ EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+
+ // Send one that does match again to confirm that points will start sending
+ // again if the hovering state starts matching again.
+ SendEvent(true, gfx::PointF(30, 30));
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ EXPECT_FALSE(delegated_ink_point_renderer->GetPredictionState());
+}
+
+// Confirm that only move events are forwarded, not enter/exit or equivalent
+// events.
+TEST_P(DelegatedInkPointTest, IgnoreEnterAndExitEvents) {
+ // First set everything up and try forwarding a point, confirming that it is
+ // sent as expected.
+ SetInkMetadataFlagOnRenderFrameMetadata(true);
+ gfx::DelegatedInkPoint expected_point(
+ gfx::PointF(10, 10), base::TimeTicks::Now(), GetExpectedPointerId());
+ SendEvent(true, expected_point.point(), expected_point.timestamp());
+
+ MockDelegatedInkPointRenderer* delegated_ink_point_renderer =
+ compositor()->delegated_ink_point_renderer();
+ EXPECT_TRUE(delegated_ink_point_renderer);
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ gfx::DelegatedInkPoint actual_point =
+ delegated_ink_point_renderer->GetDelegatedInkPoint();
+ EXPECT_EQ(expected_point.point(), actual_point.point());
+ EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
+ EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
+
+ // Try sending an enter event and confirm it is not forwarded.
+ SendEvent(true, gfx::PointF(12, 12), base::TimeTicks::Now(),
+ /*use_enter_event*/ true, /*use_exit_event*/ false);
+ delegated_ink_point_renderer->FlushForTesting();
+ EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+
+ // Now try with an exit event.
+ SendEvent(true, gfx::PointF(42, 19), base::TimeTicks::Now(),
+ /*use_enter_event*/ false, /*use_exit_event*/ true);
+ delegated_ink_point_renderer->FlushForTesting();
+ EXPECT_FALSE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+
+ // Finally, confirm that sending move events will work again without issue.
+ expected_point = gfx::DelegatedInkPoint(
+ gfx::PointF(20, 21), base::TimeTicks::Now(), GetExpectedPointerId());
+ SendEvent(true, expected_point.point(), expected_point.timestamp());
+
+ delegated_ink_point_renderer->FlushForTesting();
+
+ EXPECT_TRUE(delegated_ink_point_renderer->HasDelegatedInkPoint());
+ actual_point = delegated_ink_point_renderer->GetDelegatedInkPoint();
+ EXPECT_EQ(expected_point.point(), actual_point.point());
+ EXPECT_EQ(expected_point.timestamp(), actual_point.timestamp());
+ EXPECT_EQ(GetExpectedPointerId(), actual_point.pointer_id());
+}
+
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index 3e66a34e..ec0d6b0 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -988,8 +988,4 @@
transformed_point);
}
-ui::Compositor* RenderWidgetHostViewBase::GetCompositor() {
- return nullptr;
-}
-
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index 6c9aa1e..9e207025 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -54,7 +54,6 @@
}
namespace ui {
-class Compositor;
enum class DomCode;
class LatencyInfo;
class TouchEvent;
@@ -545,8 +544,6 @@
void SetTooltipObserverForTesting(TooltipObserver* observer);
- virtual ui::Compositor* GetCompositor();
-
protected:
explicit RenderWidgetHostViewBase(RenderWidgetHost* host);
~RenderWidgetHostViewBase() override;
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.cc b/content/browser/renderer_host/render_widget_host_view_child_frame.cc
index 4e26cd2ff..14a83f94 100644
--- a/content/browser/renderer_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/renderer_host/render_widget_host_view_child_frame.cc
@@ -1003,10 +1003,4 @@
host()->SynchronizeVisualProperties();
}
-ui::Compositor* RenderWidgetHostViewChildFrame::GetCompositor() {
- if (!GetRootView())
- return nullptr;
- return GetRootView()->GetCompositor();
-}
-
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.h b/content/browser/renderer_host/render_widget_host_view_child_frame.h
index fdcd303..a32e3e0 100644
--- a/content/browser/renderer_host/render_widget_host_view_child_frame.h
+++ b/content/browser/renderer_host/render_widget_host_view_child_frame.h
@@ -256,8 +256,6 @@
return weak_factory_.GetWeakPtr();
}
- ui::Compositor* GetCompositor() override;
-
protected:
~RenderWidgetHostViewChildFrame() override;
diff --git a/content/browser/renderer_host/render_widget_host_view_event_handler.cc b/content/browser/renderer_host/render_widget_host_view_event_handler.cc
index 68ba083..f4dbe7b3e 100644
--- a/content/browser/renderer_host/render_widget_host_view_event_handler.cc
+++ b/content/browser/renderer_host/render_widget_host_view_event_handler.cc
@@ -364,6 +364,69 @@
}
}
+bool IsMoveEvent(ui::EventType type) {
+ return type == ui::ET_MOUSE_MOVED || type == ui::ET_MOUSE_DRAGGED ||
+ type == ui::ET_TOUCH_MOVED;
+}
+
+void RenderWidgetHostViewEventHandler::ForwardDelegatedInkPoint(
+ ui::LocatedEvent* event,
+ bool hovering,
+ int32_t pointer_id) {
+ const cc::RenderFrameMetadata& last_metadata =
+ host_->render_frame_metadata_provider()->LastRenderFrameMetadata();
+ if (IsMoveEvent(event->type()) &&
+ last_metadata.delegated_ink_metadata.has_value() &&
+ hovering == last_metadata.delegated_ink_metadata.value()
+ .delegated_ink_is_hovering) {
+ if (!delegated_ink_point_renderer_.is_bound()) {
+ ui::Compositor* compositor = window_ && window_->layer()
+ ? window_->layer()->GetCompositor()
+ : nullptr;
+
+ // The remote can't be bound if the compositor is null, so bail if that
+ // is the case so we don't crash by trying to use an unbound remote.
+ if (!compositor)
+ return;
+
+ TRACE_EVENT_INSTANT0("input",
+ "Binding mojo interface for delegated ink points.",
+ TRACE_EVENT_SCOPE_THREAD);
+ compositor->SetDelegatedInkPointRenderer(
+ delegated_ink_point_renderer_.BindNewPipeAndPassReceiver());
+ delegated_ink_point_renderer_.reset_on_disconnect();
+ }
+
+ gfx::PointF point = event->root_location_f();
+ point.Scale(host_view_->GetDeviceScaleFactor());
+ gfx::DelegatedInkPoint delegated_ink_point(point, event->time_stamp(),
+ pointer_id);
+ TRACE_EVENT_INSTANT1("input",
+ "Forwarding delegated ink point from browser.",
+ TRACE_EVENT_SCOPE_THREAD, "delegated point",
+ delegated_ink_point.ToString());
+
+ // Calling this will result in IPC calls to get |delegated_ink_point| to
+ // viz. The decision to do this here was made with the understanding that
+ // the IPC overhead will result in a minor increase in latency for getting
+ // this event to the renderer. However, by sending it here, the event is
+ // given the greatest possible chance to make it to viz before
+ // DrawAndSwap() is called, allowing more points to be drawn as part of
+ // the delegated ink trail, and thus reducing user perceived latency.
+ delegated_ink_point_renderer_->StoreDelegatedInkPoint(delegated_ink_point);
+ ended_delegated_ink_trail_ = false;
+ } else if (delegated_ink_point_renderer_.is_bound() &&
+ !ended_delegated_ink_trail_) {
+ // Let viz know that the most recent point it received from us is probably
+ // the last point the user is inking, so it shouldn't predict anything
+ // beyond it.
+ TRACE_EVENT_INSTANT0("input", "Delegated ink trail ended",
+ TRACE_EVENT_SCOPE_THREAD);
+ delegated_ink_point_renderer_->ResetPrediction();
+ ended_delegated_ink_trail_ = true;
+ }
+}
+
void RenderWidgetHostViewEventHandler::OnMouseEvent(ui::MouseEvent* event) {
TRACE_EVENT0("input", "RenderWidgetHostViewBase::OnMouseEvent");
@@ -407,6 +470,9 @@
bool is_selection_popup = NeedsInputGrab(popup_child_host_view_);
if (CanRendererHandleEvent(event, mouse_locked_, is_selection_popup) &&
!(event->flags() & ui::EF_FROM_TOUCH)) {
+ bool hovering = (event->type() ^ ui::ET_MOUSE_DRAGGED) &&
+ (event->type() ^ ui::ET_MOUSE_PRESSED);
+ ForwardDelegatedInkPoint(event, hovering, event->pointer_details().id);
// Confirm existing composition text on mouse press, to make sure
// the input caret won't be moved with an ongoing composition text.
@@ -531,6 +597,9 @@
if (handled)
return;
+ ForwardDelegatedInkPoint(event, event->hovering(),
+ event->pointer_details().id);
+
if (had_no_pointer)
delegate_->selection_controller_client()->OnTouchDown();
if (!pointer_state_.GetPointerCount())
diff --git a/content/browser/renderer_host/render_widget_host_view_event_handler.h b/content/browser/renderer_host/render_widget_host_view_event_handler.h
index 6d41f4d..65dbc6313 100644
--- a/content/browser/renderer_host/render_widget_host_view_event_handler.h
+++ b/content/browser/renderer_host/render_widget_host_view_event_handler.h
@@ -12,12 +12,14 @@
#include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
#include "content/common/content_export.h"
#include "content/public/browser/native_web_keyboard_event.h"
+#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/mojom/input/pointer_lock_result.mojom.h"
#include "ui/aura/scoped_enable_unadjusted_mouse_events.h"
#include "ui/aura/scoped_keyboard_hook.h"
#include "ui/events/event_handler.h"
#include "ui/events/gestures/motion_event_aura.h"
+#include "ui/gfx/mojom/delegated_ink_point_renderer.mojom.h"
#include "ui/latency/latency_info.h"
namespace aura {
@@ -252,6 +254,15 @@
void HandleMouseWheelEvent(ui::MouseEvent* event);
+ // Forward the location and timestamp of the event to viz if a delegated ink
+ // trail is requested.
+ void ForwardDelegatedInkPoint(ui::LocatedEvent* event,
+ bool hovering,
+ int32_t pointer_id);
+
+ // Flush the remote for testing purposes.
+ void FlushForTest() { delegated_ink_point_renderer_.FlushForTesting(); }
+
// Whether return characters should be passed on to the RenderWidgetHostImpl.
bool accept_return_character_ = false;
@@ -314,6 +325,18 @@
std::unique_ptr<HitTestDebugKeyEventObserver> debug_observer_;
+ // Remote end of the connection for sending delegated ink points to viz to
+ // support the delegated ink trails feature.
+ mojo::Remote<gfx::mojom::DelegatedInkPointRenderer>
+ delegated_ink_point_renderer_;
+ // Used to know if we have already told viz to reset prediction because the
+ // final point of the delegated ink trail has been sent. True when prediction
+ // has already been reset for the most recent trail, false otherwise. This
+ // flag helps make sure that we don't send more IPCs than necessary to viz to
+ // reset prediction. Sending extra IPCs wouldn't impact correctness, but can
+ // impact performance due to the IPC overhead.
+ bool ended_delegated_ink_trail_ = false;
+
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewEventHandler);
};
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index 556a1838..05e9add2 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -18,7 +18,6 @@
#include "base/test/scoped_feature_list.h"
#include "base/test/test_timeouts.h"
#include "build/build_config.h"
-#include "components/viz/common/features.h"
#include "components/viz/test/host_frame_sink_manager_test_api.h"
#include "content/browser/compositor/surface_utils.h"
#include "content/browser/renderer_host/cursor_manager.h"
@@ -7329,130 +7328,4 @@
EXPECT_EQ(kSlowHitTestFlags, hit_test_data[2].flags);
}
-#if defined(USE_AURA)
-class SitePerProcessDelegatedInkBrowserTest
- : public SitePerProcessHitTestBrowserTest {
- public:
- SitePerProcessDelegatedInkBrowserTest() = default;
-
- void SetUpCommandLine(base::CommandLine* command_line) override {
- SitePerProcessHitTestBrowserTest::SetUpCommandLine(command_line);
- command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
- "DelegatedInkTrails");
- }
-};
-
-// Test confirms that a point hitting an OOPIF that is requesting delegated ink
-// trails results in the metadata being correctly sent to the child's
-// RenderWidgetHost and is usable for sending delegated ink points.
-IN_PROC_BROWSER_TEST_F(SitePerProcessDelegatedInkBrowserTest,
- MetadataAndPointGoThroughOOPIF) {
- // Delegated ink is only supported on Skia Renderer for now.
- if (!features::IsUsingSkiaRenderer())
- return;
-
- GURL main_url(embedded_test_server()->GetURL(
- "/frame_tree/page_with_positioned_frame.html"));
- EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
- FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
- ->GetFrameTree()
- ->root();
- ASSERT_EQ(1U, root->child_count());
-
- FrameTreeNode* child = root->child_at(0);
-
- GURL site_url(embedded_test_server()->GetURL("baz.com", "/title1.html"));
- EXPECT_EQ(site_url, child->current_url());
- EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
- child->current_frame_host()->GetSiteInstance());
-
- // Make sure the child frame is indeed a OOPIF
- EXPECT_TRUE(child->current_frame_host()->IsCrossProcessSubframe());
-
- EXPECT_TRUE(ExecJs(child->current_frame_host(), R"(
- let presenter = null;
- navigator.ink.requestPresenter('delegated-ink-trail').then(e => {
- presenter = e;
- });
- let style = { color: 'green', diameter: 21 };
-
- window.addEventListener('pointermove' , evt => {
- presenter.updateInkTrailStartPoint(evt, style);
- document.write('Force a new frame so that an updated ' +
- 'RenderFrameMetadata is sent to the browser process.');
- });
- )"));
-
- RenderWidgetHostImpl* root_rwh =
- root->current_frame_host()->GetRenderWidgetHost();
- RenderWidgetHostImpl* child_rwh =
- child->current_frame_host()->GetRenderWidgetHost();
-
- // Create listeners for mouse events.
- RenderWidgetHostMouseEventMonitor main_frame_monitor(root_rwh);
- RenderWidgetHostMouseEventMonitor child_frame_monitor(child_rwh);
-
- WaitForHitTestData(child->current_frame_host());
-
- RenderWidgetHostViewBase* root_view =
- static_cast<RenderWidgetHostViewBase*>(root_rwh->GetView());
- RenderWidgetHostViewBase* rwhv_child =
- static_cast<RenderWidgetHostViewBase*>(child_rwh->GetView());
-
- RenderWidgetHostInputEventRouter* router =
- web_contents()->GetInputEventRouter();
-
- EXPECT_FALSE(router->IsDelegatedInkRendererBoundForTest());
-
- // Target MouseMove to child frame.
- blink::WebMouseEvent mouse_event(
- blink::WebInputEvent::Type::kMouseMove,
- blink::WebInputEvent::kNoModifiers,
- blink::WebInputEvent::GetStaticTimeStampForTests());
- SetWebEventPositions(&mouse_event, gfx::Point(55, 55), root_view);
-
- RouteMouseEventAndWaitUntilDispatch(router, root_view, rwhv_child,
- &mouse_event);
-
- // Dispatch twice because the router generates an extra MouseLeave for the
- // main frame.
- main_frame_monitor.ResetEventReceived();
- child_frame_monitor.ResetEventReceived();
-
- RouteMouseEventAndWaitUntilDispatch(router, root_view, rwhv_child,
- &mouse_event);
- EXPECT_FALSE(main_frame_monitor.EventWasReceived());
- EXPECT_TRUE(child_frame_monitor.EventWasReceived());
-
- // Wait for the child to receive and process input so that the new
- // RenderFrameMetadata is sent to the browser process.
- {
- auto observer = std::make_unique<MainThreadFrameObserver>(child_rwh);
- observer->Wait();
- }
-
- // Confirm that the metadata is what we expect and accessible from the child's
- // RenderWidgetHost.
- const cc::RenderFrameMetadata& last_metadata =
- child_rwh->render_frame_metadata_provider()->LastRenderFrameMetadata();
- EXPECT_TRUE(last_metadata.delegated_ink_metadata.has_value());
- EXPECT_TRUE(
- last_metadata.delegated_ink_metadata.value().delegated_ink_is_hovering);
-
- // Send one more mouse move event and confirm that it causes the forwarding
- // to occur, which will result in the |delegated_ink_point_renderer_| mojom
- // remote being bound.
- main_frame_monitor.ResetEventReceived();
- child_frame_monitor.ResetEventReceived();
- SetWebEventPositions(&mouse_event, gfx::Point(57, 57), root_view);
- RouteMouseEventAndWaitUntilDispatch(router, root_view, rwhv_child,
- &mouse_event);
-
- EXPECT_FALSE(main_frame_monitor.EventWasReceived());
- EXPECT_TRUE(child_frame_monitor.EventWasReceived());
- EXPECT_TRUE(router->IsDelegatedInkRendererBoundForTest());
-}
-#endif // USE_AURA
-
} // namespace content
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index cea0a32..88bd15d 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -234,10 +234,6 @@
return display_feature_;
}
-ui::Compositor* TestRenderWidgetHostView::GetCompositor() {
- return compositor_;
-}
-
TestRenderViewHost::TestRenderViewHost(
FrameTree* frame_tree,
SiteInstance* instance,
diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h
index 0529c4ec..5482020 100644
--- a/content/test/test_render_view_host.h
+++ b/content/test/test_render_view_host.h
@@ -118,7 +118,6 @@
viz::SurfaceId GetCurrentSurfaceId() const override;
std::unique_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget()
override;
- ui::Compositor* GetCompositor() override;
bool is_showing() const { return is_showing_; }
bool is_occluded() const { return is_occluded_; }
@@ -130,8 +129,6 @@
const WebCursor& last_cursor() const { return last_cursor_; }
- void SetCompositor(ui::Compositor* compositor) { compositor_ = compositor; }
-
protected:
// RenderWidgetHostViewBase:
void UpdateBackgroundColor() override;
@@ -157,8 +154,6 @@
#endif
absl::optional<DisplayFeature> display_feature_;
-
- ui::Compositor* compositor_ = nullptr;
};
// TestRenderViewHost ----------------------------------------------------------