blob: 5d166f0260d3de312e2c94397432f84d6b99cd51 [file] [log] [blame]
// Copyright 2014 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/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/devtools/devtools_window_testing.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/core/common/features.h"
#include "components/strings/grit/components_strings.h"
#include "components/webui/chrome_urls/pref_names.h"
#include "content/public/browser/web_contents.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 "ui/base/l10n/l10n_util.h"
class InterstitialUITest : public InProcessBrowserTest {
public:
InterstitialUITest() = default;
~InterstitialUITest() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
InProcessBrowserTest::SetUpCommandLine(command_line);
#if BUILDFLAG(IS_CHROMEOS)
// These tests use chrome:// URLs and are written on the assumption devtools
// are always available, so guarantee that assumption holds. Tests that
// check if devtools can be disabled should use a test fixture without the
// kForceDevToolsAvailable switch set.
command_line->AppendSwitch(switches::kForceDevToolsAvailable);
#endif
}
void SetUpOnMainThread() override {
g_browser_process->local_state()->SetBoolean(
chrome_urls::kInternalOnlyUisEnabled, true);
InProcessBrowserTest::SetUpOnMainThread();
}
protected:
// Tests interstitial displayed at url to verify that it has the given
// page title and body content that is expected.
//
// page_title must be an exact match, while body content may appear anywhere
// in the rendered page. Thus an empty body_text never fails.
void TestInterstitial(GURL url,
const std::string& page_title,
const std::u16string& body_text) {
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
EXPECT_EQ(base::ASCIIToUTF16(page_title),
browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
// Should also be able to open and close devtools.
DevToolsWindow* window =
DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), true);
EXPECT_TRUE(window);
DevToolsWindowTesting::CloseDevToolsWindowSync(window);
if (body_text.empty()) {
return;
}
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
EXPECT_GE(ui_test_utils::FindInPage(contents, body_text, true, true,
nullptr, nullptr),
1);
}
// Convenience function to test interstitial pages without provided body_text.
void TestInterstitial(GURL url, const std::string& page_title) {
TestInterstitial(url, page_title, std::u16string());
}
// Convenience function to test interstitial pages with l10n message_ids as
// body_text strings.
void TestInterstitial(GURL url,
const std::string& page_title,
int message_id) {
TestInterstitial(url, page_title, l10n_util::GetStringUTF16(message_id));
}
};
IN_PROC_BROWSER_TEST_F(InterstitialUITest, HomePage) {
TestInterstitial(GURL("chrome://interstitials"), "Interstitials");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, InvalidURLShouldOpenHomePage) {
// Invalid path should open the main page:
TestInterstitial(GURL("chrome://interstitials/--invalid--"), "Interstitials");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest,
InvalidURLMatchingStartOfValidURLShouldBeInvalid) {
// Path that matches the first characters of another should be invalid
// (and therefore open the main page).
TestInterstitial(GURL("chrome://interstitials/ssl--invalid--"),
"Interstitials");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, SSLInterstitial) {
TestInterstitial(GURL("chrome://interstitials/ssl"), "Privacy error",
IDS_SSL_V2_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, MITMSoftwareInterstitial) {
TestInterstitial(GURL("chrome://interstitials/mitm-software-ssl"),
"Privacy error", IDS_MITM_SOFTWARE_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, PinnedCertInterstitial) {
TestInterstitial(GURL("chrome://interstitials/ssl?type=hpkp_failure"),
"Privacy error",
u"NET::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, CTInterstitial) {
TestInterstitial(GURL("chrome://interstitials/ssl?type=ct_failure"),
"Privacy error",
u"NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, EnterpriseBlockInterstitial) {
TestInterstitial(GURL("chrome://interstitials/enterprise-block"),
"Blocked by Admin", IDS_ENTERPRISE_BLOCK_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, EnterpriseWarnInterstitial) {
TestInterstitial(GURL("chrome://interstitials/enterprise-warn"),
"Admin warning", IDS_ENTERPRISE_WARN_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, MalwareInterstitial) {
TestInterstitial(GURL("chrome://interstitials/safebrowsing?type=malware"),
"Security error", IDS_SAFEBROWSING_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, PhishingInterstitial) {
TestInterstitial(GURL("chrome://interstitials/safebrowsing?type=phishing"),
"Security error", IDS_SAFEBROWSING_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, UnwantedSoftwareInterstitial) {
TestInterstitial(GURL("chrome://interstitials/safebrowsing?type=unwanted"),
"Security error", IDS_SAFEBROWSING_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, MalwareInterstitialQuiet) {
TestInterstitial(
GURL("chrome://interstitials/quietsafebrowsing?type=malware"),
"Security error", IDS_MALWARE_WEBVIEW_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, PhishingInterstitialQuiet) {
TestInterstitial(
GURL("chrome://interstitials/quietsafebrowsing?type=phishing"),
"Security error", IDS_PHISHING_WEBVIEW_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, UnwantedSoftwareInterstitialQuiet) {
TestInterstitial(
GURL("chrome://interstitials/quietsafebrowsing?type=unwanted"),
"Security error", IDS_HARMFUL_WEBVIEW_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, BillingInterstitialQuiet) {
TestInterstitial(
GURL("chrome://interstitials/quietsafebrowsing?type=billing"),
"Page may charge money", IDS_BILLING_WEBVIEW_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, ClientsideMalwareInterstitial) {
TestInterstitial(
GURL("chrome://interstitials/safebrowsing?type=clientside_malware"),
"Security error", IDS_SAFEBROWSING_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, ClientsidePhishingInterstitial) {
TestInterstitial(
GURL("chrome://interstitials/safebrowsing?type=clientside_phishing"),
"Security error", IDS_SAFEBROWSING_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, BillingInterstitial) {
TestInterstitial(GURL("chrome://interstitials/safebrowsing?type=billing"),
"Page may charge money", IDS_BILLING_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, CaptivePortalInterstitial) {
TestInterstitial(GURL("chrome://interstitials/captiveportal"),
"Connect to network");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, CaptivePortalInterstitialWifi) {
TestInterstitial(GURL("chrome://interstitials/captiveportal?is_wifi=1"),
"Connect to Wi-Fi");
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest, BlockedInterceptionInterstitial) {
TestInterstitial(GURL("chrome://interstitials/blocked-interception"),
"Your activity on example.com is being monitored",
u"Anything you type");
}
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
// Tests that the interstitials have the expected title and content.
IN_PROC_BROWSER_TEST_F(InterstitialUITest,
SupervisedUserVerificationInterstitial) {
TestInterstitial(GURL("chrome://interstitials/supervised-user-verify"),
"YouTube", IDS_SUPERVISED_USER_VERIFY_PAGE_PRIMARY_HEADING);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest,
SupervisedUserVerificationBlockedSiteInterstitial) {
TestInterstitial(
GURL("chrome://interstitials/supervised-user-verify-blocked-site"),
"Site blocked", IDS_CHILD_BLOCK_INTERSTITIAL_MESSAGE_NOT_SIGNED_IN);
}
IN_PROC_BROWSER_TEST_F(InterstitialUITest,
SupervisedUserVerificationSubframeInterstitial) {
TestInterstitial(
GURL("chrome://interstitials/supervised-user-verify-subframe"), "YouTube",
IDS_SUPERVISED_USER_VERIFY_PAGE_SUBFRAME_YOUTUBE_HEADING);
}
IN_PROC_BROWSER_TEST_F(
InterstitialUITest,
SupervisedUserVerificationBlockedSiteSubframeInterstitial) {
TestInterstitial(
GURL("chrome://interstitials/"
"supervised-user-verify-blocked-site-subframe"),
"Site blocked",
IDS_SUPERVISED_USER_VERIFY_PAGE_SUBFRAME_BLOCKED_SITE_HEADING);
}
#endif
// Tests that back button works after opening an interstitial from
// chrome://interstitials.
IN_PROC_BROWSER_TEST_F(InterstitialUITest, InterstitialBackButton) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL("chrome://interstitials")));
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(),
GURL("chrome://interstitials/ssl")));
content::TestNavigationObserver navigation_observer(web_contents);
chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
navigation_observer.Wait();
std::u16string title;
ui_test_utils::GetCurrentTabTitle(browser(), &title);
EXPECT_EQ(title, u"Interstitials");
}
// Tests that view-source: works correctly on chrome://interstitials.
IN_PROC_BROWSER_TEST_F(InterstitialUITest, InterstitialViewSource) {
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), GURL("view-source:chrome://interstitials/")));
int found;
std::u16string expected_title = u"<title>Interstitials</title>";
found = ui_test_utils::FindInPage(
browser()->tab_strip_model()->GetActiveWebContents(), expected_title,
true, /* Forward */
true, /* case_sensitive */
nullptr, nullptr);
EXPECT_EQ(found, 1);
}
// Tests that view-source: works correctly on a subpage of
// chrome://interstitials (using chrome://interstitials/ssl).
// Test is currently flaky on Windows (crbug.com/926392)
#if BUILDFLAG(IS_WIN)
#define MAYBE_InterstitialWithPathViewSource \
DISABLED_InterstitialWithPathViewSource
#else
#define MAYBE_InterstitialWithPathViewSource InterstitialWithPathViewSource
#endif
IN_PROC_BROWSER_TEST_F(InterstitialUITest,
MAYBE_InterstitialWithPathViewSource) {
ASSERT_TRUE(ui_test_utils::NavigateToURL(
browser(), GURL("view-source:chrome://interstitials/ssl")));
int found;
std::u16string expected_title = u"<title>Privacy error</title";
found = ui_test_utils::FindInPage(
browser()->tab_strip_model()->GetActiveWebContents(), expected_title,
true, /* Forward */
true, /* case_sensitive */
nullptr, nullptr);
EXPECT_EQ(found, 1);
}
// Checks that the interstitial page uses correct web contents. If not, closing
// the tab might result in a freed web contents pointer and cause a crash.
// See https://crbug.com/611706 for details.
IN_PROC_BROWSER_TEST_F(InterstitialUITest, UseCorrectWebContents) {
int current_tab = browser()->tab_strip_model()->active_index();
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(),
GURL("chrome://interstitials/ssl")));
// Duplicate the tab and close it.
chrome::DuplicateTab(browser());
EXPECT_NE(current_tab, browser()->tab_strip_model()->active_index());
chrome::CloseTab(browser());
EXPECT_EQ(current_tab, browser()->tab_strip_model()->active_index());
// Reloading the page shouldn't cause a crash.
chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
}