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

Side by Side Diff: chrome/renderer/page_click_tracker.cc

Issue 8351009: Updating PageClickTracker to Notify listeners When Text Input Loses Focus. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fix issue with gaining focus with tab Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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
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();
Ilya Sherman 2011/10/27 22:04:17 I think you might want to leave this in place. Ot
csharp 2011/10/31 15:24:25 Done.
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 (DidSelectedTextFieldLoseFocus(node))
125 SelectedTextFieldLostFocus();
Ilya Sherman 2011/10/27 22:04:17 nit: It might be cleaner to combine these two func
csharp 2011/10/31 15:24:25 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_);
Ilya Sherman 2011/10/27 22:04:17 nit: Just noticed this line, which uses |render_vi
csharp 2011/10/31 15:24:25 Done.
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 }
146
147 bool PageClickTracker::DidSelectedTextFieldLoseFocus(
148 WebKit::WebNode newly_clicked_node) {
149 WebKit::WebNode focused_node = newly_clicked_node.document().focusedNode();
150
151 if (focused_node.isNull() || GetTextWebInputElement(focused_node).isNull())
152 return false;
153
154 return focused_node != newly_clicked_node;
155 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698