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

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 10918189: Add PrerenderStatusEvent on Prerenders (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 8 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 205
206 PrerenderManager::~PrerenderManager() { 206 PrerenderManager::~PrerenderManager() {
207 } 207 }
208 208
209 void PrerenderManager::Shutdown() { 209 void PrerenderManager::Shutdown() {
210 DoShutdown(); 210 DoShutdown();
211 } 211 }
212 212
213 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( 213 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender(
214 int process_id, 214 int process_id,
215 int prerender_id,
215 int route_id, 216 int route_id,
216 const GURL& url, 217 const GURL& url,
217 const content::Referrer& referrer, 218 const content::Referrer& referrer,
218 const gfx::Size& size) { 219 const gfx::Size& size) {
219 #if defined(OS_ANDROID) 220 #if defined(OS_ANDROID)
220 // TODO(jcivelli): http://crbug.com/113322 We should have an option to disable 221 // TODO(jcivelli): http://crbug.com/113322 We should have an option to disable
221 // link-prerender and enable omnibox-prerender only. 222 // link-prerender and enable omnibox-prerender only.
222 return NULL; 223 return NULL;
223 #else 224 #else
224 DCHECK(!size.IsEmpty()); 225 DCHECK(!size.IsEmpty());
225 if (PrerenderData* parent_prerender_data = 226 if (PrerenderData* parent_prerender_data =
226 FindPrerenderDataForChildAndRoute(process_id, route_id)) { 227 FindPrerenderDataForChildAndRoute(process_id, route_id)) {
227 // Instead of prerendering from inside of a running prerender, we will defer 228 // Instead of prerendering from inside of a running prerender, we will defer
228 // this request until its launcher is made visible. 229 // this request until its launcher is made visible.
229 if (PrerenderContents* contents = parent_prerender_data->contents_) { 230 if (PrerenderContents* contents = parent_prerender_data->contents_) {
230 pending_prerender_list_.push_back( 231 pending_prerender_list_.push_back(linked_ptr<PrerenderData>(
231 linked_ptr<PrerenderData>(new PrerenderData(this))); 232 new PrerenderData(this)));
232 PrerenderHandle* prerender_handle = 233 PrerenderHandle* prerender_handle =
233 new PrerenderHandle(pending_prerender_list_.back().get()); 234 new PrerenderHandle(pending_prerender_list_.back().get());
234 contents->AddPendingPrerender( 235 contents->AddPendingPrerender(
235 prerender_handle->weak_ptr_factory_.GetWeakPtr(), 236 prerender_handle->weak_ptr_factory_.GetWeakPtr(),
236 url, referrer, size); 237 url, referrer, size);
237 return prerender_handle; 238 return prerender_handle;
238 } 239 }
239 } 240 }
240 241
241 // Unit tests pass in a process_id == -1. 242 // Unit tests pass in a process_id == -1.
242 SessionStorageNamespace* session_storage_namespace = NULL; 243 SessionStorageNamespace* session_storage_namespace = NULL;
243 if (process_id != -1) { 244 if (process_id != -1) {
244 RenderViewHost* source_render_view_host = 245 RenderViewHost* source_render_view_host =
245 RenderViewHost::FromID(process_id, route_id); 246 RenderViewHost::FromID(process_id, route_id);
246 if (!source_render_view_host) 247 if (!source_render_view_host)
247 return NULL; 248 return NULL;
248 WebContents* source_web_contents = 249 WebContents* source_web_contents =
249 WebContents::FromRenderViewHost(source_render_view_host); 250 WebContents::FromRenderViewHost(source_render_view_host);
250 if (!source_web_contents) 251 if (!source_web_contents)
251 return NULL; 252 return NULL;
252 // TODO(ajwong): This does not correctly handle storage for isolated apps. 253 // TODO(ajwong): This does not correctly handle storage for isolated apps.
253 session_storage_namespace = 254 session_storage_namespace =
254 source_web_contents->GetController() 255 source_web_contents->GetController()
255 .GetDefaultSessionStorageNamespace(); 256 .GetDefaultSessionStorageNamespace();
256 } 257 }
257 258
258 return AddPrerender(ORIGIN_LINK_REL_PRERENDER, 259 return AddPrerender(ORIGIN_LINK_REL_PRERENDER,
259 process_id, url, referrer, size, 260 process_id, prerender_id, url, referrer, size,
dominich 2012/09/12 15:21:04 I thought the PrerenderHandle work would remove th
260 session_storage_namespace); 261 session_storage_namespace);
261 #endif 262 #endif
262 } 263 }
263 264
264 PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox( 265 PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox(
265 const GURL& url, 266 const GURL& url,
266 SessionStorageNamespace* session_storage_namespace, 267 SessionStorageNamespace* session_storage_namespace,
267 const gfx::Size& size) { 268 const gfx::Size& size) {
268 if (!IsOmniboxEnabled(profile_)) 269 if (!IsOmniboxEnabled(profile_))
269 return NULL; 270 return NULL;
270 return AddPrerender(ORIGIN_OMNIBOX, -1, url, content::Referrer(), size, 271 return AddPrerender(ORIGIN_OMNIBOX, -1, -1, url, content::Referrer(), size,
dominich 2012/09/12 15:21:04 does this mean the renderer doesn't get informed a
271 session_storage_namespace); 272 session_storage_namespace);
272 } 273 }
273 274
274 void PrerenderManager::DestroyPrerenderForRenderView( 275 void PrerenderManager::DestroyPrerenderForRenderView(
275 int process_id, int view_id, FinalStatus final_status) { 276 int process_id, int view_id, FinalStatus final_status) {
276 DCHECK(CalledOnValidThread()); 277 DCHECK(CalledOnValidThread());
277 if (PrerenderData* prerender_data = 278 if (PrerenderData* prerender_data =
278 FindPrerenderDataForChildAndRoute(process_id, view_id)) { 279 FindPrerenderDataForChildAndRoute(process_id, view_id)) {
279 prerender_data->contents_->Destroy(final_status); 280 prerender_data->contents_->Destroy(final_status);
280 } 281 }
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 DCHECK(existing_prerender_handle->IsValid()); 824 DCHECK(existing_prerender_handle->IsValid());
824 DCHECK(existing_prerender_handle->IsPending()); 825 DCHECK(existing_prerender_handle->IsPending());
825 826
826 DVLOG(6) << "StartPendingPrerender"; 827 DVLOG(6) << "StartPendingPrerender";
827 DVLOG(6) << "existing_prerender_handle->handle_count_ = " << 828 DVLOG(6) << "existing_prerender_handle->handle_count_ = " <<
828 existing_prerender_handle->prerender_data_->handle_count_; 829 existing_prerender_handle->prerender_data_->handle_count_;
829 830
830 DCHECK(process_id == -1 || session_storage_namespace); 831 DCHECK(process_id == -1 || session_storage_namespace);
831 832
832 scoped_ptr<PrerenderHandle> swap_prerender_handle(AddPrerender( 833 scoped_ptr<PrerenderHandle> swap_prerender_handle(AddPrerender(
833 origin, process_id, url, referrer, size, session_storage_namespace)); 834 origin, process_id, -1, url, referrer, size, session_storage_namespace));
mmenke 2012/09/12 16:31:45 Won't this break PrerenderMsg_StoppedPrerender? W
834 if (swap_prerender_handle.get()) { 835 if (swap_prerender_handle.get()) {
835 // AddPrerender has returned a new prerender handle to us. We want to make 836 // AddPrerender has returned a new prerender handle to us. We want to make
836 // |existing_prerender_handle| active, so swap the underlying PrerenderData 837 // |existing_prerender_handle| active, so swap the underlying PrerenderData
837 // between the two handles, and delete our old handle (which will release 838 // between the two handles, and delete our old handle (which will release
838 // our entry in the pending_prerender_list_). 839 // our entry in the pending_prerender_list_).
839 existing_prerender_handle->SwapPrerenderDataWith( 840 existing_prerender_handle->SwapPrerenderDataWith(
840 swap_prerender_handle.get()); 841 swap_prerender_handle.get());
841 swap_prerender_handle->OnCancel(); 842 swap_prerender_handle->OnCancel();
842 return; 843 return;
843 } 844 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 on_close_tab_contents_deleters_.clear(); 897 on_close_tab_contents_deleters_.clear();
897 profile_ = NULL; 898 profile_ = NULL;
898 899
899 DCHECK(active_prerender_list_.empty()); 900 DCHECK(active_prerender_list_.empty());
900 } 901 }
901 902
902 // private 903 // private
903 PrerenderHandle* PrerenderManager::AddPrerender( 904 PrerenderHandle* PrerenderManager::AddPrerender(
904 Origin origin, 905 Origin origin,
905 int process_id, 906 int process_id,
907 int prerender_id,
906 const GURL& url_arg, 908 const GURL& url_arg,
907 const content::Referrer& referrer, 909 const content::Referrer& referrer,
908 const gfx::Size& size, 910 const gfx::Size& size,
909 SessionStorageNamespace* session_storage_namespace) { 911 SessionStorageNamespace* session_storage_namespace) {
910 DCHECK(CalledOnValidThread()); 912 DCHECK(CalledOnValidThread());
911 913
912 if (!IsEnabled()) 914 if (!IsEnabled())
913 return NULL; 915 return NULL;
914 916
915 if (origin == ORIGIN_LINK_REL_PRERENDER && 917 if (origin == ORIGIN_LINK_REL_PRERENDER &&
(...skipping 14 matching lines...) Expand all
930 url = alias_url; 932 url = alias_url;
931 } 933 }
932 934
933 // From here on, we will record a FinalStatus so we need to register with the 935 // From here on, we will record a FinalStatus so we need to register with the
934 // histogram tracking. 936 // histogram tracking.
935 histograms_->RecordPrerender(origin, url_arg); 937 histograms_->RecordPrerender(origin, url_arg);
936 938
937 if (PrerenderData* preexisting_prerender_data = 939 if (PrerenderData* preexisting_prerender_data =
938 FindPrerenderData(url, session_storage_namespace)) { 940 FindPrerenderData(url, session_storage_namespace)) {
939 RecordFinalStatus(origin, experiment, FINAL_STATUS_DUPLICATE); 941 RecordFinalStatus(origin, experiment, FINAL_STATUS_DUPLICATE);
940 return new PrerenderHandle(preexisting_prerender_data); 942 return new PrerenderHandle(preexisting_prerender_data);
mmenke 2012/09/12 16:31:45 When we merge prerenders, only one of them will ev
941 } 943 }
942 944
943 // Do not prerender if there are too many render processes, and we would 945 // Do not prerender if there are too many render processes, and we would
944 // have to use an existing one. We do not want prerendering to happen in 946 // have to use an existing one. We do not want prerendering to happen in
945 // a shared process, so that we can always reliably lower the CPU 947 // a shared process, so that we can always reliably lower the CPU
946 // priority for prerendering. 948 // priority for prerendering.
947 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns 949 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns
948 // true, so that case needs to be explicitly checked for. 950 // true, so that case needs to be explicitly checked for.
949 // TODO(tburkard): Figure out how to cancel prerendering in the opposite 951 // TODO(tburkard): Figure out how to cancel prerendering in the opposite
950 // case, when a new tab is added to a process used for prerendering. 952 // case, when a new tab is added to a process used for prerendering.
(...skipping 29 matching lines...) Expand all
980 this, prerender_contents, GetExpiryTimeForNewPrerender()))); 982 this, prerender_contents, GetExpiryTimeForNewPrerender())));
981 983
982 PrerenderHandle* prerender_handle = 984 PrerenderHandle* prerender_handle =
983 new PrerenderHandle(active_prerender_list_.back().get()); 985 new PrerenderHandle(active_prerender_list_.back().get());
984 986
985 last_prerender_start_time_ = GetCurrentTimeTicks(); 987 last_prerender_start_time_ = GetCurrentTimeTicks();
986 988
987 gfx::Size contents_size = 989 gfx::Size contents_size =
988 size.IsEmpty() ? config_.default_tab_bounds.size() : size; 990 size.IsEmpty() ? config_.default_tab_bounds.size() : size;
989 991
990 prerender_contents->StartPrerendering(process_id, contents_size, 992 prerender_contents->StartPrerendering(process_id, prerender_id, contents_size,
991 session_storage_namespace, 993 session_storage_namespace,
992 control_group_behavior); 994 control_group_behavior);
993 995
994 while (active_prerender_list_.size() > config_.max_concurrency) { 996 while (active_prerender_list_.size() > config_.max_concurrency) {
995 prerender_contents = active_prerender_list_.front()->contents_; 997 prerender_contents = active_prerender_list_.front()->contents_;
996 DCHECK(prerender_contents); 998 DCHECK(prerender_contents);
997 prerender_contents->Destroy(FINAL_STATUS_EVICTED); 999 prerender_contents->Destroy(FINAL_STATUS_EVICTED);
998 } 1000 }
999 1001
1000 histograms_->RecordConcurrency(active_prerender_list_.size(), 1002 histograms_->RecordConcurrency(active_prerender_list_.size(),
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 if (!render_process_host || !render_process_host->GetBrowserContext()) 1290 if (!render_process_host || !render_process_host->GetBrowserContext())
1289 return NULL; 1291 return NULL;
1290 Profile* profile = Profile::FromBrowserContext( 1292 Profile* profile = Profile::FromBrowserContext(
1291 render_process_host->GetBrowserContext()); 1293 render_process_host->GetBrowserContext());
1292 if (!profile) 1294 if (!profile)
1293 return NULL; 1295 return NULL;
1294 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); 1296 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile);
1295 } 1297 }
1296 1298
1297 } // namespace prerender 1299 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698