1 // Copyright 2013 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/notifications/fullscreen_notification_blocker.h" 6 7 #include "base/time/time.h" 8 #include "chrome/browser/chrome_notification_types.h" 9 #include "chrome/browser/fullscreen.h" 10 #include "content/public/browser/notification_service.h" 11 12 #if defined(USE_ASH) 13 #include "ash/root_window_controller.h" 14 #include "ash/shell.h" 15 #include "ash/system/system_notifier.h" 16 #include "ash/wm/window_state.h" 17 #include "ui/aura/root_window.h" 18 #include "ui/aura/window.h" 19 #endif 20 21 namespace { 22 23 bool DoesFullscreenModeBlockNotifications() { 24 #if defined(USE_ASH) 25 if (ash::Shell::HasInstance()) { 26 ash::internal::RootWindowController* controller = 27 ash::internal::RootWindowController::ForTargetRootWindow(); 28 29 // During shutdown |controller| can be NULL. 30 if (!controller) 31 return false; 32 33 // Block notifications if the shelf is hidden because of a fullscreen 34 // window. 35 const aura::Window* fullscreen_window = 36 controller->GetWindowForFullscreenMode(); 37 if (!fullscreen_window) 38 return false; 39 return ash::wm::GetWindowState(fullscreen_window)-> 40 hide_shelf_when_fullscreen(); 41 } 42 #endif 43 44 return IsFullScreenMode(); 45 } 46 47 } // namespace 48 49 FullscreenNotificationBlocker::FullscreenNotificationBlocker( 50 message_center::MessageCenter* message_center) 51 : NotificationBlocker(message_center), 52 is_fullscreen_mode_(false) { 53 registrar_.Add(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, 54 content::NotificationService::AllSources()); 55 } 56 57 FullscreenNotificationBlocker::~FullscreenNotificationBlocker() { 58 } 59 60 void FullscreenNotificationBlocker::CheckState() { 61 bool was_fullscreen_mode = is_fullscreen_mode_; 62 is_fullscreen_mode_ = DoesFullscreenModeBlockNotifications(); 63 if (is_fullscreen_mode_ != was_fullscreen_mode) 64 NotifyBlockingStateChanged(); 65 } 66 67 bool FullscreenNotificationBlocker::ShouldShowNotificationAsPopup( 68 const message_center::NotifierId& notifier_id) const { 69 bool enabled = !is_fullscreen_mode_; 70 #if defined(USE_ASH) 71 if (ash::Shell::HasInstance()) 72 enabled = enabled || ash::system_notifier::ShouldAlwaysShowPopups( 73 notifier_id); 74 #endif 75 76 return enabled; 77 } 78 79 void FullscreenNotificationBlocker::Observe( 80 int type, 81 const content::NotificationSource& source, 82 const content::NotificationDetails& details) { 83 DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type); 84 CheckState(); 85 } 86