1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_AUTOFILL_CONTENT_RENDERER_PAGE_CLICK_TRACKER_H_
6#define COMPONENTS_AUTOFILL_CONTENT_RENDERER_PAGE_CLICK_TRACKER_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/memory/weak_ptr.h"
12#include "content/public/renderer/render_view_observer.h"
13#include "third_party/WebKit/public/web/WebNode.h"
14
15namespace autofill {
16
17class PageClickListener;
18
19// This class is responsible notifiying the associated listener when a node is
20// clicked or tapped. It also tracks whether a node was focused before the event
21// was handled.
22//
23// This is useful for password/form autofill where we want to trigger a
24// suggestion popup when a text input is clicked.
25//
26// There is one PageClickTracker per RenderView.
27class PageClickTracker : public content::RenderViewObserver {
28 public:
29  // The |listener| will be notified when an element is clicked.  It must
30  // outlive this class.
31  PageClickTracker(content::RenderView* render_view,
32                   PageClickListener* listener);
33  virtual ~PageClickTracker();
34
35 private:
36  // RenderView::Observer implementation.
37  virtual void DidHandleMouseEvent(const blink::WebMouseEvent& event) OVERRIDE;
38  virtual void DidHandleGestureEvent(
39      const blink::WebGestureEvent& event) OVERRIDE;
40  virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE;
41
42  // Called there is a tap or click at |x|, |y|.
43  void PotentialActivationAt(int x, int y);
44
45  // Sets |was_focused_before_now_| to true.
46  void SetWasFocused();
47
48  // This is set to false when the focus changes, then set back to true soon
49  // afterwards. This helps track whether an event happened after a node was
50  // already focused, or if it caused the focus to change.
51  bool was_focused_before_now_;
52
53  // The listener getting the actual notifications.
54  PageClickListener* listener_;
55
56  base::WeakPtrFactory<PageClickTracker> weak_ptr_factory_;
57
58  DISALLOW_COPY_AND_ASSIGN(PageClickTracker);
59};
60
61}  // namespace autofill
62
63#endif  // COMPONENTS_AUTOFILL_CONTENT_RENDERER_PAGE_CLICK_TRACKER_H_
64