blob: 817978f46bd184ba0ae4821e0727d2b0d4972e43 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/bloated_renderer/bloated_renderer_tab_helper.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/common/page_importance_signals.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
class BloatedRendererTabHelperTest : public ChromeRenderViewHostTestHarness {
protected:
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
BloatedRendererTabHelper::CreateForWebContents(web_contents());
tab_helper_ = BloatedRendererTabHelper::FromWebContents(web_contents());
web_contents_tester_ = content::WebContentsTester::For(web_contents());
web_contents_tester_->SetLastCommittedURL(GURL("https://test.test"));
}
BloatedRendererTabHelper* tab_helper_;
content::WebContentsTester* web_contents_tester_;
};
TEST_F(BloatedRendererTabHelperTest, DetectReload) {
EXPECT_EQ(BloatedRendererTabHelper::State::kInactive, tab_helper_->state_);
tab_helper_->state_ = BloatedRendererTabHelper::State::kRequestingReload;
auto reload_navigation =
content::NavigationHandle::CreateNavigationHandleForTesting(
GURL(), web_contents()->GetMainFrame());
tab_helper_->DidStartNavigation(reload_navigation.get());
EXPECT_EQ(BloatedRendererTabHelper::State::kStartedNavigation,
tab_helper_->state_);
EXPECT_EQ(reload_navigation->GetNavigationId(),
tab_helper_->saved_navigation_id_);
tab_helper_->DidFinishNavigation(reload_navigation.get());
EXPECT_EQ(BloatedRendererTabHelper::State::kInactive, tab_helper_->state_);
}
TEST_F(BloatedRendererTabHelperTest, IgnoreUnrelatedNavigation) {
EXPECT_EQ(BloatedRendererTabHelper::State::kInactive, tab_helper_->state_);
tab_helper_->state_ = BloatedRendererTabHelper::State::kRequestingReload;
auto reload_navigation =
content::NavigationHandle::CreateNavigationHandleForTesting(
GURL(), web_contents()->GetMainFrame());
tab_helper_->DidStartNavigation(reload_navigation.get());
EXPECT_EQ(BloatedRendererTabHelper::State::kStartedNavigation,
tab_helper_->state_);
EXPECT_EQ(reload_navigation->GetNavigationId(),
tab_helper_->saved_navigation_id_);
auto unrelated_navigation =
content::NavigationHandle::CreateNavigationHandleForTesting(
GURL(), web_contents()->GetMainFrame());
tab_helper_->DidFinishNavigation(unrelated_navigation.get());
EXPECT_EQ(BloatedRendererTabHelper::State::kStartedNavigation,
tab_helper_->state_);
EXPECT_EQ(reload_navigation->GetNavigationId(),
tab_helper_->saved_navigation_id_);
}
TEST_F(BloatedRendererTabHelperTest, CanReloadBloatedTab) {
web_contents_tester_->NavigateAndCommit(GURL("https://test.test"));
EXPECT_TRUE(tab_helper_->CanReloadBloatedTab());
}
TEST_F(BloatedRendererTabHelperTest, CannotReloadBloatedTabCrashed) {
web_contents()->SetIsCrashed(base::TERMINATION_STATUS_PROCESS_CRASHED, 0);
EXPECT_FALSE(tab_helper_->CanReloadBloatedTab());
}
TEST_F(BloatedRendererTabHelperTest, CannotReloadBloatedTabInvalidURL) {
web_contents_tester_->SetLastCommittedURL(GURL("invalid :)"));
EXPECT_FALSE(tab_helper_->CanReloadBloatedTab());
}
TEST_F(BloatedRendererTabHelperTest, CannotReloadBloatedTabWithPostData) {
web_contents_tester_->NavigateAndCommit(GURL("https://test.test"));
web_contents()->GetController().GetLastCommittedEntry()->SetHasPostData(true);
EXPECT_FALSE(tab_helper_->CanReloadBloatedTab());
}
TEST_F(BloatedRendererTabHelperTest,
CannotReloadBloatedTabPendingUserInteraction) {
content::PageImportanceSignals signals;
signals.had_form_interaction = true;
web_contents_tester_->SetPageImportanceSignals(signals);
EXPECT_FALSE(tab_helper_->CanReloadBloatedTab());
}