Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: chrome/browser/android/offline_pages/prerendering_loader.cc

Issue 1968593002: PrerenderingLoader initial integration with PrerenderManager/PrerenderHandle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added more unit tests for PrerenderingLoader Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/prerendering_loader.h" 5 #include "chrome/browser/android/offline_pages/prerendering_loader.h"
6 6
7 #include "base/location.h"
8 #include "base/logging.h"
9 #include "chrome/browser/prerender/prerender_manager.h"
10 #include "chrome/browser/prerender/prerender_manager_factory.h"
11 #include "chrome/browser/profiles/profile.h"
7 #include "content/public/browser/browser_context.h" 12 #include "content/public/browser/browser_context.h"
13 #include "content/public/browser/browser_thread.h"
8 #include "content/public/browser/web_contents.h" 14 #include "content/public/browser/web_contents.h"
9 #include "ui/gfx/geometry/size.h" 15 #include "ui/gfx/geometry/size.h"
10 16
11 namespace offline_pages { 17 namespace offline_pages {
12 18
13 PrerenderingLoader::PrerenderingLoader( 19 PrerenderingLoader::PrerenderingLoader(content::BrowserContext* browser_context)
14 content::BrowserContext* browser_context) {} 20 : state_(State::IDLE),
21 browser_context_(browser_context),
22 adapter_(new PrerenderAdapter()) {}
pasko 2016/05/18 11:47:26 If you are not planning to reset adapter_ in the P
fgorski 2016/05/19 04:29:39 There is setadapterfortesting(). I requested it to
15 23
16 PrerenderingLoader::~PrerenderingLoader() {} 24 PrerenderingLoader::~PrerenderingLoader() {
25 CancelPrerender();
26 }
17 27
18 bool PrerenderingLoader::LoadPage( 28 bool PrerenderingLoader::LoadPage(const GURL& url,
19 const GURL& url, 29 const LoadPageCallback& callback) {
20 const LoadPageCallback& callback) { 30 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
21 // TODO(dougarnett): implement. 31 if (!IsIdle()) {
22 return false; 32 DVLOG(1) << "WARNING: Existing request pending";
33 return false;
34 }
35 if (!CanPrerender())
36 return false;
37
38 // Create a WebContents instance to define and hold a SessionStorageNamespace
39 // for this load request.
40 DCHECK(!session_contents_.get());
41 session_contents_.reset(content::WebContents::Create(
42 content::WebContents::CreateParams(browser_context_)));
43 if (!observer_.get())
pasko 2016/05/18 11:47:26 It would be simpler to have the observer class as
dougarnett 2016/05/20 00:27:23 Done.
44 observer_.reset(
45 new PrerenderingLoader::PrerenderHandleObserver(this, adapter_.get()));
46
47 bool accepted = adapter_->StartPrerender(browser_context_, url,
48 GetSessionStorageNamespace(),
49 GetSize(), observer_.get());
50 if (!accepted)
51 return false;
52
53 DCHECK(adapter_->IsActive());
54 callback_ = callback;
55 state_ = State::PENDING;
56 return true;
23 } 57 }
24 58
25 void PrerenderingLoader::StopLoading() { 59 void PrerenderingLoader::StopLoading() {
26 // TODO(dougarnett): implement. 60 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
61 CancelPrerender();
62 }
63
64 bool PrerenderingLoader::CanPrerender() {
65 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
66 return adapter_->CanPrerender();
67 }
68
69 bool PrerenderingLoader::IsIdle() {
70 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
71 return state_ == State::IDLE;
72 }
73
74 bool PrerenderingLoader::IsLoaded() {
75 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
76 return state_ == State::LOADED;
77 }
78
79 void PrerenderingLoader::SetAdapterForTesting(
80 std::unique_ptr<PrerenderAdapter> prerender_adapter) {
81 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
82 adapter_ = std::move(prerender_adapter);
83 }
84
85 void PrerenderingLoader::OnPrerenderStart() {
86 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
87 DCHECK(state_ == State::PENDING);
88 state_ = State::LOADING;
89 }
90
91 void PrerenderingLoader::OnPrerenderStopLoading() {
92 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
93 // TODO(dougarnett): Implement/integrate to delay policy here.
94 ReportLoadedIfStillLoading();
95 }
96
97 void PrerenderingLoader::OnPrerenderDomContentLoaded() {
98 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
99 // TODO(dougarnett): Implement/integrate to delay policy here.
100 ReportLoadedIfStillLoading();
101 }
102
103 void PrerenderingLoader::OnPrerenderStop() {
104 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
105 ReportLoadFailedIfStillLoading();
106 }
107
108 content::SessionStorageNamespace*
109 PrerenderingLoader::GetSessionStorageNamespace() {
110 DCHECK(session_contents_);
111 return session_contents_->GetController().GetDefaultSessionStorageNamespace();
112 }
113
114 const gfx::Size PrerenderingLoader::GetSize() {
115 DCHECK(session_contents_);
116 return session_contents_->GetContainerBounds().size();
117 }
118
119 void PrerenderingLoader::ReportLoadedIfStillLoading() {
120 // Check if load is still active to see if reporting is applicable (i.e.,
121 // no other load detection or canceling has already occurred).
122 if (!IsLoaded() && !IsIdle()) {
123 content::WebContents* contents = adapter_->GetWebContents();
124 if (contents) {
125 state_ = State::LOADED;
126 base::ThreadTaskRunnerHandle::Get()->PostTask(
127 FROM_HERE,
128 base::Bind(callback_, Offliner::RequestStatus::LOADED, contents));
129 } else {
130 ReportLoadFailedIfStillLoading();
131 }
132 }
133 }
134
135 void PrerenderingLoader::ReportLoadFailedIfStillLoading() {
136 // Check if load is still active to see if reporting is applicable.
137 if (!IsLoaded() && !IsIdle()) {
138 if (adapter_->IsActive()) {
139 DVLOG(1) << "Load failed: " << adapter_->GetFinalStatus();
140 adapter_->DestroyActive();
141 }
142 // TODO(dougarnett): Determine from final status if retry-able and report
143 // different failure statuses if retry-able or not.
144 session_contents_.reset(nullptr);
145 state_ = State::IDLE;
146 base::ThreadTaskRunnerHandle::Get()->PostTask(
147 FROM_HERE,
148 base::Bind(callback_, Offliner::RequestStatus::FAILED, nullptr));
149 }
150 }
151
152 void PrerenderingLoader::CancelPrerender() {
153 if (adapter_->IsActive()) {
154 adapter_->DestroyActive();
155 }
156 session_contents_.reset(nullptr);
157 if (!IsLoaded() && !IsIdle()) {
158 base::ThreadTaskRunnerHandle::Get()->PostTask(
159 FROM_HERE,
160 base::Bind(callback_, Offliner::RequestStatus::CANCELED, nullptr));
161 }
162 state_ = State::IDLE;
163 }
164
165 // PrerenderHandleObserver implementation:
166
167 PrerenderingLoader::PrerenderHandleObserver::PrerenderHandleObserver(
168 PrerenderingLoader* loader,
169 PrerenderAdapter* adapter)
170 : loader_(loader), adapter_(adapter) {
171 DCHECK(loader);
172 DCHECK(adapter);
173 }
174
175 PrerenderingLoader::PrerenderHandleObserver::~PrerenderHandleObserver() {}
176
177 void PrerenderingLoader::PrerenderHandleObserver::OnPrerenderStart(
178 prerender::PrerenderHandle* handle) {
179 DCHECK(adapter_->HasHandle(handle));
180 loader_->OnPrerenderStart();
181 }
182
183 void PrerenderingLoader::PrerenderHandleObserver::OnPrerenderStopLoading(
184 prerender::PrerenderHandle* handle) {
185 DCHECK(adapter_->HasHandle(handle));
186 loader_->OnPrerenderDomContentLoaded();
187 }
188
189 void PrerenderingLoader::PrerenderHandleObserver::OnPrerenderDomContentLoaded(
190 prerender::PrerenderHandle* handle) {
191 DCHECK(adapter_->HasHandle(handle));
192 loader_->OnPrerenderDomContentLoaded();
193 }
194
195 void PrerenderingLoader::PrerenderHandleObserver::OnPrerenderStop(
196 prerender::PrerenderHandle* handle) {
197 DCHECK(adapter_->HasHandle(handle));
198 loader_->OnPrerenderStop();
27 } 199 }
28 200
29 } // namespace offline_pages 201 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698