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

Unified Diff: content/browser/web_contents/navigation_controller_impl.cc

Issue 10831116: Move SessionStorageNamespace entirely into NavigationController and support StoragePartitions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix content shell 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
Index: content/browser/web_contents/navigation_controller_impl.cc
diff --git a/content/browser/web_contents/navigation_controller_impl.cc b/content/browser/web_contents/navigation_controller_impl.cc
index 557180f7158a0902b09976469c225d1723ca6f6c..46fe09116ae13e9a146926b5d6bda5c00c3ceb15 100644
--- a/content/browser/web_contents/navigation_controller_impl.cc
+++ b/content/browser/web_contents/navigation_controller_impl.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+ // Copyright (c) 2012 The Chromium Authors. All rights reserved.
Charlie Reis 2012/08/02 23:06:47 Extra space
awong 2012/08/03 00:31:04 Done.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -22,12 +22,14 @@
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/view_messages.h"
#include "content/public/browser/browser_context.h"
+#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/invalidate_type.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/content_client.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/url_constants.h"
#include "net/base/escape.h"
@@ -37,12 +39,14 @@
using content::BrowserContext;
using content::DOMStorageContext;
+using content::GetContentClient;
using content::GlobalRequestID;
using content::NavigationController;
using content::NavigationEntry;
using content::NavigationEntryImpl;
using content::RenderViewHostImpl;
using content::SessionStorageNamespace;
+using content::SessionStorageNamespaceMap;
using content::SiteInstance;
using content::UserMetricsAction;
using content::WebContents;
@@ -178,8 +182,7 @@ void NavigationController::DisablePromptOnRepost() {
NavigationControllerImpl::NavigationControllerImpl(
WebContentsImpl* web_contents,
- BrowserContext* browser_context,
- SessionStorageNamespaceImpl* session_storage_namespace)
+ BrowserContext* browser_context)
: browser_context_(browser_context),
pending_entry_(NULL),
last_committed_entry_index_(-1),
@@ -189,14 +192,8 @@ NavigationControllerImpl::NavigationControllerImpl(
max_restored_page_id_(-1),
ALLOW_THIS_IN_INITIALIZER_LIST(ssl_manager_(this)),
needs_reload_(false),
- session_storage_namespace_(session_storage_namespace),
pending_reload_(NO_RELOAD) {
DCHECK(browser_context_);
- if (!session_storage_namespace_) {
- session_storage_namespace_ = new SessionStorageNamespaceImpl(
- static_cast<DOMStorageContextImpl*>(
- BrowserContext::GetDefaultDOMStorageContext(browser_context_)));
- }
}
NavigationControllerImpl::~NavigationControllerImpl() {
@@ -1131,7 +1128,15 @@ void NavigationControllerImpl::CopyStateFrom(
needs_reload_ = true;
InsertEntriesFrom(source, source.GetEntryCount());
- session_storage_namespace_ = source.session_storage_namespace_->Clone();
+ for (SessionStorageNamespaceMap::const_iterator it =
+ source.session_storage_namespace_map_.begin();
+ it != source.session_storage_namespace_map_.end();
+ ++it) {
+ SessionStorageNamespaceImpl* source_namespace =
+ static_cast<SessionStorageNamespaceImpl*>(it->second.get());
+ session_storage_namespace_map_.insert(
+ make_pair(it->first, source_namespace->Clone()));
+ }
FinishRestore(source.last_committed_entry_index_, false);
@@ -1211,6 +1216,8 @@ void NavigationControllerImpl::CopyStateFromAndPrune(
web_contents_->UpdateMaxPageIDForSiteInstance(site_instance.get(),
max_page_id);
}
+
+ // TODO(ajwong): Do we need to handle SessionStorage here?
Charlie Reis 2012/08/02 23:06:47 I would think so. We want all the SessionStorageN
awong 2012/08/03 00:31:04 I'm actually not sure....the prerenderer and insta
Charlie Reis 2012/08/03 22:11:28 Should be easy to check manually, right? Just set
awong 2012/08/04 01:01:32 At this point, I think I understand instant and pr
}
void NavigationControllerImpl::PruneAllButActive() {
@@ -1252,6 +1259,24 @@ void NavigationControllerImpl::PruneAllButActive() {
}
}
+void NavigationControllerImpl::SetSessionStorageNamespace(
+ const std::string& partition_id,
+ content::SessionStorageNamespace* session_storage_namespace) {
+ if (!session_storage_namespace) {
Charlie Reis 2012/08/02 23:06:47 nit: No braces
awong 2012/08/03 00:31:04 Done.
+ return;
+ }
+
+ // We can't overwrite an existing SessionStorage without violating spec.
+ // Attempts to do so may give a tab access to another tab's session storage
+ // so die hard on an error.
+ bool successful_insert = session_storage_namespace_map_.insert(
+ make_pair(partition_id,
+ static_cast<SessionStorageNamespaceImpl*>(
+ session_storage_namespace)))
+ .second;
+ CHECK(successful_insert) << "Cannot replace existing SessionStorageNamespace";
+}
+
void NavigationControllerImpl::SetMaxRestoredPageID(int32 max_id) {
max_restored_page_id_ = max_id;
}
@@ -1261,8 +1286,32 @@ int32 NavigationControllerImpl::GetMaxRestoredPageID() const {
}
SessionStorageNamespace*
- NavigationControllerImpl::GetSessionStorageNamespace() const {
- return session_storage_namespace_;
+NavigationControllerImpl::GetSessionStorageNamespace(int renderer_id) {
+ const std::string& partition_id =
+ GetContentClient()->browser()->GetStoragePartitionIdForChildProcess(
+ browser_context_,
+ renderer_id);
+
+ SessionStorageNamespaceMap::const_iterator it =
+ session_storage_namespace_map_.find(partition_id);
+ if (it != session_storage_namespace_map_.end()) {
Charlie Reis 2012/08/02 23:06:47 nit: No braces
awong 2012/08/03 00:31:04 Done.
+ return it->second.get();
+ }
+
+ // Create one if no one has accessed session storage for this partition yet.
+ SessionStorageNamespaceImpl* session_storage_namespace =
+ new SessionStorageNamespaceImpl(
+ static_cast<DOMStorageContextImpl*>(
+ BrowserContext::GetDOMStorageContext(browser_context_,
+ renderer_id)));
+ session_storage_namespace_map_[partition_id] = session_storage_namespace;
+
+ return session_storage_namespace;
+}
+
+const SessionStorageNamespaceMap&
+NavigationControllerImpl::GetSessionStorageNamespaceMap() const {
+ return session_storage_namespace_map_;
}
bool NavigationControllerImpl::NeedsReload() const {

Powered by Google App Engine
This is Rietveld 408576698