| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/offline_pages/recent_tab_helper.h" | 5 #include "chrome/browser/android/offline_pages/recent_tab_helper.h" |
| 6 | 6 |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "base/test/test_mock_time_task_runner.h" | 8 #include "base/test/test_mock_time_task_runner.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" | 10 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
| 11 #include "chrome/browser/android/offline_pages/test_offline_page_model_builder.h
" | 11 #include "chrome/browser/android/offline_pages/test_offline_page_model_builder.h
" |
| 12 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 12 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 13 #include "components/offline_pages/offline_page_item.h" | 13 #include "components/offline_pages/offline_page_item.h" |
| 14 #include "components/offline_pages/offline_page_model.h" | 14 #include "components/offline_pages/offline_page_model.h" |
| 15 #include "components/offline_pages/offline_page_test_archiver.h" | 15 #include "components/offline_pages/offline_page_test_archiver.h" |
| 16 #include "content/public/browser/navigation_entry.h" | 16 #include "content/public/browser/navigation_entry.h" |
| 17 #include "content/public/browser/navigation_handle.h" | 17 #include "content/public/browser/navigation_handle.h" |
| 18 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 20 | 20 |
| 21 namespace offline_pages { | 21 namespace offline_pages { |
| 22 | 22 |
| 23 namespace { |
| 24 const GURL kTestPageUrl("http://mystery.site/foo.html"); |
| 25 } |
| 26 |
| 23 class TestArchiveFactoryImpl : public RecentTabHelper::TestArchiveFactory { | 27 class TestArchiveFactoryImpl : public RecentTabHelper::TestArchiveFactory { |
| 24 public: | 28 public: |
| 25 explicit TestArchiveFactoryImpl(OfflinePageTestArchiver::Observer* observer); | 29 explicit TestArchiveFactoryImpl(OfflinePageTestArchiver::Observer* observer); |
| 26 ~TestArchiveFactoryImpl() override {} | 30 ~TestArchiveFactoryImpl() override {} |
| 27 | 31 |
| 28 std::unique_ptr<OfflinePageArchiver> CreateArchiver( | 32 std::unique_ptr<OfflinePageArchiver> CreateArchiver( |
| 29 content::WebContents* web_contents) override; | 33 content::WebContents* web_contents) override; |
| 30 private: | 34 private: |
| 31 OfflinePageTestArchiver::Observer* observer_; // observer owns this. | 35 OfflinePageTestArchiver::Observer* observer_; // observer owns this. |
| 32 }; | 36 }; |
| 33 | 37 |
| 34 class RecentTabHelperTest | 38 class RecentTabHelperTest |
| 35 : public ChromeRenderViewHostTestHarness, | 39 : public ChromeRenderViewHostTestHarness, |
| 36 public OfflinePageModel::Observer, | 40 public OfflinePageModel::Observer, |
| 37 public OfflinePageTestArchiver::Observer { | 41 public OfflinePageTestArchiver::Observer { |
| 38 public: | 42 public: |
| 39 RecentTabHelperTest(); | 43 RecentTabHelperTest(); |
| 40 ~RecentTabHelperTest() override {} | 44 ~RecentTabHelperTest() override {} |
| 41 | 45 |
| 42 void SetUp() override; | 46 void SetUp() override; |
| 43 void SetUpTestArchiver(const GURL& url); | 47 void SetUpTestArchiver(const GURL& url); |
| 44 void SetUpMockTaskRunner(); | 48 void SetUpMockTaskRunner(); |
| 45 const std::vector<OfflinePageItem>& GetAllPages(); | 49 const std::vector<OfflinePageItem>& GetAllPages(); |
| 46 | 50 |
| 51 void FailLoad(const GURL& url); |
| 52 |
| 47 // Runs default thread. | 53 // Runs default thread. |
| 48 void RunUntilIdle(); | 54 void RunUntilIdle(); |
| 49 // Moves forward the snapshot controller's task runner. | 55 // Moves forward the snapshot controller's task runner. |
| 50 void FastForwardSnapshotController(); | 56 void FastForwardSnapshotController(); |
| 51 | 57 |
| 52 RecentTabHelper* recent_tab_helper() const { return recent_tab_helper_; } | 58 RecentTabHelper* recent_tab_helper() const { return recent_tab_helper_; } |
| 53 OfflinePageModel* model() const { return model_; } | 59 OfflinePageModel* model() const { return model_; } |
| 54 const std::vector<OfflinePageItem>& all_pages() { return all_pages_; } | 60 const std::vector<OfflinePageItem>& all_pages() { return all_pages_; } |
| 55 size_t model_changed_count() { return model_changed_count_; } | 61 size_t model_changed_count() { return model_changed_count_; } |
| 56 size_t model_removed_count() { return model_removed_count_; } | 62 size_t model_removed_count() { return model_removed_count_; } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 128 |
| 123 std::unique_ptr<RecentTabHelper::TestArchiveFactory> test_archive_factory( | 129 std::unique_ptr<RecentTabHelper::TestArchiveFactory> test_archive_factory( |
| 124 new TestArchiveFactoryImpl(this)); | 130 new TestArchiveFactoryImpl(this)); |
| 125 recent_tab_helper_->SetArchiveFactoryForTest(std::move(test_archive_factory)); | 131 recent_tab_helper_->SetArchiveFactoryForTest(std::move(test_archive_factory)); |
| 126 | 132 |
| 127 | 133 |
| 128 model_ = OfflinePageModelFactory::GetForBrowserContext(browser_context()); | 134 model_ = OfflinePageModelFactory::GetForBrowserContext(browser_context()); |
| 129 model_->AddObserver(this); | 135 model_->AddObserver(this); |
| 130 } | 136 } |
| 131 | 137 |
| 138 void RecentTabHelperTest::FailLoad(const GURL& url) { |
| 139 controller().LoadURL(url, content::Referrer(), ui::PAGE_TRANSITION_TYPED, |
| 140 std::string()); |
| 141 content::RenderFrameHostTester::For(main_rfh())->SimulateNavigationStart(url); |
| 142 content::RenderFrameHostTester::For(main_rfh())-> |
| 143 SimulateNavigationError(url, net::ERR_INTERNET_DISCONNECTED); |
| 144 content::RenderFrameHostTester::For(main_rfh())-> |
| 145 SimulateNavigationErrorPageCommit(); |
| 146 } |
| 147 |
| 132 const std::vector<OfflinePageItem>& RecentTabHelperTest::GetAllPages() { | 148 const std::vector<OfflinePageItem>& RecentTabHelperTest::GetAllPages() { |
| 133 model()->GetAllPages( | 149 model()->GetAllPages( |
| 134 base::Bind(&RecentTabHelperTest::OnGetAllPagesDone, | 150 base::Bind(&RecentTabHelperTest::OnGetAllPagesDone, |
| 135 weak_ptr_factory_.GetWeakPtr())); | 151 weak_ptr_factory_.GetWeakPtr())); |
| 136 RunUntilIdle(); | 152 RunUntilIdle(); |
| 137 return all_pages_; | 153 return all_pages_; |
| 138 } | 154 } |
| 139 | 155 |
| 140 void RecentTabHelperTest::OnGetAllPagesDone( | 156 void RecentTabHelperTest::OnGetAllPagesDone( |
| 141 const std::vector<OfflinePageItem>& result) { | 157 const std::vector<OfflinePageItem>& result) { |
| 142 all_pages_ = result; | 158 all_pages_ = result; |
| 143 } | 159 } |
| 144 | 160 |
| 145 void RecentTabHelperTest::RunUntilIdle() { | 161 void RecentTabHelperTest::RunUntilIdle() { |
| 146 base::RunLoop().RunUntilIdle(); | 162 base::RunLoop().RunUntilIdle(); |
| 147 } | 163 } |
| 148 | 164 |
| 149 void RecentTabHelperTest::FastForwardSnapshotController() { | 165 void RecentTabHelperTest::FastForwardSnapshotController() { |
| 150 const size_t kLongDelayMs = 100*1000; | 166 const size_t kLongDelayMs = 100*1000; |
| 151 task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(kLongDelayMs)); | 167 task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(kLongDelayMs)); |
| 152 } | 168 } |
| 153 | 169 |
| 154 TEST_F(RecentTabHelperTest, Basic) { | 170 TEST_F(RecentTabHelperTest, Basic) { |
| 155 EXPECT_NE(nullptr, recent_tab_helper()); | 171 EXPECT_NE(nullptr, recent_tab_helper()); |
| 156 } | 172 } |
| 157 | 173 |
| 158 TEST_F(RecentTabHelperTest, SimpleCapture) { | 174 TEST_F(RecentTabHelperTest, SimpleCapture) { |
| 159 const GURL url("http://mystery.site/foo.html"); | 175 NavigateAndCommit(kTestPageUrl); |
| 160 NavigateAndCommit(url); | |
| 161 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); | 176 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); |
| 162 RunUntilIdle(); | 177 RunUntilIdle(); |
| 163 EXPECT_TRUE(model()->is_loaded()); | 178 EXPECT_TRUE(model()->is_loaded()); |
| 164 GetAllPages(); | 179 GetAllPages(); |
| 165 EXPECT_EQ(1U, all_pages().size()); | 180 EXPECT_EQ(1U, all_pages().size()); |
| 166 EXPECT_EQ(url, all_pages()[0].url); | 181 EXPECT_EQ(kTestPageUrl, all_pages()[0].url); |
| 167 } | 182 } |
| 168 | 183 |
| 169 TEST_F(RecentTabHelperTest, TwoCaptures) { | 184 TEST_F(RecentTabHelperTest, TwoCaptures) { |
| 170 const GURL url("http://mystery.site/foo.html"); | 185 NavigateAndCommit(kTestPageUrl); |
| 171 NavigateAndCommit(url); | |
| 172 // Triggers snapshot after a time delay. | 186 // Triggers snapshot after a time delay. |
| 173 recent_tab_helper()->DocumentAvailableInMainFrame(); | 187 recent_tab_helper()->DocumentAvailableInMainFrame(); |
| 174 RunUntilIdle(); | 188 RunUntilIdle(); |
| 175 EXPECT_TRUE(model()->is_loaded()); | 189 EXPECT_TRUE(model()->is_loaded()); |
| 176 EXPECT_EQ(0U, model_changed_count()); | 190 EXPECT_EQ(0U, model_changed_count()); |
| 177 // Move the snapshot controller's time forward so it gets past timeouts. | 191 // Move the snapshot controller's time forward so it gets past timeouts. |
| 178 FastForwardSnapshotController(); | 192 FastForwardSnapshotController(); |
| 179 RunUntilIdle(); | 193 RunUntilIdle(); |
| 180 EXPECT_EQ(1U, model_changed_count()); | 194 EXPECT_EQ(1U, model_changed_count()); |
| 181 EXPECT_EQ(0U, model_removed_count()); | 195 EXPECT_EQ(0U, model_removed_count()); |
| 182 GetAllPages(); | 196 GetAllPages(); |
| 183 EXPECT_EQ(1U, all_pages().size()); | 197 EXPECT_EQ(1U, all_pages().size()); |
| 184 EXPECT_EQ(url, all_pages()[0].url); | 198 EXPECT_EQ(kTestPageUrl, all_pages()[0].url); |
| 185 | 199 |
| 186 // Triggers snapshot immediately; | 200 // Triggers snapshot immediately; |
| 187 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); | 201 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); |
| 188 RunUntilIdle(); | 202 RunUntilIdle(); |
| 189 EXPECT_EQ(2U, model_changed_count()); | 203 EXPECT_EQ(2U, model_changed_count()); |
| 190 EXPECT_EQ(1U, model_removed_count()); | 204 EXPECT_EQ(1U, model_removed_count()); |
| 191 // the same page should be simply overridden. | 205 // the same page should be simply overridden. |
| 192 GetAllPages(); | 206 GetAllPages(); |
| 193 EXPECT_EQ(1U, all_pages().size()); | 207 EXPECT_EQ(1U, all_pages().size()); |
| 194 EXPECT_EQ(url, all_pages()[0].url); | 208 EXPECT_EQ(kTestPageUrl, all_pages()[0].url); |
| 209 } |
| 210 |
| 211 TEST_F(RecentTabHelperTest, NoCaptureOnErrorPage) { |
| 212 FailLoad(kTestPageUrl); |
| 213 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); |
| 214 RunUntilIdle(); |
| 215 EXPECT_TRUE(model()->is_loaded()); |
| 216 GetAllPages(); |
| 217 EXPECT_EQ(0U, all_pages().size()); |
| 195 } | 218 } |
| 196 | 219 |
| 197 } // namespace offline_pages | 220 } // namespace offline_pages |
| OLD | NEW |