blob: 68e49e7129484b273ceeb63b699e63332d06320f [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/main/browser_list_impl.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/main/browser.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
BrowserListImpl::BrowserListImpl() {}
BrowserListImpl::~BrowserListImpl() {
observers_.Clear();
}
// KeyedService:
void BrowserListImpl::Shutdown() {
for (auto& observer : observers_)
observer.OnBrowserListShutdown(this);
observers_.Clear();
for (Browser* browser : browsers_) {
browser->RemoveObserver(this);
}
for (Browser* browser : incognito_browsers_) {
browser->RemoveObserver(this);
}
}
// BrowserList:
void BrowserListImpl::AddBrowser(Browser* browser) {
DCHECK(!browser->GetBrowserState()->IsOffTheRecord());
browsers_.insert(browser);
browser->AddObserver(this);
for (auto& observer : observers_)
observer.OnBrowserAdded(this, browser);
}
void BrowserListImpl::AddIncognitoBrowser(Browser* browser) {
DCHECK(browser->GetBrowserState()->IsOffTheRecord());
incognito_browsers_.insert(browser);
browser->AddObserver(this);
for (auto& observer : observers_)
observer.OnIncognitoBrowserAdded(this, browser);
}
void BrowserListImpl::RemoveBrowser(Browser* browser) {
if (browsers_.erase(browser) > 0) {
browser->RemoveObserver(this);
for (auto& observer : observers_)
observer.OnBrowserRemoved(this, browser);
}
}
void BrowserListImpl::RemoveIncognitoBrowser(Browser* browser) {
if (incognito_browsers_.erase(browser) > 0) {
browser->RemoveObserver(this);
for (auto& observer : observers_)
observer.OnIncognitoBrowserRemoved(this, browser);
}
}
std::set<Browser*> BrowserListImpl::AllRegularBrowsers() const {
return browsers_;
}
std::set<Browser*> BrowserListImpl::AllIncognitoBrowsers() const {
return incognito_browsers_;
}
// Adds an observer to the model.
void BrowserListImpl::AddObserver(BrowserListObserver* observer) {
observers_.AddObserver(observer);
}
// Removes an observer from the model.
void BrowserListImpl::RemoveObserver(BrowserListObserver* observer) {
observers_.RemoveObserver(observer);
}
// BrowserObserver
void BrowserListImpl::BrowserDestroyed(Browser* browser) {
if (browser->GetBrowserState()->IsOffTheRecord()) {
RemoveIncognitoBrowser(browser);
} else {
RemoveBrowser(browser);
}
browser->RemoveObserver(this);
}