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

Side by Side Diff: components/autofill/content/renderer/page_click_tracker.cc

Issue 884583002: [autofill] Show autofill popup when focusing a field by tapping near its edge. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bounds-change
Patch Set: Use Blink hit testing Created 5 years, 10 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/autofill/content/renderer/page_click_tracker.h" 5 #include "components/autofill/content/renderer/page_click_tracker.h"
6 6
7 #include "components/autofill/content/renderer/form_autofill_util.h" 7 #include "components/autofill/content/renderer/form_autofill_util.h"
8 #include "components/autofill/content/renderer/page_click_listener.h" 8 #include "components/autofill/content/renderer/page_click_listener.h"
9 #include "content/public/renderer/render_frame.h" 9 #include "content/public/renderer/render_frame.h"
10 #include "content/public/renderer/render_view.h" 10 #include "content/public/renderer/render_view.h"
11 #include "third_party/WebKit/public/platform/WebPoint.h"
12 #include "third_party/WebKit/public/platform/WebSize.h"
11 #include "third_party/WebKit/public/web/WebDocument.h" 13 #include "third_party/WebKit/public/web/WebDocument.h"
14 #include "third_party/WebKit/public/web/WebHitTestResult.h"
12 #include "third_party/WebKit/public/web/WebInputElement.h" 15 #include "third_party/WebKit/public/web/WebInputElement.h"
13 #include "third_party/WebKit/public/web/WebInputEvent.h" 16 #include "third_party/WebKit/public/web/WebInputEvent.h"
14 #include "third_party/WebKit/public/web/WebLocalFrame.h" 17 #include "third_party/WebKit/public/web/WebLocalFrame.h"
15 #include "third_party/WebKit/public/web/WebTextAreaElement.h" 18 #include "third_party/WebKit/public/web/WebTextAreaElement.h"
16 #include "third_party/WebKit/public/web/WebView.h" 19 #include "third_party/WebKit/public/web/WebView.h"
17 20
18 using blink::WebElement; 21 using blink::WebElement;
19 using blink::WebGestureEvent; 22 using blink::WebGestureEvent;
20 using blink::WebInputElement; 23 using blink::WebInputElement;
21 using blink::WebInputEvent; 24 using blink::WebInputEvent;
22 using blink::WebMouseEvent; 25 using blink::WebMouseEvent;
23 using blink::WebNode; 26 using blink::WebNode;
27 using blink::WebPoint;
28 using blink::WebSize;
24 using blink::WebTextAreaElement; 29 using blink::WebTextAreaElement;
25 30
26 namespace { 31 namespace {
27 32
28 // Casts |node| to a WebInputElement. 33 // Casts |node| to a WebInputElement.
29 // Returns an empty (isNull()) WebInputElement if |node| is not a text field. 34 // Returns an empty (isNull()) WebInputElement if |node| is not a text field.
30 const WebInputElement GetTextWebInputElement(const WebNode& node) { 35 const WebInputElement GetTextWebInputElement(const WebNode& node) {
31 if (!node.isElementNode()) 36 if (!node.isElementNode())
32 return WebInputElement(); 37 return WebInputElement();
33 const WebElement element = node.toConst<WebElement>(); 38 const WebElement element = node.toConst<WebElement>();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 71
67 PageClickTracker::~PageClickTracker() { 72 PageClickTracker::~PageClickTracker() {
68 } 73 }
69 74
70 void PageClickTracker::DidHandleMouseEvent(const WebMouseEvent& event) { 75 void PageClickTracker::DidHandleMouseEvent(const WebMouseEvent& event) {
71 if (event.type != WebInputEvent::MouseDown || 76 if (event.type != WebInputEvent::MouseDown ||
72 event.button != WebMouseEvent::ButtonLeft) { 77 event.button != WebMouseEvent::ButtonLeft) {
73 return; 78 return;
74 } 79 }
75 80
76 PotentialActivationAt(event.x, event.y); 81 WebNode clicked_node = render_frame()->GetRenderView()->GetWebView()
82 ->hitTestResultAt(WebPoint(event.x, event.y)).node();
83 focused_node_was_last_clicked_ = !clicked_node.isNull() &&
84 clicked_node.focused();
77 } 85 }
78 86
79 void PageClickTracker::DidHandleGestureEvent(const WebGestureEvent& event) { 87 void PageClickTracker::DidHandleGestureEvent(const WebGestureEvent& event) {
80 if (event.type != WebGestureEvent::GestureTap) 88 if (event.type != WebGestureEvent::GestureTap)
81 return; 89 return;
82 90
83 PotentialActivationAt(event.x, event.y); 91 WebNode tapped_node = render_frame()->GetRenderView()->GetWebView()
92 ->hitTestResultForTap(
93 WebPoint(event.x, event.y),
94 WebSize(event.data.tap.width, event.data.tap.height)).node();
95 focused_node_was_last_clicked_ = !tapped_node.isNull() &&
96 tapped_node.focused();
84 } 97 }
85 98
86 void PageClickTracker::FocusedNodeChanged(const WebNode& node) { 99 void PageClickTracker::FocusedNodeChanged(const WebNode& node) {
87 was_focused_before_now_ = false; 100 was_focused_before_now_ = false;
88 } 101 }
89 102
90 void PageClickTracker::FocusChangeComplete() { 103 void PageClickTracker::FocusChangeComplete() {
91 blink::WebNode focused_node = render_frame()->GetFocusedElement(); 104 WebNode focused_node = render_frame()->GetFocusedElement();
92 if (focused_node_was_last_clicked_ && !focused_node.isNull()) { 105 if (focused_node_was_last_clicked_ && !focused_node.isNull()) {
93 const WebInputElement input_element = GetTextWebInputElement(focused_node); 106 const WebInputElement input_element = GetTextWebInputElement(focused_node);
94 if (!input_element.isNull()) { 107 if (!input_element.isNull()) {
95 listener_->FormControlElementClicked(input_element, 108 listener_->FormControlElementClicked(input_element,
96 was_focused_before_now_); 109 was_focused_before_now_);
97 } else { 110 } else {
98 const WebTextAreaElement textarea_element = 111 const WebTextAreaElement textarea_element =
99 GetWebTextAreaElement(focused_node); 112 GetWebTextAreaElement(focused_node);
100 if (!textarea_element.isNull()) { 113 if (!textarea_element.isNull()) {
101 listener_->FormControlElementClicked(textarea_element, 114 listener_->FormControlElementClicked(textarea_element,
102 was_focused_before_now_); 115 was_focused_before_now_);
103 } 116 }
104 } 117 }
105 } 118 }
106 119
107 was_focused_before_now_ = true; 120 was_focused_before_now_ = true;
108 focused_node_was_last_clicked_ = false; 121 focused_node_was_last_clicked_ = false;
109 } 122 }
110 123
111 void PageClickTracker::PotentialActivationAt(int x, int y) {
112 blink::WebElement focused_element = render_frame()->GetFocusedElement();
113 if (focused_element.isNull())
114 return;
115
116 if (!GetScaledBoundingBox(
117 render_frame()->GetRenderView()->GetWebView()->pageScaleFactor(),
118 &focused_element).Contains(x, y)) {
119 return;
120 }
121
122 focused_node_was_last_clicked_ = true;
123 }
124
125 // PageClickTracker::Legacy ---------------------------------------------------- 124 // PageClickTracker::Legacy ----------------------------------------------------
126 125
127 PageClickTracker::Legacy::Legacy(PageClickTracker* tracker) 126 PageClickTracker::Legacy::Legacy(PageClickTracker* tracker)
128 : content::RenderViewObserver(tracker->render_frame()->GetRenderView()), 127 : content::RenderViewObserver(tracker->render_frame()->GetRenderView()),
129 tracker_(tracker) { 128 tracker_(tracker) {
130 } 129 }
131 130
132 void PageClickTracker::Legacy::OnDestruct() { 131 void PageClickTracker::Legacy::OnDestruct() {
133 // No-op. Don't delete |this|. 132 // No-op. Don't delete |this|.
134 } 133 }
135 134
136 void PageClickTracker::Legacy::DidHandleMouseEvent( 135 void PageClickTracker::Legacy::DidHandleMouseEvent(const WebMouseEvent& event) {
137 const blink::WebMouseEvent& event) {
138 tracker_->DidHandleMouseEvent(event); 136 tracker_->DidHandleMouseEvent(event);
139 } 137 }
140 138
141 void PageClickTracker::Legacy::DidHandleGestureEvent( 139 void PageClickTracker::Legacy::DidHandleGestureEvent(
142 const blink::WebGestureEvent& event) { 140 const WebGestureEvent& event) {
143 tracker_->DidHandleGestureEvent(event); 141 tracker_->DidHandleGestureEvent(event);
144 } 142 }
145 143
146 void PageClickTracker::Legacy::FocusChangeComplete() { 144 void PageClickTracker::Legacy::FocusChangeComplete() {
147 tracker_->FocusChangeComplete(); 145 tracker_->FocusChangeComplete();
148 } 146 }
149 147
150 } // namespace autofill 148 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/content/renderer/page_click_tracker.h ('k') | content/public/test/render_view_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698