diff options
author | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-13 08:23:05 +0000 |
---|---|---|
committer | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-13 08:23:05 +0000 |
commit | 03f10dadd98fc09673da36afd57e2595b30be976 (patch) | |
tree | 97c55107d4963be793c026da700ed7cb0e4957bb /components | |
parent | 6619abc862f535996e4dff2f51d84d9389a8e41b (diff) | |
download | chromium_src-03f10dadd98fc09673da36afd57e2595b30be976.zip chromium_src-03f10dadd98fc09673da36afd57e2595b30be976.tar.gz chromium_src-03f10dadd98fc09673da36afd57e2595b30be976.tar.bz2 |
[Autofill] Make AutofillAgent the only PageClickListener
In a follow-up CL, I will teach the AutofillAgent to forward click events to the
PasswordAutofillAgent, as it does for keyboard events.
BUG=178313
Review URL: https://chromiumcodereview.appspot.com/13591003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@194091 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components')
-rw-r--r-- | components/autofill/renderer/autofill_agent.cc | 13 | ||||
-rw-r--r-- | components/autofill/renderer/autofill_agent.h | 4 | ||||
-rw-r--r-- | components/autofill/renderer/page_click_listener.h | 8 | ||||
-rw-r--r-- | components/autofill/renderer/page_click_tracker.cc | 34 | ||||
-rw-r--r-- | components/autofill/renderer/page_click_tracker.h | 19 | ||||
-rw-r--r-- | components/autofill/renderer/password_autofill_agent.cc | 16 | ||||
-rw-r--r-- | components/autofill/renderer/password_autofill_agent.h | 10 |
7 files changed, 26 insertions, 78 deletions
diff --git a/components/autofill/renderer/autofill_agent.cc b/components/autofill/renderer/autofill_agent.cc index acf4973..4c975fd 100644 --- a/components/autofill/renderer/autofill_agent.cc +++ b/components/autofill/renderer/autofill_agent.cc @@ -20,6 +20,7 @@ #include "components/autofill/common/form_field_data.h" #include "components/autofill/common/web_element_descriptor.h" #include "components/autofill/renderer/form_autofill_util.h" +#include "components/autofill/renderer/page_click_tracker.h" #include "components/autofill/renderer/password_autofill_agent.h" #include "content/public/common/password_form.h" #include "content/public/common/ssl_status.h" @@ -154,6 +155,10 @@ AutofillAgent::AutofillAgent(content::RenderView* render_view, ignore_text_changes_(false), ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { render_view->GetWebView()->setAutofillClient(this); + + // The PageClickTracker is a RenderViewObserver, and hence will be freed when + // the RenderView is destroyed. + new PageClickTracker(render_view, this); } AutofillAgent::~AutofillAgent() {} @@ -347,19 +352,15 @@ void AutofillAgent::setIgnoreTextChanges(bool ignore) { ignore_text_changes_ = ignore; } -bool AutofillAgent::InputElementClicked(const WebInputElement& element, +void AutofillAgent::InputElementClicked(const WebInputElement& element, bool was_focused, bool is_focused) { if (was_focused) ShowSuggestions(element, true, false, true); - - return false; } -bool AutofillAgent::InputElementLostFocus() { +void AutofillAgent::InputElementLostFocus() { HideHostAutofillUi(); - - return false; } void AutofillAgent::didAcceptAutofillSuggestion(const WebNode& node, diff --git a/components/autofill/renderer/autofill_agent.h b/components/autofill/renderer/autofill_agent.h index 0e93043..b6da184 100644 --- a/components/autofill/renderer/autofill_agent.h +++ b/components/autofill/renderer/autofill_agent.h @@ -73,10 +73,10 @@ class AutofillAgent : public content::RenderViewObserver, virtual void FocusedNodeChanged(const WebKit::WebNode& node) OVERRIDE; // PageClickListener: - virtual bool InputElementClicked(const WebKit::WebInputElement& element, + virtual void InputElementClicked(const WebKit::WebInputElement& element, bool was_focused, bool is_focused) OVERRIDE; - virtual bool InputElementLostFocus() OVERRIDE; + virtual void InputElementLostFocus() OVERRIDE; // WebKit::WebAutofillClient: virtual void didAcceptAutofillSuggestion(const WebKit::WebNode& node, diff --git a/components/autofill/renderer/page_click_listener.h b/components/autofill/renderer/page_click_listener.h index 6a29f1b..7101722 100644 --- a/components/autofill/renderer/page_click_listener.h +++ b/components/autofill/renderer/page_click_listener.h @@ -19,17 +19,13 @@ class PageClickListener { // Notification that |element| was clicked. // |was_focused| is true if |element| had focus BEFORE the click. // |is_focused| is true if |element| has focus AFTER the click was processed. - // If this method returns true, the notification will not be propagated to - // other listeners. - virtual bool InputElementClicked(const WebKit::WebInputElement& element, + virtual void InputElementClicked(const WebKit::WebInputElement& element, bool was_focused, bool is_focused) = 0; // If the previously focused element was an input field, listeners are // informed that the text field has lost its focus. - // If this method returns true, the notification will not be propagated to - // other listeners. - virtual bool InputElementLostFocus() = 0; + virtual void InputElementLostFocus() = 0; protected: virtual ~PageClickListener() {} diff --git a/components/autofill/renderer/page_click_tracker.cc b/components/autofill/renderer/page_click_tracker.cc index 0561684..54c8f2f 100644 --- a/components/autofill/renderer/page_click_tracker.cc +++ b/components/autofill/renderer/page_click_tracker.cc @@ -58,9 +58,11 @@ bool DidSelectedTextFieldLoseFocus(const WebNode& newly_clicked_node) { namespace autofill { -PageClickTracker::PageClickTracker(content::RenderView* render_view) +PageClickTracker::PageClickTracker(content::RenderView* render_view, + PageClickListener* listener) : content::RenderViewObserver(render_view), - was_focused_(false) { + was_focused_(false), + listener_(listener) { } PageClickTracker::~PageClickTracker() { @@ -85,20 +87,7 @@ void PageClickTracker::DidHandleMouseEvent(const WebMouseEvent& event) { 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); + listener_->InputElementClicked(input_element, was_focused_, is_focused); } void PageClickTracker::DidFinishDocumentLoad(WebKit::WebFrame* frame) { @@ -107,7 +96,7 @@ void PageClickTracker::DidFinishDocumentLoad(WebKit::WebFrame* frame) { } void PageClickTracker::FrameDetached(WebKit::WebFrame* frame) { - FrameList::iterator iter = + std::vector<WebKit::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 @@ -150,15 +139,8 @@ void PageClickTracker::handleEvent(const WebDOMEvent& event) { 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; - } + if (DidSelectedTextFieldLoseFocus(newly_clicked_node)) + listener_->InputElementLostFocus(); } } // namespace autofill diff --git a/components/autofill/renderer/page_click_tracker.h b/components/autofill/renderer/page_click_tracker.h index b95259a3..009ce9b 100644 --- a/components/autofill/renderer/page_click_tracker.h +++ b/components/autofill/renderer/page_click_tracker.h @@ -8,7 +8,6 @@ #include <vector> #include "base/basictypes.h" -#include "base/observer_list.h" #include "content/public/renderer/render_view_observer.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEventListener.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" @@ -17,7 +16,6 @@ namespace autofill { class PageClickListener; - // This class is responsible for tracking clicks on elements in web pages and // notifiying the associated listener when a node is clicked. // Compared to a simple WebDOMEventListener, it offers the added capability of @@ -33,16 +31,12 @@ class PageClickListener; class PageClickTracker : public content::RenderViewObserver, public WebKit::WebDOMEventListener { public: - explicit PageClickTracker(content::RenderView* render_view); + // The |listener| will be notified when an element is clicked. It must + // outlive this class. + PageClickTracker(content::RenderView* render_view, + PageClickListener* listener); virtual ~PageClickTracker(); - // Adds/removes a listener for getting notification when an element is - // clicked. Note that the order of insertion is important as a listener when - // notified can decide to stop the propagation of the event (so that listeners - // inserted after don't get the notification). - void AddListener(PageClickListener* listener); - void RemoveListener(PageClickListener* listener); - private: // RenderView::Observer implementation. virtual void DidFinishDocumentLoad(WebKit::WebFrame* frame) OVERRIDE; @@ -64,11 +58,10 @@ class PageClickTracker : public content::RenderViewObserver, bool was_focused_; // The frames we are listening to for mouse events. - typedef std::vector<WebKit::WebFrame*> FrameList; - FrameList tracked_frames_; + std::vector<WebKit::WebFrame*> tracked_frames_; // The listener getting the actual notifications. - ObserverList<PageClickListener> listeners_; + PageClickListener* listener_; DISALLOW_COPY_AND_ASSIGN(PageClickTracker); }; diff --git a/components/autofill/renderer/password_autofill_agent.cc b/components/autofill/renderer/password_autofill_agent.cc index 0fcd1b0..8372a73 100644 --- a/components/autofill/renderer/password_autofill_agent.cc +++ b/components/autofill/renderer/password_autofill_agent.cc @@ -415,22 +415,6 @@ void PasswordAutofillAgent::FrameWillClose(WebKit::WebFrame* frame) { FrameClosing(frame); } - -//////////////////////////////////////////////////////////////////////////////// -// PageClickListener implementation: - -bool PasswordAutofillAgent::InputElementClicked( - const WebKit::WebInputElement& element, - bool was_focused, - bool is_focused) { - // TODO(jcivelli): http://crbug.com/51644 Implement behavior. - return false; -} - -bool PasswordAutofillAgent::InputElementLostFocus() { - return false; -} - void PasswordAutofillAgent::OnFillPasswordForm( const PasswordFormFillData& form_data, bool disable_popup) { diff --git a/components/autofill/renderer/password_autofill_agent.h b/components/autofill/renderer/password_autofill_agent.h index 5f787d6..1816ccb 100644 --- a/components/autofill/renderer/password_autofill_agent.h +++ b/components/autofill/renderer/password_autofill_agent.h @@ -10,7 +10,6 @@ #include "base/memory/weak_ptr.h" #include "components/autofill/common/password_form_fill_data.h" -#include "components/autofill/renderer/page_click_listener.h" #include "content/public/renderer/render_view_observer.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h" @@ -24,8 +23,7 @@ namespace autofill { // This class is responsible for filling password forms. // There is one PasswordAutofillAgent per RenderView. -class PasswordAutofillAgent : public content::RenderViewObserver, - public PageClickListener { +class PasswordAutofillAgent : public content::RenderViewObserver { public: explicit PasswordAutofillAgent(content::RenderView* render_view); virtual ~PasswordAutofillAgent(); @@ -71,12 +69,6 @@ class PasswordAutofillAgent : public content::RenderViewObserver, virtual void FrameDetached(WebKit::WebFrame* frame) OVERRIDE; virtual void FrameWillClose(WebKit::WebFrame* frame) OVERRIDE; - // PageClickListener: - virtual bool InputElementClicked(const WebKit::WebInputElement& element, - bool was_focused, - bool is_focused) OVERRIDE; - virtual bool InputElementLostFocus() OVERRIDE; - // RenderView IPC handlers: void OnFillPasswordForm(const PasswordFormFillData& form_data, bool disable_popup); |