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