- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / notifications / fullscreen_notification_blocker.cc
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->GetTopmostFullscreenWindow();
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     FOR_EACH_OBSERVER(
65         NotificationBlocker::Observer, observers(), OnBlockingStateChanged());
66   }
67 }
68
69 bool FullscreenNotificationBlocker::ShouldShowNotificationAsPopup(
70     const message_center::NotifierId& notifier_id) const {
71   bool enabled = !is_fullscreen_mode_;
72 #if defined(USE_ASH)
73   if (ash::Shell::HasInstance())
74     enabled = enabled ||
75         ash::system_notifier::ShouldAlwaysShowPopups(notifier_id);
76 #endif
77
78   return enabled;
79 }
80
81 void FullscreenNotificationBlocker::Observe(
82     int type,
83     const content::NotificationSource& source,
84     const content::NotificationDetails& details) {
85   DCHECK_EQ(chrome::NOTIFICATION_FULLSCREEN_CHANGED, type);
86   CheckState();
87 }