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() {
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() {
TRACE_EVENT_NESTABLE_ASYNC_END0("input", "capturing mouse",
TRACE_ID_LOCAL(this));
......
......@@ -526,7 +526,6 @@ class CORE_EXPORT WebViewImpl final : public WebView,
void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason);
void ThemeChanged();
WebInputEventResult DispatchBufferedTouchEvents();
void ApplyViewportChanges(const ApplyViewportChangesArgs& args);
void RecordManipulationTypeCounts(cc::ManipulationInfo info);
void MouseCaptureLost();
......
......@@ -1504,6 +1504,18 @@ void WebFrameWidgetBase::ProcessInputEventSynchronouslyForTesting(
std::move(callback));
}
WebInputEventResult WebFrameWidgetBase::DispatchBufferedTouchEvents() {
CHECK(LocalRootImpl());
if (WebDevToolsAgentImpl* devtools = LocalRootImpl()->DevToolsAgentImpl())
devtools->DispatchBufferedTouchEvents();
return LocalRootImpl()
->GetFrame()
->GetEventHandler()
.DispatchBufferedTouchEvents();
}
WebInputEventResult WebFrameWidgetBase::HandleInputEvent(
const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event();
......
......@@ -327,6 +327,7 @@ class CORE_EXPORT WebFrameWidgetBase
void SetHandlingInputEvent(bool handling) override;
void ProcessInputEventSynchronouslyForTesting(const WebCoalescedInputEvent&,
HandledEventCallback) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override;
void UpdateTextInputState() override;
void UpdateSelectionBounds() override;
......
......@@ -330,26 +330,6 @@ void WebFrameWidgetImpl::UpdateLifecycle(WebLifecycleUpdate requested_update,
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() {
Element* element = FocusedElement();
if (!element || !WebElement(element).IsEditable())
......
......@@ -93,7 +93,6 @@ class WebFrameWidgetImpl final : public WebFrameWidgetBase {
void Resize(const gfx::Size&) override;
void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
void MouseCaptureLost() override;
void SetRemoteViewportIntersection(
......
......@@ -10,6 +10,9 @@
#include "cc/layers/solid_color_layer.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/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_view_frame_widget.h"
#include "third_party/blink/renderer/core/testing/sim/sim_request.h"
......@@ -28,6 +31,24 @@ bool operator==(const InputHandlerProxy::DidOverscrollParams& lhs,
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 {};
// Tests that if a WebView is auto-resized, the associated
......@@ -566,4 +587,52 @@ TEST_F(WebFrameWidgetSimTest, ActivePinchGestureUpdatesLayerTreeHost) {
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
......@@ -97,10 +97,6 @@ void WebViewFrameWidget::UpdateLifecycle(WebLifecycleUpdate requested_update,
web_view_->UpdateLifecycle(requested_update, reason);
}
WebInputEventResult WebViewFrameWidget::DispatchBufferedTouchEvents() {
return web_view_->DispatchBufferedTouchEvents();
}
void WebViewFrameWidget::ApplyViewportChanges(
const ApplyViewportChangesArgs& args) {
web_view_->ApplyViewportChanges(args);
......
......@@ -66,7 +66,6 @@ class CORE_EXPORT WebViewFrameWidget : public WebFrameWidgetBase {
void Resize(const gfx::Size& size_with_dsf) override;
void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
void MouseCaptureLost() override;
// 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