Commit a00c4eb3 authored by Danyao Wang's avatar Danyao Wang Committed by Commit Bot

[Nav Experiment] Implement GetBackwardItems() and GetForwardItems().

Bug: 734150
Change-Id: I5198d481082fb5bc9e4a88b50847dcbebb97c248
Reviewed-on: https://chromium-review.googlesource.com/600292
Commit-Queue: Danyao Wang <danyao@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Reviewed-by: default avatarKurt Horimoto <kkhorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#491876}
parent 8e4d4abf
...@@ -1827,6 +1827,136 @@ TEST_P(NavigationManagerTest, GetIndexOfItem) { ...@@ -1827,6 +1827,136 @@ TEST_P(NavigationManagerTest, GetIndexOfItem) {
EXPECT_EQ(-1, navigation_manager()->GetIndexOfItem(item_not_found.get())); EXPECT_EQ(-1, navigation_manager()->GetIndexOfItem(item_not_found.get()));
} }
// Tests that GetBackwardItems() and GetForwardItems() return expected entries
// when current item is in the middle of the navigation history.
TEST_P(NavigationManagerTest, TestBackwardForwardItems) {
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/0"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
[mock_wk_list_ setCurrentURL:@"http://www.url.com/0"];
navigation_manager()->CommitPendingItem();
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/1"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
[mock_wk_list_ setCurrentURL:@"http://www.url.com/1"
backListURLs:@[ @"http://www.url.com/0" ]
forwardListURLs:nil];
navigation_manager()->CommitPendingItem();
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/2"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
[mock_wk_list_
setCurrentURL:@"http://www.url.com/2"
backListURLs:@[ @"http://www.url.com/0", @"http://www.url.com/1" ]
forwardListURLs:nil];
navigation_manager()->CommitPendingItem();
EXPECT_EQ(2, navigation_manager()->GetLastCommittedItemIndex());
NavigationItemList back_items = navigation_manager()->GetBackwardItems();
EXPECT_EQ(2U, back_items.size());
EXPECT_EQ("http://www.url.com/1", back_items[0]->GetURL().spec());
EXPECT_EQ("http://www.url.com/0", back_items[1]->GetURL().spec());
EXPECT_TRUE(navigation_manager()->GetForwardItems().empty());
if (GetParam() == TEST_WK_BASED_NAVIGATION_MANAGER) {
// TODO(crbug.com/734150): Enable this test once |GoToIndex| is
// implemented in WKBasedNavigationManager.
return;
}
navigation_manager()->GoBack();
EXPECT_EQ(1, navigation_manager()->GetLastCommittedItemIndex());
back_items = navigation_manager()->GetBackwardItems();
EXPECT_EQ(1U, back_items.size());
EXPECT_EQ("http://www.url.com/0", back_items[0]->GetURL().spec());
NavigationItemList forward_items = navigation_manager()->GetForwardItems();
EXPECT_EQ(1U, forward_items.size());
EXPECT_EQ("http://www.url.com/2", forward_items[0]->GetURL().spec());
}
// Tests that pending item is not considered part of session history so that
// GetBackwardItems returns the second last committed item even if there is a
// pendign item.
TEST_P(NavigationManagerTest, NewPendingItemIsHiddenFromHistory) {
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/0"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
[mock_wk_list_ setCurrentURL:@"http://www.url.com/0"];
navigation_manager()->CommitPendingItem();
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/1"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
[mock_wk_list_ setCurrentURL:@"http://www.url.com/1"
backListURLs:@[ @"http://www.url.com/0" ]
forwardListURLs:nil];
navigation_manager()->CommitPendingItem();
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/2"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
EXPECT_EQ(1, navigation_manager()->GetLastCommittedItemIndex());
EXPECT_TRUE(navigation_manager()->GetPendingItem());
NavigationItemList back_items = navigation_manager()->GetBackwardItems();
EXPECT_EQ(1U, back_items.size());
EXPECT_EQ("http://www.url.com/0", back_items[0]->GetURL().spec());
}
// Tests that all committed items are considered history if there is a transient
// item. This can happen if an intersitial was loaded for SSL error.
// See crbug.com/691311.
TEST_P(NavigationManagerTest,
BackwardItemsShouldContainAllCommittedIfCurrentIsTransient) {
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/0"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
[mock_wk_list_ setCurrentURL:@"http://www.url.com/0"];
navigation_manager()->CommitPendingItem();
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/1"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
navigation_manager()->AddTransientItem(GURL("http://www.url.com/1"));
EXPECT_EQ(0, navigation_manager()->GetLastCommittedItemIndex());
EXPECT_TRUE(navigation_manager()->GetTransientItem());
NavigationItemList back_items = navigation_manager()->GetBackwardItems();
EXPECT_EQ(1U, back_items.size());
EXPECT_EQ("http://www.url.com/0", back_items[0]->GetURL().spec());
}
TEST_P(NavigationManagerTest, BackwardItemsShouldBeEmptyIfFirstIsTransient) {
navigation_manager()->AddPendingItem(
GURL("http://www.url.com/0"), Referrer(), ui::PAGE_TRANSITION_TYPED,
web::NavigationInitiationType::USER_INITIATED,
web::NavigationManager::UserAgentOverrideOption::INHERIT);
navigation_manager()->AddTransientItem(GURL("http://www.url.com/0"));
EXPECT_EQ(-1, navigation_manager()->GetLastCommittedItemIndex());
EXPECT_TRUE(navigation_manager()->GetTransientItem());
NavigationItemList back_items = navigation_manager()->GetBackwardItems();
EXPECT_TRUE(back_items.empty());
}
INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P(
ProgrammaticNavigationManagerTest, ProgrammaticNavigationManagerTest,
NavigationManagerTest, NavigationManagerTest,
......
...@@ -328,13 +328,29 @@ void WKBasedNavigationManagerImpl::GoToIndex(int index) { ...@@ -328,13 +328,29 @@ void WKBasedNavigationManagerImpl::GoToIndex(int index) {
} }
NavigationItemList WKBasedNavigationManagerImpl::GetBackwardItems() const { NavigationItemList WKBasedNavigationManagerImpl::GetBackwardItems() const {
DLOG(WARNING) << "Not yet implemented."; NavigationItemList items;
return NavigationItemList();
// If the current navigation item is a transient item (e.g. SSL
// interstitial), the last committed item should also be considered part of
// the backward history.
int wk_current_item_index = GetWKCurrentItemIndex();
if (GetTransientItem() && wk_current_item_index >= 0) {
items.push_back(GetItemAtIndex(wk_current_item_index));
}
for (int index = wk_current_item_index - 1; index >= 0; index--) {
items.push_back(GetItemAtIndex(index));
}
return items;
} }
NavigationItemList WKBasedNavigationManagerImpl::GetForwardItems() const { NavigationItemList WKBasedNavigationManagerImpl::GetForwardItems() const {
DLOG(WARNING) << "Not yet implemented."; NavigationItemList items;
return NavigationItemList(); for (int index = GetWKCurrentItemIndex() + 1; index < GetItemCount();
index++) {
items.push_back(GetItemAtIndex(index));
}
return items;
} }
void WKBasedNavigationManagerImpl::CopyStateFromAndPrune( void WKBasedNavigationManagerImpl::CopyStateFromAndPrune(
......
...@@ -78,10 +78,9 @@ TEST_F(WKBasedNavigationManagerTest, SyncAfterItemAtIndex) { ...@@ -78,10 +78,9 @@ TEST_F(WKBasedNavigationManagerTest, SyncAfterItemAtIndex) {
// Tests that Referrer is inferred from the previous WKBackForwardListItem. // Tests that Referrer is inferred from the previous WKBackForwardListItem.
TEST_F(WKBasedNavigationManagerTest, SyncAfterItemAtIndexWithPreviousItem) { TEST_F(WKBasedNavigationManagerTest, SyncAfterItemAtIndexWithPreviousItem) {
[mock_wk_list_ [mock_wk_list_ setCurrentURL:@"http://www.1.com"
setCurrentURL:@"http://www.1.com" backListURLs:@[ @"http://www.0.com" ]
backListURLs:[NSArray arrayWithObjects:@"http://www.0.com", nil] forwardListURLs:@[ @"http://www.2.com" ]];
forwardListURLs:[NSArray arrayWithObjects:@"http://www.2.com", nil]];
EXPECT_EQ(3, manager_->GetItemCount()); EXPECT_EQ(3, manager_->GetItemCount());
EXPECT_EQ(1, manager_->GetLastCommittedItemIndex()); EXPECT_EQ(1, manager_->GetLastCommittedItemIndex());
...@@ -140,11 +139,9 @@ TEST_F(WKBasedNavigationManagerTest, GetItemAtIndexAfterCommitPending) { ...@@ -140,11 +139,9 @@ TEST_F(WKBasedNavigationManagerTest, GetItemAtIndexAfterCommitPending) {
NavigationItem* pending_item2 = manager_->GetPendingItem(); NavigationItem* pending_item2 = manager_->GetPendingItem();
// Simulate an iframe navigation between the two main frame navigations. // Simulate an iframe navigation between the two main frame navigations.
[mock_wk_list_ [mock_wk_list_ setCurrentURL:@"http://www.2.com"
setCurrentURL:@"http://www.2.com" backListURLs:@[ @"http://www.0.com", @"http://www.1.com" ]
backListURLs:[NSArray arrayWithObjects:@"http://www.0.com", forwardListURLs:nil];
@"http://www.1.com", nil]
forwardListURLs:nil];
manager_->CommitPendingItem(); manager_->CommitPendingItem();
EXPECT_EQ(3, manager_->GetItemCount()); EXPECT_EQ(3, manager_->GetItemCount());
...@@ -172,10 +169,9 @@ TEST_F(WKBasedNavigationManagerTest, GetItemAtIndexAfterCommitPending) { ...@@ -172,10 +169,9 @@ TEST_F(WKBasedNavigationManagerTest, GetItemAtIndexAfterCommitPending) {
// pending item is a back forward navigation. // pending item is a back forward navigation.
TEST_F(WKBasedNavigationManagerTest, ReusePendingItemForHistoryNavigation) { TEST_F(WKBasedNavigationManagerTest, ReusePendingItemForHistoryNavigation) {
// Simulate two regular navigations. // Simulate two regular navigations.
[mock_wk_list_ [mock_wk_list_ setCurrentURL:@"http://www.1.com"
setCurrentURL:@"http://www.1.com" backListURLs:@[ @"http://www.0.com" ]
backListURLs:[NSArray arrayWithObjects:@"http://www.0.com", nil] forwardListURLs:nil];
forwardListURLs:nil];
// Force sync NavigationItems. // Force sync NavigationItems.
NavigationItem* original_item0 = manager_->GetItemAtIndex(0); NavigationItem* original_item0 = manager_->GetItemAtIndex(0);
...@@ -188,7 +184,7 @@ TEST_F(WKBasedNavigationManagerTest, ReusePendingItemForHistoryNavigation) { ...@@ -188,7 +184,7 @@ TEST_F(WKBasedNavigationManagerTest, ReusePendingItemForHistoryNavigation) {
WKBackForwardListItem* wk_item1 = [mock_wk_list_ itemAtIndex:0]; WKBackForwardListItem* wk_item1 = [mock_wk_list_ itemAtIndex:0];
mock_wk_list_.currentItem = wk_item0; mock_wk_list_.currentItem = wk_item0;
mock_wk_list_.backList = nil; mock_wk_list_.backList = nil;
mock_wk_list_.forwardList = [NSArray arrayWithObjects:wk_item1, nil]; mock_wk_list_.forwardList = @[ wk_item1 ];
OCMExpect([mock_web_view_ URL]) OCMExpect([mock_web_view_ URL])
.andReturn([[NSURL alloc] initWithString:@"http://www.0.com"]); .andReturn([[NSURL alloc] initWithString:@"http://www.0.com"]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment