diff options
-rw-r--r-- | chrome/browser/external_tab_container.cc | 43 | ||||
-rw-r--r-- | chrome/browser/external_tab_container.h | 4 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_delegate.h | 7 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_win.cc | 14 |
4 files changed, 32 insertions, 36 deletions
diff --git a/chrome/browser/external_tab_container.cc b/chrome/browser/external_tab_container.cc index 79a84fc..a66e2c2 100644 --- a/chrome/browser/external_tab_container.cc +++ b/chrome/browser/external_tab_container.cc @@ -77,18 +77,6 @@ bool ExternalTabContainer::Init(Profile* profile, HWND parent, root_view_.AddChildView(tab_contents_container_); // Note that SetTabContents must be called after AddChildView is called tab_contents_container_->SetTabContents(tab_contents_); - // Add a dummy view to catch when the user tabs out of the tab - // Create a dummy FocusTraversable object to represent the frame of the - // external host. This will allow Tab and Shift-Tab to cycle into the - // external frame. When the tab_contents_container_ loses focus, - // the focus will be moved to this class (See OnSetFocus in this file). - // An alternative to using views::View and catching when the focus manager - // shifts the focus to the dummy view could be to implement our own view - // and handle AboutToRequestFocusFromTabTraversal. - views::View* dummy = new views::View(); - dummy->SetFocusable(true); - DCHECK(dummy->IsFocusable()); - root_view_.AddChildView(dummy); NavigationController* controller = &tab_contents_->controller(); registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, @@ -157,22 +145,6 @@ LRESULT ExternalTabContainer::OnSize(UINT, WPARAM, LPARAM, BOOL& handled) { return 0; } -LRESULT ExternalTabContainer::OnSetFocus(UINT msg, WPARAM wp, LPARAM lp, - BOOL& handled) { - if (automation_) { - views::FocusManager* focus_manager = - views::FocusManager::GetFocusManager(GetNativeView()); - DCHECK(focus_manager); - if (focus_manager) { - focus_manager->ClearFocus(); - automation_->Send(new AutomationMsg_TabbedOut(0, - win_util::IsShiftPressed())); - } - } - - return 0; -} - void ExternalTabContainer::OpenURLFromTab(TabContents* source, const GURL& url, const GURL& referrer, @@ -262,6 +234,21 @@ void ExternalTabContainer::ForwardMessageToExternalHost( } } +bool ExternalTabContainer::TakeFocus(bool reverse) { + if (automation_) { + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(GetNativeView()); + DCHECK(focus_manager); + if (focus_manager) { + focus_manager->ClearFocus(); + automation_->Send(new AutomationMsg_TabbedOut(0, + win_util::IsShiftPressed())); + } + } + + return true; +} + void ExternalTabContainer::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { diff --git a/chrome/browser/external_tab_container.h b/chrome/browser/external_tab_container.h index c9d8f34..4f7750b 100644 --- a/chrome/browser/external_tab_container.h +++ b/chrome/browser/external_tab_container.h @@ -40,7 +40,6 @@ class ExternalTabContainer : public TabContentsDelegate, public: BEGIN_MSG_MAP(ExternalTabContainer) MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) END_MSG_MAP() DECLARE_WND_CLASS(chrome::kExternalTabWindowClass) @@ -89,6 +88,8 @@ class ExternalTabContainer : public TabContentsDelegate, return true; }; + virtual bool TakeFocus(bool reverse); + // Notification service callback. virtual void Observe(NotificationType type, const NotificationSource& source, @@ -135,7 +136,6 @@ class ExternalTabContainer : public TabContentsDelegate, protected: LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL& handled); - LRESULT OnSetFocus(UINT msg, WPARAM wp, LPARAM lp, BOOL& handled); void OnDestroy(); void OnFinalMessage(HWND window); diff --git a/chrome/browser/tab_contents/tab_contents_delegate.h b/chrome/browser/tab_contents/tab_contents_delegate.h index ac8739c..87e228e 100644 --- a/chrome/browser/tab_contents/tab_contents_delegate.h +++ b/chrome/browser/tab_contents/tab_contents_delegate.h @@ -157,6 +157,13 @@ class TabContentsDelegate : public PageNavigator { // this to disable inactive rendering for the frame in the window the select // is opened within if necessary. virtual void RenderWidgetShowing() {} + + // This is called when webkit tells us that it is done tabbing through + // controls on the page. Provides a way for TabContentsDelegates to handle + // this. Returns true if the delegate successfully handled it. + virtual bool TakeFocus(bool reverse) { + return false; + } }; #endif // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_DELEGATE_H_ diff --git a/chrome/browser/tab_contents/tab_contents_view_win.cc b/chrome/browser/tab_contents/tab_contents_view_win.cc index f5f3d96..e0ee88e 100644 --- a/chrome/browser/tab_contents/tab_contents_view_win.cc +++ b/chrome/browser/tab_contents/tab_contents_view_win.cc @@ -315,13 +315,15 @@ void TabContentsViewWin::UpdateDragCursor(bool is_drop_target) { } void TabContentsViewWin::TakeFocus(bool reverse) { - views::FocusManager* focus_manager = - views::FocusManager::GetFocusManager(GetNativeView()); + if (!web_contents()->delegate()->TakeFocus(reverse)) { + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(GetNativeView()); - // We may not have a focus manager if the tab has been switched before this - // message arrived. - if (focus_manager) - focus_manager->AdvanceFocus(reverse); + // We may not have a focus manager if the tab has been switched before this + // message arrived. + if (focus_manager) + focus_manager->AdvanceFocus(reverse); + } } void TabContentsViewWin::HandleKeyboardEvent( |