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 "apps/app_lifetime_monitor.h" 6 7 #include "apps/shell_window.h" 8 #include "chrome/browser/chrome_notification_types.h" 9 #include "chrome/browser/extensions/extension_host.h" 10 #include "chrome/browser/profiles/profile.h" 11 #include "content/public/browser/notification_details.h" 12 #include "content/public/browser/notification_service.h" 13 #include "extensions/common/extension.h" 14 15 namespace apps { 16 17 using extensions::Extension; 18 using extensions::ExtensionHost; 19 20 AppLifetimeMonitor::AppLifetimeMonitor(Profile* profile) 21 : profile_(profile) { 22 registrar_.Add( 23 this, chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, 24 content::NotificationService::AllSources()); 25 registrar_.Add( 26 this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, 27 content::NotificationService::AllSources()); 28 registrar_.Add( 29 this, chrome::NOTIFICATION_APP_TERMINATING, 30 content::NotificationService::AllSources()); 31 32 ShellWindowRegistry* shell_window_registry = 33 ShellWindowRegistry::Factory::GetForBrowserContext( 34 profile_, false /* create */); 35 DCHECK(shell_window_registry); 36 shell_window_registry->AddObserver(this); 37 } 38 39 AppLifetimeMonitor::~AppLifetimeMonitor() {} 40 41 void AppLifetimeMonitor::AddObserver(Observer* observer) { 42 observers_.AddObserver(observer); 43 } 44 45 void AppLifetimeMonitor::RemoveObserver(Observer* observer) { 46 observers_.RemoveObserver(observer); 47 } 48 49 void AppLifetimeMonitor::Observe(int type, 50 const content::NotificationSource& source, 51 const content::NotificationDetails& details) { 52 switch (type) { 53 case chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING: { 54 ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); 55 const Extension* extension = host->extension(); 56 if (!extension || !extension->is_platform_app()) 57 return; 58 59 NotifyAppStart(extension->id()); 60 break; 61 } 62 63 case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { 64 ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); 65 const Extension* extension = host->extension(); 66 if (!extension || !extension->is_platform_app()) 67 return; 68 69 NotifyAppStop(extension->id()); 70 break; 71 } 72 73 case chrome::NOTIFICATION_APP_TERMINATING: { 74 NotifyChromeTerminating(); 75 break; 76 } 77 } 78 } 79 80 void AppLifetimeMonitor::OnShellWindowAdded(ShellWindow* shell_window) { 81 if (shell_window->window_type() != ShellWindow::WINDOW_TYPE_DEFAULT) 82 return; 83 84 ShellWindowRegistry::ShellWindowList windows = 85 ShellWindowRegistry::Get(shell_window->profile())-> 86 GetShellWindowsForApp(shell_window->extension_id()); 87 if (windows.size() == 1) 88 NotifyAppActivated(shell_window->extension_id()); 89 } 90 91 void AppLifetimeMonitor::OnShellWindowIconChanged(ShellWindow* shell_window) {} 92 93 void AppLifetimeMonitor::OnShellWindowRemoved(ShellWindow* shell_window) { 94 ShellWindowRegistry::ShellWindowList windows = 95 ShellWindowRegistry::Get(shell_window->profile())-> 96 GetShellWindowsForApp(shell_window->extension_id()); 97 if (windows.empty()) 98 NotifyAppDeactivated(shell_window->extension_id()); 99 } 100 101 void AppLifetimeMonitor::Shutdown() { 102 ShellWindowRegistry* shell_window_registry = 103 ShellWindowRegistry::Factory::GetForBrowserContext( 104 profile_, false /* create */); 105 if (shell_window_registry) 106 shell_window_registry->RemoveObserver(this); 107 } 108 109 void AppLifetimeMonitor::NotifyAppStart(const std::string& app_id) { 110 FOR_EACH_OBSERVER(Observer, observers_, OnAppStart(profile_, app_id)); 111 } 112 113 void AppLifetimeMonitor::NotifyAppActivated(const std::string& app_id) { 114 FOR_EACH_OBSERVER(Observer, observers_, OnAppActivated(profile_, app_id)); 115 } 116 117 void AppLifetimeMonitor::NotifyAppDeactivated(const std::string& app_id) { 118 FOR_EACH_OBSERVER(Observer, observers_, OnAppDeactivated(profile_, app_id)); 119 } 120 121 void AppLifetimeMonitor::NotifyAppStop(const std::string& app_id) { 122 FOR_EACH_OBSERVER(Observer, observers_, OnAppStop(profile_, app_id)); 123 } 124 125 void AppLifetimeMonitor::NotifyChromeTerminating() { 126 FOR_EACH_OBSERVER(Observer, observers_, OnChromeTerminating()); 127 } 128 129 } // namespace apps 130