| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/views/tab_contents/native_tab_contents_container_gtk.h" | 5 #include "chrome/browser/views/tab_contents/native_tab_contents_container_gtk.h" |
| 6 | 6 |
| 7 #include "chrome/browser/renderer_host/render_widget_host_view.h" | 7 #include "chrome/browser/renderer_host/render_widget_host_view.h" |
| 8 #include "chrome/browser/tab_contents/interstitial_page.h" | 8 #include "chrome/browser/tab_contents/interstitial_page.h" |
| 9 #include "chrome/browser/tab_contents/tab_contents.h" | 9 #include "chrome/browser/tab_contents/tab_contents.h" |
| 10 #include "chrome/browser/views/tab_contents/tab_contents_container.h" | 10 #include "chrome/browser/views/tab_contents/tab_contents_container.h" |
| 11 #include "views/focus/focus_manager.h" | 11 #include "views/focus/focus_manager.h" |
| 12 #include "views/widget/root_view.h" | 12 #include "views/widget/root_view.h" |
| 13 #include "views/widget/widget.h" | 13 #include "views/widget/widget.h" |
| 14 | 14 |
| 15 //////////////////////////////////////////////////////////////////////////////// | 15 //////////////////////////////////////////////////////////////////////////////// |
| 16 // NativeTabContentsContainerGtk, public: | 16 // NativeTabContentsContainerGtk, public: |
| 17 | 17 |
| 18 NativeTabContentsContainerGtk::NativeTabContentsContainerGtk( | 18 NativeTabContentsContainerGtk::NativeTabContentsContainerGtk( |
| 19 TabContentsContainer* container) | 19 TabContentsContainer* container) |
| 20 : container_(container) { | 20 : container_(container), |
| 21 focus_callback_id_(0) { |
| 21 } | 22 } |
| 22 | 23 |
| 23 NativeTabContentsContainerGtk::~NativeTabContentsContainerGtk() { | 24 NativeTabContentsContainerGtk::~NativeTabContentsContainerGtk() { |
| 24 } | 25 } |
| 25 | 26 |
| 26 //////////////////////////////////////////////////////////////////////////////// | 27 //////////////////////////////////////////////////////////////////////////////// |
| 27 // NativeTabContentsContainerGtk, NativeTabContentsContainer overrides: | 28 // NativeTabContentsContainerGtk, NativeTabContentsContainer overrides: |
| 28 | 29 |
| 29 void NativeTabContentsContainerGtk::AttachContents(TabContents* contents) { | 30 void NativeTabContentsContainerGtk::AttachContents(TabContents* contents) { |
| 30 // We need to register the tab contents window with the BrowserContainer so | |
| 31 // that the BrowserContainer is the focused view when the focus is on the | |
| 32 // TabContents window (for the TabContents case). | |
| 33 set_focus_view(this); | |
| 34 | |
| 35 Attach(contents->GetNativeView()); | 31 Attach(contents->GetNativeView()); |
| 36 | |
| 37 // TODO(port): figure out focus interception | |
| 38 #if defined(OS_WIN) | |
| 39 HWND contents_hwnd = contents->GetContentNativeView(); | |
| 40 if (contents_hwnd) | |
| 41 views::FocusManager::InstallFocusSubclass(contents_hwnd, this); | |
| 42 #else | |
| 43 NOTIMPLEMENTED(); | |
| 44 #endif | |
| 45 } | 32 } |
| 46 | 33 |
| 47 void NativeTabContentsContainerGtk::DetachContents(TabContents* contents) { | 34 void NativeTabContentsContainerGtk::DetachContents(TabContents* contents) { |
| 48 // TODO(port): figure out focus interception | |
| 49 #if defined(OS_WIN) | |
| 50 // TODO(brettw) should this move to NativeViewHost::Detach which is called | |
| 51 // below? It needs cleanup regardless. | |
| 52 HWND container_hwnd = contents->GetNativeView(); | |
| 53 | |
| 54 // Hide the contents before adjusting its parent to avoid a full desktop | |
| 55 // flicker. | |
| 56 ShowWindow(container_hwnd, SW_HIDE); | |
| 57 | |
| 58 // Reset the parent to NULL to ensure hidden tabs don't receive messages. | |
| 59 ::SetParent(container_hwnd, NULL); | |
| 60 | |
| 61 // Unregister the tab contents window from the FocusManager. | |
| 62 views::FocusManager::UninstallFocusSubclass(container_hwnd); | |
| 63 HWND hwnd = contents->GetContentNativeView(); | |
| 64 if (hwnd) { | |
| 65 // We may not have an HWND anymore, if the renderer crashed and we are | |
| 66 // displaying the sad tab for example. | |
| 67 views::FocusManager::UninstallFocusSubclass(hwnd); | |
| 68 } | |
| 69 #else | |
| 70 gtk_widget_hide(contents->GetNativeView()); | 35 gtk_widget_hide(contents->GetNativeView()); |
| 71 #endif | |
| 72 | 36 |
| 73 // Now detach the TabContents. | 37 // Now detach the TabContents. |
| 74 Detach(); | 38 Detach(); |
| 75 } | 39 } |
| 76 | 40 |
| 77 void NativeTabContentsContainerGtk::SetFastResize(bool fast_resize) { | 41 void NativeTabContentsContainerGtk::SetFastResize(bool fast_resize) { |
| 78 set_fast_resize(fast_resize); | 42 set_fast_resize(fast_resize); |
| 79 } | 43 } |
| 80 | 44 |
| 81 void NativeTabContentsContainerGtk::RenderViewHostChanged( | 45 void NativeTabContentsContainerGtk::RenderViewHostChanged( |
| 82 RenderViewHost* old_host, | 46 RenderViewHost* old_host, |
| 83 RenderViewHost* new_host) { | 47 RenderViewHost* new_host) { |
| 84 // TODO(port): figure out focus interception | |
| 85 #if defined(OS_WIN) | |
| 86 if (old_host && old_host->view()) { | |
| 87 views::FocusManager::UninstallFocusSubclass( | |
| 88 old_host->view()->GetNativeView()); | |
| 89 } | |
| 90 | |
| 91 if (new_host && new_host->view()) { | |
| 92 views::FocusManager::InstallFocusSubclass( | |
| 93 new_host->view()->GetNativeView(), this); | |
| 94 } | |
| 95 | |
| 96 // If we are focused, we need to pass the focus to the new RenderViewHost. | 48 // If we are focused, we need to pass the focus to the new RenderViewHost. |
| 97 views::FocusManager* focus_manager = views::FocusManager::GetFocusManager( | 49 views::FocusManager* focus_manager = GetFocusManager(); |
| 98 GetRootView()->GetWidget()->GetNativeView()); | |
| 99 if (focus_manager->GetFocusedView() == this) | 50 if (focus_manager->GetFocusedView() == this) |
| 100 Focus(); | 51 Focus(); |
| 101 #else | |
| 102 // If we are focused, we need to pass the focus to the new RenderViewHost. | |
| 103 // TODO: uncomment this once FocusManager has been ported. | |
| 104 // views::FocusManager* focus_manager = views::FocusManager::GetFocusManager( | |
| 105 // GetRootView()->GetWidget()->GetNativeView()); | |
| 106 // if (focus_manager->GetFocusedView() == this) | |
| 107 // Focus(); | |
| 108 #endif | |
| 109 } | 52 } |
| 110 | 53 |
| 111 views::View* NativeTabContentsContainerGtk::GetView() { | 54 views::View* NativeTabContentsContainerGtk::GetView() { |
| 112 return this; | 55 return this; |
| 113 } | 56 } |
| 114 | 57 |
| 115 void NativeTabContentsContainerGtk::TabContentsFocused( | 58 void NativeTabContentsContainerGtk::TabContentsFocused( |
| 116 TabContents* tab_contents) { | 59 TabContents* tab_contents) { |
| 117 #if defined(OS_WIN) | 60 // Called when the tab contents native view gets focused (typically through a |
| 61 // user click). We make ourself the focused view, so the focus is restored |
| 62 // properly when the browser window is deactivated/reactivated. |
| 118 views::FocusManager* focus_manager = GetFocusManager(); | 63 views::FocusManager* focus_manager = GetFocusManager(); |
| 119 if (!focus_manager) { | 64 if (!focus_manager) { |
| 120 NOTREACHED(); | 65 NOTREACHED(); |
| 121 return; | 66 return; |
| 122 } | 67 } |
| 123 focus_manager->SetFocusedView(this); | 68 focus_manager->SetFocusedView(this); |
| 124 #endif | |
| 125 } | 69 } |
| 126 | 70 |
| 127 //////////////////////////////////////////////////////////////////////////////// | 71 //////////////////////////////////////////////////////////////////////////////// |
| 128 // NativeTabContentsContainerGtk, views::View overrides: | 72 // NativeTabContentsContainerGtk, views::View overrides: |
| 129 | 73 |
| 130 bool NativeTabContentsContainerGtk::SkipDefaultKeyEventProcessing( | 74 bool NativeTabContentsContainerGtk::SkipDefaultKeyEventProcessing( |
| 131 const views::KeyEvent& e) { | 75 const views::KeyEvent& e) { |
| 132 // Don't look-up accelerators or tab-traverse if we are showing a non-crashed | 76 // Don't look-up accelerators or tab-traverse if we are showing a non-crashed |
| 133 // TabContents. | 77 // TabContents. |
| 134 // We'll first give the page a chance to process the key events. If it does | 78 // We'll first give the page a chance to process the key events. If it does |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 } | 142 } |
| 199 | 143 |
| 200 //////////////////////////////////////////////////////////////////////////////// | 144 //////////////////////////////////////////////////////////////////////////////// |
| 201 // NativeTabContentsContainer, public: | 145 // NativeTabContentsContainer, public: |
| 202 | 146 |
| 203 // static | 147 // static |
| 204 NativeTabContentsContainer* NativeTabContentsContainer::CreateNativeContainer( | 148 NativeTabContentsContainer* NativeTabContentsContainer::CreateNativeContainer( |
| 205 TabContentsContainer* container) { | 149 TabContentsContainer* container) { |
| 206 return new NativeTabContentsContainerGtk(container); | 150 return new NativeTabContentsContainerGtk(container); |
| 207 } | 151 } |
| OLD | NEW |