Index: components/test_runner/event_sender.cc |
diff --git a/components/test_runner/event_sender.cc b/components/test_runner/event_sender.cc |
index ba9165488adf35628ec1fe83406d742f4f151c14..f56555d59b52d4806a36224407800451fca50b0e 100644 |
--- a/components/test_runner/event_sender.cc |
+++ b/components/test_runner/event_sender.cc |
@@ -6,6 +6,8 @@ |
#include <stddef.h> |
+#include <memory> |
+ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/command_line.h" |
@@ -20,9 +22,11 @@ |
#include "components/test_runner/test_interfaces.h" |
#include "components/test_runner/web_test_delegate.h" |
#include "components/test_runner/web_view_test_proxy.h" |
+#include "components/test_runner/web_widget_test_proxy.h" |
#include "gin/handle.h" |
#include "gin/object_template_builder.h" |
#include "gin/wrappable.h" |
+#include "third_party/WebKit/public/platform/WebInputEvent.h" |
#include "third_party/WebKit/public/platform/WebPointerProperties.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
#include "third_party/WebKit/public/platform/WebVector.h" |
@@ -1280,8 +1284,8 @@ EventSender::SavedEvent::SavedEvent() |
milliseconds(0), |
modifiers(0) {} |
-EventSender::EventSender(WebViewTestProxyBase* web_view_test_proxy_base) |
- : web_view_test_proxy_base_(web_view_test_proxy_base), |
+EventSender::EventSender(WebWidgetTestProxyBase* web_widget_test_proxy_base) |
+ : web_widget_test_proxy_base_(web_widget_test_proxy_base), |
replaying_saved_events_(false), |
weak_factory_(this) { |
Reset(); |
@@ -1294,10 +1298,10 @@ void EventSender::Reset() { |
current_drag_data_.reset(); |
current_drag_effect_ = blink::WebDragOperationNone; |
current_drag_effects_allowed_ = blink::WebDragOperationNone; |
- if (view() && |
+ if (widget() && |
current_pointer_state_[kRawMousePointerId].pressed_button_ != |
WebMouseEvent::Button::NoButton) |
- view()->mouseCaptureLost(); |
+ widget()->mouseCaptureLost(); |
current_pointer_state_.clear(); |
is_drag_mode_ = true; |
force_layout_on_events_ = true; |
@@ -1340,19 +1344,20 @@ void EventSender::SetContextMenuData(const WebContextMenuData& data) { |
void EventSender::DoDragDrop(const WebDragData& drag_data, |
WebDragOperationsMask mask) { |
- WebMouseEvent unscaled_event; |
+ WebMouseEvent raw_event; |
InitMouseEvent(WebInputEvent::MouseDown, |
current_pointer_state_[kRawMousePointerId].pressed_button_, |
current_pointer_state_[kRawMousePointerId].current_buttons_, |
current_pointer_state_[kRawMousePointerId].last_pos_, |
GetCurrentEventTimeSec(), click_count_, |
current_pointer_state_[kRawMousePointerId].modifiers_, |
- &unscaled_event); |
+ &raw_event); |
- std::unique_ptr<WebInputEvent> scaled_event = ScaleEvent(unscaled_event); |
+ std::unique_ptr<WebInputEvent> widget_event = |
+ TransformScreenToWidgetCoordinates(raw_event); |
const WebMouseEvent* event = |
- scaled_event.get() ? static_cast<WebMouseEvent*>(scaled_event.get()) |
- : &unscaled_event; |
+ widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) |
+ : &raw_event; |
WebPoint client_point(event->x, event->y); |
WebPoint screen_point(event->globalX, event->globalY); |
@@ -1387,7 +1392,7 @@ void EventSender::PointerDown(int button_number, |
int tiltX, |
int tiltY) { |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
DCHECK_NE(-1, button_number); |
@@ -1424,7 +1429,7 @@ void EventSender::PointerUp(int button_number, |
int tiltX, |
int tiltY) { |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
DCHECK_NE(-1, button_number); |
@@ -1693,7 +1698,7 @@ void EventSender::KeyDown(const std::string& code_str, |
// EventSender.m forces a layout here, with at least one |
// test (fast/forms/focus-control-to-page.html) relying on this. |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
// In the browser, if a keyboard event corresponds to an editor command, |
// the command will be dispatched to the renderer just before dispatching |
@@ -1734,9 +1739,8 @@ void EventSender::FireKeyboardEventsToElement() {} |
void EventSender::ClearKillRing() {} |
std::vector<std::string> EventSender::ContextClick() { |
- if (force_layout_on_events_) { |
- view()->updateAllLifecyclePhases(); |
- } |
+ if (force_layout_on_events_) |
+ widget()->updateAllLifecyclePhases(); |
UpdateClickCountForButton(WebMouseEvent::Button::Right); |
@@ -1910,7 +1914,7 @@ void EventSender::GestureFlingCancel() { |
event.timeStampSeconds = GetCurrentEventTimeSec(); |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
HandleInputEventOnViewOrPopup(event); |
} |
@@ -1954,7 +1958,7 @@ void EventSender::GestureFlingStart(float x, |
event.timeStampSeconds = GetCurrentEventTimeSec(); |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
HandleInputEventOnViewOrPopup(event); |
} |
@@ -2141,7 +2145,7 @@ void EventSender::MouseScrollBy(gin::Arguments* args, |
void EventSender::MouseMoveTo(gin::Arguments* args) { |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
double x; |
double y; |
@@ -2196,7 +2200,7 @@ void EventSender::MouseMoveTo(gin::Arguments* args) { |
void EventSender::MouseLeave() { |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
WebMouseEvent event; |
InitMouseEvent(WebInputEvent::MouseLeave, WebMouseEvent::Button::NoButton, 0, |
@@ -2265,7 +2269,7 @@ void EventSender::SendCurrentTouchEvent(WebInputEvent::Type type, |
DCHECK_GT(static_cast<unsigned>(WebTouchEvent::kTouchesLengthCap), |
touch_points_.size()); |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
WebTouchEvent touch_event; |
touch_event.type = type; |
@@ -2524,7 +2528,7 @@ void EventSender::GestureEvent(WebInputEvent::Type type, |
event.timeStampSeconds = GetCurrentEventTimeSec(); |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
WebInputEventResult result = HandleInputEventOnViewOrPopup(event); |
@@ -2566,7 +2570,7 @@ void EventSender::InitMouseWheelEvent(gin::Arguments* args, |
// determined before we send events (as well as all the other methods |
// that send an event do). |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
double horizontal; |
if (!args->GetNext(&horizontal)) { |
@@ -2673,12 +2677,13 @@ void EventSender::InitPointerProperties(gin::Arguments* args, |
return; |
} |
-void EventSender::FinishDragAndDrop(const WebMouseEvent& unscaled_event, |
+void EventSender::FinishDragAndDrop(const WebMouseEvent& raw_event, |
blink::WebDragOperation drag_effect) { |
- std::unique_ptr<WebInputEvent> scaled_event = ScaleEvent(unscaled_event); |
+ std::unique_ptr<WebInputEvent> widget_event = |
+ TransformScreenToWidgetCoordinates(raw_event); |
const WebMouseEvent* event = |
- scaled_event.get() ? static_cast<const WebMouseEvent*>(scaled_event.get()) |
- : &unscaled_event; |
+ widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) |
+ : &raw_event; |
WebPoint client_point(event->x, event->y); |
WebPoint screen_point(event->globalX, event->globalY); |
@@ -2696,11 +2701,12 @@ void EventSender::FinishDragAndDrop(const WebMouseEvent& unscaled_event, |
view()->dragSourceSystemDragEnded(); |
} |
-void EventSender::DoDragAfterMouseUp(const WebMouseEvent& unscaled_event) { |
- std::unique_ptr<WebInputEvent> scaled_event = ScaleEvent(unscaled_event); |
+void EventSender::DoDragAfterMouseUp(const WebMouseEvent& raw_event) { |
+ std::unique_ptr<WebInputEvent> widget_event = |
+ TransformScreenToWidgetCoordinates(raw_event); |
const WebMouseEvent* event = |
- scaled_event.get() ? static_cast<WebMouseEvent*>(scaled_event.get()) |
- : &unscaled_event; |
+ widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) |
+ : &raw_event; |
last_click_time_sec_ = event->timeStampSeconds; |
last_click_pos_ = current_pointer_state_[kRawMousePointerId].last_pos_; |
@@ -2719,20 +2725,21 @@ void EventSender::DoDragAfterMouseUp(const WebMouseEvent& unscaled_event) { |
if (current_drag_data_.isNull()) |
return; |
- FinishDragAndDrop(unscaled_event, drag_effect); |
+ FinishDragAndDrop(raw_event, drag_effect); |
} |
-void EventSender::DoDragAfterMouseMove(const WebMouseEvent& unscaled_event) { |
+void EventSender::DoDragAfterMouseMove(const WebMouseEvent& raw_event) { |
if (current_pointer_state_[kRawMousePointerId].pressed_button_ == |
WebMouseEvent::Button::NoButton || |
current_drag_data_.isNull()) { |
return; |
} |
- std::unique_ptr<WebInputEvent> scaled_event = ScaleEvent(unscaled_event); |
+ std::unique_ptr<WebInputEvent> widget_event = |
+ TransformScreenToWidgetCoordinates(raw_event); |
const WebMouseEvent* event = |
- scaled_event.get() ? static_cast<WebMouseEvent*>(scaled_event.get()) |
- : &unscaled_event; |
+ widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) |
+ : &raw_event; |
WebPoint client_point(event->x, event->y); |
WebPoint screen_point(event->globalX, event->globalY); |
@@ -2789,18 +2796,26 @@ void EventSender::ReplaySavedEvents() { |
} |
WebInputEventResult EventSender::HandleInputEventOnViewOrPopup( |
- const WebInputEvent& unscaled_event) { |
- std::unique_ptr<WebInputEvent> scaled_event = ScaleEvent(unscaled_event); |
+ const WebInputEvent& raw_event) { |
+ last_event_timestamp_ = raw_event.timeStampSeconds; |
+ |
+ WebPagePopup* popup = widget()->pagePopup(); |
+ if (popup && !WebInputEvent::isKeyboardEventType(raw_event.type)) { |
+ // ui::ScaleWebInputEvent returns nullptr when the scale is 1.0f as the |
+ // event does not have to be converted. |
+ std::unique_ptr<WebInputEvent> scaled_event = ui::ScaleWebInputEvent( |
+ raw_event, delegate()->GetWindowToViewportScale()); |
+ const WebInputEvent* popup_friendly_event = |
+ scaled_event.get() ? scaled_event.get() : &raw_event; |
+ return popup->handleInputEvent(*popup_friendly_event); |
+ } |
+ |
+ std::unique_ptr<WebInputEvent> widget_event = |
+ TransformScreenToWidgetCoordinates(raw_event); |
const WebInputEvent* event = |
- scaled_event.get() ? scaled_event.get() : &unscaled_event; |
- |
- last_event_timestamp_ = event->timeStampSeconds; |
- |
- if (WebPagePopup* popup = view()->pagePopup()) { |
- if (!WebInputEvent::isKeyboardEventType(event->type)) |
- return popup->handleInputEvent(*event); |
- } |
- return view()->handleInputEvent(*event); |
+ widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) |
+ : &raw_event; |
+ return widget()->handleInputEvent(*event); |
} |
void EventSender::SendGesturesForMouseWheelEvent( |
@@ -2829,7 +2844,7 @@ void EventSender::SendGesturesForMouseWheelEvent( |
} |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
HandleInputEventOnViewOrPopup(begin_event); |
@@ -2845,7 +2860,7 @@ void EventSender::SendGesturesForMouseWheelEvent( |
begin_event.data.scrollBegin.deltaHintUnits; |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
HandleInputEventOnViewOrPopup(update_event); |
WebGestureEvent end_event; |
@@ -2856,31 +2871,35 @@ void EventSender::SendGesturesForMouseWheelEvent( |
begin_event.data.scrollBegin.deltaHintUnits; |
if (force_layout_on_events_) |
- view()->updateAllLifecyclePhases(); |
+ widget()->updateAllLifecyclePhases(); |
HandleInputEventOnViewOrPopup(end_event); |
} |
TestInterfaces* EventSender::interfaces() { |
- return web_view_test_proxy_base_->test_interfaces(); |
+ return web_widget_test_proxy_base_->web_view_test_proxy_base() |
+ ->test_interfaces(); |
} |
WebTestDelegate* EventSender::delegate() { |
- return web_view_test_proxy_base_->delegate(); |
+ return web_widget_test_proxy_base_->web_view_test_proxy_base()->delegate(); |
} |
const blink::WebView* EventSender::view() const { |
- return web_view_test_proxy_base_->web_view(); |
+ return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view(); |
} |
blink::WebView* EventSender::view() { |
- return web_view_test_proxy_base_->web_view(); |
+ return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view(); |
+} |
+ |
+blink::WebWidget* EventSender::widget() { |
+ return web_widget_test_proxy_base_->web_widget(); |
} |
-std::unique_ptr<WebInputEvent> EventSender::ScaleEvent( |
+std::unique_ptr<WebInputEvent> EventSender::TransformScreenToWidgetCoordinates( |
const WebInputEvent& event) { |
- // ui::ScaleWebInputEvent returns nullptr when the scale is 1.0f as the event |
- // does not have to be converted. |
- return ui::ScaleWebInputEvent(event, delegate()->GetWindowToViewportScale()); |
+ return delegate()->TransformScreenToWidgetCoordinates( |
+ web_widget_test_proxy_base_, event); |
} |
} // namespace test_runner |