0

Migrate OnTask window tracker unit tests to browser tests

This change migrates the OnTask window tracker unit tests to browser
tests to ensure we are using a real browser implementation to test
window tracker behavior. Similar migration for the OnTask nav throttle
tests will follow in a separate CL.

Bug: b:388073477
Change-Id: Ie9f114bfefdc3a92c389f04da36b1a0f4ea6a707
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6168415
Reviewed-by: April Zhou <aprilzhou@google.com>
Reviewed-by: Luke Cao <caott@google.com>
Commit-Queue: Vignesh Shenvi <vshenvi@google.com>
Cr-Commit-Position: refs/heads/main@{#1407495}
This commit is contained in:
Vignesh Shenvi
2025-01-16 11:58:51 -08:00
committed by Chromium LUCI CQ
parent b8a71205a7
commit 4b51bb20a3
3 changed files with 982 additions and 808 deletions

@@ -110,6 +110,7 @@ source_set("browser_tests") {
"//chrome/browser/ash/boca",
"//chrome/browser/ui/ash/system_web_apps",
"//chrome/test:test_support",
"//chromeos/ash/components/boca",
"//chromeos/ash/components/boca/on_task",
"//chromeos/ash/components/boca/proto",
"//chromeos/ui/wm",

@@ -37,20 +37,13 @@ using ::testing::Return;
namespace {
constexpr char kTabUrl1[] = "http://example.com";
constexpr char kTabUrl1SubDomain1[] = "http://example.child.com";
constexpr char kTabUrl1SubDomain2[] = "http://example.b.com";
constexpr char kTabUrl1FrontSubDomain1[] = "http://sub.example.com";
constexpr char kTabUrl1WithPath[] = "http://example.child.com/random/path/";
constexpr char kTabUrl1WithSubPage[] = "http://example.com/blah-blah";
constexpr char kTabUrl1WithRandomQuery[] =
"http://example.child.com/q?randomness";
constexpr char kTabUrl1DomainRedirect[] =
"http://example.child.com/redirected/url/path.html";
constexpr char kTabUrlRedirectedUrl[] = "http://redirect-url.com/q?randomness";
constexpr char kTabUrl2[] = "http://company.org";
constexpr char kTabUrl2SubDomain1[] = "http://company.a.org";
constexpr char kTabGoogleUrl[] = "http://google.com";
constexpr char kTabDocsUrl[] = "http://docs.google.com";
constexpr char kTabGooglePath[] = "http://google.com/blah-blah";
} // namespace
@@ -88,14 +81,18 @@ class FakeOnTaskNotificationsManagerDelegate
std::set<std::string> notifications_shown_;
};
// TODO(b/36741761): Migrate to browser test.
// TODO(b/36741761): Refactor existing browser init timing after migrate to
// browser test, right now it's very hard to tell when does tab strip update
// happens.
class OnTaskLockedSessionWindowTrackerTest : public BrowserWithTestWindowTest {
// TODO(crbug.com/384769231) - Migrate nav throttle unit tests to browser tests.
class OnTaskNavigationThrottleTest : public BrowserWithTestWindowTest {
protected:
OnTaskNavigationThrottleTest() {
scoped_feature_list_.InitWithFeatures(
/*enabled_features=*/{ash::features::kBoca,
ash::features::kBocaConsumer},
/*disabled_features=*/{});
}
void SetUp() override {
// TODO(crbug.com/36741761): Change this to regular mock when remigrated to
// TODO(crbug.com/384769231): Change this to regular mock when remigrated to
// browser test.
ON_CALL(boca_window_observer_, OnActiveTabChanged(_))
.WillByDefault(Return());
@@ -156,703 +153,6 @@ class OnTaskLockedSessionWindowTrackerTest : public BrowserWithTestWindowTest {
BrowserWithTestWindowTest::TearDown();
}
protected:
raw_ptr<FakeOnTaskNotificationsManagerDelegate>
fake_notifications_delegate_ptr_;
NiceMock<MockBocaWindowObserver> boca_window_observer_;
};
TEST_F(OnTaskLockedSessionWindowTrackerTest, RegisterUrlsAndRestrictionLevels) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_b(kTabUrl2);
const GURL url_a_subdomain(kTabUrl1SubDomain1);
const GURL url_b_subdomain(kTabUrl2SubDomain1);
const GURL url_a_subdomain2(kTabUrl1SubDomain2);
AddTab(browser(), url_a);
AddTab(browser(), url_b);
AddTab(browser(), url_a_subdomain);
AddTab(browser(), url_b_subdomain);
AddTab(browser(), url_a_subdomain2);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(4), url_a,
LockedNavigationOptions::OPEN_NAVIGATION);
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(3), url_b,
LockedNavigationOptions::BLOCK_NAVIGATION);
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(2), url_a_subdomain,
LockedNavigationOptions::DOMAIN_NAVIGATION);
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(1), url_b_subdomain,
LockedNavigationOptions::LIMITED_NAVIGATION);
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_a_subdomain2,
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 5u);
EXPECT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(4))],
LockedNavigationOptions::OPEN_NAVIGATION);
EXPECT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(3))],
LockedNavigationOptions::BLOCK_NAVIGATION);
EXPECT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(2))],
LockedNavigationOptions::DOMAIN_NAVIGATION);
EXPECT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(1))],
LockedNavigationOptions::LIMITED_NAVIGATION);
EXPECT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
EXPECT_EQ(on_task_blocklist->one_level_deep_original_url().size(), 2u);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
RegisterChildUrlsWithRestrictions) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_a_child(kTabUrl1SubDomain1);
AddTab(browser(), url_a);
AddTab(browser(), url_a_child);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(1), url_a,
LockedNavigationOptions::OPEN_NAVIGATION);
on_task_blocklist->MaybeSetURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_a_child,
LockedNavigationOptions::LIMITED_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 1u);
ASSERT_EQ(on_task_blocklist->child_tab_to_nav_filters().size(), 1u);
EXPECT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(1))],
LockedNavigationOptions::OPEN_NAVIGATION);
EXPECT_EQ(
on_task_blocklist
->child_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::LIMITED_NAVIGATION);
EXPECT_EQ(on_task_blocklist->one_level_deep_original_url().size(), 1u);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
NavigateCurrentTabWithMultipleRestrictionsMaintainTabRestrictions) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url(kTabUrl1);
const GURL url_subdomain(kTabUrl1SubDomain1);
const GURL url_with_query(kTabUrl1WithRandomQuery);
const GURL url_with_path(kTabUrl1WithPath);
AddTab(browser(), url_subdomain);
AddTab(browser(), url);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url,
LockedNavigationOptions::OPEN_NAVIGATION);
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(1), url_subdomain,
LockedNavigationOptions::BLOCK_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 2u);
ASSERT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::OPEN_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
on_task_blocklist->MaybeSetURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(1), url_subdomain,
LockedNavigationOptions::BLOCK_NAVIGATION);
NavigateAndCommitActiveTab(url_subdomain);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
NavigateAndCommitActiveTab(url_with_query);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
NavigateAndCommitActiveTab(url_with_path);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest, NavigateNonParentTab) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url(kTabUrl1);
const GURL url_subdomain(kTabUrl1SubDomain1);
const GURL url_with_query(kTabUrl1WithRandomQuery);
const GURL url_with_path(kTabUrl1WithPath);
AddTab(browser(), url_subdomain);
AddTab(browser(), url);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url,
LockedNavigationOptions::OPEN_NAVIGATION);
on_task_blocklist->MaybeSetURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(1), url_subdomain,
LockedNavigationOptions::BLOCK_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 1u);
ASSERT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::OPEN_NAVIGATION);
ASSERT_EQ(on_task_blocklist->child_tab_to_nav_filters().size(), 1u);
ASSERT_EQ(
on_task_blocklist
->child_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(1))],
LockedNavigationOptions::BLOCK_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
task_environment()->RunUntilIdle();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
browser()->tab_strip_model()->ActivateTabAt(1);
task_environment()->RunUntilIdle();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::BLOCK_NAVIGATION);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
NavigateCurrentTabWithNewRestrictedLevelFromRedirectUrl) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url(kTabUrl1);
const GURL url_subdomain(kTabUrl1SubDomain1);
AddTab(browser(), url);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url,
LockedNavigationOptions::OPEN_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 1u);
ASSERT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::OPEN_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
NavigateAndCommitActiveTab(url_subdomain);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
const GURL url_redirect(kTabUrlRedirectedUrl);
NavigateAndCommitActiveTab(url_redirect);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
NavigateCurrentTabThatSpawnsNewTab) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url(kTabUrl1);
const GURL url_subdomain(kTabUrl1SubDomain1);
AddTab(browser(), url);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url,
LockedNavigationOptions::LIMITED_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 1u);
ASSERT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::LIMITED_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::LIMITED_NAVIGATION);
const SessionID active_tab_id = sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0));
EXPECT_CALL(boca_window_observer_,
OnTabAdded(active_tab_id, _, url_subdomain))
.Times(1);
AddTab(browser(), url_subdomain);
const GURL url_redirect(kTabUrl1DomainRedirect);
NavigateAndCommitActiveTab(url_redirect);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::BLOCK_NAVIGATION);
// Sanity check to make sure child tabs aren't added as parent tabs.
EXPECT_FALSE(
on_task_blocklist->IsParentTab(tab_strip_model->GetWebContentsAt(0)));
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
NavigateCurrentTabWithSameDomainAndOneLevelDeepFromRedirectUrl) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url(kTabUrl1);
const GURL url_subdomain(kTabUrl1SubDomain1);
const GURL url_with_query(kTabUrl1WithRandomQuery);
AddTab(browser(), url_subdomain);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_subdomain,
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
ASSERT_EQ(on_task_blocklist->parent_tab_to_nav_filters().size(), 1u);
ASSERT_EQ(
on_task_blocklist
->parent_tab_to_nav_filters()[sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0))],
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
NavigateAndCommitActiveTab(url);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
const GURL url_redirect(kTabUrl1DomainRedirect);
NavigateAndCommitActiveTab(url_redirect);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
const GURL url_redirect_not_same_domain(kTabUrlRedirectedUrl);
NavigateAndCommitActiveTab(url_redirect_not_same_domain);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::
SAME_DOMAIN_OPEN_OTHER_DOMAIN_LIMITED_NAVIGATION);
const SessionID active_tab_id = sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0));
EXPECT_CALL(boca_window_observer_, OnTabAdded(active_tab_id, _, url_redirect))
.Times(1);
// Redirect happens in a new tab.
AddTab(browser(), url_redirect);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
NavigateAndCommitActiveTab(url_redirect_not_same_domain);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::BLOCK_NAVIGATION);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest, SwitchTabWithNewRestrictedLevel) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_b(kTabUrl2);
// Add Tab inserts tab at the 0th index.
AddTab(browser(), url_a);
AddTab(browser(), url_b);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(1), url_a,
LockedNavigationOptions::OPEN_NAVIGATION);
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_b,
LockedNavigationOptions::BLOCK_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::BLOCK_NAVIGATION);
browser()->tab_strip_model()->ActivateTabAt(1);
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
BlockUrlSuccessfullyForLimitedNav) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_b(kTabUrl2);
const GURL url_c(kTabUrl1WithSubPage);
AddTab(browser(), url_a);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_a,
LockedNavigationOptions::BLOCK_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
task_environment()->RunUntilIdle();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::BLOCK_NAVIGATION);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_b),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_c),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
AllowAndBlockUrlSuccessfullyForSameDomainNav) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_a_front_subdomain(kTabUrl1FrontSubDomain1);
const GURL url_a_subpage(kTabUrl1WithSubPage);
const GURL url_a_subdomain_page(kTabUrl1WithPath);
const GURL url_a_subdomain(kTabUrl1SubDomain1);
const GURL url_b(kTabUrl2);
AddTab(browser(), url_a);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_a,
LockedNavigationOptions::DOMAIN_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
task_environment()->RunUntilIdle();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::DOMAIN_NAVIGATION);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_front_subdomain),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_subpage),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_subdomain),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_subdomain_page),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_b),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
AllowUrlSuccessfullyForUnrestrictedNav) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_a_front_subdomain(kTabUrl1FrontSubDomain1);
const GURL url_a_path(kTabUrl1WithPath);
const GURL url_a_subdomain(kTabUrl1SubDomain1);
const GURL url_b(kTabUrl2);
AddTab(browser(), url_a);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), url_a,
LockedNavigationOptions::OPEN_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
task_environment()->RunUntilIdle();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::OPEN_NAVIGATION);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_front_subdomain),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_path),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_a_subdomain),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_b),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
AllowAndBlockUrlSuccessfullyForGoogleSameDomainNav) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL google_url(kTabGoogleUrl);
const GURL docs_url(kTabDocsUrl);
const GURL random_google_url(kTabGooglePath);
const GURL url_b(kTabUrl1SubDomain1);
const GURL not_google_url(kTabUrl2);
AddTab(browser(), google_url);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
on_task_blocklist->SetParentURLRestrictionLevel(
tab_strip_model->GetWebContentsAt(0), google_url,
LockedNavigationOptions::DOMAIN_NAVIGATION);
window_tracker->RefreshUrlBlocklist();
task_environment()->RunUntilIdle();
EXPECT_EQ(on_task_blocklist->current_page_restriction_level(),
LockedNavigationOptions::DOMAIN_NAVIGATION);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(docs_url),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(random_google_url),
policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(url_b),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
EXPECT_EQ(on_task_blocklist->GetURLBlocklistState(not_google_url),
policy::URLBlocklist::URLBlocklistState::URL_IN_BLOCKLIST);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
NewBrowserWindowsDontOpenDuringLockedFullscreen) {
// Set up relevant features for browser instance observation.
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeatures(
/*enabled_features=*/{ash::features::kBoca, ash::features::kBocaConsumer},
/*disabled_features=*/{});
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
ash::TestWindowBuilder builder;
const std::unique_ptr<aura::Window> native_window =
builder.SetTestWindowDelegate().AllowAllWindowStates().Build();
static_cast<TestBrowserWindow*>(window())->SetNativeWindow(
native_window.get());
PinWindow(window()->GetNativeWindow(), /*trusted=*/true);
window_tracker->InitializeBrowserInfoForTracking(browser());
const std::unique_ptr<Browser> normal_browser(
CreateTestBrowser(/*popup=*/false));
ASSERT_TRUE(base::test::RunUntil(
[&normal_browser]() { return normal_browser != nullptr; }));
EXPECT_TRUE(
static_cast<TestBrowserWindow*>(normal_browser->window())->IsClosed());
}
TEST_F(OnTaskLockedSessionWindowTrackerTest,
NewBrowserWindowsCanOpenDuringUnlockedSession) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
ash::TestWindowBuilder builder;
const std::unique_ptr<aura::Window> native_window =
builder.SetTestWindowDelegate().AllowAllWindowStates().Build();
static_cast<TestBrowserWindow*>(window())->SetNativeWindow(
native_window.get());
PinWindow(window()->GetNativeWindow(), /*trusted=*/false);
window_tracker->InitializeBrowserInfoForTracking(browser());
const std::unique_ptr<Browser> normal_browser(
CreateTestBrowser(/*popup=*/false));
ASSERT_TRUE(base::test::RunUntil(
[&normal_browser]() { return normal_browser != nullptr; }));
EXPECT_FALSE(
static_cast<TestBrowserWindow*>(normal_browser->window())->IsClosed());
}
TEST_F(OnTaskLockedSessionWindowTrackerTest, NewBrowserPopupIsRegistered) {
// Set up relevant features for browser instance observation.
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeatures(
/*enabled_features=*/{ash::features::kBoca, ash::features::kBocaConsumer},
/*disabled_features=*/{});
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
window_tracker->InitializeBrowserInfoForTracking(browser());
const std::unique_ptr<Browser> popup_browser(
CreateTestBrowser(/*popup=*/true));
EXPECT_EQ(BrowserList::GetInstance()->size(), 2u);
EXPECT_FALSE(
static_cast<TestBrowserWindow*>(popup_browser->window())->IsClosed());
EXPECT_FALSE(window_tracker->CanOpenNewPopup());
popup_browser->OnWindowClosing();
EXPECT_TRUE(window_tracker->CanOpenNewPopup());
}
TEST_F(OnTaskLockedSessionWindowTrackerTest, BrowserClose) {
// Set up relevant features for browser instance observation.
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeatures(
/*enabled_features=*/{ash::features::kBoca, ash::features::kBocaConsumer},
/*disabled_features=*/{});
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_a_child(kTabUrl1SubDomain1);
AddTab(browser(), url_a);
AddTab(browser(), url_a_child);
EXPECT_EQ(browser()->tab_strip_model()->count(), 2);
ash::TestWindowBuilder builder;
const std::unique_ptr<aura::Window> native_window =
builder.SetTestWindowDelegate().AllowAllWindowStates().Build();
static_cast<TestBrowserWindow*>(window())->SetNativeWindow(
native_window.get());
PinWindow(window()->GetNativeWindow(), /*trusted=*/true);
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
browser()->OnWindowClosing();
ASSERT_TRUE(base::test::RunUntil(
[&window_tracker]() { return !window_tracker->browser(); }));
EXPECT_FALSE(window_tracker->browser());
}
TEST_F(OnTaskLockedSessionWindowTrackerTest, BrowserTrackingOverride) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const std::unique_ptr<Browser> normal_browser(
CreateTestBrowser(/*popup=*/false));
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
window_tracker->InitializeBrowserInfoForTracking(normal_browser.get());
ASSERT_NE(window_tracker->browser(), browser());
EXPECT_EQ(window_tracker->browser(), normal_browser.get());
// Set back to nullptr so during tear down we are not accessing a deleted
// normal_browser ptr. Since normal_browser is created only in the lifetime of
// this one unittest, and we set the window_tracker to track this, by the time
// tear down is called, normal_browser ptr is freed, but there is still a ref
// to that ptr by the window_tracker during tear down.
window_tracker->InitializeBrowserInfoForTracking(nullptr);
}
TEST_F(OnTaskLockedSessionWindowTrackerTest, ObserveAddTabAndRemoveTab) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url_a(kTabUrl1);
const GURL url_b(kTabUrl2);
AddTab(browser(), url_a);
window_tracker->InitializeBrowserInfoForTracking(browser());
ASSERT_EQ(window_tracker->browser(), browser());
auto* const tab_strip_model = browser()->tab_strip_model();
const SessionID active_tab_id = sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0));
EXPECT_CALL(boca_window_observer_, OnTabAdded(active_tab_id, _, url_b))
.Times(1);
AddTab(browser(), url_b);
// Sanity check to make sure child tabs aren't added as parent tabs.
auto* const on_task_blocklist = window_tracker->on_task_blocklist();
EXPECT_FALSE(
on_task_blocklist->IsParentTab(tab_strip_model->GetWebContentsAt(0)));
const SessionID tab_id = sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0));
EXPECT_CALL(boca_window_observer_, OnTabRemoved(tab_id)).Times(1);
tab_strip_model->DetachAndDeleteWebContentsAt(0);
}
// TODO(crbug.com/36741761):An example test case to add when we switch to
// browser test, currently disabled due to cause test flakiness, once migrated
// need to rework all test cases to add observer assertion too.
TEST_F(OnTaskLockedSessionWindowTrackerTest,
DISABLED_NavigateAndTriggerActiveTabUpdated) {
CreateWindowTrackerServiceForTesting();
auto* const window_tracker =
LockedSessionWindowTrackerFactory::GetForBrowserContext(profile());
const GURL url(kTabUrl1);
const GURL url_subdomain(kTabUrl1SubDomain1);
const auto* const tab_strip_model = browser()->tab_strip_model();
window_tracker->InitializeBrowserInfoForTracking(browser());
EXPECT_CALL(boca_window_observer_, OnActiveTabChanged(_)).Times(1);
const SessionID active_tab_id = sessions::SessionTabHelper::IdForTab(
tab_strip_model->GetWebContentsAt(0));
EXPECT_CALL(boca_window_observer_,
OnTabAdded(active_tab_id, _, url_subdomain))
.Times(1);
AddTab(browser(), url_subdomain);
const GURL url_redirect(kTabUrl1DomainRedirect);
NavigateAndCommitActiveTab(url_redirect);
browser()->tab_strip_model()->UpdateWebContentsStateAt(0,
TabChangeType::kAll);
}
class OnTaskNavigationThrottleTest
: public OnTaskLockedSessionWindowTrackerTest {
protected:
OnTaskNavigationThrottleTest() {
scoped_feature_list_.InitWithFeatures(
/*enabled_features=*/{ash::features::kBoca,
ash::features::kBocaConsumer},
/*disabled_features=*/{});
}
std::unique_ptr<content::NavigationSimulator> StartNavigation(
const GURL& first_url,
content::RenderFrameHost* rfh) {
@@ -862,7 +162,9 @@ class OnTaskNavigationThrottleTest
return simulator;
}
private:
raw_ptr<FakeOnTaskNotificationsManagerDelegate>
fake_notifications_delegate_ptr_;
NiceMock<MockBocaWindowObserver> boca_window_observer_;
base::test::ScopedFeatureList scoped_feature_list_;
};