Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
| index fb24531d9df91aafc14c1437451296e2230f587b..832839ff88954adbc7bb9c006fd270b929ddbe5a 100644 |
| --- a/chrome/browser/prerender/prerender_manager.cc |
| +++ b/chrome/browser/prerender/prerender_manager.cc |
| @@ -227,24 +227,9 @@ PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
| return NULL; |
| #else |
| DCHECK(!size.IsEmpty()); |
| - if (PrerenderData* parent_prerender_data = |
| - FindPrerenderDataForChildAndRoute(process_id, route_id)) { |
| - // Instead of prerendering from inside of a running prerender, we will defer |
| - // this request until its launcher is made visible. |
| - if (PrerenderContents* contents = parent_prerender_data->contents_) { |
| - pending_prerender_list_.push_back( |
| - linked_ptr<PrerenderData>(new PrerenderData(this))); |
| - PrerenderHandle* prerender_handle = |
| - new PrerenderHandle(pending_prerender_list_.back().get()); |
| - contents->AddPendingPrerender( |
| - prerender_handle->weak_ptr_factory_.GetWeakPtr(), |
| - ORIGIN_LINK_REL_PRERENDER, url, referrer, size); |
| - return prerender_handle; |
| - } |
| - } |
| - |
| - // Unit tests pass in a process_id == -1. |
| + bool is_same_domain = false; |
| SessionStorageNamespace* session_storage_namespace = NULL; |
| + // Unit tests pass in a process_id == -1. |
| if (process_id != -1) { |
| RenderViewHost* source_render_view_host = |
| RenderViewHost::FromID(process_id, route_id); |
| @@ -254,13 +239,33 @@ PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
| WebContents::FromRenderViewHost(source_render_view_host); |
| if (!source_web_contents) |
| return NULL; |
| + is_same_domain = (source_web_contents->GetURL().host() == url.host()); |
|
dominich
2012/10/08 17:03:04
does this return true if you have https://google.c
|
| // TODO(ajwong): This does not correctly handle storage for isolated apps. |
| session_storage_namespace = |
| source_web_contents->GetController() |
| .GetDefaultSessionStorageNamespace(); |
| } |
| - return AddPrerender(ORIGIN_LINK_REL_PRERENDER, |
| + if (PrerenderData* parent_prerender_data = |
| + FindPrerenderDataForChildAndRoute(process_id, route_id)) { |
| + // Instead of prerendering from inside of a running prerender, we will defer |
| + // this request until its launcher is made visible. |
| + if (PrerenderContents* contents = parent_prerender_data->contents_) { |
| + pending_prerender_list_.push_back( |
| + linked_ptr<PrerenderData>(new PrerenderData(this))); |
| + PrerenderHandle* prerender_handle = |
| + new PrerenderHandle(pending_prerender_list_.back().get()); |
| + contents->AddPendingPrerender( |
| + prerender_handle->weak_ptr_factory_.GetWeakPtr(), |
| + is_same_domain ? ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN |
| + : ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN, |
| + url, referrer, size); |
| + return prerender_handle; |
| + } |
| + } |
| + |
| + return AddPrerender(is_same_domain ? ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN |
| + : ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN, |
| process_id, url, referrer, size, |
| session_storage_namespace); |
| #endif |
| @@ -520,7 +525,7 @@ void PrerenderManager::RecordPerceivedPageLoadTime( |
| return; |
| if (!prerender_manager->IsEnabled()) |
| return; |
| - Origin prerender_origin = ORIGIN_NONE; |
| + const Origin* prerender_origin = NULL; |
| bool was_prerender = |
| prerender_manager->IsWebContentsPrerendered(web_contents, |
| &prerender_origin); |
| @@ -528,15 +533,15 @@ void PrerenderManager::RecordPerceivedPageLoadTime( |
| prerender_manager->WouldWebContentsBePrerendered(web_contents); |
| if (prerender_manager->IsWebContentsPrerendering(web_contents)) { |
| prerender_manager->histograms_->RecordPageLoadTimeNotSwappedIn( |
| - prerender_origin, perceived_page_load_time, url); |
| + was_prerender ? *prerender_origin : ORIGIN_NONE, |
| + perceived_page_load_time, url); |
| } else { |
| prerender_manager->histograms_->RecordPerceivedPageLoadTime( |
| - prerender_origin, perceived_page_load_time, was_prerender, |
| - was_complete_prerender, url); |
| - if (was_prerender) { |
| - prerender_manager->histograms_->RecordPercentLoadDoneAtSwapin( |
| - prerender_origin, fraction_plt_elapsed_at_swap_in); |
| - } |
| + was_prerender ? *prerender_origin : ORIGIN_NONE, |
| + perceived_page_load_time, was_prerender, was_complete_prerender, url); |
| + prerender_manager->histograms_->RecordPercentLoadDoneAtSwapin( |
| + was_prerender ? *prerender_origin : ORIGIN_NONE, |
| + fraction_plt_elapsed_at_swap_in); |
| if (prerender_manager->local_predictor_.get()) { |
| prerender_manager->local_predictor_-> |
| OnPLTEventForURL(url, perceived_page_load_time); |
| @@ -547,9 +552,10 @@ void PrerenderManager::RecordPerceivedPageLoadTime( |
| void PrerenderManager::RecordFractionPixelsFinalAtSwapin( |
| content::WebContents* web_contents, |
| double fraction) { |
| - Origin origin = ORIGIN_NONE; |
| + const Origin* origin = NULL; |
| IsWebContentsPrerendered(web_contents, &origin); |
| - histograms_->RecordFractionPixelsFinalAtSwapin(origin, fraction); |
| + histograms_->RecordFractionPixelsFinalAtSwapin( |
| + origin ? *origin : ORIGIN_NONE, fraction); |
| } |
| void PrerenderManager::set_enabled(bool enabled) { |
| @@ -691,17 +697,17 @@ void PrerenderManager::MarkWebContentsAsNotPrerendered( |
| bool PrerenderManager::IsWebContentsPrerendered( |
| content::WebContents* web_contents, |
| - Origin* origin) const { |
| + const Origin** origin) const { |
| DCHECK(CalledOnValidThread()); |
| base::hash_map<content::WebContents*, PrerenderedWebContentsData>:: |
| const_iterator it = prerendered_web_contents_data_.find(web_contents); |
| if (it == prerendered_web_contents_data_.end()) { |
| if (origin) |
| - *origin = ORIGIN_NONE; |
| + *origin = NULL; |
|
dominich
2012/10/08 17:03:04
this could be ORIGIN_MAX. Or a new ORIGIN_INVALID
|
| return false; |
| } |
| if (origin) |
| - *origin = it->second.origin; |
| + *origin = &it->second.origin; |
|
dominich
2012/10/08 17:03:04
this could lead to lifetime issues depending on wh
|
| return true; |
| } |
| @@ -957,7 +963,8 @@ PrerenderHandle* PrerenderManager::AddPrerender( |
| if (!IsEnabled()) |
| return NULL; |
| - if (origin == ORIGIN_LINK_REL_PRERENDER && |
| + if ((origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN || |
| + origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN) && |
| IsGoogleSearchResultURL(referrer.url)) { |
| origin = ORIGIN_GWS_PRERENDER; |
| } |