Chromium Code Reviews| 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 a14bf00b396de805ab673a83de700799769fe16d..f4a7b0d9297af8f3c28350f49b42aa0f5f79e4ee 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -15,6 +15,8 @@ |
| #include "base/sys_info.h" |
| #include "base/time.h" |
| #include "base/utf_string_conversions.h" |
| +#include "content/browser/browser_plugin/browser_plugin_embedder.h" |
| +#include "content/browser/browser_plugin/browser_plugin_guest.h" |
| #include "content/browser/browser_plugin/old/old_browser_plugin_host.h" |
| #include "content/browser/child_process_security_policy_impl.h" |
| #include "content/browser/debugger/devtools_manager_impl.h" |
| @@ -35,6 +37,7 @@ |
| #include "content/browser/web_contents/interstitial_page_impl.h" |
| #include "content/browser/web_contents/navigation_entry_impl.h" |
| #include "content/browser/webui/web_ui_impl.h" |
| +#include "content/common/browser_plugin_messages.h" |
| #include "content/common/intents_messages.h" |
| #include "content/common/ssl_status_serialization.h" |
| #include "content/common/view_messages.h" |
| @@ -314,6 +317,27 @@ WebContents* WebContents::CreateWithSessionStorage( |
| return new_contents; |
| } |
| +WebContents* WebContents::CreateGuest(BrowserContext* browser_context, |
| + const std::string& host_url, |
| + int guest_instance_id) { |
| + // The SiteInstance of a given guest is based on the fact that it's a guest |
| + // in addition to which platform application the guest belongs to, rather |
| + // than the URL that the guest is being navigated to. |
| + GURL guest_site( |
| + base::StringPrintf("%s://%s", chrome::kGuestScheme, host_url.c_str())); |
| + SiteInstance* guest_site_instance = |
| + SiteInstance::CreateForURL(browser_context, guest_site); |
| + WebContents* new_contents = WebContents::Create( |
| + browser_context, |
| + guest_site_instance, |
| + MSG_ROUTING_NONE, |
| + NULL); // base WebContents |
| + |
| + static_cast<WebContentsImpl*>(new_contents)->AssignBrowserPluginGuest( |
| + guest_instance_id); |
|
awong
2012/09/09 18:08:09
You can also just do new_contents->browser_plugin_
lazyboy
2012/09/10 16:30:17
Ah
Interesting, done and removed AssignBrowserPlug
|
| + return new_contents; |
| +} |
| + |
| WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { |
| return rvh->GetDelegate()->GetAsWebContents(); |
| } |
| @@ -687,6 +711,8 @@ bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, |
| IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) |
| IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, |
| OnRequestPpapiBrokerPermission) |
| + IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_NavigateGuest, |
| + OnBrowserPluginNavigateGuest) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP_EX() |
| message_source_ = NULL; |
| @@ -2274,6 +2300,29 @@ void WebContentsImpl::OnPpapiBrokerPermissionResult(int request_id, |
| result)); |
| } |
| +void WebContentsImpl::OnBrowserPluginNavigateGuest(int instance_id, |
| + int64 frame_id, |
| + const std::string& src, |
| + const gfx::Size& size) { |
| + // This is the first 'navigate' to a browser plugin, before WebContents has/is |
| + // an 'Embedder'; subsequent navigate messages for this WebContents will |
| + // be handled by the BrowserPluginEmbedderHelper of the embedder itself (this |
| + // also means any message from browser plugin renderer prior to NavigateGuest |
| + // which is not NavigateGuest will be ignored). Therefore |
| + // |browser_plugin_embedder_| should not be set. |
| + // For more info, see comment above classes BrowserPluginEmbedder and |
| + // BrowserPluginGuest. |
| + CHECK(!browser_plugin_embedder_.get()); |
| + |
| + browser_plugin_embedder_.reset( |
| + content::BrowserPluginEmbedder::Create(this, GetRenderViewHost())); |
| + browser_plugin_embedder_->NavigateGuest(GetRenderViewHost(), |
| + instance_id, |
| + frame_id, |
| + src, |
| + size); |
| +} |
| + |
| // Notifies the RenderWidgetHost instance about the fact that the page is |
| // loading, or done loading and calls the base implementation. |
| void WebContentsImpl::SetIsLoading(bool is_loading, |
| @@ -2430,6 +2479,11 @@ void WebContentsImpl::NotifySwapped() { |
| content::NOTIFICATION_WEB_CONTENTS_SWAPPED, |
| content::Source<WebContents>(this), |
| content::NotificationService::NoDetails()); |
| + |
| + // Ensure that the associated embedder gets cleared after a RenderViewHost |
| + // gets swapped, so we don't reuse the same embedder next time a |
| + // RenderViewHost is attached to this WebContents (for security concerns). |
| + RemoveSwappedOutBrowserPluginEmbedder(); |
| } |
| void WebContentsImpl::NotifyConnected() { |
| @@ -2475,6 +2529,11 @@ gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { |
| return gfx::Rect(); |
| } |
| +void WebContentsImpl::RemoveSwappedOutBrowserPluginEmbedder() { |
| + if (browser_plugin_embedder_.get()) |
| + browser_plugin_embedder_.reset(); |
| +} |
| + |
| void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { |
| // Don't send notifications if we are just creating a swapped-out RVH for |
| // the opener chain. These won't be used for view-source or WebUI, so it's |
| @@ -3263,3 +3322,20 @@ void WebContentsImpl::GetBrowserPluginEmbedderInfo( |
| embedder_process_id); |
| } |
| } |
| + |
| +content::BrowserPluginGuest* WebContentsImpl::AssignBrowserPluginGuest( |
| + int instance_id) { |
| + // This makes this WebContents to have a guest role. |
| + // For more info, see comment above class BrowserPluginGuest. |
| + browser_plugin_guest_.reset(content::BrowserPluginGuest::Create( |
| + instance_id, this, GetRenderViewHost())); |
| + return browser_plugin_guest_.get(); |
| +} |
| + |
| +content::BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() { |
| + return browser_plugin_guest_.get(); |
| +} |
| + |
| +content::BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() { |
| + return browser_plugin_embedder_.get(); |
| +} |