Index: chrome/browser/prerender/prerender_manager.cc |
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
index e932868887e4fabc36f8ba0119b0c4371e3a97b5..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; |
mmenke
2012/10/05 21:15:44
Having an origin here instead of a bool would remo
|
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()); |
mmenke
2012/10/05 21:15:44
Nothing actionable, but just noting that cross dom
|
// 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 |
@@ -958,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; |
} |