diff options
-rw-r--r-- | chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc | 58 | ||||
-rw-r--r-- | chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc | 50 |
2 files changed, 78 insertions, 30 deletions
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc index 720ba64..b6e70f7 100644 --- a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc +++ b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc @@ -14,6 +14,7 @@ #include "chrome/browser/ui/views/passwords/manage_password_item_view.h" #include "chrome/browser/ui/views/passwords/manage_passwords_icon_view.h" #include "chrome/grit/generated_resources.h" +#include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "ui/aura/window.h" #include "ui/base/l10n/l10n_util.h" @@ -636,37 +637,56 @@ void ManagePasswordsBubbleView::SaveConfirmationView::ButtonPressed( // ManagePasswordsBubbleView::WebContentMouseHandler -------------------------- // The class listens for WebContentsView events and notifies the bubble if the -// view was clicked on. +// view was clicked on or received keystrokes. class ManagePasswordsBubbleView::WebContentMouseHandler : public ui::EventHandler { public: - explicit WebContentMouseHandler(ManagePasswordsBubbleView* bubble) - : bubble_(bubble) { - GetWebContentsWindow()->AddPreTargetHandler(this); - } - - virtual ~WebContentMouseHandler() { - aura::Window* window = GetWebContentsWindow(); - if (window) - window->RemovePreTargetHandler(this); - } + explicit WebContentMouseHandler(ManagePasswordsBubbleView* bubble); + virtual ~WebContentMouseHandler(); - virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { - if (event->type() == ui::ET_MOUSE_PRESSED) - bubble_->StartFadingOut(); - } + virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; + virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; private: - aura::Window* GetWebContentsWindow() { - content::WebContents* web_contents = bubble_->model()->web_contents(); - return web_contents ? web_contents->GetNativeView() : NULL; - } + aura::Window* GetWebContentsWindow(); ManagePasswordsBubbleView* bubble_; DISALLOW_COPY_AND_ASSIGN(WebContentMouseHandler); }; +ManagePasswordsBubbleView::WebContentMouseHandler::WebContentMouseHandler( + ManagePasswordsBubbleView* bubble) + : bubble_(bubble) { + GetWebContentsWindow()->AddPreTargetHandler(this); +} + +ManagePasswordsBubbleView::WebContentMouseHandler::~WebContentMouseHandler() { + if (aura::Window* window = GetWebContentsWindow()) + window->RemovePreTargetHandler(this); +} + +void ManagePasswordsBubbleView::WebContentMouseHandler::OnKeyEvent( + ui::KeyEvent* event) { + content::WebContents* web_contents = bubble_->model()->web_contents(); + content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); + if (rvh->IsFocusedElementEditable() && + event->type() == ui::ET_KEY_PRESSED) + bubble_->StartFadingOut(); +} + +void ManagePasswordsBubbleView::WebContentMouseHandler::OnMouseEvent( + ui::MouseEvent* event) { + if (event->type() == ui::ET_MOUSE_PRESSED) + bubble_->StartFadingOut(); +} + +aura::Window* +ManagePasswordsBubbleView::WebContentMouseHandler::GetWebContentsWindow() { + content::WebContents* web_contents = bubble_->model()->web_contents(); + return web_contents ? web_contents->GetNativeView() : NULL; +} + // ManagePasswordsBubbleView::FadeOutObserver --------------------------------- // The class notifies the bubble when it faded out completely. diff --git a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc index c81394c..74a01a7 100644 --- a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc @@ -23,36 +23,43 @@ namespace { const char kDisplayDispositionMetric[] = "PasswordBubble.DisplayDisposition"; -// Listens to WebContents and invokes a callback on the mouse down event. -class WebContentMouseClickHandler : public ui::EventHandler { +// Listens to WebContents and invokes a callback on the mouse/key down event. +class WebContentEventHandler : public ui::EventHandler { public: - explicit WebContentMouseClickHandler(content::WebContents* web_contents, - const base::Closure& callback) + explicit WebContentEventHandler(content::WebContents* web_contents, + const base::Closure& callback) : web_contents_(web_contents), callback_(callback), was_called_(false) { web_contents_->GetNativeView()->AddPreTargetHandler(this); } - virtual ~WebContentMouseClickHandler() { + virtual ~WebContentEventHandler() { web_contents_->GetNativeView()->RemovePreTargetHandler(this); } + virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { + if (event->type() == ui::ET_KEY_PRESSED) + HandleEvent(event); + } + virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { - if (event->type() == ui::ET_MOUSE_PRESSED) { - callback_.Run(); - was_called_ = true; - } + if (event->type() == ui::ET_MOUSE_PRESSED) + HandleEvent(event); } bool was_called() const { return was_called_; } private: + void HandleEvent(ui::Event* event) { + callback_.Run(); + was_called_ = true; + } content::WebContents* web_contents_; base::Closure callback_; bool was_called_; - DISALLOW_COPY_AND_ASSIGN(WebContentMouseClickHandler); + DISALLOW_COPY_AND_ASSIGN(WebContentEventHandler); }; void CheckBubbleAnimation() { @@ -230,9 +237,30 @@ IN_PROC_BROWSER_TEST_F(ManagePasswordsBubbleViewTest, FadeOnClick) { GetFocusManager()->GetFocusedView()); // We have to check the animation in the process of handling the mouse down // event. Otherwise, animation may finish too quickly. - WebContentMouseClickHandler observer( + WebContentEventHandler observer( browser()->tab_strip_model()->GetActiveWebContents(), base::Bind(&CheckBubbleAnimation)); ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); EXPECT_TRUE(observer.was_called()); } + +IN_PROC_BROWSER_TEST_F(ManagePasswordsBubbleViewTest, FadeOnKey) { + ui_test_utils::NavigateToURL( + browser(), + GURL("data:text/html;charset=utf-8,<input type=\"text\" autofocus>")); + ManagePasswordsBubbleView::ShowBubble( + browser()->tab_strip_model()->GetActiveWebContents(), + ManagePasswordsBubble::AUTOMATIC); + EXPECT_TRUE(ManagePasswordsBubbleView::IsShowing()); + EXPECT_FALSE(ManagePasswordsBubbleView::manage_password_bubble()-> + GetFocusManager()->GetFocusedView()); + EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER)); + // We have to check the animation in the process of handling the key down + // event. Otherwise, animation may finish too quickly. + WebContentEventHandler observer( + browser()->tab_strip_model()->GetActiveWebContents(), + base::Bind(&CheckBubbleAnimation)); + ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_K, + false, false, false, false)); + EXPECT_TRUE(observer.was_called()); +} |