Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(431)

Side by Side Diff: chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc

Issue 2277563002: Wires up immersive mode for chrome and mash (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix crash Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/ui/views/frame/immersive_mode_controller_ash.h" 5 #include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h"
6 6
7 #include "ash/common/material_design/material_design_controller.h" 7 #include "ash/common/material_design/material_design_controller.h"
8 #include "ash/common/wm/window_state.h" 8 #include "ash/common/wm/window_state.h"
9 #include "ash/shared/immersive_revealed_lock.h" 9 #include "ash/shared/immersive_revealed_lock.h"
10 #include "ash/shell.h" 10 #include "ash/shell.h"
11 #include "ash/wm/window_state_aura.h" 11 #include "ash/wm/window_state_aura.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "chrome/browser/chrome_notification_types.h" 13 #include "chrome/browser/chrome_notification_types.h"
14 #include "chrome/browser/ui/ash/ash_util.h"
14 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" 15 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
15 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" 16 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
16 #include "chrome/browser/ui/views/frame/browser_view.h" 17 #include "chrome/browser/ui/views/frame/browser_view.h"
17 #include "chrome/browser/ui/views/frame/top_container_view.h" 18 #include "chrome/browser/ui/views/frame/top_container_view.h"
18 #include "chrome/browser/ui/views/tabs/tab_strip.h" 19 #include "chrome/browser/ui/views/tabs/tab_strip.h"
19 #include "content/public/browser/notification_service.h" 20 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
22 #include "services/ui/public/cpp/property_type_converters.h"
23 #include "services/ui/public/cpp/window_tree_client.h"
24 #include "services/ui/public/interfaces/window_manager.mojom.h"
25 #include "ui/aura/mus/mus_util.h"
21 #include "ui/aura/window.h" 26 #include "ui/aura/window.h"
27 #include "ui/compositor/paint_context.h"
28 #include "ui/compositor/paint_recorder.h"
29 #include "ui/views/mus/native_widget_mus.h"
30 #include "ui/views/mus/window_manager_connection.h"
22 #include "ui/views/view.h" 31 #include "ui/views/view.h"
23 #include "ui/views/widget/widget.h" 32 #include "ui/views/widget/widget.h"
24 #include "ui/views/window/non_client_view.h" 33 #include "ui/views/window/non_client_view.h"
25 34
26 namespace { 35 namespace {
27 36
28 // Revealing the TopContainerView looks better if the animation starts and ends 37 // Revealing the TopContainerView looks better if the animation starts and ends
29 // just a few pixels before the view goes offscreen, which reduces the visual 38 // just a few pixels before the view goes offscreen, which reduces the visual
30 // "pop" as the 3-pixel tall "light bar" style tab strip becomes visible. 39 // "pop" as the 3-pixel tall "light bar" style tab strip becomes visible.
31 const int kAnimationOffsetY = 3; 40 const int kAnimationOffsetY = 3;
(...skipping 17 matching lines...) Expand all
49 public: 58 public:
50 explicit ImmersiveRevealedLockAsh(ash::ImmersiveRevealedLock* lock) 59 explicit ImmersiveRevealedLockAsh(ash::ImmersiveRevealedLock* lock)
51 : lock_(lock) {} 60 : lock_(lock) {}
52 61
53 private: 62 private:
54 std::unique_ptr<ash::ImmersiveRevealedLock> lock_; 63 std::unique_ptr<ash::ImmersiveRevealedLock> lock_;
55 64
56 DISALLOW_COPY_AND_ASSIGN(ImmersiveRevealedLockAsh); 65 DISALLOW_COPY_AND_ASSIGN(ImmersiveRevealedLockAsh);
57 }; 66 };
58 67
68 // TODO(sky): remove this, should instead create a layer that is clone of
69 // existing layers. http://crbug.com/640378.
70 class DelegatingPaintView : public views::View {
71 public:
72 explicit DelegatingPaintView(views::View* view) : view_(view) {}
73
74 ~DelegatingPaintView() override {}
75
76 // views::View:
77 void PaintChildren(const ui::PaintContext& context) override {
78 view_->Paint(ui::PaintContext(
79 context, ui::PaintContext::CLONE_WITHOUT_INVALIDATION));
80 }
81
82 private:
83 views::View* view_;
84
85 DISALLOW_COPY_AND_ASSIGN(DelegatingPaintView);
86 };
87
59 } // namespace 88 } // namespace
60 89
61 ImmersiveModeControllerAsh::ImmersiveModeControllerAsh() 90 ImmersiveModeControllerAsh::ImmersiveModeControllerAsh()
62 : ImmersiveModeController(Type::ASH), 91 : ImmersiveModeController(Type::ASH),
63 controller_(new ash::ImmersiveFullscreenController), 92 controller_(new ash::ImmersiveFullscreenController),
64 browser_view_(nullptr), 93 browser_view_(nullptr),
65 native_window_(nullptr),
66 observers_enabled_(false), 94 observers_enabled_(false),
67 use_tab_indicators_(false), 95 use_tab_indicators_(false),
68 visible_fraction_(1) {} 96 visible_fraction_(1) {}
69 97
70 ImmersiveModeControllerAsh::~ImmersiveModeControllerAsh() { 98 ImmersiveModeControllerAsh::~ImmersiveModeControllerAsh() {
71 EnableWindowObservers(false); 99 EnableWindowObservers(false);
72 } 100 }
73 101
74 void ImmersiveModeControllerAsh::Init(BrowserView* browser_view) { 102 void ImmersiveModeControllerAsh::Init(BrowserView* browser_view) {
75 browser_view_ = browser_view; 103 browser_view_ = browser_view;
76 native_window_ = browser_view_->GetNativeWindow();
77 controller_->Init(this, browser_view_->frame(), 104 controller_->Init(this, browser_view_->frame(),
78 browser_view_->top_container()); 105 browser_view_->top_container());
79 } 106 }
80 107
81 void ImmersiveModeControllerAsh::SetEnabled(bool enabled) { 108 void ImmersiveModeControllerAsh::SetEnabled(bool enabled) {
82 if (controller_->IsEnabled() == enabled) 109 if (controller_->IsEnabled() == enabled)
83 return; 110 return;
84 111
85 EnableWindowObservers(enabled); 112 EnableWindowObservers(enabled);
86 113
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 162
136 void ImmersiveModeControllerAsh::EnableWindowObservers(bool enable) { 163 void ImmersiveModeControllerAsh::EnableWindowObservers(bool enable) {
137 if (observers_enabled_ == enable) 164 if (observers_enabled_ == enable)
138 return; 165 return;
139 observers_enabled_ = enable; 166 observers_enabled_ = enable;
140 167
141 content::Source<FullscreenController> source(browser_view_->browser() 168 content::Source<FullscreenController> source(browser_view_->browser()
142 ->exclusive_access_manager() 169 ->exclusive_access_manager()
143 ->fullscreen_controller()); 170 ->fullscreen_controller());
144 if (enable) { 171 if (enable) {
145 ash::wm::GetWindowState(native_window_)->AddObserver(this); 172 if (chrome::IsRunningInMash()) {
173 // TODO: http://crbug.com/640381.
174 NOTIMPLEMENTED();
175 } else {
176 ash::wm::GetWindowState(browser_view_->GetNativeWindow())
177 ->AddObserver(this);
178 }
146 registrar_.Add(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source); 179 registrar_.Add(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source);
147 } else { 180 } else {
148 ash::wm::GetWindowState(native_window_)->RemoveObserver(this); 181 if (chrome::IsRunningInMash()) {
182 // TODO: http://crbug.com/640381.
183 NOTIMPLEMENTED();
184 } else {
185 ash::wm::GetWindowState(browser_view_->GetNativeWindow())
186 ->RemoveObserver(this);
187 }
149 registrar_.Remove(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source); 188 registrar_.Remove(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source);
150 } 189 }
151 } 190 }
152 191
153 void ImmersiveModeControllerAsh::LayoutBrowserRootView() { 192 void ImmersiveModeControllerAsh::LayoutBrowserRootView() {
154 views::Widget* widget = browser_view_->frame(); 193 views::Widget* widget = browser_view_->frame();
155 // Update the window caption buttons. 194 // Update the window caption buttons.
156 widget->non_client_view()->frame_view()->ResetWindowControls(); 195 widget->non_client_view()->frame_view()->ResetWindowControls();
157 widget->non_client_view()->frame_view()->InvalidateLayout(); 196 widget->non_client_view()->frame_view()->InvalidateLayout();
158 browser_view_->InvalidateLayout(); 197 browser_view_->InvalidateLayout();
(...skipping 19 matching lines...) Expand all
178 } 217 }
179 218
180 bool show_tab_indicators = use_tab_indicators_ && !IsRevealed(); 219 bool show_tab_indicators = use_tab_indicators_ && !IsRevealed();
181 if (show_tab_indicators != browser_view_->tabstrip()->IsImmersiveStyle()) { 220 if (show_tab_indicators != browser_view_->tabstrip()->IsImmersiveStyle()) {
182 browser_view_->tabstrip()->SetImmersiveStyle(show_tab_indicators); 221 browser_view_->tabstrip()->SetImmersiveStyle(show_tab_indicators);
183 return true; 222 return true;
184 } 223 }
185 return false; 224 return false;
186 } 225 }
187 226
227 void ImmersiveModeControllerAsh::CreateMashRevealWidget() {
228 if (!chrome::IsRunningInMash())
229 return;
230
231 DCHECK(!mash_reveal_widget_);
232 mash_reveal_widget_.reset(new views::Widget);
233 views::Widget::InitParams init_params(views::Widget::InitParams::TYPE_POPUP);
234 std::map<std::string, std::vector<uint8_t>> window_properties;
235 window_properties
236 [ui::mojom::WindowManager::kRendererParentTitleArea_Property] =
James Cook 2016/08/24 17:00:32 optional: "using ui::mojom::WindowManager;" might
sky 2016/08/24 19:23:29 That doesn't work for constants.
237 mojo::ConvertTo<std::vector<uint8_t>>(true);
238 window_properties[ui::mojom::WindowManager::kName_Property] =
239 mojo::ConvertTo<std::vector<uint8_t>>(
240 std::string("ChromeImmersiveRevealWindow"));
James Cook 2016/08/24 17:00:32 I think you can just set init_params.name for this
sky 2016/08/24 19:23:29 That only works if WindowManagerConnection creates
241 init_params.native_widget = new views::NativeWidgetMus(
242 mash_reveal_widget_.get(),
243 views::WindowManagerConnection::Get()->client()->NewWindow(
244 &window_properties),
245 ui::mojom::SurfaceType::DEFAULT);
246 init_params.accept_events = false;
247 init_params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
248 init_params.activatable = views::Widget::InitParams::ACTIVATABLE_NO;
249 init_params.parent_mus = GetMusWindow(browser_view_->GetNativeWindow());
250 const gfx::Rect& top_container_bounds =
251 browser_view_->top_container()->bounds();
252 init_params.bounds =
253 gfx::Rect(0, -top_container_bounds.height(), top_container_bounds.width(),
254 top_container_bounds.height());
255 mash_reveal_widget_->Init(init_params);
256 mash_reveal_widget_->SetContentsView(
257 new DelegatingPaintView(browser_view_->top_container()));
258 mash_reveal_widget_->StackAtTop();
259 mash_reveal_widget_->Show();
260 }
261
262 void ImmersiveModeControllerAsh::DestroyMashRevealWidget() {
263 mash_reveal_widget_.reset();
264 }
265
188 void ImmersiveModeControllerAsh::OnImmersiveRevealStarted() { 266 void ImmersiveModeControllerAsh::OnImmersiveRevealStarted() {
267 DestroyMashRevealWidget();
268
189 visible_fraction_ = 0; 269 visible_fraction_ = 0;
190 browser_view_->top_container()->SetPaintToLayer(true); 270 browser_view_->top_container()->SetPaintToLayer(true);
191 browser_view_->top_container()->layer()->SetFillsBoundsOpaquely(false); 271 browser_view_->top_container()->layer()->SetFillsBoundsOpaquely(false);
192 UpdateTabIndicators(); 272 UpdateTabIndicators();
193 LayoutBrowserRootView(); 273 LayoutBrowserRootView();
274 CreateMashRevealWidget();
194 FOR_EACH_OBSERVER(Observer, observers_, OnImmersiveRevealStarted()); 275 FOR_EACH_OBSERVER(Observer, observers_, OnImmersiveRevealStarted());
195 } 276 }
196 277
197 void ImmersiveModeControllerAsh::OnImmersiveRevealEnded() { 278 void ImmersiveModeControllerAsh::OnImmersiveRevealEnded() {
279 DestroyMashRevealWidget();
198 visible_fraction_ = 0; 280 visible_fraction_ = 0;
199 browser_view_->top_container()->SetPaintToLayer(false); 281 browser_view_->top_container()->SetPaintToLayer(false);
200 UpdateTabIndicators(); 282 UpdateTabIndicators();
201 LayoutBrowserRootView(); 283 LayoutBrowserRootView();
202 } 284 }
203 285
204 void ImmersiveModeControllerAsh::OnImmersiveFullscreenExited() { 286 void ImmersiveModeControllerAsh::OnImmersiveFullscreenExited() {
287 DestroyMashRevealWidget();
205 browser_view_->top_container()->SetPaintToLayer(false); 288 browser_view_->top_container()->SetPaintToLayer(false);
206 UpdateTabIndicators(); 289 UpdateTabIndicators();
207 LayoutBrowserRootView(); 290 LayoutBrowserRootView();
208 } 291 }
209 292
210 void ImmersiveModeControllerAsh::SetVisibleFraction(double visible_fraction) { 293 void ImmersiveModeControllerAsh::SetVisibleFraction(double visible_fraction) {
211 if (visible_fraction_ != visible_fraction) { 294 if (visible_fraction_ != visible_fraction) {
212 visible_fraction_ = visible_fraction; 295 visible_fraction_ = visible_fraction;
213 browser_view_->Layout(); 296 browser_view_->Layout();
297
298 if (mash_reveal_widget_) {
299 gfx::Rect bounds = mash_reveal_widget_->GetNativeWindow()->bounds();
300 bounds.set_y(visible_fraction * bounds.height() - bounds.height());
301 mash_reveal_widget_->SetBounds(bounds);
302 }
214 } 303 }
215 } 304 }
216 305
217 std::vector<gfx::Rect> 306 std::vector<gfx::Rect>
218 ImmersiveModeControllerAsh::GetVisibleBoundsInScreen() const { 307 ImmersiveModeControllerAsh::GetVisibleBoundsInScreen() const {
219 views::View* top_container_view = browser_view_->top_container(); 308 views::View* top_container_view = browser_view_->top_container();
220 gfx::Rect top_container_view_bounds = top_container_view->GetVisibleBounds(); 309 gfx::Rect top_container_view_bounds = top_container_view->GetVisibleBounds();
221 // TODO(tdanderson): Implement View::ConvertRectToScreen(). 310 // TODO(tdanderson): Implement View::ConvertRectToScreen().
222 gfx::Point top_container_view_bounds_in_screen_origin( 311 gfx::Point top_container_view_bounds_in_screen_origin(
223 top_container_view_bounds.origin()); 312 top_container_view_bounds.origin());
(...skipping 23 matching lines...) Expand all
247 } 336 }
248 337
249 void ImmersiveModeControllerAsh::Observe( 338 void ImmersiveModeControllerAsh::Observe(
250 int type, 339 int type,
251 const content::NotificationSource& source, 340 const content::NotificationSource& source,
252 const content::NotificationDetails& details) { 341 const content::NotificationDetails& details) {
253 DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type); 342 DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type);
254 if (!controller_->IsEnabled()) 343 if (!controller_->IsEnabled())
255 return; 344 return;
256 345
346 if (chrome::IsRunningInMash()) {
347 // TODO: http://crbug.com/640384.
348 NOTIMPLEMENTED();
349 return;
350 }
351
257 bool tab_indicator_visibility_changed = UpdateTabIndicators(); 352 bool tab_indicator_visibility_changed = UpdateTabIndicators();
258 353
259 // Auto hide the shelf in immersive browser fullscreen. When auto hidden and 354 // Auto hide the shelf in immersive browser fullscreen. When auto hidden and
260 // Material Design is not enabled, the shelf displays a 3px 'light bar' when 355 // Material Design is not enabled, the shelf displays a 3px 'light bar' when
261 // it is closed. When in immersive browser fullscreen and tab fullscreen, hide 356 // it is closed. When in immersive browser fullscreen and tab fullscreen, hide
262 // the shelf completely and prevent it from being revealed. 357 // the shelf completely and prevent it from being revealed.
263 bool in_tab_fullscreen = content::Source<FullscreenController>(source)-> 358 bool in_tab_fullscreen = content::Source<FullscreenController>(source)->
264 IsWindowFullscreenForTabOrPending(); 359 IsWindowFullscreenForTabOrPending();
265 ash::wm::GetWindowState(native_window_) 360 ash::wm::GetWindowState(browser_view_->GetNativeWindow())
266 ->set_shelf_mode_in_fullscreen( 361 ->set_shelf_mode_in_fullscreen(
267 in_tab_fullscreen ? ash::wm::WindowState::SHELF_HIDDEN 362 in_tab_fullscreen ? ash::wm::WindowState::SHELF_HIDDEN
268 : ash::wm::WindowState::SHELF_AUTO_HIDE_VISIBLE); 363 : ash::wm::WindowState::SHELF_AUTO_HIDE_VISIBLE);
269 ash::Shell::GetInstance()->UpdateShelfVisibility(); 364 ash::Shell::GetInstance()->UpdateShelfVisibility();
270 365
271 if (tab_indicator_visibility_changed) 366 if (tab_indicator_visibility_changed)
272 LayoutBrowserRootView(); 367 LayoutBrowserRootView();
273 } 368 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698