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

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

Issue 10868012: Browser Plugin: New Implementation (Browser Side) (Closed) Base URL: http://git.chromium.org/chromium/src.git@master-trial-obrowser
Patch Set: integrate windows fix by Fady (original cl #10910228) Created 8 years, 3 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/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 8564c3ac602cea769f315dc1ee1815c68fe08cec..321e490a34c89499991243c48b1ad979a961e511 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"
@@ -423,6 +426,34 @@ WebContentsImpl* WebContentsImpl::CreateWithOpener(
return new_contents;
}
+WebContentsImpl* WebContentsImpl::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);
+ WebContentsImpl* new_contents = WebContentsImpl::Create(
+ browser_context,
+ guest_site_instance,
+ MSG_ROUTING_NONE,
+ NULL); // base WebContents
+ WebContentsImpl* new_contents_impl =
+ static_cast<WebContentsImpl*>(new_contents);
+
+ // This makes |new_contents| to have a guest role.
Charlie Reis 2012/09/13 00:51:44 nit: This makes |new_contents| act as a guest.
lazyboy 2012/09/13 15:56:24 Done.
+ // For more info, see comment above class BrowserPluginGuest.
+ new_contents_impl->browser_plugin_guest_.reset(
+ content::BrowserPluginGuest::Create(
+ guest_instance_id,
+ new_contents_impl,
+ new_contents_impl->GetRenderViewHost()));
+ return new_contents;
+}
+
WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh,
const GURL& url) {
WebPreferences prefs;
@@ -694,6 +725,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;
@@ -2302,6 +2335,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,
@@ -2458,6 +2514,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).
Charlie Reis 2012/09/13 00:51:44 What security concerns? I suggest dropping that p
lazyboy 2012/09/13 15:56:24 Remove the security concerns part from the comment
+ RemoveSwappedOutBrowserPluginEmbedder();
}
void WebContentsImpl::NotifyConnected() {
@@ -2503,6 +2564,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
@@ -3291,3 +3357,11 @@ void WebContentsImpl::GetBrowserPluginEmbedderInfo(
embedder_process_id);
}
}
+
+content::BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() {
+ return browser_plugin_guest_.get();
+}
+
+content::BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() {
+ return browser_plugin_embedder_.get();
+}

Powered by Google App Engine
This is Rietveld 408576698