Index: chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
index 40f4c01aa769dfda99049b72bd9bb2891b1bfb01..22fbdcf5f59791575d31539e37edc3f6a86e2b5f 100644 |
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
@@ -8,10 +8,13 @@ |
#include "ash/shell.h" |
#include "ash/wm/window_properties.h" |
#include "base/command_line.h" |
+#include "chrome/browser/ui/fullscreen/fullscreen_controller.h" |
#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" |
#include "chrome/browser/ui/views/frame/browser_view.h" |
#include "chrome/browser/ui/views/frame/top_container_view.h" |
#include "chrome/browser/ui/views/tabs/tab_strip.h" |
+#include "chrome/common/chrome_notification_types.h" |
+#include "content/public/browser/notification_service.h" |
#include "ui/aura/client/activation_client.h" |
#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/client/capture_client.h" |
@@ -312,12 +315,6 @@ class ImmersiveModeControllerAsh::WindowObserver : public aura::WindowObserver { |
} |
return; |
} |
- using ash::internal::kImmersiveModeKey; |
- if (key == kImmersiveModeKey) { |
- // Another component has toggled immersive mode. |
- controller_->SetEnabled(window->GetProperty(kImmersiveModeKey)); |
- return; |
- } |
} |
private: |
@@ -333,7 +330,7 @@ ImmersiveModeControllerAsh::ImmersiveModeControllerAsh() |
enabled_(false), |
reveal_state_(CLOSED), |
revealed_lock_count_(0), |
- hide_tab_indicators_(false), |
+ tab_indicator_visibility_(TAB_INDICATORS_HIDE), |
native_window_(NULL), |
weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
} |
@@ -371,8 +368,10 @@ void ImmersiveModeControllerAsh::Init(BrowserView* browser_view) { |
EnableWindowObservers(true); |
// Optionally allow the tab indicators to be hidden. |
- hide_tab_indicators_ = CommandLine::ForCurrentProcess()-> |
- HasSwitch(ash::switches::kAshImmersiveHideTabIndicators); |
+ if (CommandLine::ForCurrentProcess()-> |
+ HasSwitch(ash::switches::kAshImmersiveHideTabIndicators)) { |
+ tab_indicator_visibility_ = TAB_INDICATORS_FORCE_HIDE; |
+ } |
anchored_widget_manager_.reset(new AnchoredWidgetManager(this)); |
} |
@@ -419,13 +418,7 @@ void ImmersiveModeControllerAsh::SetEnabled(bool enabled) { |
// Don't need explicit layout because we're inside a fullscreen transition |
// and it blocks layout calls. |
- // This causes a no-op call to SetEnabled() since enabled_ is already set. |
- native_window_->SetProperty(ash::internal::kImmersiveModeKey, enabled_); |
- // Ash on Windows may not have a shell. |
- if (ash::Shell::HasInstance()) { |
- // Shelf auto-hides in immersive mode. |
- ash::Shell::GetInstance()->UpdateShelfVisibility(); |
- } |
+ UpdateUseMinimalChrome(LAYOUT_NO); |
} |
bool ImmersiveModeControllerAsh::IsEnabled() const { |
@@ -433,7 +426,7 @@ bool ImmersiveModeControllerAsh::IsEnabled() const { |
} |
bool ImmersiveModeControllerAsh::ShouldHideTabIndicators() const { |
- return hide_tab_indicators_; |
+ return tab_indicator_visibility_ != TAB_INDICATORS_SHOW; |
} |
bool ImmersiveModeControllerAsh::ShouldHideTopViews() const { |
@@ -475,6 +468,15 @@ void ImmersiveModeControllerAsh::OnTopContainerBoundsChanged() { |
//////////////////////////////////////////////////////////////////////////////// |
// Observers: |
+void ImmersiveModeControllerAsh::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type); |
+ if (enabled_) |
+ UpdateUseMinimalChrome(LAYOUT_YES); |
+} |
+ |
void ImmersiveModeControllerAsh::OnMouseEvent(ui::MouseEvent* event) { |
if (!enabled_) |
return; |
@@ -558,8 +560,12 @@ void ImmersiveModeControllerAsh::OnImplicitAnimationsCompleted() { |
//////////////////////////////////////////////////////////////////////////////// |
// Testing interface: |
-void ImmersiveModeControllerAsh::SetHideTabIndicatorsForTest(bool hide) { |
- hide_tab_indicators_ = hide; |
+void ImmersiveModeControllerAsh::SetForceHideTabIndicatorsForTest(bool force) { |
+ if (force) |
+ tab_indicator_visibility_ = TAB_INDICATORS_FORCE_HIDE; |
+ else if (tab_indicator_visibility_ == TAB_INDICATORS_FORCE_HIDE) |
+ tab_indicator_visibility_ = TAB_INDICATORS_HIDE; |
+ UpdateUseMinimalChrome(LAYOUT_YES); |
} |
void ImmersiveModeControllerAsh::StartRevealForTest(bool hovered) { |
@@ -601,6 +607,20 @@ void ImmersiveModeControllerAsh::EnableWindowObservers(bool enable) { |
// The window observer adds and removes itself from the native window. |
window_observer_.reset(enable ? new WindowObserver(this) : NULL); |
+ if (enable) { |
+ registrar_.Add( |
+ this, |
+ chrome::NOTIFICATION_FULLSCREEN_CHANGED, |
+ content::Source<FullscreenController>( |
+ browser_view_->browser()->fullscreen_controller())); |
+ } else { |
+ registrar_.Remove( |
+ this, |
+ chrome::NOTIFICATION_FULLSCREEN_CHANGED, |
+ content::Source<FullscreenController>( |
+ browser_view_->browser()->fullscreen_controller())); |
+ } |
+ |
if (!enable) |
StopObservingImplicitAnimations(); |
} |
@@ -677,6 +697,35 @@ void ImmersiveModeControllerAsh::UpdateFocusRevealedLock() { |
} |
} |
+void ImmersiveModeControllerAsh::UpdateUseMinimalChrome(Layout layout) { |
+ bool in_tab_fullscreen = browser_view_->browser()->fullscreen_controller()-> |
+ IsFullscreenForTabOrPending(); |
+ bool use_minimal_chrome = !in_tab_fullscreen && enabled_; |
+ native_window_->SetProperty(ash::internal::kFullscreenUsesMinimalChromeKey, |
+ use_minimal_chrome); |
+ |
+ TabIndicatorVisibility previous_tab_indicator_visibility = |
+ tab_indicator_visibility_; |
+ if (tab_indicator_visibility_ != TAB_INDICATORS_FORCE_HIDE) { |
+ tab_indicator_visibility_ = use_minimal_chrome ? |
+ TAB_INDICATORS_SHOW : TAB_INDICATORS_HIDE; |
+ } |
+ |
+ // Ash on Windows may not have a shell. |
+ if (ash::Shell::HasInstance()) { |
+ // When using minimal chrome, the shelf is auto-hidden. The auto-hidden |
+ // shelf displays a 3px 'light bar' when it is closed. |
+ ash::Shell::GetInstance()->UpdateShelfVisibility(); |
+ } |
+ |
+ if (tab_indicator_visibility_ != previous_tab_indicator_visibility) { |
+ // If the top-of-window views are revealed or animating, the change will |
+ // take effect with the layout once the top-of-window views are closed. |
+ if (layout == LAYOUT_YES && reveal_state_ == CLOSED) |
+ LayoutBrowserView(true); |
+ } |
+} |
+ |
int ImmersiveModeControllerAsh::GetAnimationDuration(Animate animate) const { |
switch (animate) { |
case ANIMATE_NO: |