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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a786270f700803b1e8b7da895dec4de410eb4e05 |
--- /dev/null |
+++ b/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm |
@@ -0,0 +1,496 @@ |
+// Copyright 2017 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/shared/chrome/browser/tabs/web_state_list.h" |
+ |
+#include "base/macros.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/supports_user_data.h" |
+#import "ios/shared/chrome/browser/tabs/fake_web_state_list_delegate.h" |
+#import "ios/shared/chrome/browser/tabs/web_state_list_observer.h" |
+#import "ios/shared/chrome/browser/tabs/web_state_opener.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" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+namespace { |
+const char kURL0[] = "https://chromium.org/0"; |
+const char kURL1[] = "https://chromium.org/1"; |
+const char kURL2[] = "https://chromium.org/2"; |
+ |
+// WebStateList observer that records which events have been called by the |
+// WebStateList. |
+class WebStateListTestObserver : public WebStateListObserver { |
+ public: |
+ WebStateListTestObserver() = default; |
+ |
+ // Reset statistics whether events have been called. |
+ void ResetStatistics() { |
+ web_state_inserted_called_ = false; |
+ web_state_moved_called_ = false; |
+ web_state_replaced_called_ = false; |
+ web_state_detached_called_ = false; |
+ } |
+ |
+ // Returns whether WebStateInsertedAt was invoked. |
+ bool web_state_inserted_called() const { return web_state_inserted_called_; } |
+ |
+ // Returns whether WebStateMoved was invoked. |
+ bool web_state_moved_called() const { return web_state_moved_called_; } |
+ |
+ // Returns whether WebStateReplacedAt was invoked. |
+ bool web_state_replaced_called() const { return web_state_replaced_called_; } |
+ |
+ // Returns whether WebStateDetachedAt was invoked. |
+ bool web_state_detached_called() const { return web_state_detached_called_; } |
+ |
+ // WebStateListObserver implementation. |
+ void WebStateInsertedAt(WebStateList* web_state_list, |
+ web::WebState* web_state, |
+ int index) override { |
+ web_state_inserted_called_ = true; |
+ } |
+ |
+ void WebStateMoved(WebStateList* web_state_list, |
+ web::WebState* web_state, |
+ int from_index, |
+ int to_index) override { |
+ web_state_moved_called_ = true; |
+ } |
+ |
+ void WebStateReplacedAt(WebStateList* web_state_list, |
+ web::WebState* old_web_state, |
+ web::WebState* new_web_state, |
+ int index) override { |
+ web_state_replaced_called_ = true; |
+ } |
+ |
+ void WebStateDetachedAt(WebStateList* web_state_list, |
+ web::WebState* web_state, |
+ int index) override { |
+ web_state_detached_called_ = true; |
+ } |
+ |
+ private: |
+ bool web_state_inserted_called_ = false; |
+ bool web_state_moved_called_ = false; |
+ bool web_state_replaced_called_ = false; |
+ bool web_state_detached_called_ = false; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WebStateListTestObserver); |
+}; |
+ |
+// A fake NavigationManager used to test opener-opened relationship in the |
+// WebStateList. |
+class FakeNavigationManager : public web::TestNavigationManager { |
+ public: |
+ FakeNavigationManager() = default; |
+ |
+ // web::NavigationManager implementation. |
+ int GetLastCommittedItemIndex() const override { |
+ return last_committed_item_index; |
+ } |
+ |
+ bool CanGoBack() const override { return last_committed_item_index > 0; } |
+ |
+ bool CanGoForward() const override { |
+ return last_committed_item_index < INT_MAX; |
+ } |
+ |
+ void GoBack() override { |
+ DCHECK(CanGoBack()); |
+ --last_committed_item_index; |
+ } |
+ |
+ void GoForward() override { |
+ DCHECK(CanGoForward()); |
+ ++last_committed_item_index; |
+ } |
+ |
+ void GoToIndex(int index) override { last_committed_item_index = index; } |
+ |
+ int last_committed_item_index = 0; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeNavigationManager); |
+}; |
+ |
+} // namespace |
+ |
+class WebStateListTest : public PlatformTest { |
+ public: |
+ WebStateListTest() : web_state_list_(&web_state_list_delegate_) { |
+ web_state_list_.AddObserver(&observer_); |
+ } |
+ |
+ ~WebStateListTest() override { web_state_list_.RemoveObserver(&observer_); } |
+ |
+ protected: |
+ FakeWebStateListDelegate web_state_list_delegate_; |
+ WebStateList web_state_list_; |
+ WebStateListTestObserver observer_; |
+ |
+ std::unique_ptr<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<FakeNavigationManager>()); |
+ // TODO(crbug.com/703565): remove std::move() once Xcode 9.0+ is required. |
+ return std::move(test_web_state); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(WebStateListTest); |
+}; |
+ |
+TEST_F(WebStateListTest, IsEmpty) { |
+ EXPECT_EQ(0, web_state_list_.count()); |
+ EXPECT_TRUE(web_state_list_.empty()); |
+ |
+ web_state_list_.InsertWebState(0, CreateWebState(kURL0)); |
+ |
+ EXPECT_TRUE(observer_.web_state_inserted_called()); |
+ EXPECT_EQ(1, web_state_list_.count()); |
+ EXPECT_FALSE(web_state_list_.empty()); |
+} |
+ |
+TEST_F(WebStateListTest, InsertUrlSingle) { |
+ web_state_list_.InsertWebState(0, CreateWebState(kURL0)); |
+ |
+ EXPECT_TRUE(observer_.web_state_inserted_called()); |
+ EXPECT_EQ(1, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ EXPECT_TRUE(observer_.web_state_inserted_called()); |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.MoveWebStateAt(0, 1); |
+ |
+ EXPECT_TRUE(observer_.web_state_moved_called()); |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.MoveWebStateAt(0, 2); |
+ |
+ EXPECT_TRUE(observer_.web_state_moved_called()); |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.MoveWebStateAt(2, 1); |
+ |
+ EXPECT_TRUE(observer_.web_state_moved_called()); |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.MoveWebStateAt(2, 0); |
+ |
+ EXPECT_TRUE(observer_.web_state_moved_called()); |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.MoveWebStateAt(2, 2); |
+ |
+ EXPECT_FALSE(observer_.web_state_moved_called()); |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+} |
+ |
+TEST_F(WebStateListTest, ReplaceWebStateAt) { |
+ web_state_list_.InsertWebState(0, CreateWebState(kURL0)); |
+ web_state_list_.InsertWebState(1, CreateWebState(kURL1)); |
+ |
+ // Sanity check before replacing WebState. |
+ EXPECT_EQ(2, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ std::unique_ptr<web::WebState> old_web_state( |
+ web_state_list_.ReplaceWebStateAt(1, CreateWebState(kURL2))); |
+ |
+ EXPECT_TRUE(observer_.web_state_replaced_called()); |
+ EXPECT_EQ(2, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, old_web_state->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.DetachWebStateAt(0); |
+ |
+ EXPECT_TRUE(observer_.web_state_detached_called()); |
+ EXPECT_EQ(2, web_state_list_.count()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.DetachWebStateAt(1); |
+ |
+ EXPECT_TRUE(observer_.web_state_detached_called()); |
+ EXPECT_EQ(2, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ |
+ // Sanity check before closing WebState. |
+ EXPECT_EQ(3, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL2, web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec()); |
+ |
+ observer_.ResetStatistics(); |
+ web_state_list_.DetachWebStateAt(2); |
+ |
+ EXPECT_TRUE(observer_.web_state_detached_called()); |
+ EXPECT_EQ(2, web_state_list_.count()); |
+ EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec()); |
+ EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec()); |
+} |
+ |
+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)); |
+ web_state_list_.InsertWebState(1, CreateWebState(kURL1)); |
+ web_state_list_.InsertWebState(2, CreateWebState(kURL2)); |
+ |
+ 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)); |
+ web::WebState* opener = web_state_list_.GetWebStateAt(0); |
+ |
+ web_state_list_.InsertWebState(1, CreateWebState(kURL1)); |
+ web_state_list_.SetOpenerOfWebStateAt(1, WebStateOpener(opener)); |
+ |
+ web_state_list_.InsertWebState(2, CreateWebState(kURL2)); |
+ web_state_list_.SetOpenerOfWebStateAt(2, WebStateOpener(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)); |
+ web_state_list_.SetOpenerOfWebStateAt(3, WebStateOpener(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)); |
+ web::WebState* opener = web_state_list_.GetWebStateAt(0); |
+ |
+ web_state_list_.InsertWebState(0, CreateWebState(kURL1)); |
+ web_state_list_.SetOpenerOfWebStateAt(0, WebStateOpener(opener)); |
+ |
+ web_state_list_.InsertWebState(1, CreateWebState(kURL2)); |
+ web_state_list_.SetOpenerOfWebStateAt(1, WebStateOpener(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)); |
+} |