blob: dd760f78a8796269c053aa3727f88f513b2ad78c [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/web_applications/web_app_browsertest_base.h"
#include "chrome/browser/web_applications/web_app_helpers.h"
#include "chrome/test/base/ui_test_utils.h"
#include "chrome/test/base/web_feature_histogram_tester.h"
#include "components/metrics/content/subprocess_metrics_provider.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h"
namespace web_app {
// Test app title scenarios with valid, empty and dynamic app title.
class WebAppTitleBrowserTest : public WebAppBrowserTestBase {
public:
WebAppTitleBrowserTest() = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, "AppTitle");
}
};
// Test app title with valid app title.
IN_PROC_BROWSER_TEST_F(WebAppTitleBrowserTest, ValidAppTitle) {
const GURL app_url =
https_server()->GetURL("/web_apps/page_with_app_title.html");
const std::u16string app_title = u"A Web App";
WebFeatureHistogramTester histogram_tester;
auto web_app_info = WebAppInstallInfo::CreateWithStartUrlForTesting(app_url);
web_app_info->scope = app_url.GetWithoutFilename();
web_app_info->title = app_title;
const webapps::AppId app_id = InstallWebApp(std::move(web_app_info));
Browser* const app_browser = LaunchWebAppBrowser(app_id);
content::WebContents* const web_contents =
app_browser->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
// Validate app title has app title.
EXPECT_EQ(u"A Web App - ApplicationTitle",
app_browser->GetWindowTitleForCurrentTab(false));
// Navigate away to flush use counters.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
// Log histogram map.
histogram_tester.ExpectCounts({{blink::mojom::WebFeature::kWebAppTitle, 1}});
}
IN_PROC_BROWSER_TEST_F(WebAppTitleBrowserTest, WithoutAppTitle) {
const GURL app_url =
https_server()->GetURL("/web_apps/page_without_app_title.html");
const std::u16string app_title = u"A Web App";
base::HistogramTester histogram_tester;
auto web_app_info = WebAppInstallInfo::CreateWithStartUrlForTesting(app_url);
web_app_info->scope = app_url.GetWithoutFilename();
web_app_info->title = app_title;
const webapps::AppId app_id = InstallWebApp(std::move(web_app_info));
Browser* const app_browser = LaunchWebAppBrowser(app_id);
content::WebContents* const web_contents =
app_browser->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
// Validate app title is the same as page title.
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
// Navigate away to flush use counters.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
EXPECT_THAT(
histogram_tester.GetAllSamples("Blink.UseCounter.Features"),
BucketsInclude(base::Bucket(blink::mojom::WebFeature::kWebAppTitle, 0)));
}
IN_PROC_BROWSER_TEST_F(WebAppTitleBrowserTest, DynamicAppTitle) {
const GURL app_url =
https_server()->GetURL("/web_apps/page_without_app_title.html");
const std::u16string app_title = u"A Web App";
base::HistogramTester histogram_tester;
auto web_app_info = WebAppInstallInfo::CreateWithStartUrlForTesting(app_url);
web_app_info->scope = app_url.GetWithoutFilename();
web_app_info->title = app_title;
const webapps::AppId app_id = InstallWebApp(std::move(web_app_info));
Browser* const app_browser = LaunchWebAppBrowser(app_id);
content::WebContents* const web_contents =
app_browser->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
// Validate that app title matches page title.
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
// Navigate away to flush use counters.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
EXPECT_THAT(
histogram_tester.GetAllSamples("Blink.UseCounter.Features"),
BucketsInclude(base::Bucket(blink::mojom::WebFeature::kWebAppTitle, 0)));
{
// Add app title via script and validate title is updated.
std::string add_app_title =
"var meta = document.createElement('meta'); meta.name = "
"'application-title'; "
"meta.content = 'ApplicationTitle'; "
"document.getElementsByTagName('head')[0].appendChild(meta);";
EXPECT_TRUE(content::ExecJs(web_contents, add_app_title));
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App - ApplicationTitle",
app_browser->GetWindowTitleForCurrentTab(false));
}
{
// Update app title via script and validate title is updated.
std::string update_app_title =
"document.head.getElementsByTagName('meta')['application-title']."
"content = "
"'New'";
EXPECT_TRUE(content::ExecJs(web_contents, update_app_title));
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App - New",
app_browser->GetWindowTitleForCurrentTab(false));
}
{
// Remove app title via script and validate title is updated.
std::string remove_app_title =
"document.head.getElementsByTagName('meta')['application-title']."
"remove()";
EXPECT_TRUE(content::ExecJs(web_contents, remove_app_title));
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
}
// Navigate away to flush use counters.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
}
// Navigate to page with and without app title to validate app title is updated.
IN_PROC_BROWSER_TEST_F(WebAppTitleBrowserTest, AppTitleNavigation) {
const GURL app_url =
https_server()->GetURL("/web_apps/page_with_app_title.html");
const std::u16string app_title = u"A Web App";
WebFeatureHistogramTester histogram_tester;
auto web_app_info = WebAppInstallInfo::CreateWithStartUrlForTesting(app_url);
web_app_info->scope = app_url.GetWithoutFilename();
web_app_info->title = app_title;
const webapps::AppId app_id = InstallWebApp(std::move(web_app_info));
Browser* const app_browser = LaunchWebAppBrowser(app_id);
content::WebContents* const web_contents =
app_browser->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
// Validate app title has app title.
EXPECT_EQ(u"A Web App - ApplicationTitle",
app_browser->GetWindowTitleForCurrentTab(false));
// Navigate to page without app title.
const GURL page_without_url =
https_server()->GetURL("/web_apps/page_without_app_title.html");
EXPECT_TRUE(ui_test_utils::NavigateToURL(app_browser, page_without_url));
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
// Navigate to page with app title.
web_contents->GetController().GoBack();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App - ApplicationTitle",
app_browser->GetWindowTitleForCurrentTab(false));
// Navigate again to page without app title.
web_contents->GetController().GoForward();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
// Navigate away to flush use counters.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
// Explicitly fetch the metrics from the child processes and merge them.
content::FetchHistogramsFromChildProcesses();
metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
histogram_tester.ExpectCounts({{blink::mojom::WebFeature::kWebAppTitle, 1}});
}
// Test app title with empty app title.
IN_PROC_BROWSER_TEST_F(WebAppTitleBrowserTest, AppTitleIsEmpty) {
const GURL app_url =
https_server()->GetURL("/web_apps/page_with_app_title.html");
const std::u16string app_title = u"A Web App";
WebFeatureHistogramTester histogram_tester;
auto web_app_info = WebAppInstallInfo::CreateWithStartUrlForTesting(app_url);
web_app_info->scope = app_url.GetWithoutFilename();
web_app_info->title = app_title;
const webapps::AppId app_id = InstallWebApp(std::move(web_app_info));
Browser* const app_browser = LaunchWebAppBrowser(app_id);
content::WebContents* const web_contents =
app_browser->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
// Validate app title has app title.
EXPECT_EQ(u"A Web App - ApplicationTitle",
app_browser->GetWindowTitleForCurrentTab(false));
// Navigate away to flush use counters.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));
// Log histogram map.
histogram_tester.ExpectCounts({{blink::mojom::WebFeature::kWebAppTitle, 1}});
// Update app title to empty via script and validate title is updated.
{
std::string update_app_title =
"document.head.getElementsByTagName('meta')['application-title']."
"content = ''";
EXPECT_TRUE(content::ExecJs(web_contents, update_app_title));
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
}
// Update app title to space via script and validate title is updated.
{
std::string update_app_title =
"document.head.getElementsByTagName('meta')['application-title']."
"content = ' '";
EXPECT_TRUE(content::ExecJs(web_contents, update_app_title));
EXPECT_TRUE(content::WaitForLoadStop(web_contents));
EXPECT_EQ(u"A Web App", app_browser->GetWindowTitleForCurrentTab(false));
}
}
} // namespace web_app