OLD | NEW |
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 Loading... |
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 |
OLD | NEW |