| Index: chrome/renderer/page_click_tracker.cc
|
| diff --git a/chrome/renderer/page_click_tracker.cc b/chrome/renderer/page_click_tracker.cc
|
| deleted file mode 100644
|
| index 27d4a1c2fe337e3dbed8dc4c590c7b1db4646fa2..0000000000000000000000000000000000000000
|
| --- a/chrome/renderer/page_click_tracker.cc
|
| +++ /dev/null
|
| @@ -1,160 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/renderer/page_click_tracker.h"
|
| -
|
| -#include "chrome/renderer/autofill/form_autofill_util.h"
|
| -#include "chrome/renderer/page_click_listener.h"
|
| -#include "content/public/renderer/render_view.h"
|
| -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMMouseEvent.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
|
| -
|
| -using WebKit::WebDOMEvent;
|
| -using WebKit::WebDOMMouseEvent;
|
| -using WebKit::WebElement;
|
| -using WebKit::WebFormControlElement;
|
| -using WebKit::WebFrame;
|
| -using WebKit::WebInputElement;
|
| -using WebKit::WebInputEvent;
|
| -using WebKit::WebMouseEvent;
|
| -using WebKit::WebNode;
|
| -using WebKit::WebString;
|
| -using WebKit::WebView;
|
| -
|
| -namespace {
|
| -
|
| -// Casts |node| to a WebInputElement.
|
| -// Returns an empty (isNull()) WebInputElement if |node| is not a text field.
|
| -const WebInputElement GetTextWebInputElement(const WebNode& node) {
|
| - if (!node.isElementNode())
|
| - return WebInputElement();
|
| - const WebElement element = node.toConst<WebElement>();
|
| - if (!element.hasTagName("input"))
|
| - return WebInputElement();
|
| - const WebInputElement* input = WebKit::toWebInputElement(&element);
|
| - if (!autofill::IsTextInput(input))
|
| - return WebInputElement();
|
| - return *input;
|
| -}
|
| -
|
| -// Checks to see if a text field was the previously selected node and is now
|
| -// losing its focus.
|
| -bool DidSelectedTextFieldLoseFocus(const WebNode& newly_clicked_node) {
|
| - WebKit::WebNode focused_node = newly_clicked_node.document().focusedNode();
|
| -
|
| - if (focused_node.isNull() || GetTextWebInputElement(focused_node).isNull())
|
| - return false;
|
| -
|
| - return focused_node != newly_clicked_node;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -PageClickTracker::PageClickTracker(content::RenderView* render_view)
|
| - : content::RenderViewObserver(render_view),
|
| - was_focused_(false) {
|
| -}
|
| -
|
| -PageClickTracker::~PageClickTracker() {
|
| - // Note that even though RenderView calls FrameDetached when notified that
|
| - // a frame was closed, it might not always get that notification from WebKit
|
| - // for all frames.
|
| - // By the time we get here, the frame could have been destroyed so we cannot
|
| - // unregister listeners in frames remaining in tracked_frames_ as they might
|
| - // be invalid.
|
| -}
|
| -
|
| -void PageClickTracker::DidHandleMouseEvent(const WebMouseEvent& event) {
|
| - if (event.type != WebInputEvent::MouseDown ||
|
| - last_node_clicked_.isNull()) {
|
| - return;
|
| - }
|
| -
|
| - // We are only interested in text field clicks.
|
| - const WebInputElement input_element =
|
| - GetTextWebInputElement(last_node_clicked_);
|
| - if (input_element.isNull())
|
| - return;
|
| -
|
| - bool is_focused = (last_node_clicked_ == render_view()->GetFocusedNode());
|
| - ObserverListBase<PageClickListener>::Iterator it(listeners_);
|
| - PageClickListener* listener;
|
| - while ((listener = it.GetNext()) != NULL) {
|
| - if (listener->InputElementClicked(input_element, was_focused_, is_focused))
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void PageClickTracker::AddListener(PageClickListener* listener) {
|
| - listeners_.AddObserver(listener);
|
| -}
|
| -
|
| -void PageClickTracker::RemoveListener(PageClickListener* listener) {
|
| - listeners_.RemoveObserver(listener);
|
| -}
|
| -
|
| -void PageClickTracker::DidFinishDocumentLoad(WebKit::WebFrame* frame) {
|
| - tracked_frames_.push_back(frame);
|
| - frame->document().addEventListener("mousedown", this, false);
|
| -}
|
| -
|
| -void PageClickTracker::FrameDetached(WebKit::WebFrame* frame) {
|
| - FrameList::iterator iter =
|
| - std::find(tracked_frames_.begin(), tracked_frames_.end(), frame);
|
| - if (iter == tracked_frames_.end()) {
|
| - // Some frames might never load contents so we may not have a listener on
|
| - // them. Calling removeEventListener() on them would trigger an assert, so
|
| - // we need to keep track of which frames we are listening to.
|
| - return;
|
| - }
|
| - tracked_frames_.erase(iter);
|
| -}
|
| -
|
| -void PageClickTracker::handleEvent(const WebDOMEvent& event) {
|
| - last_node_clicked_.reset();
|
| -
|
| - if (!event.isMouseEvent())
|
| - return;
|
| -
|
| - const WebDOMMouseEvent mouse_event = event.toConst<WebDOMMouseEvent>();
|
| - DCHECK(mouse_event.buttonDown());
|
| - if (mouse_event.button() != 0)
|
| - return; // We are only interested in left clicks.
|
| -
|
| - // Remember which node has focus before the click is processed.
|
| - // We'll get a notification once the mouse event has been processed
|
| - // (DidHandleMouseEvent), we'll notify the listener at that point.
|
| - WebNode node = mouse_event.target();
|
| - if (node.isNull())
|
| - // Node may be null if the target was an SVG instance element from a <use>
|
| - // tree and the tree has been rebuilt due to an earlier event.
|
| - return;
|
| -
|
| - HandleTextFieldMaybeLosingFocus(node);
|
| -
|
| - // We are only interested in text field clicks.
|
| - if (GetTextWebInputElement(node).isNull())
|
| - return;
|
| -
|
| - last_node_clicked_ = node;
|
| - was_focused_ = (node.document().focusedNode() == last_node_clicked_);
|
| -}
|
| -
|
| -void PageClickTracker::HandleTextFieldMaybeLosingFocus(
|
| - const WebNode& newly_clicked_node) {
|
| - if (!DidSelectedTextFieldLoseFocus(newly_clicked_node))
|
| - return;
|
| -
|
| - ObserverListBase<PageClickListener>::Iterator it(listeners_);
|
| - PageClickListener* listener;
|
| - while ((listener = it.GetNext()) != NULL) {
|
| - if (listener->InputElementLostFocus())
|
| - break;
|
| - }
|
| -}
|
|
|