blob: 068412db6a943bb9ea12749fe55d0d1f704252a9 [file] [log] [blame]
// Copyright 2012 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/tab_contents/tab_contents_iterator.h"
#include <optional>
#include "base/check.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
// This does not create a useful iterator, but providing a default constructor
// is required for forward iterators by the C++ spec.
AllTabContentsesList::Iterator::Iterator() : Iterator(true) {}
AllTabContentsesList::Iterator::Iterator(bool is_end_iter)
: cur_(nullptr),
browser_iterator_(BrowserList::GetInstance()->begin()),
tab_iterator_(std::nullopt) {
if (!is_end_iter &&
(browser_iterator_ != BrowserList::GetInstance()->end())) {
// Load the first WebContents into |cur_|.
Next();
}
}
AllTabContentsesList::Iterator::Iterator(const Iterator& iterator) = default;
AllTabContentsesList::Iterator::~Iterator() = default;
void AllTabContentsesList::Iterator::Next() {
// The current WebContents should be valid unless we are at the beginning.
DCHECK(cur_ || (browser_iterator_ != BrowserList::GetInstance()->end()))
<< "Trying to advance past the end";
// Update |cur_| to the next WebContents in the list.
while (browser_iterator_ != BrowserList::GetInstance()->end()) {
if (!tab_iterator_.has_value()) {
tab_iterator_ = (*browser_iterator_)->tab_strip_model()->begin();
}
if (tab_iterator_ != (*browser_iterator_)->tab_strip_model()->end()) {
cur_ = tab_iterator_.value()->GetContents();
// Increment by reference has better performance.
++(tab_iterator_.value());
return;
} else {
tab_iterator_ = std::nullopt;
browser_iterator_++;
}
}
// Reached the end.
cur_ = nullptr;
}
const AllTabContentsesList& AllTabContentses() {
static const AllTabContentsesList all_tabs;
return all_tabs;
}