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

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

Issue 6151011: Introduce RenderView::Observer interface so that RenderView doesn't have to k... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/page_click_tracker.h ('k') | chrome/renderer/page_click_tracker_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/renderer/page_click_listener.h" 7 #include "chrome/renderer/page_click_listener.h"
8 #include "chrome/renderer/render_view.h" 8 #include "chrome/renderer/render_view.h"
9 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" 9 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
10 #include "third_party/WebKit/WebKit/chromium/public/WebDOMMouseEvent.h" 10 #include "third_party/WebKit/WebKit/chromium/public/WebDOMMouseEvent.h"
11 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" 11 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
12 #include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h" 12 #include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h"
13 #include "third_party/WebKit/WebKit/chromium/public/WebString.h" 13 #include "third_party/WebKit/WebKit/chromium/public/WebString.h"
14 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" 14 #include "third_party/WebKit/WebKit/chromium/public/WebView.h"
15 15
16 using WebKit::WebDOMEvent; 16 using WebKit::WebDOMEvent;
17 using WebKit::WebDOMMouseEvent; 17 using WebKit::WebDOMMouseEvent;
18 using WebKit::WebElement; 18 using WebKit::WebElement;
19 using WebKit::WebFormControlElement; 19 using WebKit::WebFormControlElement;
20 using WebKit::WebFrame; 20 using WebKit::WebFrame;
21 using WebKit::WebInputElement; 21 using WebKit::WebInputElement;
22 using WebKit::WebInputEvent; 22 using WebKit::WebInputEvent;
23 using WebKit::WebMouseEvent; 23 using WebKit::WebMouseEvent;
24 using WebKit::WebNode; 24 using WebKit::WebNode;
25 using WebKit::WebString; 25 using WebKit::WebString;
26 using WebKit::WebView; 26 using WebKit::WebView;
27 27
28 PageClickTracker::PageClickTracker(RenderView* render_view) 28 PageClickTracker::PageClickTracker(RenderView* render_view)
29 : render_view_(render_view), 29 : RenderViewObserver(render_view),
30 was_focused_(false) { 30 was_focused_(false) {
31 } 31 }
32 32
33 PageClickTracker::~PageClickTracker() { 33 PageClickTracker::~PageClickTracker() {
34 // Note that even though RenderView calls StopTrackingFrame when notified that 34 // Note that even though RenderView calls FrameDetached when notified that
35 // a frame was closed, it might not always get that notification from WebKit 35 // a frame was closed, it might not always get that notification from WebKit
36 // for all frames. 36 // for all frames.
37 // By the time we get here, the frame could have been destroyed so we cannot 37 // By the time we get here, the frame could have been destroyed so we cannot
38 // unregister listeners in frames remaining in tracked_frames_ as they might 38 // unregister listeners in frames remaining in tracked_frames_ as they might
39 // be invalid. 39 // be invalid.
40 } 40 }
41 41
42 void PageClickTracker::StartTrackingFrame(WebFrame* frame) {
43 tracked_frames_.push_back(frame);
44 frame->document().addEventListener("mousedown", this, false);
45 }
46
47 void PageClickTracker::StopTrackingFrame(WebFrame* frame, bool frame_detached) {
48 FrameList::iterator iter =
49 std::find(tracked_frames_.begin(), tracked_frames_.end(), frame);
50 if (iter == tracked_frames_.end()) {
51 // Some frames might never load contents so we may not have a listener on
52 // them. Calling removeEventListener() on them would trigger an assert, so
53 // we need to keep track of which frames we are listening to.
54 return;
55 }
56 tracked_frames_.erase(iter);
57 // If the frame has been detached, all event listeners have already been
58 // removed.
59 if (!frame_detached)
60 frame->document().removeEventListener("mousedown", this, false);
61 }
62
63 void PageClickTracker::DidHandleMouseEvent(const WebMouseEvent& event) { 42 void PageClickTracker::DidHandleMouseEvent(const WebMouseEvent& event) {
64 if (event.type != WebInputEvent::MouseDown || 43 if (event.type != WebInputEvent::MouseDown ||
65 last_node_clicked_.isNull()) { 44 last_node_clicked_.isNull()) {
66 return; 45 return;
67 } 46 }
68 47
69 // We are only interested in text field clicks. 48 // We are only interested in text field clicks.
70 if (!last_node_clicked_.isElementNode()) 49 if (!last_node_clicked_.isElementNode())
71 return; 50 return;
72 const WebElement& element = last_node_clicked_.toConst<WebElement>(); 51 const WebElement& element = last_node_clicked_.toConst<WebElement>();
(...skipping 18 matching lines...) Expand all
91 } 70 }
92 71
93 void PageClickTracker::AddListener(PageClickListener* listener) { 72 void PageClickTracker::AddListener(PageClickListener* listener) {
94 listeners_.AddObserver(listener); 73 listeners_.AddObserver(listener);
95 } 74 }
96 75
97 void PageClickTracker::RemoveListener(PageClickListener* listener) { 76 void PageClickTracker::RemoveListener(PageClickListener* listener) {
98 listeners_.RemoveObserver(listener); 77 listeners_.RemoveObserver(listener);
99 } 78 }
100 79
80 bool PageClickTracker::OnMessageReceived(const IPC::Message& message) {
81 if (message.type() == ViewMsg_HandleInputEvent::ID) {
82 void* iter = NULL;
83 const char* data;
84 int data_length;
85 if (message.ReadData(&iter, &data, &data_length)) {
86 const WebInputEvent* input_event =
87 reinterpret_cast<const WebInputEvent*>(data);
88 if (WebInputEvent::isMouseEventType(input_event->type))
89 DidHandleMouseEvent(*(static_cast<const WebMouseEvent*>(input_event)));
90 }
91 }
92 return false;
93 }
94
95 void PageClickTracker::DidFinishDocumentLoad(WebKit::WebFrame* frame) {
96 tracked_frames_.push_back(frame);
97 frame->document().addEventListener("mousedown", this, false);
98 }
99
100 void PageClickTracker::FrameDetached(WebKit::WebFrame* frame) {
101 FrameList::iterator iter =
102 std::find(tracked_frames_.begin(), tracked_frames_.end(), frame);
103 if (iter == tracked_frames_.end()) {
104 // Some frames might never load contents so we may not have a listener on
105 // them. Calling removeEventListener() on them would trigger an assert, so
106 // we need to keep track of which frames we are listening to.
107 return;
108 }
109 tracked_frames_.erase(iter);
110 }
111
101 void PageClickTracker::handleEvent(const WebDOMEvent& event) { 112 void PageClickTracker::handleEvent(const WebDOMEvent& event) {
102 last_node_clicked_.reset(); 113 last_node_clicked_.reset();
103 114
104 if (!event.isMouseEvent()) 115 if (!event.isMouseEvent())
105 return; 116 return;
106 117
107 const WebDOMMouseEvent mouse_event = event.toConst<WebDOMMouseEvent>(); 118 const WebDOMMouseEvent mouse_event = event.toConst<WebDOMMouseEvent>();
108 DCHECK(mouse_event.buttonDown()); 119 DCHECK(mouse_event.buttonDown());
109 if (mouse_event.button() != 0) 120 if (mouse_event.button() != 0)
110 return; // We are only interested in left clicks. 121 return; // We are only interested in left clicks.
111 122
112 // Remember which node has focus before the click is processed. 123 // Remember which node has focus before the click is processed.
113 // We'll get a notification once the mouse event has been processed 124 // We'll get a notification once the mouse event has been processed
114 // (DidHandleMouseEvent), we'll notify the listener at that point. 125 // (DidHandleMouseEvent), we'll notify the listener at that point.
115 last_node_clicked_ = mouse_event.target(); 126 last_node_clicked_ = mouse_event.target();
116 was_focused_ = (GetFocusedNode() == last_node_clicked_); 127 was_focused_ = (GetFocusedNode() == last_node_clicked_);
117 } 128 }
118 129
119 WebNode PageClickTracker::GetFocusedNode() { 130 WebNode PageClickTracker::GetFocusedNode() {
120 WebView* web_view = render_view_->webview(); 131 WebView* web_view = render_view()->webview();
121 if (!web_view) 132 if (!web_view)
122 return WebNode(); 133 return WebNode();
123 134
124 WebFrame* web_frame = web_view->focusedFrame(); 135 WebFrame* web_frame = web_view->focusedFrame();
125 if (!web_frame) 136 if (!web_frame)
126 return WebNode(); 137 return WebNode();
127 138
128 return web_frame->document().focusedNode(); 139 return web_frame->document().focusedNode();
129 } 140 }
OLDNEW
« no previous file with comments | « chrome/renderer/page_click_tracker.h ('k') | chrome/renderer/page_click_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698