blob: 9d8b2cca3f60c5e4fd18afc321a1d5d3ccce795c [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/all_web_state_list_observation_registrar.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/main/browser.h"
#include "ios/chrome/browser/main/browser_list.h"
#include "ios/chrome/browser/main/browser_list_factory.h"
AllWebStateListObservationRegistrar::AllWebStateListObservationRegistrar(
ChromeBrowserState* browser_state,
std::unique_ptr<WebStateListObserver> web_state_list_observer,
Mode mode)
: browser_list_(BrowserListFactory::GetForBrowserState(browser_state)),
web_state_list_observer_(std::move(web_state_list_observer)),
scoped_observer_(
std::make_unique<ScopedObserver<WebStateList, WebStateListObserver>>(
web_state_list_observer_.get())),
mode_(mode) {
browser_list_->AddObserver(this);
// There may already be browsers in |browser_list| when this object is
// created. Register as an observer for (mode permitting) both the regular and
// incognito browsers' WebStateLists.
if (mode_ & Mode::REGULAR) {
for (Browser* browser : browser_list_->AllRegularBrowsers()) {
scoped_observer_->Add(browser->GetWebStateList());
}
}
if (mode_ & Mode::INCOGNITO) {
for (Browser* browser : browser_list_->AllIncognitoBrowsers()) {
scoped_observer_->Add(browser->GetWebStateList());
}
}
}
AllWebStateListObservationRegistrar::AllWebStateListObservationRegistrar(
ChromeBrowserState* browser_state,
std::unique_ptr<WebStateListObserver> web_state_list_observer)
: AllWebStateListObservationRegistrar(browser_state,
std::move(web_state_list_observer),
Mode::ALL) {}
AllWebStateListObservationRegistrar::~AllWebStateListObservationRegistrar() {
// If the browser state has already shut down, |browser_list_| should be
// nullptr; otherwise, stop observing it.
if (browser_list_)
browser_list_->RemoveObserver(this);
}
void AllWebStateListObservationRegistrar::OnBrowserAdded(
const BrowserList* browser_list,
Browser* browser) {
if (mode_ & Mode::REGULAR)
scoped_observer_->Add(browser->GetWebStateList());
}
void AllWebStateListObservationRegistrar::OnIncognitoBrowserAdded(
const BrowserList* browser_list,
Browser* browser) {
if (mode_ & Mode::INCOGNITO)
scoped_observer_->Add(browser->GetWebStateList());
}
void AllWebStateListObservationRegistrar::OnBrowserRemoved(
const BrowserList* browser_list,
Browser* browser) {
if (mode_ & Mode::REGULAR)
scoped_observer_->Remove(browser->GetWebStateList());
}
void AllWebStateListObservationRegistrar::OnIncognitoBrowserRemoved(
const BrowserList* browser_list,
Browser* browser) {
if (mode_ & Mode::INCOGNITO)
scoped_observer_->Remove(browser->GetWebStateList());
}
void AllWebStateListObservationRegistrar::OnBrowserListShutdown(
BrowserList* browser_list) {
DCHECK_EQ(browser_list, browser_list_);
// Stop observing all observed web state lists.
if (mode_ & Mode::REGULAR) {
for (Browser* browser : browser_list_->AllRegularBrowsers()) {
scoped_observer_->Remove(browser->GetWebStateList());
}
}
if (mode_ & Mode::INCOGNITO) {
for (Browser* browser : browser_list_->AllIncognitoBrowsers()) {
scoped_observer_->Remove(browser->GetWebStateList());
}
}
// Stop observimg the browser list, and clear |browser_list_|.
browser_list_->RemoveObserver(this);
browser_list_ = nullptr;
}