| // Copyright 2012 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. |
| |
| #import "ios/web/navigation/crw_session_controller.h" |
| |
| #import <Foundation/Foundation.h> |
| |
| #include <utility> |
| |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/strings/sys_string_conversions.h" |
| #import "ios/web/navigation/crw_session_controller+private_constructors.h" |
| #import "ios/web/navigation/navigation_item_impl.h" |
| #import "ios/web/navigation/navigation_manager_impl.h" |
| #include "ios/web/public/referrer.h" |
| #include "ios/web/public/test/fakes/test_browser_state.h" |
| #include "ios/web/public/test/test_web_thread_bundle.h" |
| #import "net/base/mac/url_conversions.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #import "testing/gtest_mac.h" |
| #include "testing/platform_test.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| using UserAgentOverrideOption = web::NavigationManager::UserAgentOverrideOption; |
| |
| @interface CRWSessionController (Testing) |
| - (const GURL&)URLForItemAtIndex:(size_t)index; |
| - (const GURL&)currentURL; |
| @end |
| |
| @implementation CRWSessionController (Testing) |
| - (const GURL&)URLForItemAtIndex:(size_t)index { |
| if (index < self.items.size()) |
| return self.items[index]->GetURL(); |
| return GURL::EmptyGURL(); |
| } |
| |
| - (const GURL&)currentURL { |
| return self.currentItem ? self.currentItem->GetURL() : GURL::EmptyGURL(); |
| } |
| @end |
| |
| namespace { |
| |
| class CRWSessionControllerTest : public PlatformTest { |
| protected: |
| void SetUp() override { |
| session_controller_ = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; |
| } |
| |
| web::Referrer MakeReferrer(const std::string& url) { |
| return web::Referrer(GURL(url), web::ReferrerPolicyDefault); |
| } |
| |
| web::TestWebThreadBundle thread_bundle_; |
| web::TestBrowserState browser_state_; |
| CRWSessionController* session_controller_; |
| }; |
| |
| TEST_F(CRWSessionControllerTest, Init) { |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| } |
| |
| // Tests session controller state after setting a pending index. |
| TEST_F(CRWSessionControllerTest, SetPendingIndex) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| [session_controller_ setPendingItemIndex:0]; |
| EXPECT_EQ(0, [session_controller_ pendingItemIndex]); |
| EXPECT_EQ([session_controller_ items].back().get(), |
| [session_controller_ pendingItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItem) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_EQ( |
| GURL("http://www.url.com/"), |
| [session_controller_ currentURL]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemWithCommittedItems) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.committed.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.committed.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ( |
| GURL("http://www.url.com/"), |
| [session_controller_ currentURL]); |
| } |
| |
| // Tests that adding a pending item resets pending item index. |
| TEST_F(CRWSessionControllerTest, addPendingItemWithExistingPendingItemIndex) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // Set 0 as pending item index. |
| [session_controller_ setPendingItemIndex:0]; |
| EXPECT_EQ(GURL("http://www.example.com/"), |
| [session_controller_ pendingItem]->GetURL()); |
| EXPECT_EQ(0, [session_controller_ pendingItemIndex]); |
| |
| // Add a pending item, which should drop pending navigation index. |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| EXPECT_EQ(GURL("http://www.example.com/1"), |
| [session_controller_ pendingItem]->GetURL()); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemOverriding) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.another.url.com") |
| referrer:MakeReferrer("http://www.another.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_EQ( |
| GURL("http://www.another.url.com/"), |
| [session_controller_ currentURL]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemAndCommit) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemOverridingAndCommit) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.another.url.com") |
| referrer:MakeReferrer("http://www.another.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.another.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemAndCommitMultiple) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| [session_controller_ |
| addPendingItem:GURL("http://www.another.url.com") |
| referrer:MakeReferrer("http://www.another.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(2U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ(GURL("http://www.another.url.com/"), |
| [session_controller_ URLForItemAtIndex:1U]); |
| EXPECT_EQ([session_controller_ items][1U].get(), |
| [session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemAndDiscard) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ discardNonCommittedItems]; |
| |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| } |
| |
| // Tests discarding pending item added via |setPendingItemIndex:| call. |
| TEST_F(CRWSessionControllerTest, setPendingItemIndexAndDiscard) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| [session_controller_ setPendingItemIndex:0]; |
| EXPECT_TRUE([session_controller_ pendingItem]); |
| EXPECT_EQ(0, [session_controller_ pendingItemIndex]); |
| |
| [session_controller_ discardNonCommittedItems]; |
| EXPECT_FALSE([session_controller_ pendingItem]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemAndDiscardAndAddAndCommit) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ discardNonCommittedItems]; |
| |
| [session_controller_ |
| addPendingItem:GURL("http://www.another.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.another.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, addPendingItemAndCommitAndAddAndDiscard) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| [session_controller_ |
| addPendingItem:GURL("http://www.another.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ discardNonCommittedItems]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, |
| commitPendingItemWithoutPendingOrCommittedItem) { |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, |
| commitPendingItemWithoutPendingItemWithCommittedItem) { |
| // Setup committed item. |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/") |
| referrer:MakeReferrer("http://www.referrer.com/") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // Commit pending item when there is no such one |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| // Tests that forward items are discarded after navigation item is committed. |
| TEST_F(CRWSessionControllerTest, commitPendingItemWithExistingForwardItems) { |
| // Make 3 items. |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/1") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/2") |
| referrer:MakeReferrer("http://www.example.com/c") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // Go back to the first item. |
| [session_controller_ goToItemAtIndex:0 discardNonCommittedItems:NO]; |
| |
| // Create and commit a new pending item. |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/2") |
| referrer:MakeReferrer("http://www.example.com/c") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // All forward items should go away. |
| EXPECT_EQ(2U, [session_controller_ items].size()); |
| EXPECT_EQ(0U, [session_controller_ forwardItems].size()); |
| ASSERT_EQ(1, [session_controller_ lastCommittedItemIndex]); |
| ASSERT_EQ(0, [session_controller_ previousItemIndex]); |
| } |
| |
| // Tests committing pending item index from the middle. |
| TEST_F(CRWSessionControllerTest, commitPendingItemIndex) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/2") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| ASSERT_EQ(3U, [session_controller_ items].size()); |
| |
| // Go to the middle, and commit first pending item index. |
| [session_controller_ goToItemAtIndex:1 discardNonCommittedItems:NO]; |
| [session_controller_ setPendingItemIndex:0]; |
| ASSERT_EQ(0, [session_controller_ pendingItemIndex]); |
| web::NavigationItem* pending_item = [session_controller_ pendingItem]; |
| ASSERT_TRUE(pending_item); |
| ASSERT_EQ(1, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(2, [session_controller_ previousItemIndex]); |
| [session_controller_ commitPendingItem]; |
| |
| // Verify that pending item has been committed and current and previous item |
| // indices updated. |
| EXPECT_EQ(pending_item, [session_controller_ lastCommittedItem]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| EXPECT_FALSE([session_controller_ pendingItem]); |
| EXPECT_EQ(0, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(1, [session_controller_ previousItemIndex]); |
| EXPECT_EQ(3U, [session_controller_ items].size()); |
| } |
| |
| TEST_F(CRWSessionControllerTest, |
| DiscardPendingItemWithoutPendingOrCommittedItem) { |
| [session_controller_ discardNonCommittedItems]; |
| |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, |
| DiscardPendingItemWithoutPendingItemWithCommittedItem) { |
| // Setup committed item |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // Discard noncommitted items when there is no such one |
| [session_controller_ discardNonCommittedItems]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, updatePendingItemWithoutPendingItem) { |
| [session_controller_ updatePendingItem:GURL("http://www.another.url.com")]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, updatePendingItemWithPendingItem) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ updatePendingItem:GURL("http://www.another.url.com")]; |
| |
| EXPECT_EQ( |
| GURL("http://www.another.url.com/"), |
| [session_controller_ currentURL]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, |
| updatePendingItemWithPendingItemAlreadyCommited) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ updatePendingItem:GURL("http://www.another.url.com")]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(GURL("http://www.url.com/"), |
| [session_controller_ URLForItemAtIndex:0U]); |
| EXPECT_EQ([session_controller_ items].front().get(), |
| [session_controller_ currentItem]); |
| } |
| |
| // Tests inserting session controller state. |
| TEST_F(CRWSessionControllerTest, CopyState) { |
| // Add 1 committed and 1 pending item to target controller. |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/2") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/3") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| // Create source session controller with 1 committed item. |
| CRWSessionController* other_session_controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [other_session_controller commitPendingItem]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| // Insert and verify the state of target session controller. |
| EXPECT_TRUE([session_controller_ canPruneAllButLastCommittedItem]); |
| [session_controller_ |
| copyStateFromSessionControllerAndPrune:other_session_controller]; |
| |
| EXPECT_EQ(2U, [session_controller_ items].size()); |
| EXPECT_EQ(1, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ previousItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| |
| EXPECT_EQ(GURL("http://www.url.com/0"), |
| [session_controller_ URLForItemAtIndex:0]); |
| EXPECT_EQ(GURL("http://www.url.com/2"), |
| [session_controller_ URLForItemAtIndex:1]); |
| EXPECT_EQ(GURL("http://www.url.com/3"), |
| [session_controller_ pendingItem]->GetURL()); |
| } |
| |
| // Tests inserting session controller state from empty session controller. |
| TEST_F(CRWSessionControllerTest, CopyStateFromEmptySessionController) { |
| // Add 2 committed items to target controller. |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // Create empty source session controller. |
| CRWSessionController* other_session_controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; |
| |
| // Insert and verify the state of target session controller. |
| EXPECT_TRUE([session_controller_ canPruneAllButLastCommittedItem]); |
| [session_controller_ |
| copyStateFromSessionControllerAndPrune:other_session_controller]; |
| EXPECT_EQ(2U, [session_controller_ items].size()); |
| EXPECT_EQ(1, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(0, [session_controller_ previousItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| EXPECT_FALSE([session_controller_ pendingItem]); |
| EXPECT_EQ(GURL("http://www.url.com/0"), |
| [session_controller_ URLForItemAtIndex:0]); |
| EXPECT_EQ(GURL("http://www.url.com/1"), |
| [session_controller_ URLForItemAtIndex:1]); |
| } |
| |
| // Tests that |-copyStateFromSessionControllerAndPrune:| is a no-op when the |
| // receiver has no last committed item. |
| TEST_F(CRWSessionControllerTest, CopyStateToEmptySessionController) { |
| EXPECT_FALSE([session_controller_ canPruneAllButLastCommittedItem]); |
| |
| // Create source session controller with 1 committed item. |
| CRWSessionController* other_session_controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [other_session_controller commitPendingItem]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| // Attempt to copy |other_session_controller|'s state and verify that |
| // |session_controller_| is unchanged. |
| [session_controller_ |
| copyStateFromSessionControllerAndPrune:other_session_controller]; |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_EQ(-1, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ previousItemIndex]); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| EXPECT_FALSE([session_controller_ pendingItem]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| } |
| |
| // Tests that |-copyStateFromSessionControllerAndPrune:| is a no-op during a |
| // pending history navigation. |
| TEST_F(CRWSessionControllerTest, CopyStateDuringPendingHistoryNavigation) { |
| // Add 1 committed and 1 pending item to target controller. |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/2") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| // Create source session controller with 1 committed item. |
| CRWSessionController* other_session_controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [other_session_controller commitPendingItem]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| // Set the pending item index to the first item. |
| [session_controller_ setPendingItemIndex:0]; |
| EXPECT_FALSE([session_controller_ canPruneAllButLastCommittedItem]); |
| |
| // Attempt to copy |other_session_controller|'s state and verify that |
| // |session_controller_| is unchanged. |
| [session_controller_ |
| copyStateFromSessionControllerAndPrune:other_session_controller]; |
| EXPECT_EQ(2U, [session_controller_ items].size()); |
| EXPECT_EQ(1, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(0, [session_controller_ previousItemIndex]); |
| EXPECT_EQ(0, [session_controller_ pendingItemIndex]); |
| EXPECT_TRUE([session_controller_ pendingItem]); |
| EXPECT_EQ([session_controller_ previousItem], |
| [session_controller_ pendingItem]); |
| } |
| |
| // Tests that |-copyStateFromSessionControllerAndPrune:| is a when a transient |
| // NavigationItem exists. |
| TEST_F(CRWSessionControllerTest, CopyStateWithTransientItem) { |
| // Add 1 committed and 1 pending item to target controller. |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| GURL second_url = GURL("http://www.url.com/2"); |
| [session_controller_ |
| addPendingItem:second_url |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ addTransientItemWithURL:second_url]; |
| |
| // Create source session controller with 1 committed item. |
| CRWSessionController* other_session_controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/0") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [other_session_controller commitPendingItem]; |
| [other_session_controller |
| addPendingItem:GURL("http://www.url.com/1") |
| referrer:web::Referrer() |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| // Attempt to copy |other_session_controller|'s state and verify that |
| // |session_controller_| is unchanged. |
| EXPECT_FALSE([session_controller_ canPruneAllButLastCommittedItem]); |
| [session_controller_ |
| copyStateFromSessionControllerAndPrune:other_session_controller]; |
| EXPECT_EQ(1U, [session_controller_ items].size()); |
| EXPECT_EQ(0, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ previousItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| EXPECT_TRUE([session_controller_ pendingItem]); |
| EXPECT_TRUE([session_controller_ transientItem]); |
| EXPECT_EQ([session_controller_ transientItem], |
| [session_controller_ currentItem]); |
| } |
| |
| // Tests state of an empty session controller. |
| TEST_F(CRWSessionControllerTest, EmptyController) { |
| EXPECT_TRUE([session_controller_ items].empty()); |
| EXPECT_EQ(-1, [session_controller_ lastCommittedItemIndex]); |
| EXPECT_EQ(-1, [session_controller_ previousItemIndex]); |
| EXPECT_FALSE([session_controller_ currentItem]); |
| EXPECT_FALSE([session_controller_ pendingItem]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| } |
| |
| // Helper to create a NavigationItem. |
| std::unique_ptr<web::NavigationItem> CreateNavigationItem( |
| const std::string& url, |
| const std::string& referrer, |
| NSString* title) { |
| web::Referrer referrer_object(GURL(referrer), |
| web::ReferrerPolicyDefault); |
| std::unique_ptr<web::NavigationItemImpl> navigation_item = |
| base::MakeUnique<web::NavigationItemImpl>(); |
| navigation_item->SetURL(GURL(url)); |
| navigation_item->SetReferrer(referrer_object); |
| navigation_item->SetTitle(base::SysNSStringToUTF16(title)); |
| navigation_item->SetTransitionType(ui::PAGE_TRANSITION_TYPED); |
| |
| // XCode clang doesn't correctly handle implicit unique_ptr casting for |
| // returned values, so manually cast here. |
| std::unique_ptr<web::NavigationItem> item( |
| static_cast<web::NavigationItem*>(navigation_item.release())); |
| return item; |
| } |
| |
| TEST_F(CRWSessionControllerTest, CreateWithEmptyNavigations) { |
| std::vector<std::unique_ptr<web::NavigationItem>> items; |
| CRWSessionController* controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_ |
| navigationItems:std::move(items) |
| lastCommittedItemIndex:0]; |
| EXPECT_TRUE(controller.items.empty()); |
| EXPECT_EQ(controller.lastCommittedItemIndex, -1); |
| EXPECT_EQ(controller.previousItemIndex, -1); |
| EXPECT_FALSE(controller.currentItem); |
| } |
| |
| TEST_F(CRWSessionControllerTest, CreateWithNavList) { |
| std::vector<std::unique_ptr<web::NavigationItem>> items; |
| items.push_back(CreateNavigationItem("http://www.google.com", |
| "http://www.referrer.com", @"Google")); |
| items.push_back(CreateNavigationItem("http://www.yahoo.com", |
| "http://www.google.com", @"Yahoo")); |
| items.push_back(CreateNavigationItem("http://www.espn.com", |
| "http://www.nothing.com", @"ESPN")); |
| CRWSessionController* controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_ |
| navigationItems:std::move(items) |
| lastCommittedItemIndex:1]; |
| |
| EXPECT_EQ(controller.items.size(), 3U); |
| EXPECT_EQ(controller.lastCommittedItemIndex, 1); |
| EXPECT_EQ(controller.previousItemIndex, -1); |
| // Sanity check the current item, the NavigationItem unit test will ensure |
| // the entire object is created properly. |
| EXPECT_EQ([controller currentItem]->GetURL(), GURL("http://www.yahoo.com")); |
| } |
| |
| // Tests index of previous navigation item. |
| TEST_F(CRWSessionControllerTest, PreviousNavigationItem) { |
| EXPECT_EQ(session_controller_.previousItemIndex, -1); |
| [session_controller_ |
| addPendingItem:GURL("http://www.url.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| EXPECT_EQ(session_controller_.previousItemIndex, -1); |
| [session_controller_ |
| addPendingItem:GURL("http://www.url1.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| EXPECT_EQ(session_controller_.previousItemIndex, 0); |
| [session_controller_ |
| addPendingItem:GURL("http://www.url2.com") |
| referrer:MakeReferrer("http://www.referer.com") |
| transition:ui::PAGE_TRANSITION_TYPED |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(session_controller_.previousItemIndex, 1); |
| |
| [session_controller_ goToItemAtIndex:1 discardNonCommittedItems:NO]; |
| EXPECT_EQ(session_controller_.previousItemIndex, 2); |
| |
| [session_controller_ goToItemAtIndex:0 discardNonCommittedItems:NO]; |
| EXPECT_EQ(session_controller_.previousItemIndex, 1); |
| |
| [session_controller_ goToItemAtIndex:1 discardNonCommittedItems:NO]; |
| EXPECT_EQ(session_controller_.previousItemIndex, 0); |
| |
| [session_controller_ goToItemAtIndex:2 discardNonCommittedItems:NO]; |
| EXPECT_EQ(session_controller_.previousItemIndex, 1); |
| } |
| |
| TEST_F(CRWSessionControllerTest, PushNewItem) { |
| std::vector<std::unique_ptr<web::NavigationItem>> items; |
| items.push_back(CreateNavigationItem("http://www.firstpage.com", |
| "http://www.starturl.com", @"First")); |
| items.push_back(CreateNavigationItem("http://www.secondpage.com", |
| "http://www.firstpage.com", @"Second")); |
| items.push_back(CreateNavigationItem("http://www.thirdpage.com", |
| "http://www.secondpage.com", @"Third")); |
| CRWSessionController* controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_ |
| navigationItems:std::move(items) |
| lastCommittedItemIndex:0]; |
| |
| GURL pushPageGurl1("http://www.firstpage.com/#push1"); |
| NSString* stateObject1 = @"{'foo': 1}"; |
| [controller pushNewItemWithURL:pushPageGurl1 |
| stateObject:stateObject1 |
| transition:ui::PAGE_TRANSITION_LINK]; |
| web::NavigationItemImpl* pushedItem = [controller currentItem]; |
| NSUInteger expectedCount = 2; |
| EXPECT_EQ(expectedCount, controller.items.size()); |
| EXPECT_EQ(pushPageGurl1, pushedItem->GetURL()); |
| EXPECT_TRUE(pushedItem->IsCreatedFromPushState()); |
| EXPECT_NSEQ(stateObject1, pushedItem->GetSerializedStateObject()); |
| EXPECT_EQ(GURL("http://www.firstpage.com/"), pushedItem->GetReferrer().url); |
| |
| // Add another new item and check size and fields again. |
| GURL pushPageGurl2("http://www.firstpage.com/push2"); |
| [controller pushNewItemWithURL:pushPageGurl2 |
| stateObject:nil |
| transition:ui::PAGE_TRANSITION_LINK]; |
| pushedItem = [controller currentItem]; |
| expectedCount = 3; |
| EXPECT_EQ(expectedCount, controller.items.size()); |
| EXPECT_EQ(pushPageGurl2, pushedItem->GetURL()); |
| EXPECT_TRUE(pushedItem->IsCreatedFromPushState()); |
| EXPECT_EQ(nil, pushedItem->GetSerializedStateObject()); |
| EXPECT_EQ(pushPageGurl1, pushedItem->GetReferrer().url); |
| } |
| |
| TEST_F(CRWSessionControllerTest, IsSameDocumentNavigation) { |
| std::vector<std::unique_ptr<web::NavigationItem>> items; |
| items.push_back( |
| CreateNavigationItem("http://foo.com", "http://google.com", @"First")); |
| // Push state navigation. |
| items.push_back( |
| CreateNavigationItem("http://foo.com#bar", "http://foo.com", @"Second")); |
| items.push_back(CreateNavigationItem("http://google.com", |
| "http://foo.com#bar", @"Third")); |
| items.push_back( |
| CreateNavigationItem("http://foo.com", "http://google.com", @"Fourth")); |
| // Push state navigation. |
| items.push_back( |
| CreateNavigationItem("http://foo.com/bar", "http://foo.com", @"Fifth")); |
| // Push state navigation. |
| items.push_back(CreateNavigationItem("http://foo.com/bar#bar", |
| "http://foo.com/bar", @"Sixth")); |
| CRWSessionController* controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_ |
| navigationItems:std::move(items) |
| lastCommittedItemIndex:0]; |
| web::NavigationItemImpl* item0 = [controller items][0].get(); |
| web::NavigationItemImpl* item1 = [controller items][1].get(); |
| web::NavigationItemImpl* item2 = [controller items][2].get(); |
| web::NavigationItemImpl* item3 = [controller items][3].get(); |
| web::NavigationItemImpl* item4 = [controller items][4].get(); |
| web::NavigationItemImpl* item5 = [controller items][5].get(); |
| item1->SetIsCreatedFromPushState(true); |
| item4->SetIsCreatedFromHashChange(true); |
| item5->SetIsCreatedFromPushState(true); |
| |
| EXPECT_FALSE( |
| [controller isSameDocumentNavigationBetweenItem:item0 andItem:item0]); |
| EXPECT_TRUE( |
| [controller isSameDocumentNavigationBetweenItem:item0 andItem:item1]); |
| EXPECT_TRUE( |
| [controller isSameDocumentNavigationBetweenItem:item5 andItem:item3]); |
| EXPECT_TRUE( |
| [controller isSameDocumentNavigationBetweenItem:item4 andItem:item3]); |
| EXPECT_FALSE( |
| [controller isSameDocumentNavigationBetweenItem:item1 andItem:item2]); |
| EXPECT_FALSE( |
| [controller isSameDocumentNavigationBetweenItem:item0 andItem:item5]); |
| EXPECT_FALSE( |
| [controller isSameDocumentNavigationBetweenItem:item2 andItem:item4]); |
| } |
| |
| TEST_F(CRWSessionControllerTest, UpdateCurrentItem) { |
| std::vector<std::unique_ptr<web::NavigationItem>> items; |
| items.push_back(CreateNavigationItem("http://www.firstpage.com", |
| "http://www.starturl.com", @"First")); |
| items.push_back(CreateNavigationItem("http://www.secondpage.com", |
| "http://www.firstpage.com", @"Second")); |
| items.push_back(CreateNavigationItem("http://www.thirdpage.com", |
| "http://www.secondpage.com", @"Third")); |
| CRWSessionController* controller = |
| [[CRWSessionController alloc] initWithBrowserState:&browser_state_ |
| navigationItems:std::move(items) |
| lastCommittedItemIndex:0]; |
| |
| GURL replacePageGurl1("http://www.firstpage.com/#replace1"); |
| NSString* stateObject1 = @"{'foo': 1}"; |
| |
| // Replace current item and check the size of history and fields of the |
| // modified item. |
| [controller updateCurrentItemWithURL:replacePageGurl1 |
| stateObject:stateObject1]; |
| web::NavigationItemImpl* replacedItem = [controller currentItem]; |
| NSUInteger expectedCount = 3; |
| EXPECT_EQ(expectedCount, controller.items.size()); |
| EXPECT_EQ(replacePageGurl1, replacedItem->GetURL()); |
| EXPECT_FALSE(replacedItem->IsCreatedFromPushState()); |
| EXPECT_NSEQ(stateObject1, replacedItem->GetSerializedStateObject()); |
| EXPECT_EQ(GURL("http://www.starturl.com/"), replacedItem->GetReferrer().url); |
| |
| // Replace current item and check size and fields again. |
| GURL replacePageGurl2("http://www.firstpage.com/#replace2"); |
| [controller updateCurrentItemWithURL:replacePageGurl2 stateObject:nil]; |
| replacedItem = [controller currentItem]; |
| EXPECT_EQ(expectedCount, controller.items.size()); |
| EXPECT_EQ(replacePageGurl2, replacedItem->GetURL()); |
| EXPECT_FALSE(replacedItem->IsCreatedFromPushState()); |
| EXPECT_NSEQ(nil, replacedItem->GetSerializedStateObject()); |
| EXPECT_EQ(GURL("http://www.starturl.com/"), replacedItem->GetReferrer().url); |
| } |
| |
| TEST_F(CRWSessionControllerTest, TestBackwardForwardItems) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/1") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/redirect") |
| referrer:MakeReferrer("http://www.example.com/r") |
| transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/2") |
| referrer:MakeReferrer("http://www.example.com/c") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| EXPECT_EQ(3, session_controller_.lastCommittedItemIndex); |
| web::NavigationItemList back_items = [session_controller_ backwardItems]; |
| EXPECT_EQ(2U, back_items.size()); |
| EXPECT_TRUE([session_controller_ forwardItems].empty()); |
| EXPECT_EQ("http://www.example.com/redirect", back_items[0]->GetURL().spec()); |
| |
| [session_controller_ goToItemAtIndex:1 discardNonCommittedItems:NO]; |
| EXPECT_EQ(1U, [session_controller_ backwardItems].size()); |
| EXPECT_EQ(1U, [session_controller_ forwardItems].size()); |
| |
| [session_controller_ goToItemAtIndex:0 discardNonCommittedItems:NO]; |
| web::NavigationItemList forwardItems = [session_controller_ forwardItems]; |
| EXPECT_EQ(0U, [session_controller_ backwardItems].size()); |
| EXPECT_EQ(2U, forwardItems.size()); |
| EXPECT_EQ("http://www.example.com/2", forwardItems[1]->GetURL().spec()); |
| } |
| |
| // Tests going to items with existing and non-existing indices. |
| TEST_F(CRWSessionControllerTest, GoToItemAtIndex) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/1") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/redirect") |
| referrer:MakeReferrer("http://www.example.com/r") |
| transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/2") |
| referrer:MakeReferrer("http://www.example.com/c") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/3") |
| referrer:MakeReferrer("http://www.example.com/d") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ addTransientItemWithURL:GURL("http://www.example.com")]; |
| EXPECT_EQ(3, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(2, session_controller_.previousItemIndex); |
| EXPECT_TRUE([session_controller_ pendingItem]); |
| EXPECT_TRUE([session_controller_ transientItem]); |
| |
| // Going back and forth without discaring transient and pending items. |
| [session_controller_ goToItemAtIndex:1 discardNonCommittedItems:NO]; |
| EXPECT_EQ(1, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(3, session_controller_.previousItemIndex); |
| EXPECT_TRUE(session_controller_.pendingItem); |
| EXPECT_TRUE(session_controller_.transientItem); |
| [session_controller_ goToItemAtIndex:3 discardNonCommittedItems:NO]; |
| EXPECT_EQ(3, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(1, session_controller_.previousItemIndex); |
| EXPECT_TRUE(session_controller_.pendingItem); |
| EXPECT_TRUE(session_controller_.transientItem); |
| |
| // Going back should discard transient and pending items. |
| [session_controller_ goToItemAtIndex:1 discardNonCommittedItems:YES]; |
| EXPECT_EQ(1, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(3, session_controller_.previousItemIndex); |
| EXPECT_FALSE(session_controller_.pendingItem); |
| EXPECT_FALSE(session_controller_.transientItem); |
| |
| // Going forward should discard transient item. |
| [session_controller_ addTransientItemWithURL:GURL("http://www.example.com")]; |
| EXPECT_TRUE(session_controller_.transientItem); |
| [session_controller_ goToItemAtIndex:2 discardNonCommittedItems:YES]; |
| EXPECT_EQ(2, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(1, session_controller_.previousItemIndex); |
| EXPECT_FALSE(session_controller_.transientItem); |
| |
| // Out of bounds navigations should be no-op. |
| [session_controller_ goToItemAtIndex:-1 discardNonCommittedItems:NO]; |
| EXPECT_EQ(2, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(1, session_controller_.previousItemIndex); |
| [session_controller_ goToItemAtIndex:NSIntegerMax |
| discardNonCommittedItems:NO]; |
| EXPECT_EQ(2, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(1, session_controller_.previousItemIndex); |
| |
| // Going to current index should not change the previous index. |
| [session_controller_ goToItemAtIndex:2 discardNonCommittedItems:NO]; |
| EXPECT_EQ(2, session_controller_.lastCommittedItemIndex); |
| EXPECT_EQ(1, session_controller_.previousItemIndex); |
| } |
| |
| // Tests that visible URL is the same as transient URL if there are no committed |
| // items. |
| TEST_F(CRWSessionControllerTest, VisibleItemWithSingleTransientItem) { |
| [session_controller_ addTransientItemWithURL:GURL("http://www.example.com")]; |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_TRUE(visible_item); |
| EXPECT_EQ("http://www.example.com/", visible_item->GetURL().spec()); |
| } |
| |
| // Tests that visible URL is the same as transient URL if there is a committed |
| // item. |
| TEST_F(CRWSessionControllerTest, VisibleItemWithCommittedAndTransientItems) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ addTransientItemWithURL:GURL("http://www.example.com")]; |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_TRUE(visible_item); |
| EXPECT_EQ("http://www.example.com/", visible_item->GetURL().spec()); |
| } |
| |
| // Tests that visible URL is the same as pending URL if it was user-initiated. |
| TEST_F(CRWSessionControllerTest, |
| VisibleItemWithSingleUserInitiatedPendingItem) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_TRUE(visible_item); |
| EXPECT_EQ("http://www.example.com/0", visible_item->GetURL().spec()); |
| } |
| |
| // Tests that visible URL is the same as pending URL if it was user-initiated |
| // and there is a committed item. |
| TEST_F(CRWSessionControllerTest, |
| VisibleItemWithCommittedAndUserInitiatedPendingItem) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_TRUE(visible_item); |
| EXPECT_EQ("http://www.example.com/0", visible_item->GetURL().spec()); |
| } |
| |
| // Tests that visible URL is not the same as pending URL if it was |
| // renderer-initiated. |
| TEST_F(CRWSessionControllerTest, |
| VisibleItemWithSingleRendererInitiatedPendingItem) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_FALSE(visible_item); |
| } |
| |
| // Tests that visible URL is not the same as pending URL if it was |
| // renderer-initiated and there is a committed item. |
| TEST_F(CRWSessionControllerTest, |
| VisibleItemWithCommittedAndRendererInitiatedPendingItem) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_TRUE(visible_item); |
| EXPECT_EQ("http://www.example.com/", visible_item->GetURL().spec()); |
| } |
| |
| // Tests that visible URL is not the same as pending URL created via pending |
| // navigation index. |
| TEST_F(CRWSessionControllerTest, VisibleItemWithPendingNavigationIndex) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| |
| [session_controller_ setPendingItemIndex:0]; |
| |
| web::NavigationItem* visible_item = [session_controller_ visibleItem]; |
| ASSERT_TRUE(visible_item); |
| EXPECT_EQ("http://www.example.com/0", visible_item->GetURL().spec()); |
| } |
| |
| // Tests that |-backwardItems| is empty if all preceding items are |
| // redirects. |
| TEST_F(CRWSessionControllerTest, BackwardItemsForAllRedirects) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT |
| initiationType:web::NavigationInitiationType::RENDERER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| EXPECT_EQ(0U, [session_controller_ backwardItems].size()); |
| } |
| |
| // Tests that |-pendingItem| is not considered part of session history so that |
| // |-backwardItems| returns the second last committed item even if there is a |
| // pendign item. |
| TEST_F(CRWSessionControllerTest, NewPendingItemIsHiddenFromHistory) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/1") |
| referrer:MakeReferrer("http://www.example.com/b") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/2") |
| referrer:MakeReferrer("http://www.example.com/c") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| |
| EXPECT_EQ(1, session_controller_.lastCommittedItemIndex); |
| EXPECT_TRUE([session_controller_ pendingItem]); |
| EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); |
| EXPECT_EQ(GURL("http://www.example.com/2"), [session_controller_ currentURL]); |
| |
| web::NavigationItemList back_items = [session_controller_ backwardItems]; |
| ASSERT_EQ(1U, back_items.size()); |
| EXPECT_EQ("http://www.example.com/0", back_items[0]->GetURL().spec()); |
| } |
| |
| // Tests that |-backwardItems| returns all committed items if there is a |
| // transient item. This can happen if an intersitial was loaded for SSL error. |
| // See crbug.com/691311. |
| TEST_F(CRWSessionControllerTest, |
| BackwardItemsShouldContainAllCommittedIfCurrentIsTransient) { |
| [session_controller_ |
| addPendingItem:GURL("http://www.example.com/0") |
| referrer:MakeReferrer("http://www.example.com/a") |
| transition:ui::PAGE_TRANSITION_LINK |
| initiationType:web::NavigationInitiationType::USER_INITIATED |
| userAgentOverrideOption:UserAgentOverrideOption::INHERIT]; |
| [session_controller_ commitPendingItem]; |
| [session_controller_ |
| addTransientItemWithURL:GURL("http://www.example.com/1")]; |
| |
| EXPECT_EQ(0, session_controller_.lastCommittedItemIndex); |
| EXPECT_TRUE([session_controller_ transientItem]); |
| EXPECT_EQ(GURL("http://www.example.com/1"), [session_controller_ currentURL]); |
| |
| web::NavigationItemList back_items = [session_controller_ backwardItems]; |
| ASSERT_EQ(1U, back_items.size()); |
| EXPECT_EQ("http://www.example.com/0", back_items[0]->GetURL().spec()); |
| } |
| |
| // Tests that |-backwardItems| works as expected when the transient item is the |
| // only item in history. |
| TEST_F(CRWSessionControllerTest, BackwardItemsShouldBeEmptyIfFirstIsTransient) { |
| [session_controller_ |
| addTransientItemWithURL:GURL("http://www.example.com/1")]; |
| |
| EXPECT_EQ(-1, session_controller_.lastCommittedItemIndex); |
| EXPECT_TRUE([session_controller_ transientItem]); |
| EXPECT_EQ(GURL("http://www.example.com/1"), [session_controller_ currentURL]); |
| |
| web::NavigationItemList back_items = [session_controller_ backwardItems]; |
| EXPECT_TRUE(back_items.empty()); |
| } |
| |
| } // anonymous namespace |