summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/extension_host.cc17
-rw-r--r--chrome/browser/views/browser_actions_container.cc6
-rw-r--r--chrome/browser/views/browser_bubble_win.cc8
-rw-r--r--chrome/browser/views/extensions/extension_view.cc11
-rw-r--r--chrome/browser/views/extensions/extension_view.h1
5 files changed, 41 insertions, 2 deletions
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 28f7403..63021f6 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -8,6 +8,7 @@
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
+#include "base/keyboard_codes.h"
#include "base/message_loop.h"
#include "base/singleton.h"
#include "base/string_util.h"
@@ -537,6 +538,14 @@ void ExtensionHost::UpdateDragCursor(WebDragOperation operation) {
}
void ExtensionHost::GotFocus() {
+#if defined(TOOLKIT_VIEWS)
+ // Request focus so that the FocusManager has a focused view and can perform
+ // normally its key event processing (so that it lets tab key events go to the
+ // renderer).
+ view()->RequestFocus();
+#else
+ // TODO(port)
+#endif
}
void ExtensionHost::TakeFocus(bool reverse) {
@@ -547,6 +556,14 @@ bool ExtensionHost::IsReservedAccelerator(const NativeWebKeyboardEvent& event) {
}
bool ExtensionHost::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
+ if (extension_host_type_ == ViewType::EXTENSION_POPUP &&
+ event.windowsKeyCode == base::VKEY_ESCAPE) {
+ NotificationService::current()->Notify(
+ NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE,
+ Source<Profile>(profile_),
+ Details<ExtensionHost>(this));
+ return true;
+ }
return false;
}
diff --git a/chrome/browser/views/browser_actions_container.cc b/chrome/browser/views/browser_actions_container.cc
index f3395a7..b405906 100644
--- a/chrome/browser/views/browser_actions_container.cc
+++ b/chrome/browser/views/browser_actions_container.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/extensions/extension_browser_event_router.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/renderer_host/render_widget_host_view.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/view_ids.h"
#include "chrome/browser/views/extensions/extension_popup.h"
@@ -451,6 +452,11 @@ void BrowserActionsContainer::BubbleBrowserWindowClosing(
}
void BrowserActionsContainer::BubbleGotFocus(BrowserBubble* bubble) {
+ if (!popup_)
+ return;
+
+ // Forward the focus to the renderer.
+ popup_->host()->render_view_host()->view()->Focus();
}
void BrowserActionsContainer::BubbleLostFocus(BrowserBubble* bubble) {
diff --git a/chrome/browser/views/browser_bubble_win.cc b/chrome/browser/views/browser_bubble_win.cc
index 3b0b9b8..33a57e1 100644
--- a/chrome/browser/views/browser_bubble_win.cc
+++ b/chrome/browser/views/browser_bubble_win.cc
@@ -58,11 +58,15 @@ class BubbleWidget : public views::WidgetWin {
if (action == WA_INACTIVE && !closed_) {
delegate->BubbleLostFocus(bubble_);
- } else if (action == WA_ACTIVE) {
- delegate->BubbleGotFocus(bubble_);
}
}
+ virtual void OnSetFocus(HWND focused_window) {
+ BrowserBubble::Delegate* delegate = bubble_->delegate();
+ if (delegate)
+ delegate->BubbleGotFocus(bubble_);
+ }
+
private:
bool closed_;
BrowserBubble* bubble_;
diff --git a/chrome/browser/views/extensions/extension_view.cc b/chrome/browser/views/extensions/extension_view.cc
index c0118ba..7945307 100644
--- a/chrome/browser/views/extensions/extension_view.cc
+++ b/chrome/browser/views/extensions/extension_view.cc
@@ -22,6 +22,11 @@ ExtensionView::ExtensionView(ExtensionHost* host, Browser* browser)
container_(NULL),
is_clipped_(false) {
host_->set_view(this);
+
+ // This view needs to be focusable so it can act as the focused view for the
+ // focus manager. This is required to have SkipDefaultKeyEventProcessing
+ // called so the tab key events are forwarded to the renderer.
+ SetFocusable(true);
}
ExtensionView::~ExtensionView() {
@@ -170,6 +175,12 @@ void ExtensionView::PreferredSizeChanged() {
}
}
+bool ExtensionView::SkipDefaultKeyEventProcessing(const views::KeyEvent& e) {
+ // Let the tab key event be processed by the renderer (instead of moving the
+ // focus to the next focusable view).
+ return (e.GetKeyCode() == base::VKEY_TAB);
+}
+
void ExtensionView::HandleMouseEvent() {
if (container_)
container_->OnExtensionMouseEvent(this);
diff --git a/chrome/browser/views/extensions/extension_view.h b/chrome/browser/views/extensions/extension_view.h
index bd63d73..3b379b1 100644
--- a/chrome/browser/views/extensions/extension_view.h
+++ b/chrome/browser/views/extensions/extension_view.h
@@ -66,6 +66,7 @@ class ExtensionView : public views::NativeViewHost {
protected:
// Overridden from views::View.
virtual void PreferredSizeChanged();
+ virtual bool SkipDefaultKeyEventProcessing(const views::KeyEvent& e);
private:
friend class ExtensionHost;