| Index: components/autofill/content/renderer/page_click_tracker.cc
|
| diff --git a/components/autofill/content/renderer/page_click_tracker.cc b/components/autofill/content/renderer/page_click_tracker.cc
|
| index 9e2f649f023a15a00f2f7c6b42e5231b8242d565..72d5ae1e847cf88ce7cd136b8984211530bddc3f 100644
|
| --- a/components/autofill/content/renderer/page_click_tracker.cc
|
| +++ b/components/autofill/content/renderer/page_click_tracker.cc
|
| @@ -1,146 +1,148 @@
|
| -// Copyright 2013 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 "components/autofill/content/renderer/page_click_tracker.h"
|
| -
|
| -#include "components/autofill/content/renderer/form_autofill_util.h"
|
| -#include "components/autofill/content/renderer/page_click_listener.h"
|
| -#include "content/public/renderer/render_view.h"
|
| -#include "third_party/WebKit/public/platform/WebString.h"
|
| -#include "third_party/WebKit/public/web/WebDOMMouseEvent.h"
|
| -#include "third_party/WebKit/public/web/WebDocument.h"
|
| -#include "third_party/WebKit/public/web/WebFrame.h"
|
| -#include "third_party/WebKit/public/web/WebInputElement.h"
|
| -#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| -#include "third_party/WebKit/public/web/WebView.h"
|
| -
|
| -using blink::WebDOMEvent;
|
| -using blink::WebDOMMouseEvent;
|
| -using blink::WebElement;
|
| -using blink::WebFormControlElement;
|
| -using blink::WebFrame;
|
| -using blink::WebInputElement;
|
| -using blink::WebInputEvent;
|
| -using blink::WebMouseEvent;
|
| -using blink::WebNode;
|
| -using blink::WebString;
|
| -using blink::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 = blink::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) {
|
| - blink::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
|
| -
|
| -namespace autofill {
|
| -
|
| -PageClickTracker::PageClickTracker(content::RenderView* render_view,
|
| - PageClickListener* listener)
|
| - : content::RenderViewObserver(render_view),
|
| - was_focused_(false),
|
| - listener_(listener) {
|
| -}
|
| -
|
| -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());
|
| - listener_->InputElementClicked(input_element, was_focused_, is_focused);
|
| -}
|
| -
|
| -void PageClickTracker::DidFinishDocumentLoad(blink::WebFrame* frame) {
|
| - tracked_frames_.push_back(frame);
|
| - frame->document().addEventListener("mousedown", this, false);
|
| -}
|
| -
|
| -void PageClickTracker::FrameDetached(blink::WebFrame* frame) {
|
| - std::vector<blink::WebFrame*>::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))
|
| - listener_->InputElementLostFocus();
|
| -}
|
| -
|
| -} // namespace autofill
|
| +// Copyright 2013 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 "components/autofill/content/renderer/page_click_tracker.h"
|
| +
|
| +#include "components/autofill/content/renderer/form_autofill_util.h"
|
| +#include "components/autofill/content/renderer/page_click_listener.h"
|
| +#include "content/public/renderer/render_view.h"
|
| +#include "third_party/WebKit/public/platform/WebString.h"
|
| +#include "third_party/WebKit/public/web/WebDOMMouseEvent.h"
|
| +#include "third_party/WebKit/public/web/WebDocument.h"
|
| +#include "third_party/WebKit/public/web/WebFrame.h"
|
| +#include "third_party/WebKit/public/web/WebInputElement.h"
|
| +#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| +#include "third_party/WebKit/public/web/WebView.h"
|
| +
|
| +using blink::WebDOMEvent;
|
| +using blink::WebDOMMouseEvent;
|
| +using blink::WebElement;
|
| +using blink::WebFormControlElement;
|
| +using blink::WebFrame;
|
| +using blink::WebInputElement;
|
| +using blink::WebInputEvent;
|
| +using blink::WebMouseEvent;
|
| +using blink::WebNode;
|
| +using blink::WebString;
|
| +using blink::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 = blink::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) {
|
| + blink::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
|
| +
|
| +namespace autofill {
|
| +
|
| +PageClickTracker::PageClickTracker(content::RenderView* render_view,
|
| + PageClickListener* listener)
|
| + : content::RenderViewObserver(render_view),
|
| + was_focused_(false),
|
| + listener_(listener) {
|
| +}
|
| +
|
| +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());
|
| + listener_->InputElementClicked(input_element, was_focused_, is_focused);
|
| +}
|
| +
|
| +void PageClickTracker::DidFinishDocumentLoad(blink::WebFrame* frame) {
|
| + if (frame->document().isNull())
|
| + return;
|
| + tracked_frames_.push_back(frame);
|
| + frame->document().addEventListener("mousedown", this, false);
|
| +}
|
| +
|
| +void PageClickTracker::FrameDetached(blink::WebFrame* frame) {
|
| + std::vector<blink::WebFrame*>::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))
|
| + listener_->InputElementLostFocus();
|
| +}
|
| +
|
| +} // namespace autofill
|
|
|