// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/notifications/fullscreen_notification_blocker.h" #include "base/time/time.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/fullscreen.h" #include "content/public/browser/notification_service.h" #if defined(USE_ASH) #include "ash/root_window_controller.h" #include "ash/shell.h" #include "ash/system/system_notifier.h" #include "ash/wm/window_state.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #endif namespace { bool DoesFullscreenModeBlockNotifications() { #if defined(USE_ASH) if (ash::Shell::HasInstance()) { ash::internal::RootWindowController* controller = ash::internal::RootWindowController::ForTargetRootWindow(); // During shutdown |controller| can be NULL. if (!controller) return false; // Block notifications if the shelf is hidden because of a fullscreen // window. const aura::Window* fullscreen_window = controller->GetWindowForFullscreenMode(); if (!fullscreen_window) return false; return ash::wm::GetWindowState(fullscreen_window)-> hide_shelf_when_fullscreen(); } #endif return IsFullScreenMode(); } } // namespace FullscreenNotificationBlocker::FullscreenNotificationBlocker( message_center::MessageCenter* message_center) : NotificationBlocker(message_center), is_fullscreen_mode_(false) { registrar_.Add(this, chrome::NOTIFICATION_FULLSCREEN_CHANGED, content::NotificationService::AllSources()); } FullscreenNotificationBlocker::~FullscreenNotificationBlocker() { } void FullscreenNotificationBlocker::CheckState() { bool was_fullscreen_mode = is_fullscreen_mode_; is_fullscreen_mode_ = DoesFullscreenModeBlockNotifications(); if (is_fullscreen_mode_ != was_fullscreen_mode) NotifyBlockingStateChanged(); } bool FullscreenNotificationBlocker::ShouldShowNotificationAsPopup( const message_center::NotifierId& notifier_id) const { bool enabled = !is_fullscreen_mode_; #if defined(USE_ASH) if (ash::Shell::HasInstance()) enabled = enabled || ash::system_notifier::ShouldAlwaysShowPopups( notifier_id); #endif return enabled; } void FullscreenNotificationBlocker::Observe( int type, const content::NotificationSource& source, const content::NotificationDetails& details) { DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type); CheckState(); }