summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc58
-rw-r--r--chrome/browser/ui/views/passwords/manage_passwords_bubble_view_browsertest.cc50
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());
+}