1 // Copyright (c) 2011 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/tabs/pinned_tab_service.h" 6 7 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/tabs/pinned_tab_codec.h" 9 #include "chrome/browser/ui/browser.h" 10 #include "chrome/browser/ui/browser_list.h" 11 #include "content/common/notification_service.h" 12 #include "content/common/notification_type.h" 13 14 static bool IsLastNormalBrowser(Browser* browser) { 15 for (BrowserList::const_iterator i = BrowserList::begin(); 16 i != BrowserList::end(); ++i) { 17 if (*i != browser && (*i)->type() == Browser::TYPE_NORMAL && 18 (*i)->profile() == browser->profile()) { 19 return false; 20 } 21 } 22 return true; 23 } 24 25 PinnedTabService::PinnedTabService(Profile* profile) 26 : profile_(profile), 27 got_exiting_(false), 28 has_normal_browser_(false) { 29 registrar_.Add(this, NotificationType::BROWSER_OPENED, 30 NotificationService::AllSources()); 31 registrar_.Add(this, NotificationType::BROWSER_CLOSING, 32 NotificationService::AllSources()); 33 registrar_.Add(this, NotificationType::APP_EXITING, 34 NotificationService::AllSources()); 35 } 36 37 void PinnedTabService::Observe(NotificationType type, 38 const NotificationSource& source, 39 const NotificationDetails& details) { 40 if (got_exiting_) 41 return; 42 43 switch (type.value) { 44 case NotificationType::BROWSER_OPENED: { 45 Browser* browser = Source<Browser>(source).ptr(); 46 if (!has_normal_browser_ && browser->type() == Browser::TYPE_NORMAL && 47 browser->profile() == profile_) { 48 has_normal_browser_ = true; 49 } 50 break; 51 } 52 53 case NotificationType::BROWSER_CLOSING: { 54 Browser* browser = Source<Browser>(source).ptr(); 55 if (has_normal_browser_ && browser->profile() == profile_) { 56 if (*(Details<bool>(details)).ptr()) { 57 GotExit(); 58 } else if (IsLastNormalBrowser(browser)) { 59 has_normal_browser_ = false; 60 PinnedTabCodec::WritePinnedTabs(profile_); 61 } 62 } 63 break; 64 } 65 66 case NotificationType::APP_EXITING: { 67 if (has_normal_browser_) 68 GotExit(); 69 break; 70 } 71 72 default: 73 NOTREACHED(); 74 } 75 } 76 77 void PinnedTabService::GotExit() { 78 DCHECK(!got_exiting_); 79 got_exiting_ = true; 80 PinnedTabCodec::WritePinnedTabs(profile_); 81 } 82