// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/web/model/web_navigation_util.h"
#import "base/memory/raw_ptr.h"
#import "base/test/metrics/user_action_tester.h"
#import "components/search_engines/template_url.h"
#import "ios/web/public/navigation/navigation_manager.h"
#import "ios/web/public/test/fakes/fake_navigation_manager.h"
#import "ios/web/public/test/fakes/fake_web_state.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"
#import "ui/base/page_transition_types.h"
#import "url/gurl.h"
class WebNavigationUtilsTest : public PlatformTest {
protected:
WebNavigationUtilsTest() {
auto navigation_manager = std::make_unique<web::FakeNavigationManager>();
navigation_manager_ = navigation_manager.get();
web_state_.SetNavigationManager(std::move(navigation_manager));
}
web::FakeWebState web_state_;
raw_ptr<web::FakeNavigationManager> navigation_manager_ = nullptr;
base::UserActionTester user_action_tester_;
};
TEST_F(WebNavigationUtilsTest, CreateWebLoadParamsWithoutPost) {
// No post params, check URL and transition.
GURL url("http://test.test/");
auto params = web_navigation_util::CreateWebLoadParams(
url, ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK,
/*post_data=*/nullptr);
EXPECT_EQ(url, params.url);
EXPECT_TRUE(PageTransitionCoreTypeIs(
params.transition_type,
ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK));
// There should be no post data, and no extra headers.
EXPECT_FALSE(params.post_data);
EXPECT_FALSE(params.extra_headers);
}
TEST_F(WebNavigationUtilsTest, CreateWebLoadParamsWithPost) {
// With post params.
GURL url("http://test.test/");
std::string post_data = "sphinx of black quartz judge my vow";
TemplateURLRef::PostContent post_content("text/plain", post_data);
auto params = web_navigation_util::CreateWebLoadParams(
url, ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT,
/*post_data=*/&post_content);
EXPECT_EQ(url, params.url);
EXPECT_TRUE(PageTransitionCoreTypeIs(
params.transition_type, ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT));
// Post data should be the same length as post_data
EXPECT_EQ(post_data.length(), params.post_data.length);
EXPECT_NSEQ(@"text/plain", params.extra_headers[@"Content-Type"]);
}
// Tests that GoBack updates the last committed item and log user action.
TEST_F(WebNavigationUtilsTest, GoBack) {
GURL url1("http:/test1.test/");
navigation_manager_->AddItem(url1, ui::PageTransition::PAGE_TRANSITION_LINK);
GURL url2("http:/test2.test/");
navigation_manager_->AddItem(url2, ui::PageTransition::PAGE_TRANSITION_LINK);
GURL url3("http:/test3.test/");
navigation_manager_->AddItem(url3, ui::PageTransition::PAGE_TRANSITION_LINK);
EXPECT_EQ(2, navigation_manager_->GetLastCommittedItemIndex());
EXPECT_EQ(0, user_action_tester_.GetActionCount("Back"));
web_navigation_util::GoBack(&web_state_);
EXPECT_EQ(1, navigation_manager_->GetLastCommittedItemIndex());
EXPECT_EQ(1, user_action_tester_.GetActionCount("Back"));
}
// Tests that GoForward updates the last committed item and log user action.
TEST_F(WebNavigationUtilsTest, GoForward) {
GURL url1("http:/test1.test/");
navigation_manager_->AddItem(url1, ui::PageTransition::PAGE_TRANSITION_LINK);
GURL url2("http:/test2.test/");
navigation_manager_->AddItem(url2, ui::PageTransition::PAGE_TRANSITION_LINK);
GURL url3("http:/test3.test/");
navigation_manager_->AddItem(url3, ui::PageTransition::PAGE_TRANSITION_LINK);
navigation_manager_->SetLastCommittedItemIndex(1);
EXPECT_EQ(1, navigation_manager_->GetLastCommittedItemIndex());
EXPECT_EQ(0, user_action_tester_.GetActionCount("Forward"));
web_navigation_util::GoForward(&web_state_);
EXPECT_EQ(2, navigation_manager_->GetLastCommittedItemIndex());
EXPECT_EQ(1, user_action_tester_.GetActionCount("Forward"));
}