Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_event_handler.cc

Issue 2782893002: WebMouseEvent coordinates are now fractional & private (Closed)
Patch Set: Rebased, fixed a comment in web_input_event_builders_mac.mm Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_event_handler.h" 5 #include "content/browser/renderer_host/render_widget_host_view_event_handler.h"
6 6
7 #include "base/metrics/user_metrics.h" 7 #include "base/metrics/user_metrics.h"
8 #include "base/metrics/user_metrics_action.h" 8 #include "base/metrics/user_metrics_action.h"
9 #include "content/browser/renderer_host/input/touch_selection_controller_client_ aura.h" 9 #include "content/browser/renderer_host/input/touch_selection_controller_client_ aura.h"
10 #include "content/browser/renderer_host/overscroll_controller.h" 10 #include "content/browser/renderer_host/overscroll_controller.h"
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 if (event->flags() & ui::EF_IS_NON_CLIENT) { 712 if (event->flags() & ui::EF_IS_NON_CLIENT) {
713 // TODO(jonross): ideally this would not be done for mus (crbug.com/621412) 713 // TODO(jonross): ideally this would not be done for mus (crbug.com/621412)
714 synthetic_move_sent_ = true; 714 synthetic_move_sent_ = true;
715 window_->MoveCursorTo(center); 715 window_->MoveCursorTo(center);
716 return; 716 return;
717 } 717 }
718 718
719 blink::WebMouseEvent mouse_event = 719 blink::WebMouseEvent mouse_event =
720 ui::MakeWebMouseEvent(*event, base::Bind(&GetScreenLocationFromEvent)); 720 ui::MakeWebMouseEvent(*event, base::Bind(&GetScreenLocationFromEvent));
721 721
722 bool is_move_to_center_event = (event->type() == ui::ET_MOUSE_MOVED || 722 bool is_move_to_center_event =
723 event->type() == ui::ET_MOUSE_DRAGGED) && 723 (event->type() == ui::ET_MOUSE_MOVED ||
724 mouse_event.x == center.x() && 724 event->type() == ui::ET_MOUSE_DRAGGED) &&
725 mouse_event.y == center.y(); 725 mouse_event.positionInWidget().x == center.x() &&
726 mouse_event.positionInWidget().y == center.y();
726 727
727 // For fractional scale factors, the conversion from pixels to dip and 728 // For fractional scale factors, the conversion from pixels to dip and
728 // vice versa could result in off by 1 or 2 errors which hurts us because 729 // vice versa could result in off by 1 or 2 errors which hurts us because
729 // we want to avoid sending the artificial move to center event to the 730 // we want to avoid sending the artificial move to center event to the
730 // renderer. Sending the move to center to the renderer cause the cursor 731 // renderer. Sending the move to center to the renderer cause the cursor
731 // to bounce around the center of the screen leading to the lock operation 732 // to bounce around the center of the screen leading to the lock operation
732 // not working correctly. 733 // not working correctly.
733 // Workaround is to treat a mouse move or drag event off by at most 2 px 734 // Workaround is to treat a mouse move or drag event off by at most 2 px
734 // from the center as a move to center event. 735 // from the center as a move to center event.
735 if (synthetic_move_sent_ && 736 if (synthetic_move_sent_ &&
736 IsFractionalScaleFactor(host_view_->current_device_scale_factor())) { 737 IsFractionalScaleFactor(host_view_->current_device_scale_factor())) {
737 if (event->type() == ui::ET_MOUSE_MOVED || 738 if (event->type() == ui::ET_MOUSE_MOVED ||
738 event->type() == ui::ET_MOUSE_DRAGGED) { 739 event->type() == ui::ET_MOUSE_DRAGGED) {
739 if ((abs(mouse_event.x - center.x()) <= 2) && 740 if ((std::abs(mouse_event.positionInWidget().x - center.x()) <= 2) &&
740 (abs(mouse_event.y - center.y()) <= 2)) { 741 (std::abs(mouse_event.positionInWidget().y - center.y()) <= 2)) {
741 is_move_to_center_event = true; 742 is_move_to_center_event = true;
742 } 743 }
743 } 744 }
744 } 745 }
745 746
746 ModifyEventMovementAndCoords(*event, &mouse_event); 747 ModifyEventMovementAndCoords(*event, &mouse_event);
747 748
748 bool should_not_forward = is_move_to_center_event && synthetic_move_sent_; 749 bool should_not_forward = is_move_to_center_event && synthetic_move_sent_;
749 if (should_not_forward) { 750 if (should_not_forward) {
750 synthetic_move_sent_ = false; 751 synthetic_move_sent_ = false;
(...skipping 21 matching lines...) Expand all
772 } 773 }
773 } 774 }
774 775
775 void RenderWidgetHostViewEventHandler::ModifyEventMovementAndCoords( 776 void RenderWidgetHostViewEventHandler::ModifyEventMovementAndCoords(
776 const ui::MouseEvent& ui_mouse_event, 777 const ui::MouseEvent& ui_mouse_event,
777 blink::WebMouseEvent* event) { 778 blink::WebMouseEvent* event) {
778 // If the mouse has just entered, we must report zero movementX/Y. Hence we 779 // If the mouse has just entered, we must report zero movementX/Y. Hence we
779 // reset any global_mouse_position set previously. 780 // reset any global_mouse_position set previously.
780 if (ui_mouse_event.type() == ui::ET_MOUSE_ENTERED || 781 if (ui_mouse_event.type() == ui::ET_MOUSE_ENTERED ||
781 ui_mouse_event.type() == ui::ET_MOUSE_EXITED) { 782 ui_mouse_event.type() == ui::ET_MOUSE_EXITED) {
782 global_mouse_position_.SetPoint(event->globalX, event->globalY); 783 global_mouse_position_.SetPoint(event->positionInScreen().x,
784 event->positionInScreen().y);
783 } 785 }
784 786
785 // Movement is computed by taking the difference of the new cursor position 787 // Movement is computed by taking the difference of the new cursor position
786 // and the previous. Under mouse lock the cursor will be warped back to the 788 // and the previous. Under mouse lock the cursor will be warped back to the
787 // center so that we are not limited by clipping boundaries. 789 // center so that we are not limited by clipping boundaries.
788 // We do not measure movement as the delta from cursor to center because 790 // We do not measure movement as the delta from cursor to center because
789 // we may receive more mouse movement events before our warp has taken 791 // we may receive more mouse movement events before our warp has taken
790 // effect. 792 // effect.
791 event->movementX = event->globalX - global_mouse_position_.x(); 793 event->movementX = event->positionInScreen().x - global_mouse_position_.x();
792 event->movementY = event->globalY - global_mouse_position_.y(); 794 event->movementY = event->positionInScreen().y - global_mouse_position_.y();
793 795
794 global_mouse_position_.SetPoint(event->globalX, event->globalY); 796 global_mouse_position_.SetPoint(event->positionInScreen().x,
797 event->positionInScreen().y);
795 798
796 // Under mouse lock, coordinates of mouse are locked to what they were when 799 // Under mouse lock, coordinates of mouse are locked to what they were when
797 // mouse lock was entered. 800 // mouse lock was entered.
798 if (mouse_locked_) { 801 if (mouse_locked_) {
799 event->x = unlocked_mouse_position_.x(); 802 event->setPositionInWidget(unlocked_mouse_position_.x(),
800 event->y = unlocked_mouse_position_.y(); 803 unlocked_mouse_position_.y());
801 event->globalX = unlocked_global_mouse_position_.x(); 804 event->setPositionInScreen(unlocked_global_mouse_position_.x(),
802 event->globalY = unlocked_global_mouse_position_.y(); 805 unlocked_global_mouse_position_.y());
803 } else { 806 } else {
804 unlocked_mouse_position_.SetPoint(event->x, event->y); 807 unlocked_mouse_position_.SetPoint(event->positionInWidget().x,
805 unlocked_global_mouse_position_.SetPoint(event->globalX, event->globalY); 808 event->positionInWidget().y);
809 unlocked_global_mouse_position_.SetPoint(event->positionInScreen().x,
810 event->positionInScreen().y);
806 } 811 }
807 } 812 }
808 813
809 void RenderWidgetHostViewEventHandler::SetKeyboardFocus() { 814 void RenderWidgetHostViewEventHandler::SetKeyboardFocus() {
810 #if defined(OS_WIN) 815 #if defined(OS_WIN)
811 if (window_ && window_->delegate()->CanFocus()) { 816 if (window_ && window_->delegate()->CanFocus()) {
812 aura::WindowTreeHost* host = window_->GetHost(); 817 aura::WindowTreeHost* host = window_->GetHost();
813 if (host) { 818 if (host) {
814 gfx::AcceleratedWidget hwnd = host->GetAcceleratedWidget(); 819 gfx::AcceleratedWidget hwnd = host->GetAcceleratedWidget();
815 if (!(::GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_NOACTIVATE)) 820 if (!(::GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_NOACTIVATE))
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 host_->ForwardWheelEventWithLatencyInfo(event, latency); 881 host_->ForwardWheelEventWithLatencyInfo(event, latency);
877 } 882 }
878 883
879 void RenderWidgetHostViewEventHandler::ProcessTouchEvent( 884 void RenderWidgetHostViewEventHandler::ProcessTouchEvent(
880 const blink::WebTouchEvent& event, 885 const blink::WebTouchEvent& event,
881 const ui::LatencyInfo& latency) { 886 const ui::LatencyInfo& latency) {
882 host_->ForwardTouchEventWithLatencyInfo(event, latency); 887 host_->ForwardTouchEventWithLatencyInfo(event, latency);
883 } 888 }
884 889
885 } // namespace content 890 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698