blob: acf8d75d2e72442b438169a7ea5984d6a0a94938 [file] [log] [blame]
// Copyright 2022 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/feedback/show_feedback_page.h"
#include "ash/constants/ash_features.h"
#include "ash/webui/os_feedback_ui/url_constants.h"
#include "base/json/json_writer.h"
#include "base/strings/escape.h"
#include "base/strings/strcat.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/values_test_util.h"
#include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
#include "chrome/browser/feedback/feedback_dialog_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/webui/feedback/feedback_dialog.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/test_navigation_observer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace ash {
class ShowFeedbackPageBrowserTest : public InProcessBrowserTest {
public:
ShowFeedbackPageBrowserTest() = default;
~ShowFeedbackPageBrowserTest() override = default;
protected:
base::test::ScopedFeatureList scope_feature_list_;
};
// Test that when the policy of UserFeedbackAllowed is false, feedback app is
// not opened.
IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest, UserFeedbackDisallowed) {
base::HistogramTester histogram_tester;
std::string unused;
chrome::ShowFeedbackPage(browser(), feedback::kFeedbackSourceBrowserCommand,
/*description_template=*/unused,
/*description_placeholder_text=*/unused,
/*category_tag=*/unused,
/*extra_diagnostics=*/unused,
/*autofill_metadata=*/base::Value::Dict());
histogram_tester.ExpectTotalCount("Feedback.RequestSource", 1);
browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
false);
chrome::ShowFeedbackPage(browser(), feedback::kFeedbackSourceBrowserCommand,
/*description_template=*/unused,
/*description_placeholder_text=*/unused,
/*category_tag=*/unused,
/*extra_diagnostics=*/unused,
/*autofill_metadata=*/base::Value::Dict());
histogram_tester.ExpectTotalCount("Feedback.RequestSource", 1);
}
// Test that when the policy of UserFeedbackAllowed is true, feedback app is
// opened and the os_feedback is used when the feature kOsFeedback is enabled.
IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest,
OsFeedbackIsOpenedWhenFeatureEnabled) {
ash::SystemWebAppManager::GetForTest(browser()->profile())
->InstallSystemAppsForTesting();
base::HistogramTester histogram_tester;
EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
const GURL page_url = chrome::GetTargetTabUrl(
browser(), browser()->tab_strip_model()->active_index());
const GURL expected_url(base::StrCat(
{ash::kChromeUIOSFeedbackUrl, "/?page_url=",
base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false)}));
content::TestNavigationObserver navigation_observer(expected_url);
navigation_observer.StartWatchingNewWebContents();
std::string unused;
browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
true);
chrome::ShowFeedbackPage(browser(), feedback::kFeedbackSourceBrowserCommand,
/*description_template=*/unused,
/*description_placeholder_text=*/unused,
/*category_tag=*/unused,
/*extra_diagnostics=*/unused,
/*autofill_metadata=*/base::Value::Dict());
navigation_observer.Wait();
histogram_tester.ExpectTotalCount("Feedback.RequestSource", 1);
EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
const GURL visible_url = chrome::FindLastActive()
->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL();
EXPECT_TRUE(visible_url.has_query());
EXPECT_EQ(expected_url, visible_url);
}
// Test that when parameters appended include:
// - `extra_diagnostics` string.
// - `description_template` string.
// - `description_placeholder_text` string.
// - `category_tag` string.
// - `page_url` GURL.
// - `from_assistant` set true.
IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest,
OsFeedbackAdditionalAssistantContextAddedToUrl) {
ash::SystemWebAppManager::GetForTest(browser()->profile())
->InstallSystemAppsForTesting();
std::string unused;
const GURL page_url = chrome::GetTargetTabUrl(
browser(), browser()->tab_strip_model()->active_index());
const std::string extra_diagnostics = "extra diagnostics param";
const std::string description_template = "Q1: Question one?";
const std::string description_placeholder_text =
"Thanks for giving feedback on the Camera app";
const std::string category_tag = "category tag param";
GURL expected_url(base::StrCat(
{ash::kChromeUIOSFeedbackUrl, "/?extra_diagnostics=",
base::EscapeQueryParamValue(extra_diagnostics, /*use_plus=*/false),
"&description_template=",
base::EscapeQueryParamValue(description_template, /*use_plus=*/false),
"&description_placeholder_text=",
base::EscapeQueryParamValue(description_placeholder_text,
/*use_plus=*/false),
"&category_tag=",
base::EscapeQueryParamValue(category_tag, /*use_plus=*/false),
"&page_url=",
base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false),
"&from_assistant=",
base::EscapeQueryParamValue("true", /*use_plus=*/false)}));
content::TestNavigationObserver navigation_observer(expected_url);
navigation_observer.StartWatchingNewWebContents();
browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
true);
chrome::ShowFeedbackPage(
browser(), feedback::kFeedbackSourceAssistant,
/*description_template=*/description_template,
/*description_placeholder_text=*/description_placeholder_text,
/*category_tag=*/category_tag,
/*extra_diagnostics=*/extra_diagnostics,
/*autofill_metadata=*/base::Value::Dict());
navigation_observer.Wait();
const GURL visible_url = chrome::FindLastActive()
->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL();
EXPECT_TRUE(visible_url.has_query());
EXPECT_EQ(expected_url, visible_url);
}
// Test that when parameters appended include:
// - `extra_diagnostics` string.
// - `description_template` string with `fingerprint` not queried.
// - `description_placeholder_text` string.
// - `category_tag` string.
// - `page_url` GURL.
// - `settings_search_do_not_record_metrics` set true.
IN_PROC_BROWSER_TEST_F(
ShowFeedbackPageBrowserTest,
OsFeedbackAdditionalSettingsSearchNoFingerprintContextAddedToUrl) {
ash::SystemWebAppManager::GetForTest(browser()->profile())
->InstallSystemAppsForTesting();
std::string unused;
const GURL page_url = chrome::GetTargetTabUrl(
browser(), browser()->tab_strip_model()->active_index());
const std::string extra_diagnostics = "extra diagnostics param";
const std::string description_template = "Q1: Question one?";
const std::string description_placeholder_text =
"Thanks for giving feedback on the Camera app";
const std::string category_tag = "category tag param";
GURL expected_url(base::StrCat(
{ash::kChromeUIOSFeedbackUrl, "/?extra_diagnostics=",
base::EscapeQueryParamValue(extra_diagnostics, /*use_plus=*/false),
"&description_template=",
base::EscapeQueryParamValue(description_template, /*use_plus=*/false),
"&description_placeholder_text=",
base::EscapeQueryParamValue(description_placeholder_text,
/*use_plus=*/false),
"&category_tag=",
base::EscapeQueryParamValue(category_tag, /*use_plus=*/false),
"&page_url=",
base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false),
"&settings_search_do_not_record_metrics=",
base::EscapeQueryParamValue("true", /*use_plus=*/true)}));
content::TestNavigationObserver navigation_observer(expected_url);
navigation_observer.StartWatchingNewWebContents();
browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
true);
chrome::ShowFeedbackPage(
browser(), feedback::kFeedbackSourceOsSettingsSearch,
/*description_template=*/description_template,
/*description_placeholder_text=*/description_placeholder_text,
/*category_tag=*/category_tag,
/*extra_diagnostics=*/extra_diagnostics,
/*autofill_metadata=*/base::Value::Dict());
navigation_observer.Wait();
const GURL visible_url = chrome::FindLastActive()
->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL();
EXPECT_TRUE(visible_url.has_query());
EXPECT_EQ(expected_url, visible_url);
}
// Test that when parameters appended include:
// - `extra_diagnostics` string.
// - `description_template` string with `fingerprint` queried.
// - `description_placeholder_text` string.
// - `category_tag` string.
// - `page_url` GURL.
// Although the search has been triggered from Settings, `fingerprint` is
// queried so settings_search_do_not_record_metrics will not be set as we need
// to record metrics for this case.
IN_PROC_BROWSER_TEST_F(
ShowFeedbackPageBrowserTest,
OsFeedbackAdditionalSettingsSearchWithFingerprintContextAddedToUrl) {
ash::SystemWebAppManager::GetForTest(browser()->profile())
->InstallSystemAppsForTesting();
std::string unused;
const GURL page_url = chrome::GetTargetTabUrl(
browser(), browser()->tab_strip_model()->active_index());
const std::string extra_diagnostics = "extra diagnostics param";
const std::string description_template = "Q1: Question one fingerprint?";
const std::string description_placeholder_text =
"Thanks for giving feedback on the Camera app";
const std::string category_tag = "category tag param";
GURL expected_url(base::StrCat(
{ash::kChromeUIOSFeedbackUrl, "/?extra_diagnostics=",
base::EscapeQueryParamValue(extra_diagnostics, /*use_plus=*/false),
"&description_template=",
base::EscapeQueryParamValue(description_template, /*use_plus=*/false),
"&description_placeholder_text=",
base::EscapeQueryParamValue(description_placeholder_text,
/*use_plus=*/false),
"&category_tag=",
base::EscapeQueryParamValue(category_tag, /*use_plus=*/false),
"&page_url=",
base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false)}));
content::TestNavigationObserver navigation_observer(expected_url);
navigation_observer.StartWatchingNewWebContents();
browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
true);
chrome::ShowFeedbackPage(
browser(), feedback::kFeedbackSourceOsSettingsSearch,
/*description_template=*/description_template,
/*description_placeholder_text=*/description_placeholder_text,
/*category_tag=*/category_tag,
/*extra_diagnostics=*/extra_diagnostics,
/*autofill_metadata=*/base::Value::Dict());
navigation_observer.Wait();
const GURL visible_url = chrome::FindLastActive()
->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL();
EXPECT_TRUE(visible_url.has_query());
EXPECT_EQ(expected_url, visible_url);
}
// Test that when parameters appended include:
// - `extra_diagnostics` string.
// - `description_template` string.
// - `description_placeholder_text` string.
// - `category_tag` string.
// - `page_url` GURL.
// - `from_autofill` set true.
// - `autofill_metadata` string.
IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest,
OsFeedbackAdditionalAutofillMetadataAddedToUrl) {
ash::SystemWebAppManager::GetForTest(browser()->profile())
->InstallSystemAppsForTesting();
std::string unused;
const GURL page_url = chrome::GetTargetTabUrl(
browser(), browser()->tab_strip_model()->active_index());
const std::string extra_diagnostics = "extra diagnostics param";
const std::string description_template = "Q1: Question one?";
const std::string description_placeholder_text =
"Thanks for giving feedback on Autofill";
const std::string category_tag = "category tag param";
base::Value::Dict autofill_metadata = base::test::ParseJsonDict(
R"({"form_signature": "123", "source_url": "test url"})");
std::string expected_autofill_metadata =
base::WriteJson(autofill_metadata).value_or("");
GURL expected_url(base::StrCat(
{ash::kChromeUIOSFeedbackUrl, "/?extra_diagnostics=",
base::EscapeQueryParamValue(extra_diagnostics, /*use_plus=*/false),
"&description_template=",
base::EscapeQueryParamValue(description_template, /*use_plus=*/false),
"&description_placeholder_text=",
base::EscapeQueryParamValue(description_placeholder_text,
/*use_plus=*/false),
"&category_tag=",
base::EscapeQueryParamValue(category_tag, /*use_plus=*/false),
"&page_url=",
base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false),
"&from_autofill=",
base::EscapeQueryParamValue("true", /*use_plus=*/false),
"&autofill_metadata=",
base::EscapeQueryParamValue(expected_autofill_metadata,
/*use_plus=*/false)}));
content::TestNavigationObserver navigation_observer(expected_url);
navigation_observer.StartWatchingNewWebContents();
browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
true);
chrome::ShowFeedbackPage(
browser(), feedback::kFeedbackSourceAutofillContextMenu,
/*description_template=*/description_template,
/*description_placeholder_text=*/description_placeholder_text,
/*category_tag=*/category_tag,
/*extra_diagnostics=*/extra_diagnostics,
/*autofill_metadata=*/std::move(autofill_metadata));
navigation_observer.Wait();
const GURL visible_url = chrome::FindLastActive()
->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL();
EXPECT_TRUE(visible_url.has_query());
EXPECT_EQ(expected_url, visible_url);
}
IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest, FeedbackFlowAI) {
std::string unused;
chrome::ShowFeedbackPage(browser(), feedback::kFeedbackSourceAI,
/*description_template=*/unused,
/*description_placeholder_text=*/unused,
/*category_tag=*/unused,
/*extra_diagnostics=*/unused,
/*autofill_metadata=*/base::Value::Dict());
EXPECT_EQ(chrome::kChromeUIFeedbackURL,
FeedbackDialog::GetInstanceForTest()->GetDialogContentURL());
}
} // namespace ash