| Index: ios/shared/chrome/browser/tabs/web_state_list_unittest.mm
|
| diff --git a/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm b/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm
|
| index 1c0ed211d1910e4f790bee4090331cde12c92b90..ad7c3fecf7f2c39c019b397c999b23a52df201da 100644
|
| --- a/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm
|
| +++ b/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm
|
| @@ -8,6 +8,7 @@
|
| #include "base/memory/ptr_util.h"
|
| #include "base/supports_user_data.h"
|
| #import "ios/shared/chrome/browser/tabs/web_state_list_observer.h"
|
| +#import "ios/web/public/test/fakes/test_navigation_manager.h"
|
| #import "ios/web/public/test/fakes/test_web_state.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "testing/platform_test.h"
|
| @@ -97,6 +98,39 @@ class WebStateListTestObserver : public WebStateListObserver {
|
|
|
| DISALLOW_COPY_AND_ASSIGN(WebStateListTestObserver);
|
| };
|
| +
|
| +// A fake NavigationManager used to test opener-opened relationship in the
|
| +// WebStateList.
|
| +class FakeNavigationManer : public web::TestNavigationManager {
|
| + public:
|
| + FakeNavigationManer() = default;
|
| +
|
| + // web::NavigationManager implementation.
|
| + int GetCurrentItemIndex() const override { return current_item_index_; }
|
| +
|
| + int GetLastCommittedItemIndex() const override { return current_item_index_; }
|
| +
|
| + bool CanGoBack() const override { return current_item_index_ > 0; }
|
| +
|
| + bool CanGoForward() const override { return current_item_index_ < INT_MAX; }
|
| +
|
| + void GoBack() override {
|
| + DCHECK(CanGoBack());
|
| + --current_item_index_;
|
| + }
|
| +
|
| + void GoForward() override {
|
| + DCHECK(CanGoForward());
|
| + ++current_item_index_;
|
| + }
|
| +
|
| + void GoToIndex(int index) override { current_item_index_ = index; }
|
| +
|
| + int current_item_index_ = 0;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(FakeNavigationManer);
|
| +};
|
| +
|
| } // namespace
|
|
|
| class WebStateListTest : public PlatformTest {
|
| @@ -117,6 +151,8 @@ class WebStateListTest : public PlatformTest {
|
| web::WebState* CreateWebState(const char* url) {
|
| auto test_web_state = base::MakeUnique<web::TestWebState>();
|
| test_web_state->SetCurrentURL(GURL(url));
|
| + test_web_state->SetNavigationManager(
|
| + base::MakeUnique<FakeNavigationManer>());
|
| return test_web_state.release();
|
| }
|
|
|
| @@ -128,7 +164,7 @@ TEST_F(WebStateListTest, IsEmpty) {
|
| EXPECT_EQ(0, web_state_list_.count());
|
| EXPECT_TRUE(web_state_list_.empty());
|
|
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
|
|
| EXPECT_TRUE(observer_.web_state_inserted_called());
|
| EXPECT_EQ(1, web_state_list_.count());
|
| @@ -136,7 +172,7 @@ TEST_F(WebStateListTest, IsEmpty) {
|
| }
|
|
|
| TEST_F(WebStateListTest, InsertUrlSingle) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
|
|
| EXPECT_TRUE(observer_.web_state_inserted_called());
|
| EXPECT_EQ(1, web_state_list_.count());
|
| @@ -144,9 +180,9 @@ TEST_F(WebStateListTest, InsertUrlSingle) {
|
| }
|
|
|
| TEST_F(WebStateListTest, InsertUrlMultiple) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL2), nullptr);
|
|
|
| EXPECT_TRUE(observer_.web_state_inserted_called());
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -156,9 +192,9 @@ TEST_F(WebStateListTest, InsertUrlMultiple) {
|
| }
|
|
|
| TEST_F(WebStateListTest, MoveWebStateAtRightByOne) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -177,9 +213,9 @@ TEST_F(WebStateListTest, MoveWebStateAtRightByOne) {
|
| }
|
|
|
| TEST_F(WebStateListTest, MoveWebStateAtRightByMoreThanOne) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -198,9 +234,9 @@ TEST_F(WebStateListTest, MoveWebStateAtRightByMoreThanOne) {
|
| }
|
|
|
| TEST_F(WebStateListTest, MoveWebStateAtLeftByOne) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -219,9 +255,9 @@ TEST_F(WebStateListTest, MoveWebStateAtLeftByOne) {
|
| }
|
|
|
| TEST_F(WebStateListTest, MoveWebStateAtLeftByMoreThanOne) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -240,9 +276,9 @@ TEST_F(WebStateListTest, MoveWebStateAtLeftByMoreThanOne) {
|
| }
|
|
|
| TEST_F(WebStateListTest, MoveWebStateAtSameIndex) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -261,8 +297,8 @@ TEST_F(WebStateListTest, MoveWebStateAtSameIndex) {
|
| }
|
|
|
| TEST_F(WebStateListTest, ReplaceWebStateAt) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
|
|
| // Sanity check before replacing WebState.
|
| EXPECT_EQ(2, web_state_list_.count());
|
| @@ -271,7 +307,7 @@ TEST_F(WebStateListTest, ReplaceWebStateAt) {
|
|
|
| observer_.ResetStatistics();
|
| std::unique_ptr<web::WebState> old_web_state(
|
| - web_state_list_.ReplaceWebStateAt(1, CreateWebState(kURL2)));
|
| + web_state_list_.ReplaceWebStateAt(1, CreateWebState(kURL2), nullptr));
|
|
|
| EXPECT_TRUE(observer_.web_state_replaced_called());
|
| EXPECT_EQ(2, web_state_list_.count());
|
| @@ -281,9 +317,9 @@ TEST_F(WebStateListTest, ReplaceWebStateAt) {
|
| }
|
|
|
| TEST_F(WebStateListTest, DetachWebStateAtIndexBegining) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -301,9 +337,9 @@ TEST_F(WebStateListTest, DetachWebStateAtIndexBegining) {
|
| }
|
|
|
| TEST_F(WebStateListTest, DetachWebStateAtIndexMiddle) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -321,9 +357,9 @@ TEST_F(WebStateListTest, DetachWebStateAtIndexMiddle) {
|
| }
|
|
|
| TEST_F(WebStateListTest, DetachWebStateAtIndexLast) {
|
| - web_state_list_.InsertWebState(0, CreateWebState(kURL0));
|
| - web_state_list_.InsertWebState(1, CreateWebState(kURL1));
|
| - web_state_list_.InsertWebState(2, CreateWebState(kURL2));
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
|
|
| // Sanity check before closing WebState.
|
| EXPECT_EQ(3, web_state_list_.count());
|
| @@ -349,7 +385,7 @@ TEST_F(WebStateListTest, OwnershipBorrowed) {
|
|
|
| auto web_state_list =
|
| base::MakeUnique<WebStateList>(WebStateList::WebStateBorrowed);
|
| - web_state_list->InsertWebState(0, test_web_state.get());
|
| + web_state_list->InsertWebState(0, test_web_state.get(), nullptr);
|
| EXPECT_FALSE(web_state_was_killed);
|
|
|
| web_state_list.reset();
|
| @@ -365,9 +401,123 @@ TEST_F(WebStateListTest, OwnershipOwned) {
|
|
|
| auto web_state_list =
|
| base::MakeUnique<WebStateList>(WebStateList::WebStateOwned);
|
| - web_state_list->InsertWebState(0, test_web_state.release());
|
| + web_state_list->InsertWebState(0, test_web_state.release(), nullptr);
|
| EXPECT_FALSE(web_state_was_killed);
|
|
|
| web_state_list.reset();
|
| EXPECT_TRUE(web_state_was_killed);
|
| }
|
| +
|
| +TEST_F(WebStateListTest, OpenersEmptyList) {
|
| + EXPECT_TRUE(web_state_list_.empty());
|
| +
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + nullptr, WebStateList::kInvalidIndex, false));
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + nullptr, WebStateList::kInvalidIndex, false));
|
| +
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + nullptr, WebStateList::kInvalidIndex, true));
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + nullptr, WebStateList::kInvalidIndex, true));
|
| +}
|
| +
|
| +TEST_F(WebStateListTest, OpenersNothingOpened) {
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), nullptr);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), nullptr);
|
| +
|
| + for (int index = 0; index < web_state_list_.count(); ++index) {
|
| + web::WebState* opener = web_state_list_.GetWebStateAt(index);
|
| + EXPECT_EQ(
|
| + WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(opener, index, false));
|
| + EXPECT_EQ(
|
| + WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(opener, index, false));
|
| +
|
| + EXPECT_EQ(
|
| + WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(opener, index, true));
|
| + EXPECT_EQ(
|
| + WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(opener, index, true));
|
| + }
|
| +}
|
| +
|
| +TEST_F(WebStateListTest, OpenersChildsAfterOpener) {
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web::WebState* opener = web_state_list_.GetWebStateAt(0);
|
| +
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL1), opener);
|
| + web_state_list_.InsertWebState(2, CreateWebState(kURL2), opener);
|
| +
|
| + const int start_index = web_state_list_.GetIndexOfWebState(opener);
|
| + EXPECT_EQ(1, web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + opener, start_index, false));
|
| + EXPECT_EQ(2, web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + opener, start_index, false));
|
| +
|
| + EXPECT_EQ(1, web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + opener, start_index, true));
|
| + EXPECT_EQ(2, web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + opener, start_index, true));
|
| +
|
| + // Simulate a navigation on the opener, results should not change if not
|
| + // using groups, but should now be kInvalidIndex otherwise.
|
| + opener->GetNavigationManager()->GoForward();
|
| +
|
| + EXPECT_EQ(1, web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + opener, start_index, false));
|
| + EXPECT_EQ(2, web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + opener, start_index, false));
|
| +
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(opener, start_index,
|
| + true));
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(opener, start_index,
|
| + true));
|
| +
|
| + // Add a new WebState with the same opener. It should be considered the next
|
| + // WebState if groups are considered and the last independently on whether
|
| + // groups are used or not.
|
| + web_state_list_.InsertWebState(3, CreateWebState(kURL2), opener);
|
| +
|
| + EXPECT_EQ(1, web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + opener, start_index, false));
|
| + EXPECT_EQ(3, web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + opener, start_index, false));
|
| +
|
| + EXPECT_EQ(3, web_state_list_.GetIndexOfNextWebStateOpenedBy(
|
| + opener, start_index, true));
|
| + EXPECT_EQ(3, web_state_list_.GetIndexOfLastWebStateOpenedBy(
|
| + opener, start_index, true));
|
| +}
|
| +
|
| +TEST_F(WebStateListTest, OpenersChildsBeforeOpener) {
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL0), nullptr);
|
| + web::WebState* opener = web_state_list_.GetWebStateAt(0);
|
| +
|
| + web_state_list_.InsertWebState(0, CreateWebState(kURL1), opener);
|
| + web_state_list_.InsertWebState(1, CreateWebState(kURL2), opener);
|
| +
|
| + const int start_index = web_state_list_.GetIndexOfWebState(opener);
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(opener, start_index,
|
| + false));
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(opener, start_index,
|
| + false));
|
| +
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfNextWebStateOpenedBy(opener, start_index,
|
| + true));
|
| + EXPECT_EQ(WebStateList::kInvalidIndex,
|
| + web_state_list_.GetIndexOfLastWebStateOpenedBy(opener, start_index,
|
| + true));
|
| +}
|
|
|