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

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: style fixes. Created 8 years, 4 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 881169f1b0c68626d33538c83b9222e56d0be34e..25d4874d1083a1bbfd6df35da7670c905ddb7d4a 100644
--- a/content/browser/web_contents/navigation_controller_impl.cc
+++ b/content/browser/web_contents/navigation_controller_impl.cc
@@ -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() {
@@ -1130,7 +1127,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);
@@ -1251,6 +1256,23 @@ void NavigationControllerImpl::PruneAllButActive() {
}
}
+void NavigationControllerImpl::SetSessionStorageNamespace(
+ const std::string& partition_id,
+ content::SessionStorageNamespace* session_storage_namespace) {
+ if (!session_storage_namespace)
+ 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;
}
@@ -1260,8 +1282,42 @@ int32 NavigationControllerImpl::GetMaxRestoredPageID() const {
}
SessionStorageNamespace*
- NavigationControllerImpl::GetSessionStorageNamespace() const {
- return session_storage_namespace_;
+NavigationControllerImpl::GetSessionStorageNamespace(
+ content::SiteInstance* instance) {
+ std::string partition_id;
+ if (instance) {
+ // TODO(ajwong): When GetDefaultSessionStorageNamespace() goes away, remove
+ // this if statement so |instance| must not be NULL.
+ partition_id =
+ GetContentClient()->browser()->GetStoragePartitionIdForSiteInstance(
+ browser_context_, instance);
+ }
+
+ SessionStorageNamespaceMap::const_iterator it =
+ session_storage_namespace_map_.find(partition_id);
+ if (it != session_storage_namespace_map_.end())
+ 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::GetDOMStorageContextByPartitionId(
+ browser_context_, partition_id)));
+ session_storage_namespace_map_[partition_id] = session_storage_namespace;
michaeln 2012/08/08 22:28:53 Seems like having additional SSN's come into exist
awong 2012/08/09 01:51:43 Yep. This is being tracked in another CL: http:
+
+ return session_storage_namespace;
+}
+
+SessionStorageNamespace*
+NavigationControllerImpl::GetDefaultSessionStorageNamespace() {
+ // TODO(ajwong): Remove if statement in GetSessionStorageNamespace().
+ return GetSessionStorageNamespace(NULL);
+}
+
+const SessionStorageNamespaceMap&
+NavigationControllerImpl::GetSessionStorageNamespaceMap() const {
+ return session_storage_namespace_map_;
}
bool NavigationControllerImpl::NeedsReload() const {

Powered by Google App Engine
This is Rietveld 408576698