Commit 6da7914b authored by Dave Tapuska's avatar Dave Tapuska Committed by Commit Bot

Move HandleInputEvent into WebFrameWidgetBase

The common implementation of HandleInputEvent can be deduplicated. There
are a few instances where metrics are logged only for the main frame
so protect those with ForMainFrame()

There were a few pieces of code weren't in the WebFrameWidgetImpl
but were in the WebViewFrameWidget implementation. I believe these
to be omissions and have added them in the common implementation.

BUG=1097816

Change-Id: I1da3fa3a0d81eaf0e0c04bc4e85b51b40f7c9fb8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2525763
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825931}
parent ee2f8113
......@@ -22,8 +22,7 @@ class CORE_EXPORT CurrentInputEvent {
static const WebInputEvent* Get() { return current_input_event_; }
private:
friend class WebFrameWidgetImpl;
friend class WebViewFrameWidget;
friend class WebFrameWidgetBase;
friend class NavigationPolicyTest;
static const WebInputEvent* current_input_event_;
......
......@@ -25,10 +25,13 @@
#include "third_party/blink/public/web/web_plugin.h"
#include "third_party/blink/public/web/web_settings.h"
#include "third_party/blink/public/web/web_widget_client.h"
#include "third_party/blink/renderer/core/content_capture/content_capture_manager.h"
#include "third_party/blink/renderer/core/dom/element.h"
#include "third_party/blink/renderer/core/dom/layout_tree_builder_traversal.h"
#include "third_party/blink/renderer/core/events/current_input_event.h"
#include "third_party/blink/renderer/core/events/web_input_event_conversion.h"
#include "third_party/blink/renderer/core/events/wheel_event.h"
#include "third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h"
#include "third_party/blink/renderer/core/exported/web_plugin_container_impl.h"
#include "third_party/blink/renderer/core/exported/web_view_impl.h"
#include "third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h"
......@@ -56,6 +59,7 @@
#include "third_party/blink/renderer/core/page/focus_controller.h"
#include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/core/page/pointer_lock_controller.h"
#include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h"
#include "third_party/blink/renderer/core/paint/paint_timing_detector.h"
#include "third_party/blink/renderer/core/probe/core_probes.h"
#include "third_party/blink/renderer/core/scroll/scrollbar_theme.h"
......@@ -1418,6 +1422,153 @@ void WebFrameWidgetBase::ProcessInputEventSynchronouslyForTesting(
std::move(callback));
}
WebInputEventResult WebFrameWidgetBase::HandleInputEvent(
const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event();
TRACE_EVENT1("input,rail", "WebFrameWidgetBase::HandleInputEvent", "type",
WebInputEvent::GetName(input_event.GetType()));
DCHECK(!WebInputEvent::IsTouchEventType(input_event.GetType()));
CHECK(LocalRootImpl());
// Only record metrics for the main frame.
if (ForMainFrame()) {
GetPage()->GetVisualViewport().StartTrackingPinchStats();
}
// If a drag-and-drop operation is in progress, ignore input events except
// PointerCancel.
if (doing_drag_and_drop_ &&
input_event.GetType() != WebInputEvent::Type::kPointerCancel)
return WebInputEventResult::kHandledSuppressed;
// Don't handle events once we've started shutting down.
if (!GetPage())
return WebInputEventResult::kNotHandled;
if (WebDevToolsAgentImpl* devtools = LocalRootImpl()->DevToolsAgentImpl()) {
auto result = devtools->HandleInputEvent(input_event);
if (result != WebInputEventResult::kNotHandled)
return result;
}
// Report the event to be NOT processed by WebKit, so that the browser can
// handle it appropriately.
if (IgnoreInputEvents())
return WebInputEventResult::kNotHandled;
base::AutoReset<const WebInputEvent*> current_event_change(
&CurrentInputEvent::current_input_event_, &input_event);
UIEventWithKeyState::ClearNewTabModifierSetFromIsolatedWorld();
if (GetPage()->GetPointerLockController().IsPointerLocked() &&
WebInputEvent::IsMouseEventType(input_event.GetType())) {
PointerLockMouseEvent(coalesced_event);
return WebInputEventResult::kHandledSystem;
}
/// These metrics are only captured for the main frame.
if (ForMainFrame()) {
Document& main_frame_document = *LocalRootImpl()->GetFrame()->GetDocument();
if (input_event.GetType() != WebInputEvent::Type::kMouseMove) {
FirstMeaningfulPaintDetector::From(main_frame_document)
.NotifyInputEvent();
}
if (input_event.GetType() != WebInputEvent::Type::kMouseMove &&
input_event.GetType() != WebInputEvent::Type::kMouseEnter &&
input_event.GetType() != WebInputEvent::Type::kMouseLeave) {
InteractiveDetector* interactive_detector(
InteractiveDetector::From(main_frame_document));
if (interactive_detector) {
interactive_detector->OnInvalidatingInputEvent(input_event.TimeStamp());
}
}
}
NotifyInputObservers(coalesced_event);
// Notify the focus frame of the input. Note that the other frames are not
// notified as input is only handled by the focused frame.
Frame* frame = FocusedCoreFrame();
if (auto* local_frame = DynamicTo<LocalFrame>(frame)) {
if (auto* content_capture_manager =
local_frame->LocalFrameRoot().GetContentCaptureManager()) {
content_capture_manager->NotifyInputEvent(input_event.GetType(),
*local_frame);
}
}
// Skip the pointerrawupdate for mouse capture case.
if (mouse_capture_element_ &&
input_event.GetType() == WebInputEvent::Type::kPointerRawUpdate)
return WebInputEventResult::kHandledSystem;
if (mouse_capture_element_ &&
WebInputEvent::IsMouseEventType(input_event.GetType()))
return HandleCapturedMouseEvent(coalesced_event);
// FIXME: This should take in the intended frame, not the local frame
// root.
return PageWidgetDelegate::HandleInputEvent(*this, coalesced_event,
LocalRootImpl()->GetFrame());
}
WebInputEventResult WebFrameWidgetBase::HandleCapturedMouseEvent(
const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event();
TRACE_EVENT1("input", "captured mouse event", "type", input_event.GetType());
// Save |mouse_capture_element_| since |MouseCaptureLost()| will clear it.
HTMLPlugInElement* element = mouse_capture_element_;
// Not all platforms call mouseCaptureLost() directly.
if (input_event.GetType() == WebInputEvent::Type::kMouseUp)
MouseCaptureLost();
AtomicString event_type;
switch (input_event.GetType()) {
case WebInputEvent::Type::kMouseEnter:
event_type = event_type_names::kMouseover;
break;
case WebInputEvent::Type::kMouseMove:
event_type = event_type_names::kMousemove;
break;
case WebInputEvent::Type::kPointerRawUpdate:
// There will be no mouse event for rawupdate events.
event_type = event_type_names::kPointerrawupdate;
break;
case WebInputEvent::Type::kMouseLeave:
event_type = event_type_names::kMouseout;
break;
case WebInputEvent::Type::kMouseDown:
event_type = event_type_names::kMousedown;
LocalFrame::NotifyUserActivation(
element->GetDocument().GetFrame(),
mojom::blink::UserActivationNotificationType::kInteraction);
break;
case WebInputEvent::Type::kMouseUp:
event_type = event_type_names::kMouseup;
break;
default:
NOTREACHED();
}
WebMouseEvent transformed_event =
TransformWebMouseEvent(LocalRootImpl()->GetFrameView(),
static_cast<const WebMouseEvent&>(input_event));
if (LocalFrame* frame = element->GetDocument().GetFrame()) {
frame->GetEventHandler().HandleTargetedMouseEvent(
element, transformed_event, event_type,
TransformWebMouseEventVector(
LocalRootImpl()->GetFrameView(),
coalesced_event.GetCoalescedEventsPointers()),
TransformWebMouseEventVector(
LocalRootImpl()->GetFrameView(),
coalesced_event.GetPredictedEventsPointers()));
}
return WebInputEventResult::kHandledSystem;
}
void WebFrameWidgetBase::UpdateTextInputState() {
widget_base_->UpdateTextInputState();
}
......
......@@ -96,8 +96,19 @@ class CORE_EXPORT WebFrameWidgetBase
void BindLocalRoot(WebLocalFrame&);
// If this widget is for the top level frame. This is different than
// |ForMainFrame| because |ForMainFrame| could return true but this method
// returns false. If this widget is a MainFrame widget embedded in another
// widget, for example embedding a portal.
virtual bool ForTopLevelFrame() const = 0;
// Returns true if this widget is for a local root that is a child frame,
// false otherwise.
virtual bool ForSubframe() const = 0;
// Opposite of |ForSubframe|. If this widget is for the local main frame.
bool ForMainFrame() const { return !ForSubframe(); }
virtual void IntrinsicSizingInfoChanged(
mojom::blink::IntrinsicSizingInfoPtr) {}
......@@ -315,6 +326,7 @@ class CORE_EXPORT WebFrameWidgetBase
void SetHandlingInputEvent(bool handling) override;
void ProcessInputEventSynchronouslyForTesting(const WebCoalescedInputEvent&,
HandledEventCallback) override;
WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override;
void UpdateTextInputState() override;
void UpdateSelectionBounds() override;
void ShowVirtualKeyboard() override;
......@@ -713,6 +725,7 @@ class CORE_EXPORT WebFrameWidgetBase
const WebMouseWheelEvent&) override;
WebInputEventResult HandleCharEvent(const WebKeyboardEvent&) override;
WebInputEventResult HandleCapturedMouseEvent(const WebCoalescedInputEvent&);
void MouseContextMenu(const WebMouseEvent&);
void CancelDrag();
void RequestAnimationAfterDelayTimerFired(TimerBase*);
......
......@@ -411,100 +411,6 @@ WebInputEventResult WebFrameWidgetImpl::DispatchBufferedTouchEvents() {
.DispatchBufferedTouchEvents();
}
WebInputEventResult WebFrameWidgetImpl::HandleInputEvent(
const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event();
TRACE_EVENT1("input", "WebFrameWidgetImpl::handleInputEvent", "type",
WebInputEvent::GetName(input_event.GetType()));
DCHECK(!WebInputEvent::IsTouchEventType(input_event.GetType()));
// If a drag-and-drop operation is in progress, ignore input events.
if (doing_drag_and_drop_)
return WebInputEventResult::kHandledSuppressed;
// Don't handle events once we've started shutting down.
if (!GetPage())
return WebInputEventResult::kNotHandled;
if (WebDevToolsAgentImpl* devtools = LocalRootImpl()->DevToolsAgentImpl()) {
auto result = devtools->HandleInputEvent(input_event);
if (result != WebInputEventResult::kNotHandled)
return result;
}
// Report the event to be NOT processed by WebKit, so that the browser can
// handle it appropriately.
if (IgnoreInputEvents())
return WebInputEventResult::kNotHandled;
// FIXME: pass event to m_localRoot's WebDevToolsAgentImpl once available.
base::AutoReset<const WebInputEvent*> current_event_change(
&CurrentInputEvent::current_input_event_, &input_event);
if (IsPointerLocked() &&
WebInputEvent::IsMouseEventType(input_event.GetType())) {
PointerLockMouseEvent(coalesced_event);
return WebInputEventResult::kHandledSystem;
}
NotifyInputObservers(coalesced_event);
if (mouse_capture_element_ &&
WebInputEvent::IsMouseEventType(input_event.GetType())) {
TRACE_EVENT1("input", "captured mouse event", "type",
input_event.GetType());
// Save m_mouseCaptureNode since mouseCaptureLost() will clear it.
HTMLPlugInElement* target = mouse_capture_element_;
// Not all platforms call mouseCaptureLost() directly.
if (input_event.GetType() == WebInputEvent::Type::kMouseUp)
MouseCaptureLost();
AtomicString event_type;
switch (input_event.GetType()) {
case WebInputEvent::Type::kMouseEnter:
event_type = event_type_names::kMouseover;
break;
case WebInputEvent::Type::kMouseMove:
event_type = event_type_names::kMousemove;
break;
case WebInputEvent::Type::kMouseLeave:
event_type = event_type_names::kMouseout;
break;
case WebInputEvent::Type::kMouseDown:
event_type = event_type_names::kMousedown;
LocalFrame::NotifyUserActivation(
target->GetDocument().GetFrame(),
mojom::blink::UserActivationNotificationType::kInteraction);
break;
case WebInputEvent::Type::kMouseUp:
event_type = event_type_names::kMouseup;
break;
default:
NOTREACHED();
}
WebMouseEvent transformed_event =
TransformWebMouseEvent(LocalRootImpl()->GetFrameView(),
static_cast<const WebMouseEvent&>(input_event));
if (LocalFrame* frame = target->GetDocument().GetFrame()) {
frame->GetEventHandler().HandleTargetedMouseEvent(
target, transformed_event, event_type,
TransformWebMouseEventVector(
LocalRootImpl()->GetFrameView(),
coalesced_event.GetCoalescedEventsPointers()),
TransformWebMouseEventVector(
LocalRootImpl()->GetFrameView(),
coalesced_event.GetPredictedEventsPointers()));
}
return WebInputEventResult::kHandledSystem;
}
return PageWidgetDelegate::HandleInputEvent(*this, coalesced_event,
LocalRootImpl()->GetFrame());
}
void WebFrameWidgetImpl::DidDetachLocalFrameTree() {}
bool WebFrameWidgetImpl::ScrollFocusedEditableElementIntoView() {
......
......@@ -95,7 +95,6 @@ class WebFrameWidgetImpl final : public WebFrameWidgetBase {
DocumentUpdateReason reason) override;
WebHitTestResult HitTestResultAt(const gfx::PointF&) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override;
void MouseCaptureLost() override;
void SetRemoteViewportIntersection(
......
......@@ -9,9 +9,7 @@
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/web/web_autofill_client.h"
#include "third_party/blink/public/web/web_view_client.h"
#include "third_party/blink/renderer/core/content_capture/content_capture_manager.h"
#include "third_party/blink/renderer/core/editing/frame_selection.h"
#include "third_party/blink/renderer/core/events/current_input_event.h"
#include "third_party/blink/renderer/core/events/ui_event_with_key_state.h"
#include "third_party/blink/renderer/core/events/web_input_event_conversion.h"
#include "third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h"
......@@ -33,7 +31,6 @@
#include "third_party/blink/renderer/core/page/focus_controller.h"
#include "third_party/blink/renderer/core/page/link_highlight.h"
#include "third_party/blink/renderer/core/page/pointer_lock_controller.h"
#include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h"
#include "third_party/blink/renderer/platform/keyboard_codes.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
#include "third_party/blink/renderer/platform/widget/widget_base.h"
......@@ -137,149 +134,10 @@ void WebViewFrameWidget::UpdateLifecycle(WebLifecycleUpdate requested_update,
web_view_->UpdateLifecycle(requested_update, reason);
}
WebInputEventResult WebViewFrameWidget::HandleInputEvent(
const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event();
CHECK(web_view_->MainFrameImpl());
DCHECK(!WebInputEvent::IsTouchEventType(input_event.GetType()));
GetPage()->GetVisualViewport().StartTrackingPinchStats();
TRACE_EVENT1("input,rail", "WebViewFrameWidget::handleInputEvent", "type",
WebInputEvent::GetName(input_event.GetType()));
// If a drag-and-drop operation is in progress, ignore input events except
// PointerCancel.
if (DoingDragAndDrop() &&
input_event.GetType() != WebInputEvent::Type::kPointerCancel)
return WebInputEventResult::kHandledSuppressed;
if (WebDevToolsAgentImpl* devtools =
web_view_->MainFrameDevToolsAgentImpl()) {
auto result = devtools->HandleInputEvent(input_event);
if (result != WebInputEventResult::kNotHandled)
return result;
}
// Report the event to be NOT processed by WebKit, so that the browser can
// handle it appropriately.
if (WebFrameWidgetBase::IgnoreInputEvents())
return WebInputEventResult::kNotHandled;
base::AutoReset<const WebInputEvent*> current_event_change(
&CurrentInputEvent::current_input_event_, &input_event);
UIEventWithKeyState::ClearNewTabModifierSetFromIsolatedWorld();
if (GetPage()->GetPointerLockController().IsPointerLocked() &&
WebInputEvent::IsMouseEventType(input_event.GetType())) {
PointerLockMouseEvent(coalesced_event);
return WebInputEventResult::kHandledSystem;
}
Document& main_frame_document =
*web_view_->MainFrameImpl()->GetFrame()->GetDocument();
if (input_event.GetType() != WebInputEvent::Type::kMouseMove) {
FirstMeaningfulPaintDetector::From(main_frame_document).NotifyInputEvent();
}
if (input_event.GetType() != WebInputEvent::Type::kMouseMove &&
input_event.GetType() != WebInputEvent::Type::kMouseEnter &&
input_event.GetType() != WebInputEvent::Type::kMouseLeave) {
InteractiveDetector* interactive_detector(
InteractiveDetector::From(main_frame_document));
if (interactive_detector) {
interactive_detector->OnInvalidatingInputEvent(input_event.TimeStamp());
}
}
NotifyInputObservers(coalesced_event);
// Notify the focus frame of the input. Note that the other frames are not
// notified as input is only handled by the focused frame.
Frame* frame = web_view_->FocusedCoreFrame();
if (auto* local_frame = DynamicTo<LocalFrame>(frame)) {
if (auto* content_capture_manager =
local_frame->LocalFrameRoot().GetContentCaptureManager()) {
content_capture_manager->NotifyInputEvent(input_event.GetType(),
*local_frame);
}
}
// Skip the pointerrawupdate for mouse capture case.
if (mouse_capture_element_ &&
input_event.GetType() == WebInputEvent::Type::kPointerRawUpdate)
return WebInputEventResult::kHandledSystem;
if (mouse_capture_element_ &&
WebInputEvent::IsMouseEventType(input_event.GetType()))
return HandleCapturedMouseEvent(coalesced_event);
// FIXME: This should take in the intended frame, not the local frame
// root.
return PageWidgetDelegate::HandleInputEvent(
*this, coalesced_event, web_view_->MainFrameImpl()->GetFrame());
}
WebInputEventResult WebViewFrameWidget::DispatchBufferedTouchEvents() {
return web_view_->DispatchBufferedTouchEvents();
}
WebInputEventResult WebViewFrameWidget::HandleCapturedMouseEvent(
const WebCoalescedInputEvent& coalesced_event) {
const WebInputEvent& input_event = coalesced_event.Event();
TRACE_EVENT1("input", "captured mouse event", "type", input_event.GetType());
// Save |mouse_capture_element_| since |MouseCaptureLost()| will clear it.
HTMLPlugInElement* element = mouse_capture_element_;
// Not all platforms call mouseCaptureLost() directly.
if (input_event.GetType() == WebInputEvent::Type::kMouseUp)
MouseCaptureLost();
AtomicString event_type;
switch (input_event.GetType()) {
case WebInputEvent::Type::kMouseEnter:
event_type = event_type_names::kMouseover;
break;
case WebInputEvent::Type::kMouseMove:
event_type = event_type_names::kMousemove;
break;
case WebInputEvent::Type::kPointerRawUpdate:
// There will be no mouse event for rawupdate events.
event_type = event_type_names::kPointerrawupdate;
break;
case WebInputEvent::Type::kMouseLeave:
event_type = event_type_names::kMouseout;
break;
case WebInputEvent::Type::kMouseDown:
event_type = event_type_names::kMousedown;
LocalFrame::NotifyUserActivation(
element->GetDocument().GetFrame(),
mojom::blink::UserActivationNotificationType::kInteraction);
break;
case WebInputEvent::Type::kMouseUp:
event_type = event_type_names::kMouseup;
break;
default:
NOTREACHED();
}
WebMouseEvent transformed_event =
TransformWebMouseEvent(web_view_->MainFrameImpl()->GetFrameView(),
static_cast<const WebMouseEvent&>(input_event));
if (LocalFrame* frame = element->GetDocument().GetFrame()) {
frame->GetEventHandler().HandleTargetedMouseEvent(
element, transformed_event, event_type,
TransformWebMouseEventVector(
web_view_->MainFrameImpl()->GetFrameView(),
coalesced_event.GetCoalescedEventsPointers()),
TransformWebMouseEventVector(
web_view_->MainFrameImpl()->GetFrameView(),
coalesced_event.GetPredictedEventsPointers()));
}
return WebInputEventResult::kHandledSystem;
}
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 HandleInputEvent(const WebCoalescedInputEvent&) override;
WebInputEventResult DispatchBufferedTouchEvents() override;
void MouseCaptureLost() override;
......@@ -150,8 +149,6 @@ class CORE_EXPORT WebViewFrameWidget : public WebFrameWidgetBase {
WebInputEventResult HandleGestureEvent(const WebGestureEvent&) override;
WebInputEventResult HandleKeyEvent(const WebKeyboardEvent&) override;
WebInputEventResult HandleCapturedMouseEvent(const WebCoalescedInputEvent&);
LocalFrameView* GetLocalFrameViewForAnimationScrolling() override;
void SetWindowRectSynchronously(const gfx::Rect& new_window_rect);
......
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