Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 79ea7ab8605ef7f9dd485124e03e18e465cc277b..5a0cec5d20b1e3bd18d08aab95bf07bee3551130 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -18,6 +18,7 @@ |
#include "content/browser/browser_plugin/old/browser_plugin_host.h" |
#include "content/browser/child_process_security_policy_impl.h" |
#include "content/browser/debugger/devtools_manager_impl.h" |
+#include "content/browser/dom_storage/dom_storage_context_impl.h" |
#include "content/browser/dom_storage/session_storage_namespace_impl.h" |
#include "content/browser/download/download_stats.h" |
#include "content/browser/download/mhtml_generation_manager.h" |
@@ -270,15 +271,31 @@ WebContents* WebContents::Create( |
BrowserContext* browser_context, |
SiteInstance* site_instance, |
int routing_id, |
+ const WebContents* base_web_contents) { |
+ return WebContentsImpl::Create( |
+ browser_context, site_instance, routing_id, |
+ static_cast<const WebContentsImpl*>(base_web_contents)); |
+} |
+ |
+WebContents* WebContents::CreateWithSessionStorage( |
+ BrowserContext* browser_context, |
+ SiteInstance* site_instance, |
+ int routing_id, |
const WebContents* base_web_contents, |
- SessionStorageNamespace* session_storage_namespace) { |
- return new WebContentsImpl( |
- browser_context, |
- site_instance, |
- routing_id, |
- static_cast<const WebContentsImpl*>(base_web_contents), |
- NULL, |
- static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace)); |
+ const SessionStorageNamespaceMap& session_storage_namespace_map) { |
+ WebContentsImpl* new_contents = new WebContentsImpl(browser_context, NULL); |
+ |
+ for (SessionStorageNamespaceMap::const_iterator it = |
+ session_storage_namespace_map.begin(); |
+ it != session_storage_namespace_map.end(); |
+ ++it) { |
+ new_contents->GetController().SetSessionStorageNamespace(it->first, |
+ it->second); |
+ } |
+ |
+ new_contents->Init(browser_context, site_instance, routing_id, |
+ static_cast<const WebContentsImpl*>(base_web_contents)); |
+ return new_contents; |
} |
WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { |
@@ -291,14 +308,9 @@ WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { |
WebContentsImpl::WebContentsImpl( |
content::BrowserContext* browser_context, |
- SiteInstance* site_instance, |
- int routing_id, |
- const WebContentsImpl* base_web_contents, |
- WebContentsImpl* opener, |
- SessionStorageNamespaceImpl* session_storage_namespace) |
+ WebContentsImpl* opener) |
: delegate_(NULL), |
- ALLOW_THIS_IN_INITIALIZER_LIST(controller_( |
- this, browser_context, session_storage_namespace)), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(controller_(this, browser_context)), |
render_view_host_delegate_view_(NULL), |
opener_(opener), |
ALLOW_THIS_IN_INITIALIZER_LIST(render_manager_(this, this, this)), |
@@ -327,43 +339,6 @@ WebContentsImpl::WebContentsImpl( |
temporary_zoom_settings_(false), |
content_restrictions_(0), |
color_chooser_(NULL) { |
- render_manager_.Init(browser_context, site_instance, routing_id); |
- |
- view_.reset(content::GetContentClient()->browser()-> |
- OverrideCreateWebContentsView(this, &render_view_host_delegate_view_)); |
- if (view_.get()) { |
- CHECK(render_view_host_delegate_view_); |
- } else { |
- content::WebContentsViewDelegate* delegate = |
- content::GetContentClient()->browser()->GetWebContentsViewDelegate( |
- this); |
- view_.reset(CreateWebContentsView( |
- this, delegate, &render_view_host_delegate_view_)); |
- CHECK(render_view_host_delegate_view_); |
- } |
- CHECK(view_.get()); |
- |
- // We have the initial size of the view be based on the size of the view of |
- // the passed in WebContents. |
- view_->CreateView(base_web_contents ? |
- base_web_contents->GetView()->GetContainerSize() : gfx::Size()); |
- |
- // Listen for whether our opener gets destroyed. |
- if (opener_) { |
- registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
- content::Source<WebContents>(opener_)); |
- } |
- |
- registrar_.Add(this, |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
- content::NotificationService::AllBrowserContextsAndSources()); |
- |
-#if defined(ENABLE_JAVA_BRIDGE) |
- java_bridge_dispatcher_host_manager_.reset( |
- new JavaBridgeDispatcherHostManager(this)); |
-#endif |
- |
- browser_plugin_host_.reset(new content::BrowserPluginHost(this)); |
} |
WebContentsImpl::~WebContentsImpl() { |
@@ -408,6 +383,28 @@ WebContentsImpl::~WebContentsImpl() { |
SetDelegate(NULL); |
} |
+WebContentsImpl* WebContentsImpl::Create( |
+ BrowserContext* browser_context, |
+ SiteInstance* site_instance, |
+ int routing_id, |
+ const WebContentsImpl* base_web_contents) { |
+ return CreateWithOpener(browser_context, site_instance, routing_id, |
+ base_web_contents, NULL); |
+} |
+ |
+WebContentsImpl* WebContentsImpl::CreateWithOpener( |
+ BrowserContext* browser_context, |
+ SiteInstance* site_instance, |
+ int routing_id, |
+ const WebContentsImpl* base_web_contents, |
+ WebContentsImpl* opener) { |
+ WebContentsImpl* new_contents = new WebContentsImpl(browser_context, opener); |
+ |
+ new_contents->Init(browser_context, site_instance, routing_id, |
+ static_cast<const WebContentsImpl*>(base_web_contents)); |
+ return new_contents; |
+} |
+ |
WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh, |
const GURL& url) { |
WebPreferences prefs; |
@@ -618,10 +615,6 @@ WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh, |
return prefs; |
} |
-NavigationControllerImpl& WebContentsImpl::GetControllerImpl() { |
- return controller_; |
-} |
- |
RenderViewHostManager* WebContentsImpl::GetRenderManagerForTesting() { |
return &render_manager_; |
} |
@@ -697,11 +690,11 @@ void WebContentsImpl::RunFileChooser( |
delegate_->RunFileChooser(this, params); |
} |
-NavigationController& WebContentsImpl::GetController() { |
+NavigationControllerImpl& WebContentsImpl::GetController() { |
return controller_; |
} |
-const NavigationController& WebContentsImpl::GetController() const { |
+const NavigationControllerImpl& WebContentsImpl::GetController() const { |
return controller_; |
} |
@@ -1015,10 +1008,10 @@ WebContents* WebContentsImpl::Clone() { |
// We use our current SiteInstance since the cloned entry will use it anyway. |
// We pass |this| for the |base_web_contents| to size the view correctly, and |
// our own opener so that the cloned page can access it if it was before. |
- WebContentsImpl* tc = new WebContentsImpl( |
- GetBrowserContext(), GetSiteInstance(), |
- MSG_ROUTING_NONE, this, opener_, NULL); |
- tc->GetControllerImpl().CopyStateFrom(controller_); |
+ WebContentsImpl* tc = CreateWithOpener(GetBrowserContext(), |
+ GetSiteInstance(), MSG_ROUTING_NONE, |
+ this, opener_); |
+ tc->GetController().CopyStateFrom(controller_); |
return tc; |
} |
@@ -1073,6 +1066,49 @@ void WebContentsImpl::Observe(int type, |
} |
} |
+void WebContentsImpl::Init(BrowserContext* browser_context, |
+ SiteInstance* site_instance, |
+ int routing_id, |
+ const WebContents* base_web_contents) { |
+ render_manager_.Init(browser_context, site_instance, routing_id); |
+ |
+ view_.reset(content::GetContentClient()->browser()-> |
+ OverrideCreateWebContentsView(this, &render_view_host_delegate_view_)); |
+ if (view_.get()) { |
+ CHECK(render_view_host_delegate_view_); |
+ } else { |
+ content::WebContentsViewDelegate* delegate = |
+ content::GetContentClient()->browser()->GetWebContentsViewDelegate( |
+ this); |
+ view_.reset(CreateWebContentsView( |
+ this, delegate, &render_view_host_delegate_view_)); |
+ CHECK(render_view_host_delegate_view_); |
+ } |
+ CHECK(view_.get()); |
+ |
+ // We have the initial size of the view be based on the size of the view of |
+ // the passed in WebContents. |
+ view_->CreateView(base_web_contents ? |
+ base_web_contents->GetView()->GetContainerSize() : gfx::Size()); |
+ |
+ // Listen for whether our opener gets destroyed. |
+ if (opener_) { |
+ registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
+ content::Source<WebContents>(opener_)); |
+ } |
+ |
+ registrar_.Add(this, |
+ content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
+ content::NotificationService::AllBrowserContextsAndSources()); |
+ |
+#if defined(ENABLE_JAVA_BRIDGE) |
+ java_bridge_dispatcher_host_manager_.reset( |
+ new JavaBridgeDispatcherHostManager(this)); |
+#endif |
+ |
+ browser_plugin_host_.reset(new content::BrowserPluginHost(this)); |
+} |
+ |
void WebContentsImpl::OnWebContentsDestroyed(WebContents* web_contents) { |
// Clear the opener if it has been closed. |
if (web_contents == opener_) { |
@@ -1187,13 +1223,26 @@ void WebContentsImpl::CreateNewWindow( |
// Create the new web contents. This will automatically create the new |
// WebContentsView. In the future, we may want to create the view separately. |
- WebContentsImpl* new_contents = new WebContentsImpl( |
- GetBrowserContext(), |
- site_instance, |
- route_id, |
- this, |
- params.opener_suppressed ? NULL : this, |
- static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace)); |
+ WebContentsImpl* new_contents = |
+ CreateWithOpener(GetBrowserContext(), |
+ site_instance, route_id, this, |
+ params.opener_suppressed ? NULL : this); |
+ |
+ int process_id = site_instance->GetProcess()->GetID(); |
+ const std::string& partition_id = |
+ content::GetContentClient()->browser() |
+ ->GetStoragePartitionIdForChildProcess(GetBrowserContext(), |
Charlie Reis
2012/08/02 23:06:47
I think we usually put the arrow on the previous l
awong
2012/08/03 00:31:04
I'm actually not sure...for gmock, they put the .
|
+ process_id); |
+ SessionStorageNamespaceImpl* session_storage_namespace_impl = |
+ static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); |
+ DOMStorageContextImpl* dom_storage_context = |
+ static_cast<DOMStorageContextImpl*>( |
+ BrowserContext::GetDOMStorageContextByPartitionId(GetBrowserContext(), |
+ partition_id)); |
+ CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); |
+ new_contents->GetController().SetSessionStorageNamespace( |
+ partition_id, |
+ session_storage_namespace); |
new_contents->set_opener_web_ui_type(GetWebUITypeForCurrentState()); |
if (!params.opener_suppressed) { |
@@ -1987,7 +2036,7 @@ void WebContentsImpl::OnDidLoadResourceFromMemoryCache( |
void WebContentsImpl::OnDidDisplayInsecureContent() { |
content::RecordAction(UserMetricsAction("SSL.DisplayedInsecureContent")); |
displayed_insecure_content_ = true; |
- SSLManager::NotifySSLInternalStateChanged(&GetControllerImpl()); |
+ SSLManager::NotifySSLInternalStateChanged(&GetController()); |
} |
void WebContentsImpl::OnDidRunInsecureContent( |
@@ -1999,7 +2048,7 @@ void WebContentsImpl::OnDidRunInsecureContent( |
content::RecordAction(UserMetricsAction("SSL.RanInsecureContentGoogle")); |
controller_.ssl_manager()->DidRunInsecureContent(security_origin); |
displayed_insecure_content_ = true; |
- SSLManager::NotifySSLInternalStateChanged(&GetControllerImpl()); |
+ SSLManager::NotifySSLInternalStateChanged(&GetController()); |
} |
void WebContentsImpl::OnDocumentLoadedInFrame(int64 frame_id) { |
@@ -3024,7 +3073,7 @@ int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { |
} |
NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { |
- return GetControllerImpl(); |
+ return GetController(); |
} |
WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { |