blob: fb0a385d10d62482e83ff54ad0886043277adfbb [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync_sessions/test_synced_window_delegates_getter.h"
#include <vector>
#include "base/functional/bind.h"
#include "components/sessions/core/serialized_navigation_entry_test_helper.h"
#include "components/sync_sessions/synced_session.h"
#include "components/sync_sessions/tab_node_pool.h"
namespace sync_sessions {
namespace {
const char kTitle[] = "title";
} // namespace
TestSyncedTabDelegate::TestSyncedTabDelegate(
SessionID window_id,
SessionID tab_id,
const base::RepeatingCallback<void(SyncedTabDelegate*)>& notify_cb)
: window_id_(window_id), tab_id_(tab_id), notify_cb_(notify_cb) {}
TestSyncedTabDelegate::~TestSyncedTabDelegate() = default;
void TestSyncedTabDelegate::Navigate(const std::string& url,
base::Time time,
ui::PageTransition transition) {
sync_pb::TabNavigation tab_navigation;
tab_navigation.set_virtual_url(url);
tab_navigation.set_title(kTitle);
tab_navigation.set_global_id(time.ToInternalValue());
tab_navigation.set_unique_id(time.ToInternalValue());
tab_navigation.set_http_status_code(200);
auto entry = std::make_unique<sessions::SerializedNavigationEntry>(
SessionNavigationFromSyncData(0, tab_navigation));
sessions::SerializedNavigationEntryTestHelper::SetTimestamp(time,
entry.get());
sessions::SerializedNavigationEntryTestHelper::SetTransitionType(transition,
entry.get());
entries_.push_back(std::move(entry));
set_current_entry_index(GetCurrentEntryIndex() + 1);
notify_cb_.Run(this);
}
void TestSyncedTabDelegate::set_current_entry_index(int i) {
current_entry_index_ = i;
}
void TestSyncedTabDelegate::set_blocked_navigations(
const std::vector<std::unique_ptr<sessions::SerializedNavigationEntry>>&
navs) {
for (auto& entry : navs) {
blocked_navigations_.push_back(
std::make_unique<sessions::SerializedNavigationEntry>(*entry));
}
}
bool TestSyncedTabDelegate::IsInitialBlankNavigation() const {
// This differs from NavigationControllerImpl, which has an initial blank
// NavigationEntry.
return GetEntryCount() == 0;
}
int TestSyncedTabDelegate::GetCurrentEntryIndex() const {
return current_entry_index_;
}
GURL TestSyncedTabDelegate::GetVirtualURLAtIndex(int i) const {
if (static_cast<size_t>(i) >= entries_.size()) {
return GURL();
}
return entries_[i]->virtual_url();
}
void TestSyncedTabDelegate::GetSerializedNavigationAtIndex(
int i,
sessions::SerializedNavigationEntry* serialized_entry) const {
if (static_cast<size_t>(i) >= entries_.size()) {
return;
}
*serialized_entry = *entries_[i];
}
int TestSyncedTabDelegate::GetEntryCount() const {
return entries_.size();
}
SessionID TestSyncedTabDelegate::GetWindowId() const {
return window_id_;
}
SessionID TestSyncedTabDelegate::GetSessionId() const {
return tab_id_;
}
bool TestSyncedTabDelegate::IsBeingDestroyed() const {
return false;
}
base::Time TestSyncedTabDelegate::GetLastActiveTime() {
return base::Time::UnixEpoch();
}
std::string TestSyncedTabDelegate::GetExtensionAppId() const {
return std::string();
}
bool TestSyncedTabDelegate::ProfileHasChildAccount() const {
return has_child_account_;
}
void TestSyncedTabDelegate::set_has_child_account(bool has_child_account) {
has_child_account_ = has_child_account;
}
const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>*
TestSyncedTabDelegate::GetBlockedNavigations() const {
return &blocked_navigations_;
}
bool TestSyncedTabDelegate::IsPlaceholderTab() const {
return false;
}
bool TestSyncedTabDelegate::ShouldSync(SyncSessionsClient* sessions_client) {
// This is just a simple filter that isn't meant to fully reproduce
// the TabContentsTabDelegate's ShouldSync logic.
// Verify all URL's are valid (which will ignore an initial blank page) and
// that there is at least one http:// url.
int http_count = 0;
for (auto& entry : entries_) {
if (!entry->virtual_url().is_valid()) {
return false;
}
if (entry->virtual_url().SchemeIsHTTPOrHTTPS()) {
http_count++;
}
}
return http_count > 0;
}
int64_t TestSyncedTabDelegate::GetTaskIdForNavigationId(int nav_id) const {
// Task IDs are currently not used in the tests. -1 signals an unknown Task
// ID.
return -1;
}
int64_t TestSyncedTabDelegate::GetParentTaskIdForNavigationId(
int nav_id) const {
// Task IDs are currently not used in the tests. -1 signals an unknown Task
// ID.
return -1;
}
int64_t TestSyncedTabDelegate::GetRootTaskIdForNavigationId(int nav_id) const {
// Task IDs are currently not used in the tests. -1 signals an unknown Task
// ID.
return -1;
}
std::unique_ptr<SyncedTabDelegate>
TestSyncedTabDelegate::ReadPlaceholderTabSnapshotIfItShouldSync(
SyncSessionsClient* sessions_client) {
NOTREACHED();
}
PlaceholderTabDelegate::PlaceholderTabDelegate(SessionID tab_id)
: tab_id_(tab_id) {}
PlaceholderTabDelegate::~PlaceholderTabDelegate() = default;
SessionID PlaceholderTabDelegate::GetSessionId() const {
return tab_id_;
}
bool PlaceholderTabDelegate::IsPlaceholderTab() const {
return true;
}
void PlaceholderTabDelegate::SetPlaceholderTabSyncedTabDelegate(
std::unique_ptr<SyncedTabDelegate> delegate) {
placeholder_tab_synced_tab_delegate_ = std::move(delegate);
}
std::unique_ptr<SyncedTabDelegate>
PlaceholderTabDelegate::ReadPlaceholderTabSnapshotIfItShouldSync(
SyncSessionsClient* sessions_client) {
CHECK(placeholder_tab_synced_tab_delegate_);
return std::move(placeholder_tab_synced_tab_delegate_);
}
SessionID PlaceholderTabDelegate::GetWindowId() const {
NOTREACHED();
}
bool PlaceholderTabDelegate::IsBeingDestroyed() const {
NOTREACHED();
}
base::Time PlaceholderTabDelegate::GetLastActiveTime() {
NOTREACHED();
}
std::string PlaceholderTabDelegate::GetExtensionAppId() const {
NOTREACHED();
}
bool PlaceholderTabDelegate::IsInitialBlankNavigation() const {
NOTREACHED();
}
int PlaceholderTabDelegate::GetCurrentEntryIndex() const {
NOTREACHED();
}
int PlaceholderTabDelegate::GetEntryCount() const {
NOTREACHED();
}
GURL PlaceholderTabDelegate::GetVirtualURLAtIndex(int i) const {
NOTREACHED();
}
void PlaceholderTabDelegate::GetSerializedNavigationAtIndex(
int i,
sessions::SerializedNavigationEntry* serialized_entry) const {
NOTREACHED();
}
bool PlaceholderTabDelegate::ProfileHasChildAccount() const {
NOTREACHED();
}
const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>*
PlaceholderTabDelegate::GetBlockedNavigations() const {
NOTREACHED();
}
bool PlaceholderTabDelegate::ShouldSync(SyncSessionsClient* sessions_client) {
NOTREACHED();
}
int64_t PlaceholderTabDelegate::GetTaskIdForNavigationId(int nav_id) const {
// Task IDs are currently not used in the tests. -1 signals an unknown Task
// ID.
NOTREACHED() << "Task IDs are not used for Placeholder Tabs";
}
int64_t PlaceholderTabDelegate::GetParentTaskIdForNavigationId(
int nav_id) const {
// Task IDs are currently not used in the tests. -1 signals an unknown Task
// ID.
NOTREACHED() << "Task IDs are not used for Placeholder Tabs";
}
int64_t PlaceholderTabDelegate::GetRootTaskIdForNavigationId(int nav_id) const {
// Task IDs are currently not used in the tests. -1 signals an unknown Task
// ID.
NOTREACHED() << "Task IDs are not used for Placeholder Tabs";
}
TestSyncedWindowDelegate::TestSyncedWindowDelegate(
SessionID window_id,
sync_pb::SyncEnums_BrowserType type)
: window_id_(window_id),
window_type_(type),
is_session_restore_in_progress_(false) {}
TestSyncedWindowDelegate::~TestSyncedWindowDelegate() = default;
void TestSyncedWindowDelegate::OverrideTabAt(int index,
SyncedTabDelegate* delegate) {
if (index >= static_cast<int>(tab_delegates_.size())) {
tab_delegates_.resize(index + 1, nullptr);
}
tab_delegates_[index] = delegate;
}
void TestSyncedWindowDelegate::CloseTab(SessionID tab_id) {
std::erase_if(tab_delegates_, [tab_id](SyncedTabDelegate* tab) {
return tab->GetSessionId() == tab_id;
});
}
void TestSyncedWindowDelegate::SetIsSessionRestoreInProgress(bool value) {
is_session_restore_in_progress_ = value;
}
bool TestSyncedWindowDelegate::HasWindow() const {
return true;
}
SessionID TestSyncedWindowDelegate::GetSessionId() const {
return window_id_;
}
int TestSyncedWindowDelegate::GetTabCount() const {
return tab_delegates_.size();
}
bool TestSyncedWindowDelegate::IsTypeNormal() const {
return window_type_ == sync_pb::SyncEnums_BrowserType_TYPE_TABBED;
}
bool TestSyncedWindowDelegate::IsTypePopup() const {
return window_type_ == sync_pb::SyncEnums_BrowserType_TYPE_POPUP;
}
bool TestSyncedWindowDelegate::IsTabPinned(const SyncedTabDelegate* tab) const {
return false;
}
SyncedTabDelegate* TestSyncedWindowDelegate::GetTabAt(int index) const {
if (index >= static_cast<int>(tab_delegates_.size())) {
return nullptr;
}
return tab_delegates_[index];
}
SessionID TestSyncedWindowDelegate::GetTabIdAt(int index) const {
SyncedTabDelegate* delegate = GetTabAt(index);
if (!delegate) {
return SessionID::InvalidValue();
}
return delegate->GetSessionId();
}
bool TestSyncedWindowDelegate::IsSessionRestoreInProgress() const {
return is_session_restore_in_progress_;
}
bool TestSyncedWindowDelegate::ShouldSync() const {
return true;
}
TestSyncedWindowDelegatesGetter::TestSyncedWindowDelegatesGetter() = default;
TestSyncedWindowDelegatesGetter::~TestSyncedWindowDelegatesGetter() = default;
void TestSyncedWindowDelegatesGetter::ResetWindows() {
delegates_.clear();
windows_.clear();
}
TestSyncedWindowDelegate* TestSyncedWindowDelegatesGetter::AddWindow(
sync_pb::SyncEnums_BrowserType type,
SessionID window_id) {
windows_.push_back(
std::make_unique<TestSyncedWindowDelegate>(window_id, type));
CHECK_EQ(window_id, windows_.back()->GetSessionId());
delegates_[window_id] = windows_.back().get();
return windows_.back().get();
}
TestSyncedTabDelegate* TestSyncedWindowDelegatesGetter::AddTab(
SessionID window_id,
SessionID tab_id) {
tabs_.push_back(std::make_unique<TestSyncedTabDelegate>(
window_id, tab_id,
base::BindRepeating(&TestRouter::NotifyNav, base::Unretained(&router_))));
for (auto& window : windows_) {
if (window->GetSessionId() == window_id) {
int tab_index = window->GetTabCount();
window->OverrideTabAt(tab_index, tabs_.back().get());
}
}
// Simulate the browser firing a tab parented notification, ahead of actual
// navigations.
router_.NotifyNav(tabs_.back().get());
return tabs_.back().get();
}
void TestSyncedWindowDelegatesGetter::CloseTab(SessionID tab_id) {
for (auto& window : windows_) {
// CloseTab() will only take effect with the belonging window, the rest will
// simply ignore the call.
window->CloseTab(tab_id);
}
}
void TestSyncedWindowDelegatesGetter::SessionRestoreComplete() {
for (auto& window : windows_) {
window->SetIsSessionRestoreInProgress(false);
}
router_.NotifySessionRestoreComplete();
}
LocalSessionEventRouter* TestSyncedWindowDelegatesGetter::router() {
return &router_;
}
SyncedWindowDelegatesGetter::SyncedWindowDelegateMap
TestSyncedWindowDelegatesGetter::GetSyncedWindowDelegates() {
return delegates_;
}
const SyncedWindowDelegate* TestSyncedWindowDelegatesGetter::FindById(
SessionID session_id) {
for (const auto& [window_id, delegate] : delegates_) {
if (delegate->GetSessionId() == session_id) {
return delegate;
}
}
return nullptr;
}
TestSyncedWindowDelegatesGetter::TestRouter::TestRouter() = default;
TestSyncedWindowDelegatesGetter::TestRouter::~TestRouter() = default;
void TestSyncedWindowDelegatesGetter::TestRouter::StartRoutingTo(
LocalSessionEventHandler* handler) {
handler_ = handler;
}
void TestSyncedWindowDelegatesGetter::TestRouter::Stop() {
handler_ = nullptr;
}
void TestSyncedWindowDelegatesGetter::TestRouter::NotifyNav(
SyncedTabDelegate* tab) {
if (handler_) {
handler_->OnLocalTabModified(tab);
}
}
void TestSyncedWindowDelegatesGetter::TestRouter::
NotifySessionRestoreComplete() {
if (handler_) {
handler_->OnSessionRestoreComplete();
}
}
} // namespace sync_sessions