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

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

Powered by Google App Engine
This is Rietveld 408576698