* Move a part of //brave/common to //brave/components * Fix lint issues * Remove brave_features.* * Fix android build * Remove dead includes * fix compilation * Fix review issues * Fix android gn check * Revert patch changes * Fix deps duplication & copyright * Fix some DEPS/BUILD.gn contradictions * gn format * move sources.gni * Fix nits * Fix after rebase
322 lines
12 KiB
C++
322 lines
12 KiB
C++
/* Copyright (c) 2020 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 "base/bind.h"
|
|
#include "base/path_service.h"
|
|
#include "base/run_loop.h"
|
|
#include "brave/app/brave_command_ids.h"
|
|
#include "brave/browser/speedreader/speedreader_service_factory.h"
|
|
#include "brave/browser/speedreader/speedreader_tab_helper.h"
|
|
#include "brave/components/constants/brave_paths.h"
|
|
#include "brave/components/speedreader/features.h"
|
|
#include "brave/components/speedreader/speedreader_service.h"
|
|
#include "brave/components/speedreader/speedreader_util.h"
|
|
#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h"
|
|
#include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
|
|
#include "chrome/browser/ui/browser.h"
|
|
#include "chrome/browser/ui/browser_command_controller.h"
|
|
#include "chrome/browser/ui/browser_commands.h"
|
|
#include "chrome/browser/ui/browser_list.h"
|
|
#include "chrome/browser/ui/views/frame/browser_view.h"
|
|
#include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
|
|
#include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
|
|
#include "chrome/test/base/in_process_browser_test.h"
|
|
#include "chrome/test/base/ui_test_utils.h"
|
|
#include "components/keep_alive_registry/keep_alive_types.h"
|
|
#include "components/keep_alive_registry/scoped_keep_alive.h"
|
|
#include "components/network_session_configurator/common/network_switches.h"
|
|
#include "content/public/browser/reload_type.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"
|
|
#include "net/dns/mock_host_resolver.h"
|
|
#include "net/test/embedded_test_server/embedded_test_server.h"
|
|
|
|
const char kTestHost[] = "a.test";
|
|
const char kTestPageSimple[] = "/simple.html";
|
|
const char kTestPageReadable[] = "/articles/guardian.html";
|
|
|
|
constexpr char kSpeedreaderToggleUMAHistogramName[] =
|
|
"Brave.SpeedReader.ToggleCount";
|
|
|
|
constexpr char kSpeedreaderEnabledUMAHistogramName[] =
|
|
"Brave.SpeedReader.Enabled";
|
|
|
|
class SpeedReaderBrowserTest : public InProcessBrowserTest {
|
|
public:
|
|
SpeedReaderBrowserTest()
|
|
: https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
|
|
feature_list_.InitAndEnableFeature(speedreader::kSpeedreaderFeature);
|
|
brave::RegisterPathProvider();
|
|
base::FilePath test_data_dir;
|
|
base::PathService::Get(brave::DIR_TEST_DATA, &test_data_dir);
|
|
https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
|
|
https_server_.ServeFilesFromDirectory(test_data_dir);
|
|
EXPECT_TRUE(https_server_.Start());
|
|
}
|
|
|
|
SpeedReaderBrowserTest(const SpeedReaderBrowserTest&) = delete;
|
|
SpeedReaderBrowserTest& operator=(const SpeedReaderBrowserTest&) = delete;
|
|
|
|
~SpeedReaderBrowserTest() override {}
|
|
|
|
void SetUpOnMainThread() override {
|
|
host_resolver()->AddRule("*", "127.0.0.1");
|
|
}
|
|
|
|
void TearDownOnMainThread() override { DisableSpeedreader(); }
|
|
|
|
content::WebContents* ActiveWebContents() {
|
|
return browser()->tab_strip_model()->GetActiveWebContents();
|
|
}
|
|
|
|
speedreader::SpeedreaderTabHelper* tab_helper() {
|
|
return speedreader::SpeedreaderTabHelper::FromWebContents(
|
|
ActiveWebContents());
|
|
}
|
|
|
|
speedreader::SpeedreaderService* speedreader_service() {
|
|
return speedreader::SpeedreaderServiceFactory::GetForProfile(
|
|
browser()->profile());
|
|
}
|
|
|
|
PageActionIconView* GetReaderButton() {
|
|
return BrowserView::GetBrowserViewForBrowser(browser())
|
|
->toolbar_button_provider()
|
|
->GetPageActionIconView(PageActionIconType::kReaderMode);
|
|
}
|
|
|
|
void ClickReaderButton() {
|
|
browser()->command_controller()->ExecuteCommand(
|
|
IDC_SPEEDREADER_ICON_ONCLICK);
|
|
content::WaitForLoadStop(ActiveWebContents());
|
|
}
|
|
|
|
void ToggleSpeedreader() { speedreader_service()->ToggleSpeedreader(); }
|
|
|
|
void DisableSpeedreader() {
|
|
speedreader_service()->DisableSpeedreaderForTest();
|
|
}
|
|
|
|
void GoBack(Browser* browser) {
|
|
content::TestNavigationObserver observer(ActiveWebContents());
|
|
chrome::GoBack(browser, WindowOpenDisposition::CURRENT_TAB);
|
|
observer.Wait();
|
|
}
|
|
|
|
void NavigateToPageSynchronously(
|
|
const char* path,
|
|
WindowOpenDisposition disposition =
|
|
WindowOpenDisposition::NEW_FOREGROUND_TAB) {
|
|
const GURL url = https_server_.GetURL(kTestHost, path);
|
|
ASSERT_TRUE(ui_test_utils::NavigateToURLWithDisposition(
|
|
browser(), url, disposition,
|
|
ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP));
|
|
}
|
|
|
|
protected:
|
|
base::test::ScopedFeatureList feature_list_;
|
|
net::EmbeddedTestServer https_server_;
|
|
};
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, RestoreSpeedreaderPage) {
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
EXPECT_TRUE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
|
|
Profile* profile = browser()->profile();
|
|
|
|
ScopedKeepAlive test_keep_alive(KeepAliveOrigin::PANEL_VIEW,
|
|
KeepAliveRestartOption::DISABLED);
|
|
ScopedProfileKeepAlive test_profile_keep_alive(
|
|
profile, ProfileKeepAliveOrigin::kBrowserWindow);
|
|
CloseBrowserSynchronously(browser());
|
|
|
|
EXPECT_EQ(0u, BrowserList::GetInstance()->size());
|
|
chrome::OpenWindowWithRestoredTabs(profile);
|
|
EXPECT_EQ(1u, BrowserList::GetInstance()->size());
|
|
SelectFirstBrowser();
|
|
EXPECT_TRUE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, NavigationNostickTest) {
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageSimple);
|
|
EXPECT_FALSE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
NavigateToPageSynchronously(kTestPageReadable,
|
|
WindowOpenDisposition::CURRENT_TAB);
|
|
EXPECT_TRUE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
|
|
// Ensure distill state doesn't stick when we back-navigate from a readable
|
|
// page to a non-readable one.
|
|
GoBack(browser());
|
|
EXPECT_FALSE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, DisableSiteWorks) {
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
EXPECT_TRUE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
tab_helper()->MaybeToggleEnabledForSite(false);
|
|
EXPECT_TRUE(WaitForLoadStop(ActiveWebContents()));
|
|
EXPECT_FALSE(
|
|
speedreader::PageStateIsDistilled(tab_helper()->PageDistillState()));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, SmokeTest) {
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
const std::string kGetStyleLength =
|
|
"document.getElementById('brave_speedreader_style').innerHTML.length";
|
|
|
|
const std::string kGetContentLength = "document.body.innerHTML.length";
|
|
|
|
const auto eval_js = [&](const std::string& script) {
|
|
int out;
|
|
EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
|
|
ActiveWebContents(),
|
|
"window.domAutomationController.send(" + script + ")", &out));
|
|
return out;
|
|
};
|
|
|
|
// Check that the document became much smaller and that non-empty speedreader
|
|
// style is injected.
|
|
EXPECT_LT(0, eval_js(kGetStyleLength));
|
|
EXPECT_GT(17750 + 1, eval_js(kGetContentLength));
|
|
|
|
// Check that disabled speedreader doesn't affect the page.
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
EXPECT_LT(106000, eval_js(kGetContentLength));
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, P3ATest) {
|
|
base::HistogramTester tester;
|
|
|
|
// SpeedReader never enabled
|
|
EXPECT_FALSE(speedreader_service()->IsEnabled());
|
|
tester.ExpectBucketCount(kSpeedreaderEnabledUMAHistogramName, 0, 1);
|
|
tester.ExpectBucketCount(kSpeedreaderToggleUMAHistogramName, 0, 1);
|
|
|
|
// SpeedReader recently enabled, toggled once
|
|
ToggleSpeedreader();
|
|
tester.ExpectBucketCount(kSpeedreaderEnabledUMAHistogramName, 2, 2);
|
|
tester.ExpectBucketCount(kSpeedreaderToggleUMAHistogramName, 1, 1);
|
|
tester.ExpectBucketCount(kSpeedreaderToggleUMAHistogramName, 2, 0);
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, ClickingOnReaderButton) {
|
|
EXPECT_FALSE(speedreader_service()->IsEnabled());
|
|
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
|
|
EXPECT_EQ(speedreader::DistillState::kPageProbablyReadable,
|
|
tab_helper()->PageDistillState());
|
|
ClickReaderButton();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kReaderMode,
|
|
tab_helper()->PageDistillState());
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
|
|
ClickReaderButton();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kPageProbablyReadable,
|
|
tab_helper()->PageDistillState());
|
|
|
|
EXPECT_FALSE(speedreader_service()->IsEnabled());
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, EnableDisableSpeedreader) {
|
|
EXPECT_FALSE(speedreader_service()->IsEnabled());
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kPageProbablyReadable,
|
|
tab_helper()->PageDistillState());
|
|
ToggleSpeedreader();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderOnDisabledPage,
|
|
tab_helper()->PageDistillState());
|
|
DisableSpeedreader();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kPageProbablyReadable,
|
|
tab_helper()->PageDistillState());
|
|
|
|
ClickReaderButton();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kReaderMode,
|
|
tab_helper()->PageDistillState());
|
|
ToggleSpeedreader();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderMode,
|
|
tab_helper()->PageDistillState());
|
|
DisableSpeedreader();
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
EXPECT_EQ(speedreader::DistillState::kReaderMode,
|
|
tab_helper()->PageDistillState());
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, TogglingSiteSpeedreader) {
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
|
|
for (int i = 0; i < 2; ++i) {
|
|
EXPECT_TRUE(WaitForLoadStop(ActiveWebContents()));
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderMode,
|
|
tab_helper()->PageDistillState());
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
|
|
tab_helper()->MaybeToggleEnabledForSite(false);
|
|
EXPECT_TRUE(WaitForLoadStop(ActiveWebContents()));
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderOnDisabledPage,
|
|
tab_helper()->PageDistillState());
|
|
EXPECT_TRUE(GetReaderButton()->GetVisible());
|
|
|
|
tab_helper()->MaybeToggleEnabledForSite(true);
|
|
EXPECT_TRUE(WaitForLoadStop(ActiveWebContents()));
|
|
}
|
|
}
|
|
|
|
IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, ReloadContent) {
|
|
ToggleSpeedreader();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
auto* contents_1 = ActiveWebContents();
|
|
NavigateToPageSynchronously(kTestPageReadable);
|
|
auto* contents_2 = ActiveWebContents();
|
|
|
|
auto* tab_helper_1 =
|
|
speedreader::SpeedreaderTabHelper::FromWebContents(contents_1);
|
|
auto* tab_helper_2 =
|
|
speedreader::SpeedreaderTabHelper::FromWebContents(contents_2);
|
|
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderMode,
|
|
tab_helper_1->PageDistillState());
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderMode,
|
|
tab_helper_2->PageDistillState());
|
|
|
|
tab_helper_1->MaybeToggleEnabledForSite(false);
|
|
content::WaitForLoadStop(contents_1);
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderOnDisabledPage,
|
|
tab_helper_1->PageDistillState());
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderMode,
|
|
tab_helper_2->PageDistillState());
|
|
|
|
contents_2->GetController().Reload(content::ReloadType::NORMAL, false);
|
|
content::WaitForLoadStop(contents_2);
|
|
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderOnDisabledPage,
|
|
tab_helper_1->PageDistillState());
|
|
EXPECT_EQ(speedreader::DistillState::kSpeedreaderOnDisabledPage,
|
|
tab_helper_2->PageDistillState());
|
|
}
|