| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/android/offline_pages/prerender_adapter.h" |
| 6 |
| 7 #include "chrome/browser/prerender/prerender_manager_factory.h" |
| 8 #include "chrome/test/base/testing_profile.h" |
| 9 #include "content/public/browser/browser_thread.h" |
| 10 #include "content/public/browser/web_contents.h" |
| 11 #include "content/public/test/test_browser_thread_bundle.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 |
| 14 using prerender::FinalStatus; |
| 15 using prerender::Origin; |
| 16 using prerender::PrerenderContents; |
| 17 using prerender::PrerenderManager; |
| 18 using prerender::PrerenderManagerFactory; |
| 19 |
| 20 namespace offline_pages { |
| 21 |
| 22 namespace { |
| 23 |
| 24 class StubPrerenderContents : public PrerenderContents { |
| 25 public: |
| 26 StubPrerenderContents(PrerenderManager* prerender_manager, |
| 27 const GURL& url, |
| 28 Origin origin); |
| 29 |
| 30 ~StubPrerenderContents() override; |
| 31 |
| 32 void StartPrerendering( |
| 33 const gfx::Size& size, |
| 34 content::SessionStorageNamespace* session_storage_namespace) override; |
| 35 |
| 36 void ReportStartEvent() { NotifyPrerenderStart(); } |
| 37 void ReportOnLoadEvent() { NotifyPrerenderStopLoading(); } |
| 38 void ReportDomContentEvent() { NotifyPrerenderDomContentLoaded(); } |
| 39 void StopWithStatus(FinalStatus final_status) { Destroy(final_status); } |
| 40 }; |
| 41 |
| 42 StubPrerenderContents::StubPrerenderContents( |
| 43 PrerenderManager* prerender_manager, |
| 44 const GURL& url, |
| 45 Origin origin) |
| 46 : PrerenderContents(prerender_manager, |
| 47 NULL, |
| 48 url, |
| 49 content::Referrer(), |
| 50 origin) {} |
| 51 |
| 52 StubPrerenderContents::~StubPrerenderContents() {} |
| 53 |
| 54 void StubPrerenderContents::StartPrerendering( |
| 55 const gfx::Size& size, |
| 56 content::SessionStorageNamespace* session_storage_namespace) { |
| 57 prerendering_has_started_ = true; |
| 58 } |
| 59 |
| 60 class StubPrerenderContentsFactory : public PrerenderContents::Factory { |
| 61 public: |
| 62 StubPrerenderContentsFactory() |
| 63 : create_prerender_contents_called_(false), |
| 64 last_prerender_contents_(nullptr) {} |
| 65 |
| 66 ~StubPrerenderContentsFactory() override {} |
| 67 |
| 68 PrerenderContents* CreatePrerenderContents( |
| 69 PrerenderManager* prerender_manager, |
| 70 Profile* profile, |
| 71 const GURL& url, |
| 72 const content::Referrer& referrer, |
| 73 Origin origin) override; |
| 74 |
| 75 bool create_prerender_contents_called() const { |
| 76 return create_prerender_contents_called_; |
| 77 } |
| 78 |
| 79 StubPrerenderContents* last_prerender_contents() const { |
| 80 return last_prerender_contents_; |
| 81 } |
| 82 |
| 83 private: |
| 84 bool create_prerender_contents_called_; |
| 85 StubPrerenderContents* last_prerender_contents_; |
| 86 |
| 87 DISALLOW_COPY_AND_ASSIGN(StubPrerenderContentsFactory); |
| 88 }; |
| 89 |
| 90 PrerenderContents* StubPrerenderContentsFactory::CreatePrerenderContents( |
| 91 PrerenderManager* prerender_manager, |
| 92 Profile* profile, |
| 93 const GURL& url, |
| 94 const content::Referrer& referrer, |
| 95 Origin origin) { |
| 96 create_prerender_contents_called_ = true; |
| 97 last_prerender_contents_ = new StubPrerenderContents( |
| 98 prerender_manager, url, prerender::ORIGIN_OFFLINE); |
| 99 return last_prerender_contents_; |
| 100 } |
| 101 |
| 102 } // namespace |
| 103 |
| 104 // Test class. |
| 105 class PrerenderAdapterTest : public testing::Test, |
| 106 public PrerenderAdapter::Observer { |
| 107 public: |
| 108 PrerenderAdapterTest(); |
| 109 ~PrerenderAdapterTest() override; |
| 110 |
| 111 // PrerenderAdapter::Observer implementation: |
| 112 void OnPrerenderStart() override; |
| 113 void OnPrerenderStopLoading() override; |
| 114 void OnPrerenderDomContentLoaded() override; |
| 115 void OnPrerenderStop() override; |
| 116 |
| 117 void SetUp() override; |
| 118 |
| 119 // Returns the PrerenderLoader to test. |
| 120 PrerenderAdapter* adapter() const { return adapter_.get(); } |
| 121 StubPrerenderContentsFactory* prerender_contents_factory() { |
| 122 return prerender_contents_factory_; |
| 123 } |
| 124 Profile* profile() { return &profile_; } |
| 125 PrerenderManager* prerender_manager() { return prerender_manager_; } |
| 126 bool observer_start_called() const { return observer_start_called_; } |
| 127 bool observer_stop_loading_called() const { |
| 128 return observer_stop_loading_called_; |
| 129 } |
| 130 bool observer_dom_content_loaded_called() const { |
| 131 return observer_dom_content_loaded_called_; |
| 132 } |
| 133 bool observer_stop_called() const { return observer_stop_called_; } |
| 134 |
| 135 private: |
| 136 content::TestBrowserThreadBundle thread_bundle_; |
| 137 TestingProfile profile_; |
| 138 std::unique_ptr<PrerenderAdapter> adapter_; |
| 139 StubPrerenderContentsFactory* prerender_contents_factory_; |
| 140 PrerenderManager* prerender_manager_; |
| 141 bool observer_start_called_; |
| 142 bool observer_stop_loading_called_; |
| 143 bool observer_dom_content_loaded_called_; |
| 144 bool observer_stop_called_; |
| 145 |
| 146 DISALLOW_COPY_AND_ASSIGN(PrerenderAdapterTest); |
| 147 }; |
| 148 |
| 149 PrerenderAdapterTest::PrerenderAdapterTest() |
| 150 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), |
| 151 prerender_manager_(nullptr), |
| 152 observer_start_called_(false), |
| 153 observer_stop_loading_called_(false), |
| 154 observer_dom_content_loaded_called_(false), |
| 155 observer_stop_called_(false) {} |
| 156 |
| 157 void PrerenderAdapterTest::OnPrerenderStart() { |
| 158 observer_start_called_ = true; |
| 159 } |
| 160 |
| 161 PrerenderAdapterTest::~PrerenderAdapterTest() { |
| 162 prerender_manager_->Shutdown(); |
| 163 } |
| 164 |
| 165 void PrerenderAdapterTest::OnPrerenderStopLoading() { |
| 166 observer_stop_loading_called_ = true; |
| 167 } |
| 168 |
| 169 void PrerenderAdapterTest::OnPrerenderDomContentLoaded() { |
| 170 observer_dom_content_loaded_called_ = true; |
| 171 } |
| 172 |
| 173 void PrerenderAdapterTest::OnPrerenderStop() { |
| 174 observer_stop_called_ = true; |
| 175 } |
| 176 |
| 177 void PrerenderAdapterTest::SetUp() { |
| 178 adapter_.reset(new PrerenderAdapter(this)); |
| 179 prerender_contents_factory_ = new StubPrerenderContentsFactory(); |
| 180 prerender_manager_ = PrerenderManagerFactory::GetForProfile(profile()); |
| 181 prerender_manager_->SetPrerenderContentsFactoryForTest( |
| 182 prerender_contents_factory_); |
| 183 prerender_manager_->SetMode(PrerenderManager::PRERENDER_MODE_ENABLED); |
| 184 observer_start_called_ = false; |
| 185 observer_stop_loading_called_ = false; |
| 186 observer_dom_content_loaded_called_ = false; |
| 187 observer_stop_called_ = false; |
| 188 ASSERT_TRUE(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 189 } |
| 190 |
| 191 TEST_F(PrerenderAdapterTest, CanPrerender) { |
| 192 EXPECT_TRUE(adapter()->CanPrerender()); |
| 193 |
| 194 prerender_manager()->SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); |
| 195 EXPECT_FALSE(adapter()->CanPrerender()); |
| 196 } |
| 197 |
| 198 TEST_F(PrerenderAdapterTest, StartPrerenderFailsForUnsupportedScheme) { |
| 199 content::WebContents* session_contents = content::WebContents::Create( |
| 200 content::WebContents::CreateParams(profile())); |
| 201 content::SessionStorageNamespace* sessionStorageNamespace = |
| 202 session_contents->GetController().GetDefaultSessionStorageNamespace(); |
| 203 gfx::Size renderWindowSize = session_contents->GetContainerBounds().size(); |
| 204 GURL url("file://file.test"); |
| 205 EXPECT_FALSE(adapter()->StartPrerender( |
| 206 profile(), url, sessionStorageNamespace, renderWindowSize)); |
| 207 EXPECT_TRUE(prerender_contents_factory()->create_prerender_contents_called()); |
| 208 EXPECT_FALSE(adapter()->IsActive()); |
| 209 } |
| 210 |
| 211 TEST_F(PrerenderAdapterTest, StartPrerenderSucceeds) { |
| 212 content::WebContents* session_contents = content::WebContents::Create( |
| 213 content::WebContents::CreateParams(profile())); |
| 214 content::SessionStorageNamespace* sessionStorageNamespace = |
| 215 session_contents->GetController().GetDefaultSessionStorageNamespace(); |
| 216 gfx::Size renderWindowSize = session_contents->GetContainerBounds().size(); |
| 217 GURL url("https://url.test"); |
| 218 EXPECT_TRUE(adapter()->StartPrerender(profile(), url, sessionStorageNamespace, |
| 219 renderWindowSize)); |
| 220 EXPECT_TRUE(prerender_contents_factory()->create_prerender_contents_called()); |
| 221 EXPECT_NE(nullptr, prerender_contents_factory()->last_prerender_contents()); |
| 222 EXPECT_TRUE(adapter()->IsActive()); |
| 223 EXPECT_FALSE(observer_start_called()); |
| 224 EXPECT_FALSE(observer_stop_loading_called()); |
| 225 EXPECT_FALSE(observer_dom_content_loaded_called()); |
| 226 EXPECT_FALSE(observer_stop_called()); |
| 227 |
| 228 // Exercise observer event call paths. |
| 229 prerender_contents_factory()->last_prerender_contents()->ReportStartEvent(); |
| 230 // PumpLoop(); |
| 231 EXPECT_TRUE(observer_start_called()); |
| 232 prerender_contents_factory() |
| 233 ->last_prerender_contents() |
| 234 ->ReportDomContentEvent(); |
| 235 EXPECT_TRUE(observer_dom_content_loaded_called()); |
| 236 prerender_contents_factory()->last_prerender_contents()->ReportOnLoadEvent(); |
| 237 EXPECT_TRUE(observer_stop_loading_called()); |
| 238 prerender_contents_factory()->last_prerender_contents()->StopWithStatus( |
| 239 FinalStatus::FINAL_STATUS_CANCELLED); |
| 240 EXPECT_TRUE(observer_stop_called()); |
| 241 EXPECT_EQ(FinalStatus::FINAL_STATUS_CANCELLED, adapter()->GetFinalStatus()); |
| 242 |
| 243 // Exercise access methods even though no interesting values set beneath. |
| 244 EXPECT_EQ(nullptr, adapter()->GetWebContents()); |
| 245 |
| 246 adapter()->DestroyActive(); |
| 247 EXPECT_FALSE(adapter()->IsActive()); |
| 248 } |
| 249 |
| 250 } // namespace offline_pages |
| OLD | NEW |