Chromium Code Reviews| Index: chrome/browser/ui/views/tab_contents/native_tab_contents_container_aura.cc |
| =================================================================== |
| --- chrome/browser/ui/views/tab_contents/native_tab_contents_container_aura.cc (revision 0) |
| +++ chrome/browser/ui/views/tab_contents/native_tab_contents_container_aura.cc (revision 0) |
| @@ -0,0 +1,170 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/ui/views/tab_contents/native_tab_contents_container_aura.h" |
| + |
| +#include "chrome/browser/ui/view_ids.h" |
| +#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h" |
| +#include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" |
| +#include "content/browser/renderer_host/render_widget_host_view_win.h" |
| +#include "content/browser/tab_contents/interstitial_page.h" |
| +#include "content/browser/tab_contents/tab_contents.h" |
| +#include "ui/base/accessibility/accessible_view_state.h" |
| +#include "views/views_delegate.h" |
| +#include "views/focus/focus_manager.h" |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// NativeTabContentsContainerAura, public: |
| + |
| +NativeTabContentsContainerAura::NativeTabContentsContainerAura( |
| + TabContentsContainer* container) |
| + : container_(container) { |
| + set_id(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW); |
| +} |
| + |
| +NativeTabContentsContainerAura::~NativeTabContentsContainerAura() { |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// NativeTabContentsContainerAura, NativeTabContentsContainer overrides: |
| + |
| +void NativeTabContentsContainerAura::AttachContents(TabContents* contents) { |
| + // We need to register the tab contents window with the BrowserContainer so |
| + // that the BrowserContainer is the focused view when the focus is on the |
| + // TabContents window (for the TabContents case). |
| + set_focus_view(this); |
| + |
| + Attach(contents->GetNativeView()); |
| +} |
| + |
| +void NativeTabContentsContainerAura::DetachContents(TabContents* contents) { |
| + // Detach the TabContents. Do this before we unparent the |
| + // TabContentsViewViews so that the window hierarchy is intact for any |
| + // cleanup during Detach(). |
| + Detach(); |
| + |
| +#if !defined(USE_AURA) |
| + // TODO(brettw) should this move to NativeViewHost::Detach? It |
| + // needs cleanup regardless. |
| + HWND container_hwnd = contents->GetNativeView(); |
| + if (container_hwnd) { |
| + // Hide the contents before adjusting its parent to avoid a full desktop |
| + // flicker. |
| + ShowWindow(container_hwnd, SW_HIDE); |
| + |
| + // Reset the parent to NULL to ensure hidden tabs don't receive messages. |
| + static_cast<TabContentsViewViews*>(contents->view())->Unparent(); |
| + } |
| +#else |
| + // TODO(beng): |
| + NOTIMPLEMENTED(); |
| +#endif |
| +} |
| + |
| +void NativeTabContentsContainerAura::SetFastResize(bool fast_resize) { |
| + set_fast_resize(fast_resize); |
| +} |
| + |
| +void NativeTabContentsContainerAura::RenderViewHostChanged( |
| + RenderViewHost* old_host, |
| + RenderViewHost* new_host) { |
| + // If we are focused, we need to pass the focus to the new RenderViewHost. |
| + if (GetFocusManager()->GetFocusedView() == this) |
| + OnFocus(); |
| +} |
| + |
| +views::View* NativeTabContentsContainerAura::GetView() { |
| + return this; |
| +} |
| + |
| +void NativeTabContentsContainerAura::TabContentsFocused( |
| + TabContents* tab_contents) { |
| + views::FocusManager* focus_manager = GetFocusManager(); |
| + if (!focus_manager) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + focus_manager->SetFocusedView(this); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// NativeTabContentsContainerAura, views::View overrides: |
| + |
| +bool NativeTabContentsContainerAura::SkipDefaultKeyEventProcessing( |
| + const views::KeyEvent& e) { |
| + // Don't look-up accelerators or tab-traversal if we are showing a non-crashed |
| + // TabContents. |
| + // We'll first give the page a chance to process the key events. If it does |
| + // not process them, they'll be returned to us and we'll treat them as |
| + // accelerators then. |
| + return container_->tab_contents() && |
| + !container_->tab_contents()->is_crashed(); |
| +} |
| + |
| +bool NativeTabContentsContainerAura::IsFocusable() const { |
| + // We need to be focusable when our contents is not a view hierarchy, as |
| + // clicking on the contents needs to focus us. |
| + return container_->tab_contents() != NULL; |
| +} |
| + |
| +void NativeTabContentsContainerAura::OnFocus() { |
| + if (container_->tab_contents()) |
| + container_->tab_contents()->Focus(); |
| +} |
| + |
| +void NativeTabContentsContainerAura::RequestFocus() { |
| + // This is a hack to circumvent the fact that a the OnFocus() method is not |
| + // invoked when RequestFocus() is called on an already focused view. |
| + // The TabContentsContainer is the view focused when the TabContents has |
| + // focus. When switching between from one tab that has focus to another tab |
| + // that should also have focus, RequestFocus() is invoked one the |
| + // TabContentsContainer. In order to make sure OnFocus() is invoked we need |
| + // to clear the focus before hands. |
| + { |
| + // Disable notifications. Clear focus will assign the focus to the main |
| + // browser window. Because this change of focus was not user requested, |
| + // don't send it to listeners. |
| + views::AutoNativeNotificationDisabler local_notification_disabler; |
| + GetFocusManager()->ClearFocus(); |
| + } |
| + View::RequestFocus(); |
| +} |
| + |
| +void NativeTabContentsContainerAura::AboutToRequestFocusFromTabTraversal( |
| + bool reverse) { |
| + container_->tab_contents()->FocusThroughTabTraversal(reverse); |
| +} |
| + |
| +void NativeTabContentsContainerAura::GetAccessibleState( |
| + ui::AccessibleViewState* state) { |
| + state->role = ui::AccessibilityTypes::ROLE_GROUPING; |
| +} |
| + |
| +gfx::NativeViewAccessible |
| + NativeTabContentsContainerAura::GetNativeViewAccessible() { |
| + TabContents* tab_contents = container_->tab_contents(); |
| + if (tab_contents) { |
| +#if !defined(USE_AURA) |
|
sadrul
2011/09/07 15:37:47
Is this file used in non-aura configs?
|
| + RenderWidgetHostViewWin* host_view_win = |
| + static_cast<RenderWidgetHostViewWin*>( |
| + tab_contents->GetRenderWidgetHostView()); |
| + if (host_view_win) |
| + return host_view_win->GetIAccessible(); |
| +#else |
| + // TODO(beng): |
| + NOTIMPLEMENTED(); |
| +#endif |
| + } |
| + |
| + return View::GetNativeViewAccessible(); |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// NativeTabContentsContainer, public: |
| + |
| +// static |
| +NativeTabContentsContainer* NativeTabContentsContainer::CreateNativeContainer( |
| + TabContentsContainer* container) { |
| + return new NativeTabContentsContainerAura(container); |
| +} |
| Property changes on: chrome\browser\ui\views\tab_contents\native_tab_contents_container_aura.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |