OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/sessions/session_restore_observer.h" |
| 6 |
| 7 #include "chrome/browser/sessions/session_restore.h" |
| 8 #include "chrome/browser/sessions/tab_loader.h" |
| 9 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 10 #include "content/public/browser/web_contents.h" |
| 11 #include "content/public/test/web_contents_tester.h" |
| 12 |
| 13 using content::WebContentsTester; |
| 14 |
| 15 namespace { |
| 16 |
| 17 const char kDefaultUrl[] = "https://www.google.com"; |
| 18 |
| 19 } // namespace |
| 20 |
| 21 class MockSessionRestoreObserver : public SessionRestoreObserver { |
| 22 public: |
| 23 MockSessionRestoreObserver() { SessionRestore::AddObserver(this); } |
| 24 |
| 25 ~MockSessionRestoreObserver() { SessionRestore::RemoveObserver(this); } |
| 26 |
| 27 enum class SessionRestoreEvent { |
| 28 STARTED_LOADING_TABS, |
| 29 FINISHED_LOADING_TABS |
| 30 }; |
| 31 |
| 32 const std::vector<SessionRestoreEvent>& session_restore_events() const { |
| 33 return session_restore_events_; |
| 34 } |
| 35 |
| 36 // SessionRestoreObserver implementation: |
| 37 void OnSessionRestoreStartedLoadingTabs() override { |
| 38 session_restore_events_.emplace_back( |
| 39 SessionRestoreEvent::STARTED_LOADING_TABS); |
| 40 } |
| 41 |
| 42 void OnSessionRestoreFinishedLoadingTabs() override { |
| 43 session_restore_events_.emplace_back( |
| 44 SessionRestoreEvent::FINISHED_LOADING_TABS); |
| 45 } |
| 46 |
| 47 private: |
| 48 std::vector<SessionRestoreEvent> session_restore_events_; |
| 49 |
| 50 DISALLOW_COPY_AND_ASSIGN(MockSessionRestoreObserver); |
| 51 }; |
| 52 |
| 53 class SessionRestoreObserverTest : public ChromeRenderViewHostTestHarness { |
| 54 public: |
| 55 using RestoredTab = SessionRestoreDelegate::RestoredTab; |
| 56 |
| 57 SessionRestoreObserverTest() {} |
| 58 |
| 59 // testing::Test: |
| 60 void SetUp() override { |
| 61 ChromeRenderViewHostTestHarness::SetUp(); |
| 62 restored_tabs_.emplace_back(web_contents(), false, false, false); |
| 63 } |
| 64 |
| 65 void TearDown() override { |
| 66 ChromeRenderViewHostTestHarness::TearDown(); |
| 67 restored_tabs_.clear(); |
| 68 } |
| 69 |
| 70 protected: |
| 71 void RestoreTabs() { |
| 72 TabLoader::RestoreTabs(restored_tabs_, base::TimeTicks()); |
| 73 } |
| 74 |
| 75 void LoadWebContents(content::WebContents* contents) { |
| 76 WebContentsTester::For(contents)->NavigateAndCommit(GURL(kDefaultUrl)); |
| 77 WebContentsTester::For(contents)->TestSetIsLoading(false); |
| 78 } |
| 79 |
| 80 const std::vector<MockSessionRestoreObserver::SessionRestoreEvent>& |
| 81 session_restore_events() const { |
| 82 return mock_observer_.session_restore_events(); |
| 83 } |
| 84 |
| 85 size_t number_of_session_restore_events() const { |
| 86 return session_restore_events().size(); |
| 87 } |
| 88 |
| 89 private: |
| 90 MockSessionRestoreObserver mock_observer_; |
| 91 std::vector<RestoredTab> restored_tabs_; |
| 92 |
| 93 DISALLOW_COPY_AND_ASSIGN(SessionRestoreObserverTest); |
| 94 }; |
| 95 |
| 96 TEST_F(SessionRestoreObserverTest, SingleSessionRestore) { |
| 97 RestoreTabs(); |
| 98 ASSERT_EQ(1u, number_of_session_restore_events()); |
| 99 EXPECT_EQ( |
| 100 MockSessionRestoreObserver::SessionRestoreEvent::STARTED_LOADING_TABS, |
| 101 session_restore_events()[0]); |
| 102 |
| 103 LoadWebContents(web_contents()); |
| 104 ASSERT_EQ(2u, number_of_session_restore_events()); |
| 105 EXPECT_EQ( |
| 106 MockSessionRestoreObserver::SessionRestoreEvent::FINISHED_LOADING_TABS, |
| 107 session_restore_events()[1]); |
| 108 } |
| 109 |
| 110 TEST_F(SessionRestoreObserverTest, SequentialSessionRestore) { |
| 111 const int number_of_session_restores = 3; |
| 112 size_t event_index = 0; |
| 113 for (int i = 0; i < number_of_session_restores; ++i) { |
| 114 RestoreTabs(); |
| 115 ASSERT_EQ(event_index + 1, number_of_session_restore_events()); |
| 116 EXPECT_EQ( |
| 117 MockSessionRestoreObserver::SessionRestoreEvent::STARTED_LOADING_TABS, |
| 118 session_restore_events()[event_index++]); |
| 119 |
| 120 LoadWebContents(web_contents()); |
| 121 ASSERT_EQ(event_index + 1, number_of_session_restore_events()); |
| 122 EXPECT_EQ( |
| 123 MockSessionRestoreObserver::SessionRestoreEvent::FINISHED_LOADING_TABS, |
| 124 session_restore_events()[event_index++]); |
| 125 } |
| 126 } |
| 127 |
| 128 TEST_F(SessionRestoreObserverTest, ConcurrentSessionRestore) { |
| 129 std::vector<RestoredTab> another_restored_tabs; |
| 130 std::unique_ptr<content::WebContents> test_contents( |
| 131 WebContentsTester::CreateTestWebContents(browser_context(), nullptr)); |
| 132 another_restored_tabs.emplace_back(test_contents.get(), false, false, false); |
| 133 |
| 134 RestoreTabs(); |
| 135 TabLoader::RestoreTabs(another_restored_tabs, base::TimeTicks()); |
| 136 ASSERT_EQ(1u, number_of_session_restore_events()); |
| 137 EXPECT_EQ( |
| 138 MockSessionRestoreObserver::SessionRestoreEvent::STARTED_LOADING_TABS, |
| 139 session_restore_events()[0]); |
| 140 |
| 141 LoadWebContents(web_contents()); |
| 142 LoadWebContents(test_contents.get()); |
| 143 |
| 144 ASSERT_EQ(2u, number_of_session_restore_events()); |
| 145 EXPECT_EQ( |
| 146 MockSessionRestoreObserver::SessionRestoreEvent::FINISHED_LOADING_TABS, |
| 147 session_restore_events()[1]); |
| 148 } |
OLD | NEW |