Chromium Code Reviews| 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() { | |
|
pasko
2016/06/15 12:25:00
also I think various *_called should be reset in S
dougarnett
2016/06/15 15:45:04
thanks - done
| |
| 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 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 185 } | |
| 186 | |
| 187 TEST_F(PrerenderAdapterTest, CanPrerender) { | |
| 188 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 189 EXPECT_TRUE(adapter()->CanPrerender()); | |
| 190 | |
| 191 prerender_manager()->SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); | |
| 192 EXPECT_FALSE(adapter()->CanPrerender()); | |
| 193 } | |
| 194 | |
| 195 TEST_F(PrerenderAdapterTest, StartPrerenderFailsForUnsupportedScheme) { | |
| 196 content::WebContents* session_contents = content::WebContents::Create( | |
| 197 content::WebContents::CreateParams(profile())); | |
| 198 content::SessionStorageNamespace* sessionStorageNamespace = | |
| 199 session_contents->GetController().GetDefaultSessionStorageNamespace(); | |
| 200 gfx::Size renderWindowSize = session_contents->GetContainerBounds().size(); | |
| 201 GURL url("file://file.test"); | |
| 202 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
|
pasko
2016/06/15 12:25:00
DCHECKs are not nice in tests because they kill th
dougarnett
2016/06/15 15:45:04
Unfortunately I don't find an ASSERT_CURRENTLY_ON
pasko
2016/06/15 17:20:27
There is ASSERT_TRUE(BrowserThread::CurrentlyOn(Br
dougarnett
2016/06/15 18:15:07
Duh - Done ;-)
| |
| 203 EXPECT_FALSE(adapter()->StartPrerender( | |
| 204 profile(), url, sessionStorageNamespace, renderWindowSize)); | |
| 205 EXPECT_TRUE(prerender_contents_factory()->create_prerender_contents_called()); | |
| 206 EXPECT_FALSE(adapter()->IsActive()); | |
| 207 } | |
|
pasko
2016/06/15 12:25:00
it would be nice to also EXPECT_FALSE for these:
o
dougarnett
2016/06/15 15:45:04
Done.
| |
| 208 | |
| 209 TEST_F(PrerenderAdapterTest, StartPrerenderSucceeds) { | |
| 210 content::WebContents* session_contents = content::WebContents::Create( | |
| 211 content::WebContents::CreateParams(profile())); | |
| 212 content::SessionStorageNamespace* sessionStorageNamespace = | |
| 213 session_contents->GetController().GetDefaultSessionStorageNamespace(); | |
| 214 gfx::Size renderWindowSize = session_contents->GetContainerBounds().size(); | |
| 215 GURL url("https://url.test"); | |
| 216 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 217 EXPECT_TRUE(adapter()->StartPrerender(profile(), url, sessionStorageNamespace, | |
| 218 renderWindowSize)); | |
| 219 EXPECT_TRUE(prerender_contents_factory()->create_prerender_contents_called()); | |
| 220 EXPECT_NE(nullptr, prerender_contents_factory()->last_prerender_contents()); | |
| 221 EXPECT_TRUE(adapter()->IsActive()); | |
| 222 | |
| 223 // Exercise observer event call paths. | |
| 224 prerender_contents_factory()->last_prerender_contents()->ReportStartEvent(); | |
| 225 // PumpLoop(); | |
| 226 EXPECT_TRUE(observer_start_called()); | |
| 227 prerender_contents_factory() | |
| 228 ->last_prerender_contents() | |
| 229 ->ReportDomContentEvent(); | |
| 230 EXPECT_TRUE(observer_dom_content_loaded_called()); | |
| 231 prerender_contents_factory()->last_prerender_contents()->ReportOnLoadEvent(); | |
| 232 EXPECT_TRUE(observer_stop_loading_called()); | |
| 233 prerender_contents_factory()->last_prerender_contents()->StopWithStatus( | |
| 234 FinalStatus::FINAL_STATUS_CANCELLED); | |
| 235 EXPECT_TRUE(observer_stop_called()); | |
| 236 EXPECT_EQ(FinalStatus::FINAL_STATUS_CANCELLED, adapter()->GetFinalStatus()); | |
| 237 | |
| 238 // Exercise access methods even though no interesting values set beneath. | |
| 239 EXPECT_EQ(nullptr, adapter()->GetWebContents()); | |
| 240 | |
| 241 adapter()->DestroyActive(); | |
| 242 EXPECT_FALSE(adapter()->IsActive()); | |
| 243 } | |
| 244 | |
| 245 } // namespace offline_pages | |
| OLD | NEW |