blob: d90d61dc7e41c7595b517def27a9961339f345f7 [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 "base/ios/ios_util.h"
#include "base/test/scoped_feature_list.h"
#include "ios/web/common/features.h"
#import "ios/web/public/navigation_manager.h"
#import "ios/web/public/test/web_view_content_test_util.h"
#import "ios/web/public/test/web_view_interaction_test_util.h"
#include "ios/web/public/web_state/web_frame.h"
#import "ios/web/test/web_int_test.h"
#include "ios/web/web_state/web_frames_manager_impl.h"
#include "net/test/embedded_test_server/default_handlers.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest/include/gtest/gtest.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
// WebFramesManagerTest is parameterized on this enum to test both
// LegacyNavigationManager and WKBasedNavigationManager.
enum class NavigationManagerChoice {
LEGACY,
WK_BASED,
};
// URL of a page with test links.
const char kLinksPageURL[] = "/links.html";
// Text of the link to |kPonyPageURL| on |kLinksPageURL|.
const char kLinksPagePonyLinkText[] = "Normal Link";
// ID of the link to |kPonyPageURL| on |kLinksPageURL|.
const char kLinksPagePonyLinkID[] = "normal-link";
// Text of the same page link on |kLinksPageURL|.
const char kLinksPageSamePageLinkText[] = "Same-page Link";
// ID of the same page link on |kLinksPageURL|.
const char kLinksPageSamePageLinkID[] = "same-page-link";
// URL of a page linked to by a link on |kLinksPageURL|.
const char kPonyPageURL[] = "/pony.html";
// Text on |kPonyPageURL|.
const char kPonyPageText[] = "Anyone know any good pony jokes?";
} // namespace
namespace web {
// Test fixture for integration tests involving html5 window.history state
// operations.
class WebFramesManagerTest
: public WebIntTest,
public ::testing::WithParamInterface<NavigationManagerChoice> {
protected:
void SetUp() override {
// Set feature flag before calling SetUp (which relies on those feature
// flags).
if (GetParam() == NavigationManagerChoice::LEGACY) {
scoped_feature_list_.InitAndDisableFeature(
web::features::kSlimNavigationManager);
} else {
scoped_feature_list_.InitAndEnableFeature(
web::features::kSlimNavigationManager);
}
WebIntTest::SetUp();
test_server_ = std::make_unique<net::test_server::EmbeddedTestServer>();
net::test_server::RegisterDefaultHandlers(test_server_.get());
test_server_->ServeFilesFromSourceDirectory(
base::FilePath("ios/testing/data/http_server_files/"));
ASSERT_TRUE(test_server_->Start());
}
protected:
// Embedded test server which hosts sample pages.
std::unique_ptr<net::EmbeddedTestServer> test_server_;
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
// Tests that the WebFramesManager correctly adds a WebFrame for a webpage.
TEST_P(WebFramesManagerTest, SingleWebFrame) {
WebFramesManagerImpl* frames_manager =
WebFramesManagerImpl::FromWebState(web_state());
GURL url = test_server_->GetURL("/echo");
ASSERT_TRUE(LoadUrl(url));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
WebFrame* main_web_frame = frames_manager->GetMainWebFrame();
ASSERT_TRUE(main_web_frame);
EXPECT_TRUE(main_web_frame->IsMainFrame());
EXPECT_FALSE(main_web_frame->GetFrameId().empty());
EXPECT_EQ(url.GetOrigin(), main_web_frame->GetSecurityOrigin());
}
// Tests that the WebFramesManager correctly adds a unique WebFrame after a
// webpage navigates back.
TEST_P(WebFramesManagerTest, SingleWebFrameBack) {
WebFramesManagerImpl* frames_manager =
WebFramesManagerImpl::FromWebState(web_state());
// Load first page.
GURL url = test_server_->GetURL("/echo");
ASSERT_TRUE(LoadUrl(url));
WebFrame* main_web_frame = frames_manager->GetMainWebFrame();
ASSERT_TRUE(main_web_frame);
std::string frame_id = main_web_frame->GetFrameId();
EXPECT_FALSE(frame_id.empty());
// Load second page.
GURL pony_url = test_server_->GetURL(kPonyPageURL);
ASSERT_TRUE(LoadUrl(pony_url));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
WebFrame* pony_main_web_frame = frames_manager->GetMainWebFrame();
ASSERT_TRUE(pony_main_web_frame);
EXPECT_TRUE(pony_main_web_frame->IsMainFrame());
EXPECT_EQ(pony_url.GetOrigin(), pony_main_web_frame->GetSecurityOrigin());
std::string pony_frame_id = pony_main_web_frame->GetFrameId();
EXPECT_FALSE(pony_frame_id.empty());
EXPECT_NE(frame_id, pony_frame_id);
// Navigate back to first page.
navigation_manager()->GoBack();
ASSERT_TRUE(test::WaitForWebViewContainingText(web_state(), "Echo"));
EXPECT_EQ(1ul, frames_manager->GetAllWebFrames().size());
EXPECT_EQ(frame_id, frames_manager->GetMainWebFrame()->GetFrameId());
}
// Tests that the WebFramesManager correctly adds a unique WebFrame after a
// webpage navigates back from a clicked link.
TEST_P(WebFramesManagerTest, SingleWebFrameLinkNavigationBackForward) {
WebFramesManagerImpl* frames_manager =
WebFramesManagerImpl::FromWebState(web_state());
// Load page with links.
GURL url = test_server_->GetURL(kLinksPageURL);
ASSERT_TRUE(LoadUrl(url));
WebFrame* main_web_frame = frames_manager->GetMainWebFrame();
ASSERT_TRUE(main_web_frame);
EXPECT_TRUE(main_web_frame->IsMainFrame());
std::string frame_id = main_web_frame->GetFrameId();
// Navigate to a linked page.
GURL pony_url = test_server_->GetURL(kPonyPageURL);
ASSERT_TRUE(ExecuteBlockAndWaitForLoad(pony_url, ^{
ASSERT_TRUE(
web::test::TapWebViewElementWithId(web_state(), kLinksPagePonyLinkID));
}));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
WebFrame* pony_main_web_frame = frames_manager->GetMainWebFrame();
ASSERT_TRUE(pony_main_web_frame);
EXPECT_TRUE(pony_main_web_frame->IsMainFrame());
EXPECT_EQ(pony_url.GetOrigin(), pony_main_web_frame->GetSecurityOrigin());
std::string pony_frame_id = pony_main_web_frame->GetFrameId();
EXPECT_FALSE(pony_frame_id.empty());
EXPECT_NE(frame_id, pony_frame_id);
// Go back to the links page.
navigation_manager()->GoBack();
ASSERT_TRUE(
test::WaitForWebViewContainingText(web_state(), kLinksPagePonyLinkText));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
EXPECT_FALSE(frames_manager->GetMainWebFrame()->GetFrameId().empty());
EXPECT_EQ(frame_id, frames_manager->GetMainWebFrame()->GetFrameId());
// Go forward to the linked page.
navigation_manager()->GoForward();
ASSERT_TRUE(test::WaitForWebViewContainingText(web_state(), kPonyPageText));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
EXPECT_FALSE(frames_manager->GetMainWebFrame()->GetFrameId().empty());
EXPECT_NE(frame_id, frames_manager->GetMainWebFrame()->GetFrameId());
}
// Tests that the WebFramesManager correctly adds a unique WebFrame after a
// webpage navigates back from a clicked same page link.
TEST_P(WebFramesManagerTest, SingleWebFrameSamePageNavigationBackForward) {
WebFramesManagerImpl* frames_manager =
WebFramesManagerImpl::FromWebState(web_state());
GURL url = test_server_->GetURL(kLinksPageURL);
ASSERT_TRUE(LoadUrl(url));
WebFrame* main_web_frame = frames_manager->GetMainWebFrame();
ASSERT_TRUE(main_web_frame);
EXPECT_TRUE(main_web_frame->IsMainFrame());
std::string frame_id = main_web_frame->GetFrameId();
ASSERT_TRUE(web::test::TapWebViewElementWithId(web_state(),
kLinksPageSamePageLinkID));
// WebFrame should not have changed.
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
EXPECT_EQ(main_web_frame, frames_manager->GetMainWebFrame());
navigation_manager()->GoBack();
ASSERT_TRUE(test::WaitForWebViewContainingText(web_state(),
kLinksPageSamePageLinkText));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
EXPECT_EQ(main_web_frame, frames_manager->GetMainWebFrame());
navigation_manager()->GoForward();
ASSERT_TRUE(test::WaitForWebViewContainingText(web_state(),
kLinksPageSamePageLinkText));
ASSERT_EQ(1ul, frames_manager->GetAllWebFrames().size());
EXPECT_FALSE(frames_manager->GetMainWebFrame()->GetFrameId().empty());
EXPECT_EQ(main_web_frame, frames_manager->GetMainWebFrame());
}
INSTANTIATE_TEST_SUITE_P(ProgrammaticWebFramesManagerTest,
WebFramesManagerTest,
::testing::Values(NavigationManagerChoice::LEGACY,
NavigationManagerChoice::WK_BASED));
} // namespace web