| OLD | NEW |
| 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" |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 | 172 |
| 173 void ImmersiveModeControllerAsh::EnableWindowObservers(bool enable) { | 173 void ImmersiveModeControllerAsh::EnableWindowObservers(bool enable) { |
| 174 if (observers_enabled_ == enable) | 174 if (observers_enabled_ == enable) |
| 175 return; | 175 return; |
| 176 observers_enabled_ = enable; | 176 observers_enabled_ = enable; |
| 177 | 177 |
| 178 content::Source<FullscreenController> source(browser_view_->browser() | 178 content::Source<FullscreenController> source(browser_view_->browser() |
| 179 ->exclusive_access_manager() | 179 ->exclusive_access_manager() |
| 180 ->fullscreen_controller()); | 180 ->fullscreen_controller()); |
| 181 if (enable) { | 181 if (enable) { |
| 182 if (ash_util::IsRunningInMash()) { | 182 if (IsRunningInMash()) { |
| 183 browser_view_->GetWidget()->GetNativeView()->GetRootWindow()->AddObserver( | 183 browser_view_->GetWidget()->GetNativeView()->GetRootWindow()->AddObserver( |
| 184 this); | 184 this); |
| 185 // TODO: http://crbug.com/640381. | 185 // TODO: http://crbug.com/640381. |
| 186 NOTIMPLEMENTED(); | 186 NOTIMPLEMENTED(); |
| 187 } else { | 187 } else { |
| 188 ash::wm::GetWindowState(native_window_)->AddObserver(this); | 188 ash::wm::GetWindowState(native_window_)->AddObserver(this); |
| 189 } | 189 } |
| 190 registrar_.Add(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source); | 190 registrar_.Add(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source); |
| 191 } else { | 191 } else { |
| 192 if (ash_util::IsRunningInMash()) { | 192 if (IsRunningInMash()) { |
| 193 browser_view_->GetWidget() | 193 browser_view_->GetWidget() |
| 194 ->GetNativeView() | 194 ->GetNativeView() |
| 195 ->GetRootWindow() | 195 ->GetRootWindow() |
| 196 ->RemoveObserver(this); | 196 ->RemoveObserver(this); |
| 197 // TODO: http://crbug.com/640381. | 197 // TODO: http://crbug.com/640381. |
| 198 NOTIMPLEMENTED(); | 198 NOTIMPLEMENTED(); |
| 199 } else { | 199 } else { |
| 200 ash::wm::GetWindowState(native_window_)->RemoveObserver(this); | 200 ash::wm::GetWindowState(native_window_)->RemoveObserver(this); |
| 201 } | 201 } |
| 202 registrar_.Remove(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source); | 202 registrar_.Remove(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, source); |
| 203 } | 203 } |
| 204 } | 204 } |
| 205 | 205 |
| 206 void ImmersiveModeControllerAsh::LayoutBrowserRootView() { | 206 void ImmersiveModeControllerAsh::LayoutBrowserRootView() { |
| 207 views::Widget* widget = browser_view_->frame(); | 207 views::Widget* widget = browser_view_->frame(); |
| 208 // Update the window caption buttons. | 208 // Update the window caption buttons. |
| 209 widget->non_client_view()->frame_view()->ResetWindowControls(); | 209 widget->non_client_view()->frame_view()->ResetWindowControls(); |
| 210 widget->non_client_view()->frame_view()->InvalidateLayout(); | 210 widget->non_client_view()->frame_view()->InvalidateLayout(); |
| 211 browser_view_->InvalidateLayout(); | 211 browser_view_->InvalidateLayout(); |
| 212 widget->GetRootView()->Layout(); | 212 widget->GetRootView()->Layout(); |
| 213 } | 213 } |
| 214 | 214 |
| 215 void ImmersiveModeControllerAsh::CreateMashRevealWidget() { | 215 void ImmersiveModeControllerAsh::CreateMashRevealWidget() { |
| 216 if (!ash_util::IsRunningInMash()) | 216 if (!IsRunningInMash()) |
| 217 return; | 217 return; |
| 218 | 218 |
| 219 DCHECK(!mash_reveal_widget_); | 219 DCHECK(!mash_reveal_widget_); |
| 220 mash_reveal_widget_ = base::MakeUnique<views::Widget>(); | 220 mash_reveal_widget_ = base::MakeUnique<views::Widget>(); |
| 221 views::Widget::InitParams init_params(views::Widget::InitParams::TYPE_POPUP); | 221 views::Widget::InitParams init_params(views::Widget::InitParams::TYPE_POPUP); |
| 222 init_params.mus_properties | 222 init_params.mus_properties |
| 223 [ui::mojom::WindowManager::kRenderParentTitleArea_Property] = | 223 [ui::mojom::WindowManager::kRenderParentTitleArea_Property] = |
| 224 mojo::ConvertTo<std::vector<uint8_t>>( | 224 mojo::ConvertTo<std::vector<uint8_t>>( |
| 225 static_cast<aura::PropertyConverter::PrimitiveType>(true)); | 225 static_cast<aura::PropertyConverter::PrimitiveType>(true)); |
| 226 init_params.mus_properties | 226 init_params.mus_properties |
| (...skipping 25 matching lines...) Expand all Loading... |
| 252 } | 252 } |
| 253 | 253 |
| 254 void ImmersiveModeControllerAsh::OnImmersiveRevealStarted() { | 254 void ImmersiveModeControllerAsh::OnImmersiveRevealStarted() { |
| 255 DestroyMashRevealWidget(); | 255 DestroyMashRevealWidget(); |
| 256 | 256 |
| 257 visible_fraction_ = 0; | 257 visible_fraction_ = 0; |
| 258 browser_view_->top_container()->SetPaintToLayer(); | 258 browser_view_->top_container()->SetPaintToLayer(); |
| 259 // In mash the window manager (ash) also renders to the non-client area. In | 259 // In mash the window manager (ash) also renders to the non-client area. In |
| 260 // order to see the decorations drawn by ash the layer needs to be marked as | 260 // order to see the decorations drawn by ash the layer needs to be marked as |
| 261 // not filling bounds opaquely. | 261 // not filling bounds opaquely. |
| 262 if (ash_util::IsRunningInMash()) | 262 if (IsRunningInMash()) |
| 263 browser_view_->top_container()->layer()->SetFillsBoundsOpaquely(false); | 263 browser_view_->top_container()->layer()->SetFillsBoundsOpaquely(false); |
| 264 LayoutBrowserRootView(); | 264 LayoutBrowserRootView(); |
| 265 CreateMashRevealWidget(); | 265 CreateMashRevealWidget(); |
| 266 for (Observer& observer : observers_) | 266 for (Observer& observer : observers_) |
| 267 observer.OnImmersiveRevealStarted(); | 267 observer.OnImmersiveRevealStarted(); |
| 268 } | 268 } |
| 269 | 269 |
| 270 void ImmersiveModeControllerAsh::OnImmersiveRevealEnded() { | 270 void ImmersiveModeControllerAsh::OnImmersiveRevealEnded() { |
| 271 DestroyMashRevealWidget(); | 271 DestroyMashRevealWidget(); |
| 272 visible_fraction_ = 0; | 272 visible_fraction_ = 0; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 } | 330 } |
| 331 | 331 |
| 332 void ImmersiveModeControllerAsh::Observe( | 332 void ImmersiveModeControllerAsh::Observe( |
| 333 int type, | 333 int type, |
| 334 const content::NotificationSource& source, | 334 const content::NotificationSource& source, |
| 335 const content::NotificationDetails& details) { | 335 const content::NotificationDetails& details) { |
| 336 DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type); | 336 DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type); |
| 337 if (!controller_->IsEnabled()) | 337 if (!controller_->IsEnabled()) |
| 338 return; | 338 return; |
| 339 | 339 |
| 340 if (ash_util::IsRunningInMash()) { | 340 if (IsRunningInMash()) { |
| 341 // TODO: http://crbug.com/640384. | 341 // TODO: http://crbug.com/640384. |
| 342 NOTIMPLEMENTED(); | 342 NOTIMPLEMENTED(); |
| 343 return; | 343 return; |
| 344 } | 344 } |
| 345 | 345 |
| 346 // Auto hide the shelf in immersive browser fullscreen. | 346 // Auto hide the shelf in immersive browser fullscreen. |
| 347 bool in_tab_fullscreen = content::Source<FullscreenController>(source)-> | 347 bool in_tab_fullscreen = content::Source<FullscreenController>(source)-> |
| 348 IsWindowFullscreenForTabOrPending(); | 348 IsWindowFullscreenForTabOrPending(); |
| 349 ash::wm::GetWindowState(native_window_) | 349 ash::wm::GetWindowState(native_window_) |
| 350 ->set_hide_shelf_when_fullscreen(in_tab_fullscreen); | 350 ->set_hide_shelf_when_fullscreen(in_tab_fullscreen); |
| 351 ash::Shell::GetInstance()->UpdateShelfVisibility(); | 351 ash::Shell::GetInstance()->UpdateShelfVisibility(); |
| 352 } | 352 } |
| 353 | 353 |
| 354 void ImmersiveModeControllerAsh::OnWindowPropertyChanged(aura::Window* window, | 354 void ImmersiveModeControllerAsh::OnWindowPropertyChanged(aura::Window* window, |
| 355 const void* key, | 355 const void* key, |
| 356 intptr_t old) { | 356 intptr_t old) { |
| 357 // In mash the window manager may move us out of immersive mode by changing | 357 // In mash the window manager may move us out of immersive mode by changing |
| 358 // the show state. When this happens notify the controller. | 358 // the show state. When this happens notify the controller. |
| 359 DCHECK(ash_util::IsRunningInMash()); | 359 DCHECK(IsRunningInMash()); |
| 360 if (key == aura::client::kShowStateKey && | 360 if (key == aura::client::kShowStateKey && |
| 361 !browser_view_->GetWidget()->IsFullscreen()) { | 361 !browser_view_->GetWidget()->IsFullscreen()) { |
| 362 SetEnabled(false); | 362 SetEnabled(false); |
| 363 } | 363 } |
| 364 } | 364 } |
| OLD | NEW |