Home | History | Annotate | Download | only in tabs
      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