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

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: Address some feedback (some remains for followup) 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"
12 #include "content/public/browser/browser_context.h"
7 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
8 #include "ui/gfx/geometry/size.h" 14 #include "ui/gfx/geometry/size.h"
9 15
10 namespace offline_pages { 16 namespace offline_pages {
11 17
12 PrerenderingLoader::PrerenderingLoader(PrerenderManager* prerender_manager) {} 18 using PrerenderingAdapter = PrerenderingLoader::PrerenderingAdapter;
13 19
14 PrerenderingLoader::~PrerenderingLoader() {} 20 PrerenderingLoader::PrerenderingLoader(content::BrowserContext* browser_context)
15 21 : browser_context_(browser_context), adapter_(new PrerenderingAdapter()) {}
16 bool PrerenderingLoader::LoadPage( 22
23 PrerenderingLoader::~PrerenderingLoader() {
24 CancelPrerender();
25 }
26
27 bool PrerenderingLoader::LoadPage(const GURL& url,
28 const LoadPageCallback& callback) {
29 if (state_ != State::kIdle) {
30 DVLOG(1) << "WARNING: Existing request pending";
31 return false;
32 }
33 if (!CanPrerender())
34 return false;
35
36 adapter_->AddPrerenderForOffline(browser_context_, url,
37 GetSessionStorageNamespace(), GetSize());
38 if (!adapter_->IsActive())
39 return false;
40
41 callback_ = callback;
42 adapter_->SetObserver(this);
43 state_ = State::kLoading;
44 return true;
45 }
46
47 void PrerenderingLoader::StopLoading() {
48 CancelPrerender();
49 state_ = State::kIdle;
50 }
51
52 bool PrerenderingLoader::CanPrerender() {
53 // First check if prerendering is enabled.
54 return adapter_->CanPrerender();
55 }
56
57 bool PrerenderingLoader::IsIdle() {
58 return state_ == State::kIdle;
59 }
60
61 content::SessionStorageNamespace*
62 PrerenderingLoader::GetSessionStorageNamespace() {
63 // TODO(dougarnett): Create separate namespace from default (to better
pasko 2016/05/11 12:18:34 my reading says that there is a 1:1 mapping betwee
dougarnett 2016/05/11 21:10:14 Nice
64 // isolate background loading artifacts from direct user browsing).
65 return content::WebContents::Create(
pasko 2016/05/11 12:18:34 This would leak WebContents, right? I think we nee
dougarnett 2016/05/11 21:10:14 Now holding onto this WebContents instance (in ses
66 content::WebContents::CreateParams(browser_context_))
67 ->GetController()
68 .GetDefaultSessionStorageNamespace();
69 }
70
71 const gfx::Size PrerenderingLoader::GetSize() {
72 return content::WebContents::Create(
73 content::WebContents::CreateParams(browser_context_))
74 ->GetContainerBounds()
75 .size();
76 }
77
78 void PrerenderingLoader::ReportLoaded() {
79 if (state_ == State::kLoading) {
80 content::WebContents* contents = adapter_->GetPrerenderContents();
81 if (contents) {
82 state_ = State::kLoaded;
83 // TODO(dougarnett): Post callback on the thread.
pasko 2016/05/11 12:18:34 which thread?
dougarnett 2016/05/11 21:10:14 Current thread. Went ahead and added the PostTask'
84 callback_.Run(true, contents);
85 } else {
86 ReportLoadFailed();
87 }
88 }
89 }
90
91 void PrerenderingLoader::ReportLoadFailed() {
92 if (state_ != State::kLoaded && state_ != State::kIdle) {
93 if (adapter_->IsActive())
94 DVLOG(1) << "Load failed: " << adapter_->GetFinalStatus();
95 state_ = State::kIdle;
96 // TODO(dougarnett): Post callback on the thread.
97 callback_.Run(false, nullptr);
98 }
99 }
100
101 void PrerenderingLoader::CancelPrerender() {
102 if (adapter_->IsPrerendering())
103 adapter_->OnCancel();
104 adapter_->DestroyActive();
105 }
106
107 void PrerenderingLoader::OnPrerenderStart(prerender::PrerenderHandle* handle) {
108 if (adapter_->IsActive(handle) && state_ == State::kPending) {
109 state_ = State::kLoading;
110 }
111 }
112
113 void PrerenderingLoader::OnPrerenderStopLoading(
114 prerender::PrerenderHandle* handle) {
115 if (adapter_->IsActive(handle)) {
116 // TODO(dougarnett): Implement/integrate to delay policy here.
117 ReportLoaded();
118 }
119 }
120
121 void PrerenderingLoader::OnPrerenderDomContentLoaded(
122 prerender::PrerenderHandle* handle) {
123 if (adapter_->IsActive(handle)) {
124 // TODO(dougarnett): Implement/integrate to delay policy here.
125 ReportLoaded();
126 }
127 }
128
129 void PrerenderingLoader::OnPrerenderStop(prerender::PrerenderHandle* handle) {
130 if (adapter_->IsActive(handle)) {
131 ReportLoadFailed();
132 }
133 }
134
135 void PrerenderingLoader::OnPrerenderCreatedMatchCompleteReplacement(
136 prerender::PrerenderHandle* handle) {
137 DVLOG(1) << "Offlining prerender should never do replacement";
138 }
139
140 void PrerenderingLoader::SetAdapterForTesting(
141 PrerenderingAdapter* prerendering_adapter) {
142 adapter_.reset(prerendering_adapter);
143 }
144
145 // Adapter implementation to prerender stack:
146
147 bool PrerenderingAdapter::CanPrerender() const {
148 return prerender::PrerenderManager::ActuallyPrerendering();
149 }
150
151 bool PrerenderingAdapter::AddPrerenderForOffline(
152 content::BrowserContext* browser_context,
17 const GURL& url, 153 const GURL& url,
18 content::SessionStorageNamespace* session_storage_namespace, 154 content::SessionStorageNamespace* session_storage_namespace,
19 const gfx::Size& size, 155 const gfx::Size& size) {
20 const LoadPageCallback& callback) { 156 DCHECK(!IsActive());
21 // TODO(dougarnett): implement. 157 Profile* profile = Profile::FromBrowserContext(browser_context);
22 return false; 158 prerender::PrerenderManager* manager =
23 } 159 prerender::PrerenderManagerFactory::GetForProfile(profile);
24 160 DCHECK(manager);
25 void PrerenderingLoader::StopLoading() { 161 // Start prerendering the url and capture the handle for the prerendering.
26 // TODO(dougarnett): implement. 162 active_handle_.reset(
163 manager->AddPrerenderForOffline(url, session_storage_namespace, size));
164 return active_handle_.get();
165 }
166
167 void PrerenderingAdapter::SetObserver(
168 prerender::PrerenderHandle::Observer* observer) {
169 active_handle_->SetObserver(observer);
170 }
171
172 bool PrerenderingAdapter::IsPrerendering() const {
173 return active_handle_->IsPrerendering();
174 }
175
176 void PrerenderingAdapter::OnCancel() {
177 active_handle_->OnCancel();
178 }
179
180 content::WebContents* PrerenderingAdapter::GetPrerenderContents() const {
181 if (active_handle_->contents()) {
182 // Note: the prerender stack maintains ownership of these contents
183 // and PrerenderingLoader::StopLoading() must be called to report
184 // the Loader is done with the contents.
185 return active_handle_->contents()->prerender_contents();
186 }
187 return nullptr;
188 }
189
190 prerender::FinalStatus PrerenderingAdapter::GetFinalStatus() const {
191 DCHECK(active_handle_->contents());
192 return active_handle_->contents()->final_status();
193 }
194
195 bool PrerenderingAdapter::IsActive() const {
196 return active_handle_.get();
197 }
198
199 bool PrerenderingAdapter::IsActive(prerender::PrerenderHandle* handle) const {
200 return active_handle_.get() == handle;
201 }
202
203 void PrerenderingAdapter::DestroyActive() {
204 active_handle_.reset(nullptr);
27 } 205 }
28 206
29 } // namespace offline_pages 207 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698