| 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 |