Index: chrome/browser/prerender/prerender_manager.cc |
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
index 7daa0212e0135c2c699398337e5e986c9805e07e..6eee82a30949f8c00dbdea0f0f9ae9a5e7698a21 100644 |
--- a/chrome/browser/prerender/prerender_manager.cc |
+++ b/chrome/browser/prerender/prerender_manager.cc |
@@ -55,7 +55,7 @@ |
using content::BrowserThread; |
using content::RenderViewHost; |
-using content::SessionStorageNamespace; |
+using content::SessionStorageNamespaceMap; |
using content::WebContents; |
namespace prerender { |
@@ -208,7 +208,7 @@ PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
#if defined(OS_ANDROID) |
// TODO(jcivelli): http://crbug.com/113322 We should have an option to disable |
// link-prerender and enable omnibox-prerender only. |
- return NULL; |
+ return false; |
#else |
DCHECK(!size.IsEmpty()); |
if (PrerenderData* parent_prerender_data = |
@@ -228,36 +228,34 @@ PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
} |
// Unit tests pass in a process_id == -1. |
- SessionStorageNamespace* session_storage_namespace = NULL; |
- if (process_id != -1) { |
- RenderViewHost* source_render_view_host = |
- RenderViewHost::FromID(process_id, route_id); |
- if (!source_render_view_host) |
- return NULL; |
- WebContents* source_web_contents = |
- WebContents::FromRenderViewHost(source_render_view_host); |
- if (!source_web_contents) |
- return NULL; |
- // TODO(ajwong): This does not correctly handle storage for isolated apps. |
- session_storage_namespace = |
- source_web_contents->GetController() |
- .GetSessionStorageNamespaceMap().find("")->second; |
+ if (process_id == -1) { |
+ return AddPrerender(ORIGIN_LINK_REL_PRERENDER, |
+ process_id, url, referrer, size, |
+ SessionStorageNamespaceMap()); |
} |
+ RenderViewHost* source_render_view_host = |
+ RenderViewHost::FromID(process_id, route_id); |
+ if (!source_render_view_host) |
+ return NULL; |
+ |
+ WebContents* source_web_contents = |
+ WebContents::FromRenderViewHost(source_render_view_host); |
return AddPrerender(ORIGIN_LINK_REL_PRERENDER, |
process_id, url, referrer, size, |
- session_storage_namespace); |
+ source_web_contents->GetController() |
+ .GetSessionStorageNamespaceMap()); |
#endif |
} |
PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox( |
const GURL& url, |
- SessionStorageNamespace* session_storage_namespace, |
+ const SessionStorageNamespaceMap& session_storage_namespace_map, |
const gfx::Size& size) { |
if (!IsOmniboxEnabled(profile_)) |
return NULL; |
return AddPrerender(ORIGIN_OMNIBOX, -1, url, content::Referrer(), size, |
- session_storage_namespace); |
+ session_storage_namespace_map); |
} |
void PrerenderManager::DestroyPrerenderForRenderView( |
@@ -283,13 +281,12 @@ bool PrerenderManager::MaybeUsePrerenderedPage(WebContents* web_contents, |
DCHECK(CalledOnValidThread()); |
DCHECK(!IsWebContentsPrerendering(web_contents)); |
+ const SessionStorageNamespaceMap& old_session_storage_namespace_map = |
+ web_contents->GetController().GetSessionStorageNamespaceMap(); |
DeleteOldEntries(); |
DeletePendingDeleteEntries(); |
- // TODO(ajwong): This doesn't handle isolated apps correctly. |
- PrerenderData* prerender_data = FindPrerenderData( |
- url, |
- web_contents->GetController().GetSessionStorageNamespaceMap() |
- .find("")->second); |
+ PrerenderData* prerender_data = |
+ FindPrerenderData(url, old_session_storage_namespace_map); |
if (!prerender_data) |
return false; |
DCHECK(prerender_data->contents_); |
@@ -810,7 +807,7 @@ void PrerenderManager::StartPendingPrerender( |
const GURL& url, |
const content::Referrer& referrer, |
const gfx::Size& size, |
- content::SessionStorageNamespace* session_storage_namespace) { |
+ const content::SessionStorageNamespaceMap& session_storage_namespace_map) { |
DCHECK(existing_prerender_handle); |
DCHECK(existing_prerender_handle->IsValid()); |
DCHECK(existing_prerender_handle->IsPending()); |
@@ -819,10 +816,10 @@ void PrerenderManager::StartPendingPrerender( |
DVLOG(6) << "existing_prerender_handle->handle_count_ = " << |
existing_prerender_handle->prerender_data_->handle_count_; |
- DCHECK(process_id == -1 || session_storage_namespace); |
+ DCHECK(process_id == -1 || !session_storage_namespace_map.empty()); |
scoped_ptr<PrerenderHandle> swap_prerender_handle(AddPrerender( |
- origin, process_id, url, referrer, size, session_storage_namespace)); |
+ origin, process_id, url, referrer, size, session_storage_namespace_map)); |
if (swap_prerender_handle.get()) { |
// AddPrerender has returned a new prerender handle to us. We want to make |
// |existing_prerender_handle| active, so swap the underlying PrerenderData |
@@ -871,7 +868,7 @@ PrerenderHandle* PrerenderManager::AddPrerender( |
const GURL& url_arg, |
const content::Referrer& referrer, |
const gfx::Size& size, |
- SessionStorageNamespace* session_storage_namespace) { |
+ const SessionStorageNamespaceMap& session_storage_namespace_map) { |
DCHECK(CalledOnValidThread()); |
if (!IsEnabled()) |
@@ -900,7 +897,7 @@ PrerenderHandle* PrerenderManager::AddPrerender( |
histograms_->RecordPrerender(origin, url_arg); |
if (PrerenderData* preexisting_prerender_data = |
- FindPrerenderData(url, session_storage_namespace)) { |
+ FindPrerenderData(url, session_storage_namespace_map)) { |
RecordFinalStatus(origin, experiment, FINAL_STATUS_DUPLICATE); |
return new PrerenderHandle(preexisting_prerender_data); |
} |
@@ -952,7 +949,7 @@ PrerenderHandle* PrerenderManager::AddPrerender( |
size.IsEmpty() ? config_.default_tab_bounds.size() : size; |
prerender_contents->StartPrerendering(process_id, contents_size, |
- session_storage_namespace, |
+ session_storage_namespace_map, |
control_group_behavior); |
while (active_prerender_list_.size() > config_.max_concurrency) { |
@@ -1064,13 +1061,13 @@ void PrerenderManager::DeletePendingDeleteEntries() { |
PrerenderManager::PrerenderData* PrerenderManager::FindPrerenderData( |
const GURL& url, |
- const SessionStorageNamespace* session_storage_namespace) { |
+ const SessionStorageNamespaceMap& session_storage_namespace_map) { |
for (std::list<linked_ptr<PrerenderData> >::iterator |
it = active_prerender_list_.begin(); |
it != active_prerender_list_.end(); |
++it) { |
PrerenderContents* prerender_contents = it->get()->contents_; |
- if (prerender_contents->Matches(url, session_storage_namespace)) |
+ if (prerender_contents->Matches(url, session_storage_namespace_map)) |
return it->get(); |
} |
return NULL; |