diff options
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 17 | ||||
-rw-r--r-- | chrome/browser/views/browser_actions_container.cc | 6 | ||||
-rw-r--r-- | chrome/browser/views/browser_bubble_win.cc | 8 | ||||
-rw-r--r-- | chrome/browser/views/extensions/extension_view.cc | 11 | ||||
-rw-r--r-- | chrome/browser/views/extensions/extension_view.h | 1 |
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; |