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/extensions/chrome_notification_observer.h" 6 7 #include "base/logging.h" 8 #include "chrome/browser/chrome_notification_types.h" 9 #include "chrome/browser/extensions/extension_system.h" 10 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/ui/browser.h" 12 #include "content/public/browser/notification_service.h" 13 #include "extensions/browser/process_manager.h" 14 15 namespace extensions { 16 17 ChromeNotificationObserver::ChromeNotificationObserver() { 18 // Notifications for extensions::ProcessManager 19 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_WINDOW_READY, 20 content::NotificationService::AllSources()); 21 } 22 23 ChromeNotificationObserver::~ChromeNotificationObserver() {} 24 25 void ChromeNotificationObserver::OnBrowserWindowReady(Browser* browser) { 26 Profile* profile = browser->profile(); 27 DCHECK(profile); 28 29 // Inform the process manager for this profile that the window is ready. 30 // We continue to observe the notification in case browser windows open for 31 // a related incognito profile or other regular profiles. 32 extensions::ProcessManager* manager = 33 ExtensionSystem::Get(profile)->process_manager(); 34 if (!manager) // Tests may not have a process manager. 35 return; 36 DCHECK_EQ(profile, manager->GetBrowserContext()); 37 manager->OnBrowserWindowReady(); 38 39 // For incognito profiles also inform the original profile's process manager 40 // that the window is ready. This will usually be a no-op because the 41 // original profile's process manager should have been informed when the 42 // non-incognito window opened. 43 if (profile->IsOffTheRecord()) { 44 Profile* original_profile = profile->GetOriginalProfile(); 45 extensions::ProcessManager* original_manager = 46 ExtensionSystem::Get(original_profile)->process_manager(); 47 DCHECK(original_manager); 48 DCHECK_EQ(original_profile, original_manager->GetBrowserContext()); 49 original_manager->OnBrowserWindowReady(); 50 } 51 } 52 53 void ChromeNotificationObserver::Observe(int type, 54 const content::NotificationSource& source, 55 const content::NotificationDetails& details) { 56 switch (type) { 57 case chrome::NOTIFICATION_BROWSER_WINDOW_READY: { 58 Browser* browser = content::Source<Browser>(source).ptr(); 59 OnBrowserWindowReady(browser); 60 break; 61 } 62 63 default: 64 NOTREACHED(); 65 } 66 } 67 68 } // namespace extensions 69