Commit a7ad0f69 authored by Dave Tapuska's avatar Dave Tapuska Committed by Commit Bot

Move DispatchBufferedTouchEvents into base.

Collapse WebViewImpl's implementation together with WebFrameWidgetImpl's
and place it in base.

WebViewImpl's version was not checking for drag and drop, and
IgnoreInputEvents state but WebFrameWidgetImpl's was. These were
unnecessary because all input first goes through HandleInputEvent
and if there were any messages would be first discarded there. Add
a test to ensure the messages are dropped correctly without the
additional checks.

BUG=1097816

Change-Id: I0bb95f0585296a48bff96bcc553c5ca80c701ecc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2532732
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatardanakj <danakj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827058}
parent 4a6fcd97
...@@ -1840,17 +1840,6 @@ bool WebViewImpl::HasVerticalScrollbar() { ...@@ -1840,17 +1840,6 @@ bool WebViewImpl::HasVerticalScrollbar() {
return MainFrameImpl()->GetFrameView()->LayoutViewport()->VerticalScrollbar(); return MainFrameImpl()->GetFrameView()->LayoutViewport()->VerticalScrollbar();
} }
WebInputEventResult WebViewImpl::DispatchBufferedTouchEvents() {
if (!MainFrameImpl())
return WebInputEventResult::kNotHandled;
if (WebDevToolsAgentImpl* devtools = MainFrameDevToolsAgentImpl())
devtools->DispatchBufferedTouchEvents();
return MainFrameImpl()
->GetFrame()
->GetEventHandler()
.DispatchBufferedTouchEvents();
}
void WebViewImpl::MouseCaptureLost() { void WebViewImpl::MouseCaptureLost() {
TRACE_EVENT_NESTABLE_ASYNC_END0("input", "capturing mouse", TRACE_EVENT_NESTABLE_ASYNC_END0("input", "capturing mouse",
TRACE_ID_LOCAL(this)); TRACE_ID_LOCAL(this));
......
...@@ -526,7 +526,6 @@ class CORE_EXPORT WebViewImpl final : public WebView, ...@@ -526,7 +526,6 @@ class CORE_EXPORT WebViewImpl final : public WebView,
void UpdateLifecycle(WebLifecycleUpdate requested_update, void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason); DocumentUpdateReason reason);
void ThemeChanged(); void ThemeChanged();
WebInputEventResult DispatchBufferedTouchEvents();
void ApplyViewportChanges(const ApplyViewportChangesArgs& args); void ApplyViewportChanges(const ApplyViewportChangesArgs& args);
void RecordManipulationTypeCounts(cc::ManipulationInfo info); void RecordManipulationTypeCounts(cc::ManipulationInfo info);
void MouseCaptureLost(); void MouseCaptureLost();
......
...@@ -1504,6 +1504,18 @@ void WebFrameWidgetBase::ProcessInputEventSynchronouslyForTesting( ...@@ -1504,6 +1504,18 @@ void WebFrameWidgetBase::ProcessInputEventSynchronouslyForTesting(
std::move(callback)); std::move(callback));
} }
WebInputEventResult WebFrameWidgetBase::DispatchBufferedTouchEvents() {
CHECK(LocalRootImpl());
if (WebDevToolsAgentImpl* devtools = LocalRootImpl()->DevToolsAgentImpl())
devtools->DispatchBufferedTouchEvents();
return LocalRootImpl()
->GetFrame()
->GetEventHandler()
.DispatchBufferedTouchEvents();
}
WebInputEventResult WebFrameWidgetBase::HandleInputEvent( WebInputEventResult WebFrameWidgetBase::HandleInputEvent(
const WebCoalescedInputEvent& coalesced_event) { const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event(); const WebInputEvent& input_event = coalesced_event.Event();
......
...@@ -327,6 +327,7 @@ class CORE_EXPORT WebFrameWidgetBase ...@@ -327,6 +327,7 @@ class CORE_EXPORT WebFrameWidgetBase
void SetHandlingInputEvent(bool handling) override; void SetHandlingInputEvent(bool handling) override;
void ProcessInputEventSynchronouslyForTesting(const WebCoalescedInputEvent&, void ProcessInputEventSynchronouslyForTesting(const WebCoalescedInputEvent&,
HandledEventCallback) override; HandledEventCallback) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override; WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override;
void UpdateTextInputState() override; void UpdateTextInputState() override;
void UpdateSelectionBounds() override; void UpdateSelectionBounds() override;
......
...@@ -330,26 +330,6 @@ void WebFrameWidgetImpl::UpdateLifecycle(WebLifecycleUpdate requested_update, ...@@ -330,26 +330,6 @@ void WebFrameWidgetImpl::UpdateLifecycle(WebLifecycleUpdate requested_update,
View()->UpdatePagePopup(); View()->UpdatePagePopup();
} }
WebInputEventResult WebFrameWidgetImpl::DispatchBufferedTouchEvents() {
if (doing_drag_and_drop_)
return WebInputEventResult::kHandledSuppressed;
if (!GetPage())
return WebInputEventResult::kNotHandled;
if (LocalRootImpl()) {
if (WebDevToolsAgentImpl* devtools = LocalRootImpl()->DevToolsAgentImpl())
devtools->DispatchBufferedTouchEvents();
}
if (IgnoreInputEvents())
return WebInputEventResult::kNotHandled;
return LocalRootImpl()
->GetFrame()
->GetEventHandler()
.DispatchBufferedTouchEvents();
}
bool WebFrameWidgetImpl::ScrollFocusedEditableElementIntoView() { bool WebFrameWidgetImpl::ScrollFocusedEditableElementIntoView() {
Element* element = FocusedElement(); Element* element = FocusedElement();
if (!element || !WebElement(element).IsEditable()) if (!element || !WebElement(element).IsEditable())
......
...@@ -93,7 +93,6 @@ class WebFrameWidgetImpl final : public WebFrameWidgetBase { ...@@ -93,7 +93,6 @@ class WebFrameWidgetImpl final : public WebFrameWidgetBase {
void Resize(const gfx::Size&) override; void Resize(const gfx::Size&) override;
void UpdateLifecycle(WebLifecycleUpdate requested_update, void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason) override; DocumentUpdateReason reason) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
void MouseCaptureLost() override; void MouseCaptureLost() override;
void SetRemoteViewportIntersection( void SetRemoteViewportIntersection(
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
#include "cc/layers/solid_color_layer.h" #include "cc/layers/solid_color_layer.h"
#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
#include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h" #include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
#include "third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h"
#include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/web_frame_widget_impl.h" #include "third_party/blink/renderer/core/frame/web_frame_widget_impl.h"
#include "third_party/blink/renderer/core/frame/web_view_frame_widget.h" #include "third_party/blink/renderer/core/frame/web_view_frame_widget.h"
#include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h"
...@@ -28,6 +31,24 @@ bool operator==(const InputHandlerProxy::DidOverscrollParams& lhs, ...@@ -28,6 +31,24 @@ bool operator==(const InputHandlerProxy::DidOverscrollParams& lhs,
lhs.overscroll_behavior == rhs.overscroll_behavior; lhs.overscroll_behavior == rhs.overscroll_behavior;
} }
namespace {
class TouchMoveEventListener final : public NativeEventListener {
public:
void Invoke(ExecutionContext*, Event*) override { invoked_ = true; }
bool GetInvokedStateAndReset() {
bool invoked = invoked_;
invoked_ = false;
return invoked;
}
private:
bool invoked_ = false;
};
} // namespace
class WebFrameWidgetSimTest : public SimTest {}; class WebFrameWidgetSimTest : public SimTest {};
// Tests that if a WebView is auto-resized, the associated // Tests that if a WebView is auto-resized, the associated
...@@ -566,4 +587,52 @@ TEST_F(WebFrameWidgetSimTest, ActivePinchGestureUpdatesLayerTreeHost) { ...@@ -566,4 +587,52 @@ TEST_F(WebFrameWidgetSimTest, ActivePinchGestureUpdatesLayerTreeHost) {
EXPECT_FALSE(layer_tree_host->is_external_pinch_gesture_active_for_testing()); EXPECT_FALSE(layer_tree_host->is_external_pinch_gesture_active_for_testing());
} }
// Tests that dispatch buffered touch events does not process events during
// drag and devtools handling.
TEST_F(WebFrameWidgetSimTest, DispatchBufferedTouchEvents) {
auto* widget = WebView().MainFrameViewWidget();
auto* listener = MakeGarbageCollected<TouchMoveEventListener>();
Window().addEventListener(
event_type_names::kTouchmove, listener,
MakeGarbageCollected<AddEventListenerOptionsResolved>());
widget->UpdateAllLifecyclePhases(DocumentUpdateReason::kTest);
// Send a start.
SyntheticWebTouchEvent touch;
touch.PressPoint(10, 10);
touch.touch_start_or_first_touch_move = true;
widget->ProcessInputEventSynchronouslyForTesting(
WebCoalescedInputEvent(touch.Clone(), {}, {}, ui::LatencyInfo()),
base::DoNothing());
// Expect listener gets called.
touch.MovePoint(0, 10, 10);
widget->ProcessInputEventSynchronouslyForTesting(
WebCoalescedInputEvent(touch.Clone(), {}, {}, ui::LatencyInfo()),
base::DoNothing());
EXPECT_TRUE(listener->GetInvokedStateAndReset());
// Expect listener does not get called, due to devtools flag.
touch.MovePoint(0, 12, 12);
WebFrameWidgetBase::SetIgnoreInputEvents(true);
widget->ProcessInputEventSynchronouslyForTesting(
WebCoalescedInputEvent(touch.Clone(), {}, {}, ui::LatencyInfo()),
base::DoNothing());
EXPECT_TRUE(WebFrameWidgetBase::IgnoreInputEvents());
EXPECT_FALSE(listener->GetInvokedStateAndReset());
WebFrameWidgetBase::SetIgnoreInputEvents(false);
// Expect listener does not get called, due to drag.
touch.MovePoint(0, 14, 14);
widget->StartDragging(WebDragData(), kDragOperationCopy, SkBitmap(),
gfx::Point());
widget->ProcessInputEventSynchronouslyForTesting(
WebCoalescedInputEvent(touch.Clone(), {}, {}, ui::LatencyInfo()),
base::DoNothing());
EXPECT_TRUE(widget->DoingDragAndDrop());
EXPECT_FALSE(WebFrameWidgetBase::IgnoreInputEvents());
EXPECT_FALSE(listener->GetInvokedStateAndReset());
}
} // namespace blink } // namespace blink
...@@ -97,10 +97,6 @@ void WebViewFrameWidget::UpdateLifecycle(WebLifecycleUpdate requested_update, ...@@ -97,10 +97,6 @@ void WebViewFrameWidget::UpdateLifecycle(WebLifecycleUpdate requested_update,
web_view_->UpdateLifecycle(requested_update, reason); web_view_->UpdateLifecycle(requested_update, reason);
} }
WebInputEventResult WebViewFrameWidget::DispatchBufferedTouchEvents() {
return web_view_->DispatchBufferedTouchEvents();
}
void WebViewFrameWidget::ApplyViewportChanges( void WebViewFrameWidget::ApplyViewportChanges(
const ApplyViewportChangesArgs& args) { const ApplyViewportChangesArgs& args) {
web_view_->ApplyViewportChanges(args); web_view_->ApplyViewportChanges(args);
......
...@@ -66,7 +66,6 @@ class CORE_EXPORT WebViewFrameWidget : public WebFrameWidgetBase { ...@@ -66,7 +66,6 @@ class CORE_EXPORT WebViewFrameWidget : public WebFrameWidgetBase {
void Resize(const gfx::Size& size_with_dsf) override; void Resize(const gfx::Size& size_with_dsf) override;
void UpdateLifecycle(WebLifecycleUpdate requested_update, void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason) override; DocumentUpdateReason reason) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
void MouseCaptureLost() override; void MouseCaptureLost() override;
// blink::mojom::FrameWidget // blink::mojom::FrameWidget
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment