| 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;
|
|
|