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

Unified Diff: chrome/browser/prerender/prerender_contents.cc

Issue 10826110: Modify prerendering to support having multiple session storage namespaces per tab. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/prerender/prerender_contents.cc
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 319e14b9ded99db7b9754dda9e936c3628227f62..9fc810a1e0c63293c4fa74d800307be3aad3399d 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -39,6 +39,7 @@ using content::OpenURLParams;
using content::RenderViewHost;
using content::ResourceRedirectDetails;
using content::SessionStorageNamespace;
+using content::SessionStorageNamespaceMap;
using content::WebContents;
namespace prerender {
@@ -210,14 +211,10 @@ bool PrerenderContents::IsPendingEntry(
}
void PrerenderContents::StartPendingPrerenders() {
- SessionStorageNamespace* session_storage_namespace = NULL;
- if (prerender_contents_.get()) {
- // TODO(ajwong): This does not correctly handle storage for isolated apps.
- session_storage_namespace =
- prerender_contents_->web_contents()->GetController()
- .GetSessionStorageNamespaceMap().find("")->second;
- }
- DCHECK(child_id_ == -1 || session_storage_namespace);
+ const SessionStorageNamespaceMap& session_storage_namespace_map =
+ prerender_contents_->web_contents()->GetController()
+ .GetSessionStorageNamespaceMap();
+ DCHECK(child_id_ == -1 || !session_storage_namespace_map.empty());
std::vector<PendingPrerenderInfo> pending_prerender_list;
pending_prerender_list.swap(pending_prerenders_);
@@ -228,7 +225,7 @@ void PrerenderContents::StartPendingPrerenders() {
if (it->weak_prerender_handle && it->weak_prerender_handle->IsValid()) {
prerender_manager_->StartPendingPrerender(
it->weak_prerender_handle.get(), ORIGIN_LINK_REL_PRERENDER, child_id_,
- it->url, it->referrer, it->size, session_storage_namespace);
+ it->url, it->referrer, it->size, session_storage_namespace_map);
}
}
}
@@ -262,7 +259,6 @@ PrerenderContents::PrerenderContents(
referrer_(referrer),
profile_(profile),
page_id_(0),
- session_storage_namespace_id_(-1),
has_stopped_loading_(false),
has_finished_loading_(false),
final_status_(FINAL_STATUS_MAX),
@@ -279,8 +275,8 @@ PrerenderContents::PrerenderContents(
void PrerenderContents::MakeIntoDummyReplacementOf(
const PrerenderContents* original_prerender_contents) {
load_start_time_ = original_prerender_contents->load_start_time_;
- session_storage_namespace_id_ =
- original_prerender_contents->session_storage_namespace_id_;
+ session_storage_namespace_ids_ =
+ original_prerender_contents->session_storage_namespace_ids_;
}
bool PrerenderContents::Init() {
@@ -295,7 +291,7 @@ PrerenderContents::Factory* PrerenderContents::CreateFactory() {
void PrerenderContents::StartPrerendering(
int creator_child_id,
const gfx::Size& size,
- SessionStorageNamespace* session_storage_namespace,
+ const SessionStorageNamespaceMap& session_storage_namespace_map,
bool is_control_group) {
DCHECK(profile_ != NULL);
DCHECK(!size.IsEmpty());
@@ -306,8 +302,13 @@ void PrerenderContents::StartPrerendering(
DCHECK_EQ(1U, alias_urls_.size());
creator_child_id_ = creator_child_id;
- session_storage_namespace_id_ = session_storage_namespace->id();
size_ = size;
+ for (SessionStorageNamespaceMap::const_iterator it =
+ session_storage_namespace_map.begin();
+ it != session_storage_namespace_map.end();
+ ++it) {
+ session_storage_namespace_ids_.insert(it->second->id());
+ }
InformRenderProcessAboutPrerender(prerender_url_, true,
creator_child_id_);
@@ -323,7 +324,7 @@ void PrerenderContents::StartPrerendering(
prerendering_has_started_ = true;
- WebContents* new_contents = CreateWebContents(session_storage_namespace);
+ WebContents* new_contents = CreateWebContents(session_storage_namespace_map);
prerender_contents_.reset(new TabContents(new_contents));
content::WebContentsObserver::Observe(new_contents);
@@ -503,13 +504,10 @@ void PrerenderContents::OnRenderViewHostCreated(
}
WebContents* PrerenderContents::CreateWebContents(
- SessionStorageNamespace* session_storage_namespace) {
- // TODO(ajwong): Remove the temporary map once prerendering is aware of
- // multiple session storage namespaces per tab.
- content::SessionStorageNamespaceMap session_storage_namespace_map;
- session_storage_namespace_map[""] = session_storage_namespace;
- return WebContents::CreateWithSessionStorage(
- profile_, NULL, MSG_ROUTING_NONE, NULL, session_storage_namespace_map);
+ const SessionStorageNamespaceMap& session_storage_namespace_map) {
+ return WebContents::CreateWithSessionStorage(profile_, NULL,
+ MSG_ROUTING_NONE, NULL,
+ session_storage_namespace_map);
}
void PrerenderContents::OnUpdateFaviconURL(
@@ -561,11 +559,25 @@ void PrerenderContents::AddAliasURLsFromOtherPrerenderContents(
bool PrerenderContents::Matches(
const GURL& url,
- const SessionStorageNamespace* session_storage_namespace) const {
- DCHECK(child_id_ == -1 || session_storage_namespace);
- if (session_storage_namespace &&
- session_storage_namespace_id_ != session_storage_namespace->id())
+ const SessionStorageNamespaceMap& session_storage_namespace_map) const {
+ DCHECK(child_id_ == -1 || !session_storage_namespace_map.empty());
+
+ // We must have the same session storage objects to match.
+ if (session_storage_namespace_ids_.size() !=
+ session_storage_namespace_map.size()) {
return false;
+ }
+
+ for (SessionStorageNamespaceMap::const_iterator it =
+ session_storage_namespace_map.begin();
+ it != session_storage_namespace_map.end();
+ ++it) {
+ if (session_storage_namespace_ids_.find(it->second->id()) ==
+ session_storage_namespace_ids_.end()) {
+ return false;
+ }
+ }
+
return std::count_if(alias_urls_.begin(), alias_urls_.end(),
std::bind2nd(std::equal_to<GURL>(), url)) != 0;
}
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698