OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_container_vie
ws.h" | |
6 | |
7 #include "chrome/browser/renderer_host/render_widget_host_view_views.h" | |
8 #include "chrome/browser/ui/view_ids.h" | |
9 #include "chrome/browser/ui/views/tab_contents/tab_contents_container.h" | |
10 #include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" | |
11 #include "content/browser/renderer_host/render_widget_host_view.h" | |
12 #include "content/browser/tab_contents/interstitial_page.h" | |
13 #include "content/browser/tab_contents/tab_contents.h" | |
14 #include "ui/base/accessibility/accessible_view_state.h" | |
15 #include "ui/views/focus/focus_manager.h" | |
16 #include "ui/views/focus/widget_focus_manager.h" | |
17 #include "ui/views/layout/fill_layout.h" | |
18 #include "views/widget/native_widget_views.h" | |
19 | |
20 //////////////////////////////////////////////////////////////////////////////// | |
21 // NativeTabContentsContainerViews, public: | |
22 | |
23 NativeTabContentsContainerViews::NativeTabContentsContainerViews( | |
24 TabContentsContainer* container) | |
25 : container_(container) { | |
26 set_id(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW); | |
27 SetLayoutManager(new views::FillLayout); | |
28 } | |
29 | |
30 NativeTabContentsContainerViews::~NativeTabContentsContainerViews() { | |
31 } | |
32 | |
33 //////////////////////////////////////////////////////////////////////////////// | |
34 // NativeTabContentsContainerViews, NativeTabContentsContainer overrides: | |
35 | |
36 void NativeTabContentsContainerViews::AttachContents(TabContents* contents) { | |
37 TabContentsViewViews* widget = | |
38 static_cast<TabContentsViewViews*>(contents->view()); | |
39 views::NativeWidgetViews* nwv = | |
40 static_cast<views::NativeWidgetViews*>(widget->native_widget()); | |
41 AddChildView(nwv->GetView()); | |
42 Layout(); | |
43 } | |
44 | |
45 void NativeTabContentsContainerViews::DetachContents(TabContents* contents) { | |
46 TabContentsViewViews* widget = | |
47 static_cast<TabContentsViewViews*>(contents->view()); | |
48 views::NativeWidgetViews* nwv = | |
49 static_cast<views::NativeWidgetViews*>(widget->native_widget()); | |
50 RemoveChildView(nwv->GetView()); | |
51 } | |
52 | |
53 void NativeTabContentsContainerViews::SetFastResize(bool fast_resize) { | |
54 } | |
55 | |
56 bool NativeTabContentsContainerViews::GetFastResize() const { | |
57 return false; | |
58 } | |
59 | |
60 bool NativeTabContentsContainerViews::FastResizeAtLastLayout() const { | |
61 return false; | |
62 } | |
63 | |
64 void NativeTabContentsContainerViews::RenderViewHostChanged( | |
65 RenderViewHost* old_host, | |
66 RenderViewHost* new_host) { | |
67 // If we are focused, we need to pass the focus to the new RenderViewHost. | |
68 if (GetFocusManager()->GetFocusedView() == this) | |
69 OnFocus(); | |
70 } | |
71 | |
72 views::View* NativeTabContentsContainerViews::GetView() { | |
73 return this; | |
74 } | |
75 | |
76 void NativeTabContentsContainerViews::TabContentsFocused( | |
77 TabContents* tab_contents) { | |
78 // This is called from RWHVViews::OnFocus, which means | |
79 // the focus manager already set focus to RWHVViews, so don't | |
80 // Update focus manager. | |
81 } | |
82 | |
83 //////////////////////////////////////////////////////////////////////////////// | |
84 // NativeTabContentsContainerWin, views::View overrides: | |
85 | |
86 bool NativeTabContentsContainerViews::SkipDefaultKeyEventProcessing( | |
87 const views::KeyEvent& e) { | |
88 // Don't look-up accelerators or tab-traversal if we are showing a non-crashed | |
89 // TabContents. | |
90 // We'll first give the page a chance to process the key events. If it does | |
91 // not process them, they'll be returned to us and we'll treat them as | |
92 // accelerators then. | |
93 return container_->tab_contents() && | |
94 !container_->tab_contents()->is_crashed(); | |
95 } | |
96 | |
97 bool NativeTabContentsContainerViews::IsFocusable() const { | |
98 // We need to be focusable when our contents is not a view hierarchy, as | |
99 // clicking on the contents needs to focus us. | |
100 return container_->tab_contents() != NULL; | |
101 } | |
102 | |
103 void NativeTabContentsContainerViews::OnFocus() { | |
104 if (container_->tab_contents()) | |
105 container_->tab_contents()->Focus(); | |
106 } | |
107 | |
108 void NativeTabContentsContainerViews::RequestFocus() { | |
109 // This is a hack to circumvent the fact that a the OnFocus() method is not | |
110 // invoked when RequestFocus() is called on an already focused view. | |
111 // The TabContentsContainer is the view focused when the TabContents has | |
112 // focus. When switching between from one tab that has focus to another tab | |
113 // that should also have focus, RequestFocus() is invoked one the | |
114 // TabContentsContainer. In order to make sure OnFocus() is invoked we need | |
115 // to clear the focus before hands. | |
116 { | |
117 // Disable notifications. Clear focus will assign the focus to the main | |
118 // browser window. Because this change of focus was not user requested, | |
119 // don't send it to listeners. | |
120 views::AutoNativeNotificationDisabler local_notification_disabler; | |
121 GetFocusManager()->ClearFocus(); | |
122 } | |
123 View::RequestFocus(); | |
124 } | |
125 | |
126 void NativeTabContentsContainerViews::AboutToRequestFocusFromTabTraversal( | |
127 bool reverse) { | |
128 container_->tab_contents()->FocusThroughTabTraversal(reverse); | |
129 } | |
130 | |
131 void NativeTabContentsContainerViews::GetAccessibleState( | |
132 ui::AccessibleViewState* state) { | |
133 state->role = ui::AccessibilityTypes::ROLE_GROUPING; | |
134 } | |
135 | |
136 gfx::NativeViewAccessible | |
137 NativeTabContentsContainerViews::GetNativeViewAccessible() { | |
138 return View::GetNativeViewAccessible(); | |
139 } | |
140 | |
OLD | NEW |