Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/renderer/page_click_tracker.h" | 5 #include "chrome/renderer/page_click_tracker.h" |
| 6 | 6 |
| 7 #include "chrome/common/render_messages.h" | 7 #include "chrome/common/render_messages.h" |
| 8 #include "chrome/renderer/page_click_listener.h" | 8 #include "chrome/renderer/page_click_listener.h" |
| 9 #include "content/public/renderer/render_view.h" | 9 #include "content/public/renderer/render_view.h" |
| 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 if (input_element.isNull()) | 72 if (input_element.isNull()) |
| 73 return; | 73 return; |
| 74 | 74 |
| 75 bool is_focused = (last_node_clicked_ == render_view()->GetFocusedNode()); | 75 bool is_focused = (last_node_clicked_ == render_view()->GetFocusedNode()); |
| 76 ObserverListBase<PageClickListener>::Iterator it(listeners_); | 76 ObserverListBase<PageClickListener>::Iterator it(listeners_); |
| 77 PageClickListener* listener; | 77 PageClickListener* listener; |
| 78 while ((listener = it.GetNext()) != NULL) { | 78 while ((listener = it.GetNext()) != NULL) { |
| 79 if (listener->InputElementClicked(input_element, was_focused_, is_focused)) | 79 if (listener->InputElementClicked(input_element, was_focused_, is_focused)) |
| 80 break; | 80 break; |
| 81 } | 81 } |
| 82 | |
| 83 last_node_clicked_.reset(); | |
| 84 } | 82 } |
| 85 | 83 |
| 86 void PageClickTracker::AddListener(PageClickListener* listener) { | 84 void PageClickTracker::AddListener(PageClickListener* listener) { |
| 87 listeners_.AddObserver(listener); | 85 listeners_.AddObserver(listener); |
| 88 } | 86 } |
| 89 | 87 |
| 90 void PageClickTracker::RemoveListener(PageClickListener* listener) { | 88 void PageClickTracker::RemoveListener(PageClickListener* listener) { |
| 91 listeners_.RemoveObserver(listener); | 89 listeners_.RemoveObserver(listener); |
| 92 } | 90 } |
| 93 | 91 |
| 94 void PageClickTracker::DidFinishDocumentLoad(WebKit::WebFrame* frame) { | 92 void PageClickTracker::DidFinishDocumentLoad(WebKit::WebFrame* frame) { |
| 95 tracked_frames_.push_back(frame); | 93 tracked_frames_.push_back(frame); |
| 96 frame->document().addEventListener("mousedown", this, false); | 94 frame->document().addEventListener("mousedown", this, false); |
| 97 } | 95 } |
| 98 | 96 |
| 99 void PageClickTracker::FrameDetached(WebKit::WebFrame* frame) { | 97 void PageClickTracker::FrameDetached(WebKit::WebFrame* frame) { |
| 100 FrameList::iterator iter = | 98 FrameList::iterator iter = |
| 101 std::find(tracked_frames_.begin(), tracked_frames_.end(), frame); | 99 std::find(tracked_frames_.begin(), tracked_frames_.end(), frame); |
| 102 if (iter == tracked_frames_.end()) { | 100 if (iter == tracked_frames_.end()) { |
| 103 // Some frames might never load contents so we may not have a listener on | 101 // Some frames might never load contents so we may not have a listener on |
| 104 // them. Calling removeEventListener() on them would trigger an assert, so | 102 // them. Calling removeEventListener() on them would trigger an assert, so |
| 105 // we need to keep track of which frames we are listening to. | 103 // we need to keep track of which frames we are listening to. |
| 106 return; | 104 return; |
| 107 } | 105 } |
| 108 tracked_frames_.erase(iter); | 106 tracked_frames_.erase(iter); |
| 109 } | 107 } |
| 110 | 108 |
| 111 void PageClickTracker::handleEvent(const WebDOMEvent& event) { | 109 void PageClickTracker::handleEvent(const WebDOMEvent& event) { |
| 112 last_node_clicked_.reset(); | |
| 113 | |
| 114 if (!event.isMouseEvent()) | 110 if (!event.isMouseEvent()) |
| 115 return; | 111 return; |
| 116 | 112 |
| 117 const WebDOMMouseEvent mouse_event = event.toConst<WebDOMMouseEvent>(); | 113 const WebDOMMouseEvent mouse_event = event.toConst<WebDOMMouseEvent>(); |
| 118 DCHECK(mouse_event.buttonDown()); | 114 DCHECK(mouse_event.buttonDown()); |
| 119 if (mouse_event.button() != 0) | 115 if (mouse_event.button() != 0) |
| 120 return; // We are only interested in left clicks. | 116 return; // We are only interested in left clicks. |
| 121 | 117 |
| 122 // Remember which node has focus before the click is processed. | 118 // Remember which node has focus before the click is processed. |
| 123 // We'll get a notification once the mouse event has been processed | 119 // We'll get a notification once the mouse event has been processed |
| 124 // (DidHandleMouseEvent), we'll notify the listener at that point. | 120 // (DidHandleMouseEvent), we'll notify the listener at that point. |
| 125 WebNode node = mouse_event.target(); | 121 WebNode node = mouse_event.target(); |
| 122 | |
| 123 // The selected text field has lost focus. | |
| 124 if (!last_node_clicked_.isNull() && last_node_clicked_ != node) | |
| 125 SelectedTextFieldLostFocus(); | |
|
Ilya Sherman
2011/10/25 20:11:50
I think in order to handle the keyboard-then-mouse
csharp1
2011/10/27 15:20:58
Done.
| |
| 126 | |
| 126 // We are only interested in text field clicks. | 127 // We are only interested in text field clicks. |
| 127 if (GetTextWebInputElement(node).isNull()) | 128 if (GetTextWebInputElement(node).isNull()) { |
| 129 last_node_clicked_.reset(); | |
| 130 | |
| 128 return; | 131 return; |
| 132 } | |
| 129 | 133 |
| 130 last_node_clicked_ = node; | 134 last_node_clicked_ = node; |
| 131 was_focused_ = (render_view()->GetFocusedNode() == last_node_clicked_); | 135 was_focused_ = (render_view()->GetFocusedNode() == last_node_clicked_); |
| 132 } | 136 } |
| 137 | |
| 138 void PageClickTracker::SelectedTextFieldLostFocus() { | |
| 139 ObserverListBase<PageClickListener>::Iterator it(listeners_); | |
| 140 PageClickListener* listener; | |
| 141 while ((listener = it.GetNext()) != NULL) { | |
| 142 if (listener->InputElementLostFocus()) | |
| 143 break; | |
| 144 } | |
| 145 } | |
| OLD | NEW |