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

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: uninlined ObserverDelegate impl 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()) {}
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());
fgorski 2016/05/17 05:09:52 don't need the .get() with !
pasko 2016/05/17 15:34:20 FWIW, I would prefer to refer to session_contents
fgorski 2016/05/17 15:54:54 That sounds great, as long as we are consistent ev
dougarnett 2016/05/18 00:37:47 Done.
dougarnett 2016/05/18 00:37:47 Going without the .get() for now. PrerenderManag
41 session_contents_.reset(content::WebContents::Create(
42 content::WebContents::CreateParams(browser_context_)));
43 if (!observer_.get())
fgorski 2016/05/17 05:09:52 ditto
dougarnett 2016/05/18 00:37:47 Done.
44 observer_.reset(new PrerenderingLoader::ObserverDelegate(this));
45
46 bool accepted = adapter_->StartPrerender(browser_context_, url,
47 GetSessionStorageNamespace(),
48 GetSize(), observer_.get());
49 if (!accepted)
50 return false;
51
52 DCHECK(adapter_->IsActive());
53 callback_ = callback;
54 state_ = State::LOADING;
55 return true;
23 } 56 }
24 57
25 void PrerenderingLoader::StopLoading() { 58 void PrerenderingLoader::StopLoading() {
26 // TODO(dougarnett): implement. 59 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
60 CancelPrerender();
61 }
62
63 bool PrerenderingLoader::CanPrerender() {
64 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
65 return adapter_->CanPrerender();
66 }
67
68 bool PrerenderingLoader::IsIdle() {
69 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
70 return state_ == State::IDLE;
71 }
72
73 bool PrerenderingLoader::IsLoaded() {
74 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
75 return state_ == State::LOADED;
76 }
77
78 void PrerenderingLoader::SetAdapterForTesting(
79 PrerenderAdapter* prerender_adapter) {
fgorski 2016/05/17 05:09:52 std::unique_ptr<PrerenderAdapter> Please tell the
dougarnett 2016/05/18 00:37:47 Done.
80 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
81 adapter_.reset(prerender_adapter);
82 }
83
84 void PrerenderingLoader::OnPrerenderStart(prerender::PrerenderHandle* handle) {
85 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
86 DCHECK(adapter_->HasHandle(handle));
87 DCHECK(state_ == State::PENDING);
88 state_ = State::LOADING;
89 }
90
91 void PrerenderingLoader::OnPrerenderStopLoading(
92 prerender::PrerenderHandle* handle) {
93 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
94 DCHECK(adapter_->HasHandle(handle));
95 // TODO(dougarnett): Implement/integrate to delay policy here.
96 ReportLoadedIfStillLoading();
97 }
98
99 void PrerenderingLoader::OnPrerenderDomContentLoaded(
100 prerender::PrerenderHandle* handle) {
101 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
102 DCHECK(adapter_->HasHandle(handle));
103 // TODO(dougarnett): Implement/integrate to delay policy here.
104 ReportLoadedIfStillLoading();
105 }
106
107 void PrerenderingLoader::OnPrerenderStop(prerender::PrerenderHandle* handle) {
108 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
109 DCHECK(adapter_->HasHandle(handle));
110 ReportLoadFailedIfStillLoading();
111 }
112
113 content::SessionStorageNamespace*
114 PrerenderingLoader::GetSessionStorageNamespace() {
115 DCHECK(session_contents_.get());
116 return session_contents_->GetController().GetDefaultSessionStorageNamespace();
117 }
118
119 const gfx::Size PrerenderingLoader::GetSize() {
120 DCHECK(session_contents_.get());
121 return session_contents_->GetContainerBounds().size();
122 }
123
124 void PrerenderingLoader::ReportLoadedIfStillLoading() {
125 // Make sure still loading in case some other load detection or canceling
126 // has already occurred.
127 if (state_ == State::LOADING) {
128 content::WebContents* contents = adapter_->GetWebContents();
129 if (contents) {
130 state_ = State::LOADED;
131 base::ThreadTaskRunnerHandle::Get()->PostTask(
132 FROM_HERE,
133 base::Bind(callback_, Offliner::RequestStatus::LOADED, contents));
134 } else {
135 ReportLoadFailedIfStillLoading();
136 }
137 }
138 }
139
140 void PrerenderingLoader::ReportLoadFailedIfStillLoading() {
141 // Check if load is still active to see if reporting is applicable.
142 if (!IsLoaded() && !IsIdle()) {
143 if (adapter_->IsActive()) {
144 DVLOG(1) << "Load failed: " << adapter_->GetFinalStatus();
145 adapter_->DestroyActive();
146 }
147 // TODO(dougarnett): Determine from final status if retry-able.
148 session_contents_.reset(nullptr);
149 state_ = State::IDLE;
150 base::ThreadTaskRunnerHandle::Get()->PostTask(
151 FROM_HERE,
152 base::Bind(callback_, Offliner::RequestStatus::FAILED_DO_NOT_RETRY,
153 nullptr));
154 }
155 }
156
157 void PrerenderingLoader::CancelPrerender() {
158 if (adapter_->IsActive()) {
159 adapter_->DestroyActive();
160 }
161 session_contents_.reset(nullptr);
162 if (!IsLoaded() && !IsIdle()) {
163 base::ThreadTaskRunnerHandle::Get()->PostTask(
164 FROM_HERE,
165 base::Bind(callback_, Offliner::RequestStatus::CANCELED, nullptr));
166 }
167 state_ = State::IDLE;
168 }
169
170 // ObserverDelegate implementation:
171
172 PrerenderingLoader::ObserverDelegate::ObserverDelegate(
173 PrerenderingLoader* loader)
174 : loader_(loader) {}
fgorski 2016/05/17 05:09:52 DCHECK(loader); ? you are calling methods on it l
dougarnett 2016/05/18 00:37:47 Done.
175
176 PrerenderingLoader::ObserverDelegate::~ObserverDelegate() {}
177
178 void PrerenderingLoader::ObserverDelegate::OnPrerenderStart(
179 prerender::PrerenderHandle* handle) {
180 loader_->OnPrerenderStart(handle);
181 }
182
183 void PrerenderingLoader::ObserverDelegate::OnPrerenderStopLoading(
184 prerender::PrerenderHandle* handle) {
185 loader_->OnPrerenderDomContentLoaded(handle);
186 }
187
188 void PrerenderingLoader::ObserverDelegate::OnPrerenderDomContentLoaded(
189 prerender::PrerenderHandle* handle) {
190 loader_->OnPrerenderDomContentLoaded(handle);
191 }
192
193 void PrerenderingLoader::ObserverDelegate::OnPrerenderStop(
194 prerender::PrerenderHandle* handle) {
195 loader_->OnPrerenderStop(handle);
27 } 196 }
28 197
29 } // namespace offline_pages 198 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698