This information is not to be retrieved with the `TabUIHelper`. Chromium changes: https://chromium.googlesource.com/chromium/src/+/79b6f0c7d59514e77293ea1ac57d079d3c0adf4e commit 79b6f0c7d59514e77293ea1ac57d079d3c0adf4e Author: Steven Luong <stluong@chromium.org> Date: Wed Feb 18 12:55:46 2026 -0800 [TabRendererData] Move themify and show icon to TabUIHelper Move favicon related properties to be calculated in the TabUIHelper so that the TabRendererData will be easier to deprecate. Bug: 484410926 Change-Id: I0de4e22d4f80ddb2980a166539f85d44af66a271 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7584127 Commit-Queue: Steven Luong <stluong@chromium.org> Reviewed-by: Eshwar Stalin <estalin@chromium.org> Reviewed-by: Darryl James <dljames@chromium.org> Cr-Commit-Position: refs/heads/main@{#1586641}
338 lines
14 KiB
C++
338 lines
14 KiB
C++
/* Copyright (c) 2021 The Brave Authors. All rights reserved.
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "brave/browser/ui/brave_browser.h"
|
|
|
|
#include "base/test/run_until.h"
|
|
#include "brave/browser/ui/browser_commands.h"
|
|
#include "brave/components/constants/pref_names.h"
|
|
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
|
|
#include "chrome/browser/devtools/devtools_window_testing.h"
|
|
#include "chrome/browser/profiles/profile.h"
|
|
#include "chrome/browser/search/search.h"
|
|
#include "chrome/browser/ui/browser_commands.h"
|
|
#include "chrome/browser/ui/browser_finder.h"
|
|
#include "chrome/browser/ui/browser_tabstrip.h"
|
|
#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
|
|
#include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
|
|
#include "chrome/browser/ui/startup/launch_mode_recorder.h"
|
|
#include "chrome/browser/ui/startup/startup_browser_creator.h"
|
|
#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
|
|
#include "chrome/browser/ui/tab_ui_helper.h"
|
|
#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
|
#include "chrome/browser/ui/views/frame/browser_view.h"
|
|
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
|
|
#include "chrome/test/base/in_process_browser_test.h"
|
|
#include "chrome/test/base/ui_test_utils.h"
|
|
#include "components/bookmarks/browser/bookmark_model.h"
|
|
#include "components/bookmarks/browser/bookmark_utils.h"
|
|
#include "components/bookmarks/common/bookmark_pref_names.h"
|
|
#include "components/optimization_guide/optimization_guide_internals/webui/url_constants.h"
|
|
#include "components/prefs/pref_service.h"
|
|
#include "content/public/browser/navigation_entry.h"
|
|
#include "content/public/test/browser_test.h"
|
|
#include "content/public/test/browser_test_utils.h"
|
|
#include "content/public/test/test_navigation_observer.h"
|
|
#include "content/public/test/test_utils.h"
|
|
|
|
using BraveBrowserBrowserTest = InProcessBrowserTest;
|
|
|
|
namespace {
|
|
|
|
Browser* OpenNewBrowser(Profile* profile) {
|
|
base::CommandLine dummy(base::CommandLine::NO_PROGRAM);
|
|
StartupBrowserCreatorImpl creator(base::FilePath(), dummy,
|
|
chrome::startup::IsFirstRun::kYes);
|
|
creator.Launch(profile, chrome::startup::IsProcessStartup::kNo,
|
|
/*restore_tabbed_browser=*/true);
|
|
return chrome::FindBrowserWithProfile(profile);
|
|
}
|
|
|
|
void AddBookmarkNode(Profile* profile) {
|
|
const GURL url = GURL("https://www.brave.com");
|
|
bookmarks::BookmarkModel* bookmark_model =
|
|
BookmarkModelFactory::GetForBrowserContext(profile);
|
|
|
|
std::vector<raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>>
|
|
nodes = bookmark_model->GetNodesByURL(url);
|
|
EXPECT_EQ(0UL, nodes.size());
|
|
|
|
// We need to pass a non-empty title when creating a bookmark so that an
|
|
// accessible name is also available, otherwise we'll hit a CHECK() and
|
|
// the test will crash (see accessibility_paint_checks.cc).
|
|
bookmarks::AddIfNotBookmarked(bookmark_model, url, u"brave");
|
|
nodes = bookmark_model->GetNodesByURL(url);
|
|
EXPECT_EQ(1UL, nodes.size());
|
|
}
|
|
|
|
} // namespace
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest, NTPFaviconTest) {
|
|
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("brave://newtab/")));
|
|
|
|
tabs::TabInterface* const tab_interface =
|
|
browser()->tab_strip_model()->GetActiveTab();
|
|
EXPECT_TRUE(TabUIHelper::From(tab_interface)->ShouldDisplayFavicon());
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest, LoadWebUIURLWithBadSchemeTest) {
|
|
ASSERT_TRUE(
|
|
ui_test_utils::NavigateToURL(browser(), GURL("http://settings/")));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest, DisabledFeatureURLLoadTest) {
|
|
// We disabled optimization hints but loading related url should not be
|
|
// crashed. See https://bugs.chromium.org/p/chromium/issues/detail?id=1476101
|
|
ASSERT_TRUE(ui_test_utils::NavigateToURL(
|
|
browser(), GURL(content::GetWebUIURLString(
|
|
optimization_guide_internals::
|
|
kChromeUIOptimizationGuideInternalsHost))));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest, OpenNewTabWhenTabStripIsEmpty) {
|
|
ASSERT_TRUE(embedded_test_server()->Start());
|
|
Browser* new_browser = OpenNewBrowser(browser()->profile());
|
|
ASSERT_TRUE(new_browser);
|
|
new_browser->profile()->GetPrefs()->SetBoolean(kEnableClosingLastTab, false);
|
|
TabStripModel* tab_strip = new_browser->tab_strip_model();
|
|
auto page_url = embedded_test_server()->GetURL("/empty.html");
|
|
ASSERT_TRUE(ui_test_utils::NavigateToURL(new_browser, page_url));
|
|
|
|
ASSERT_EQ(1, tab_strip->count());
|
|
EXPECT_EQ(page_url,
|
|
tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
|
|
auto* devtools_window = DevToolsWindowTesting::OpenDevToolsWindowSync(
|
|
tab_strip->GetActiveWebContents(), false);
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 3u);
|
|
|
|
// Close the last tab.
|
|
tab_strip->GetActiveWebContents()->Close();
|
|
|
|
ui_test_utils::WaitForBrowserToClose(
|
|
DevToolsWindowTesting::Get(devtools_window)->browser());
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 2u);
|
|
ASSERT_EQ(1, tab_strip->count());
|
|
|
|
// Expecting a new tab is opened.
|
|
EXPECT_EQ(new_browser->GetNewTabURL(),
|
|
tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
|
|
// No reentrancy for Ctrl+W
|
|
tab_strip->CloseSelectedTabs();
|
|
base::RunLoop().RunUntilIdle();
|
|
// Expecting a new tab is opened.
|
|
EXPECT_EQ(new_browser->GetNewTabURL(),
|
|
tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
|
|
|
|
// Add a couple of more tabs.
|
|
chrome::AddTabAt(new_browser, new_browser->GetNewTabURL(), -1, true);
|
|
chrome::AddTabAt(new_browser, new_browser->GetNewTabURL(), -1, true);
|
|
ASSERT_EQ(3, tab_strip->count());
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 2u);
|
|
// Close the browser window.
|
|
new_browser->window()->Close();
|
|
base::RunLoop().RunUntilIdle();
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 1u);
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest,
|
|
DoNotOpenNewTabWhenTabStripIsEmpty) {
|
|
ASSERT_TRUE(embedded_test_server()->Start());
|
|
Browser* new_browser = OpenNewBrowser(browser()->profile());
|
|
ASSERT_TRUE(new_browser);
|
|
new_browser->profile()->GetPrefs()->SetBoolean(kEnableClosingLastTab, true);
|
|
TabStripModel* tab_strip = new_browser->tab_strip_model();
|
|
auto page_url = embedded_test_server()->GetURL("/empty.html");
|
|
ASSERT_TRUE(ui_test_utils::NavigateToURL(new_browser, page_url));
|
|
|
|
ASSERT_EQ(1, tab_strip->count());
|
|
EXPECT_EQ(page_url,
|
|
tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 2u);
|
|
// Close the last tab.
|
|
tab_strip->GetActiveWebContents()->Close();
|
|
base::RunLoop().RunUntilIdle();
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 1u);
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest,
|
|
DoNotOpenNewTabWhenBringingAllTabs) {
|
|
// Given that kEnableClosingLastTab is false, which normally creates a new tab
|
|
// when tab strip is empty.
|
|
ASSERT_TRUE(embedded_test_server()->Start());
|
|
Browser* new_browser = OpenNewBrowser(browser()->profile());
|
|
ASSERT_TRUE(new_browser);
|
|
new_browser->profile()->GetPrefs()->SetBoolean(kEnableClosingLastTab, false);
|
|
|
|
// When "Bring all tabs to this window" commands executes
|
|
brave::BringAllTabs(browser());
|
|
|
|
// Then other windows should be closed
|
|
base::RunLoop().RunUntilIdle();
|
|
EXPECT_EQ(browser()->tab_strip_model()->count(), 2);
|
|
EXPECT_EQ(chrome::GetTotalBrowserCount(), 1u);
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest,
|
|
CloseBrowserAfterDetachingAllTabToAnotherBrowser) {
|
|
browser()->profile()->GetPrefs()->SetBoolean(kEnableClosingLastTab, false);
|
|
Browser* browser2 = CreateBrowser(browser()->profile());
|
|
ASSERT_TRUE(browser2);
|
|
|
|
TabStripModel* tab_strip = browser()->tab_strip_model();
|
|
TabStripModel* tab_strip2 = browser2->tab_strip_model();
|
|
|
|
// New browser has one tab and it'll be attached to browser() and |browser2|
|
|
// should be gone.
|
|
EXPECT_EQ(1, tab_strip2->count());
|
|
auto detached_tab = tab_strip2->DetachTabAtForInsertion(0);
|
|
tab_strip->InsertDetachedTabAt(0, std::move(detached_tab),
|
|
AddTabTypes::ADD_ACTIVE);
|
|
EXPECT_TRUE(
|
|
base::test::RunUntil([] { return chrome::GetTotalBrowserCount() == 1; }));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest,
|
|
CreateAnotherWindowWithExistingTab) {
|
|
ASSERT_TRUE(embedded_test_server()->Start());
|
|
browser()->profile()->GetPrefs()->SetBoolean(kEnableClosingLastTab, false);
|
|
TabStripModel* tab_strip = browser()->tab_strip_model();
|
|
|
|
auto page_url = embedded_test_server()->GetURL("/empty.html");
|
|
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), page_url));
|
|
|
|
ASSERT_EQ(1, tab_strip->count());
|
|
EXPECT_EQ(page_url,
|
|
tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
|
|
|
|
// Close the last tab.
|
|
tab_strip->GetActiveWebContents()->Close();
|
|
ASSERT_EQ(0, tab_strip->count());
|
|
|
|
// Wait till another new tab is opened.
|
|
EXPECT_TRUE(
|
|
base::test::RunUntil([tab_strip] { return tab_strip->count() == 1; }));
|
|
EXPECT_EQ(browser()->GetNewTabURL(),
|
|
tab_strip->GetWebContentsAt(0)->GetURL().possibly_invalid_spec());
|
|
|
|
ui_test_utils::NavigateToURLWithDisposition(
|
|
browser(), GURL("https://www.brave.com/"),
|
|
WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
|
ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
|
|
ASSERT_EQ(2, tab_strip->count());
|
|
|
|
// Create another browser with existing tab.
|
|
ui_test_utils::BrowserCreatedObserver browser_created_observer;
|
|
chrome::MoveTabsToNewWindow(browser(), {1});
|
|
Browser* new_browser = browser_created_observer.Wait();
|
|
ASSERT_EQ(1, tab_strip->count());
|
|
|
|
ASSERT_TRUE(new_browser);
|
|
base::RunLoop().RunUntilIdle();
|
|
|
|
// Check new browser by detaching a tab from another window has
|
|
// one tab.
|
|
EXPECT_EQ(1, new_browser->tab_strip_model()->count());
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest, BookmarkBarOnNTPTest) {
|
|
auto* profile = browser()->profile();
|
|
auto* contents = browser()->tab_strip_model()->GetActiveWebContents();
|
|
|
|
// Check Bookmark bar is hidden by default for non NTP.
|
|
EXPECT_FALSE(NewTabUI::IsNewTab(contents->GetLastCommittedURL()));
|
|
EXPECT_EQ(BookmarkBar::HIDDEN,
|
|
BookmarkBarController::From(browser())->bookmark_bar_state());
|
|
|
|
// Check show bookmarks on NTP is on by default.
|
|
EXPECT_TRUE(profile->GetPrefs()->GetBoolean(
|
|
bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP));
|
|
|
|
// Loading NTP.
|
|
EXPECT_TRUE(
|
|
content::NavigateToURL(contents, GURL(chrome::kChromeUINewTabURL)));
|
|
EXPECT_TRUE(NewTabUI::IsNewTab(contents->GetLastCommittedURL()));
|
|
|
|
// Check bookmark bar on NTP is shown even if bookmark bar is empty.
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(browser())->bookmark_bar_state());
|
|
|
|
AddBookmarkNode(profile);
|
|
|
|
// Check bookmark is also visible on NTP after adding bookmark regardless of
|
|
// show bookmark bar option value.
|
|
chrome::ToggleBookmarkBar(browser());
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(browser())->bookmark_bar_state());
|
|
chrome::ToggleBookmarkBar(browser());
|
|
EXPECT_EQ(BookmarkBar::HIDDEN,
|
|
BookmarkBarController::From(browser())->bookmark_bar_state());
|
|
EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
|
|
bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP));
|
|
// Turn off showing bookmark bar on NTP.
|
|
profile->GetPrefs()->SetBoolean(bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP,
|
|
true);
|
|
|
|
// Check bookmark bar on NTP is visible when
|
|
// bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP pref is on.
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(browser())->bookmark_bar_state());
|
|
|
|
// Check bookmark bar on NTP is visible when kBookmarkBar pref is on.
|
|
chrome::ToggleBookmarkBar(browser());
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(browser())->bookmark_bar_state());
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(BraveBrowserBrowserTest, BookmarkBarOnNTPTestIncognito) {
|
|
Browser* incognito = CreateIncognitoBrowser();
|
|
auto* profile = incognito->profile();
|
|
auto* contents = incognito->tab_strip_model()->GetActiveWebContents();
|
|
|
|
// Check Bookmark bar is hidden by default for non NTP.
|
|
EXPECT_FALSE(NewTabUI::IsNewTab(contents->GetLastCommittedURL()));
|
|
EXPECT_EQ(BookmarkBar::HIDDEN,
|
|
BookmarkBarController::From(incognito)->bookmark_bar_state());
|
|
|
|
// Check show bookmarks on NTP is on by default.
|
|
EXPECT_TRUE(profile->GetPrefs()->GetBoolean(
|
|
bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP));
|
|
|
|
// Loading NTP.
|
|
EXPECT_TRUE(
|
|
content::NavigateToURL(contents, GURL(chrome::kChromeUINewTabURL)));
|
|
EXPECT_TRUE(NewTabUI::IsNewTab(contents->GetLastCommittedURL()));
|
|
|
|
// Check bookmark bar on NTP is shown even if bookmark bar is empty.
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(incognito)->bookmark_bar_state());
|
|
|
|
AddBookmarkNode(profile);
|
|
|
|
// Check bookmark is also visible on NTP after adding bookmark regardless of
|
|
// show bookmark bar option value.
|
|
chrome::ToggleBookmarkBar(incognito);
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(incognito)->bookmark_bar_state());
|
|
chrome::ToggleBookmarkBar(incognito);
|
|
EXPECT_EQ(BookmarkBar::HIDDEN,
|
|
BookmarkBarController::From(incognito)->bookmark_bar_state());
|
|
EXPECT_FALSE(profile->GetPrefs()->GetBoolean(
|
|
bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP));
|
|
|
|
// Turn on showing bookmark bar on NTP.
|
|
profile->GetPrefs()->SetBoolean(bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP,
|
|
true);
|
|
|
|
// Check bookmark bar on NTP is visible when
|
|
// bookmarks::prefs::kAlwaysShowBookmarkBarOnNTP pref is on.
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(incognito)->bookmark_bar_state());
|
|
|
|
// Check bookmark bar on NTP is visible when kBookmarkBar pref is on.
|
|
chrome::ToggleBookmarkBar(incognito);
|
|
EXPECT_EQ(BookmarkBar::SHOW,
|
|
BookmarkBarController::From(incognito)->bookmark_bar_state());
|
|
}
|