blob: 81931b8ac7169551144e66b84cb3fe70b87e8e69 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/browser_window/public/browser_collection.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ui/browser_window/public/browser_collection_observer.h"
namespace {
// Iterates through all browsers in `collection` present at construction time,
// accounting for Browsers that may be destroyed mid-iteration.
class BrowserCollectionEnumerator : public BrowserCollectionObserver {
public:
BrowserCollectionEnumerator(BrowserCollection* collection,
BrowserCollection::BrowserVector browsers)
: browsers_(std::move(browsers)) {
browser_collection_observer_.Observe(collection);
}
BrowserCollectionEnumerator(const BrowserCollectionEnumerator&) = delete;
BrowserCollectionEnumerator& operator=(const BrowserCollectionEnumerator&) =
delete;
~BrowserCollectionEnumerator() override = default;
void ForEach(base::FunctionRef<bool(BrowserWindowInterface*)> on_browser) {
for (size_t index = 0; index < browsers_.size(); index++) {
if (browsers_[index] && !on_browser(browsers_[index])) {
return;
}
}
}
private:
// BrowserCollectionObserver:
void OnBrowserClosed(BrowserWindowInterface* browser) override {
// Nullify the closed browser to ensure we skip over it during iteration.
auto it = std::ranges::find(browsers_, browser);
if (it != browsers_.end()) {
*it = nullptr;
}
}
BrowserCollection::BrowserVector browsers_;
base::ScopedObservation<BrowserCollection, BrowserCollectionObserver>
browser_collection_observer_{this};
};
} // namespace
BrowserCollection::BrowserCollection() = default;
BrowserCollection::~BrowserCollection() = default;
void BrowserCollection::ForEach(
base::FunctionRef<bool(BrowserWindowInterface*)> on_browser,
Order order) {
BrowserCollectionEnumerator(this, GetBrowsers(order)).ForEach(on_browser);
}
void BrowserCollection::AddObserver(BrowserCollectionObserver* observer) {
observers_.AddObserver(observer);
}
void BrowserCollection::RemoveObserver(BrowserCollectionObserver* observer) {
observers_.RemoveObserver(observer);
}