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

Unified Diff: content/browser/browser_plugin/browser_plugin_guest_manager.cc

Issue 258373002: Towards moving guest management to chrome: Introduce GuestViewManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge with ToT Created 6 years, 8 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/browser_plugin/browser_plugin_guest_manager.cc
diff --git a/content/browser/browser_plugin/browser_plugin_guest_manager.cc b/content/browser/browser_plugin/browser_plugin_guest_manager.cc
index 443e7c7c230df4a589e4ca078973ef8447cdd7a0..006d8d2e408c68e195aac94ccea0c14533561736 100644
--- a/content/browser/browser_plugin/browser_plugin_guest_manager.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest_manager.cc
@@ -11,8 +11,12 @@
#include "content/common/browser_plugin/browser_plugin_constants.h"
#include "content/common/browser_plugin/browser_plugin_messages.h"
#include "content/common/content_export.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_plugin_guest_manager_delegate.h"
+#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/user_metrics.h"
+#include "content/public/common/content_client.h"
#include "content/public/common/result_codes.h"
#include "content/public/common/url_constants.h"
#include "content/public/common/url_utils.h"
@@ -23,18 +27,44 @@ namespace content {
// static
BrowserPluginHostFactory* BrowserPluginGuestManager::factory_ = NULL;
-BrowserPluginGuestManager::BrowserPluginGuestManager()
- : next_instance_id_(browser_plugin::kInstanceIDNone) {
+BrowserPluginGuestManager::BrowserPluginGuestManager(BrowserContext* context)
+ : context_(context) {}
+
+BrowserPluginGuestManagerDelegate*
+BrowserPluginGuestManager::GetDelegate() const {
+ return GetContentClient()->browser()->GetGuestManagerDelegate(context_);
}
BrowserPluginGuestManager::~BrowserPluginGuestManager() {
}
+// static.
+BrowserPluginGuestManager* BrowserPluginGuestManager::FromBrowserContext(
+ BrowserContext* context) {
+ BrowserPluginGuestManager* guest_manager =
+ static_cast<BrowserPluginGuestManager*>(
+ context->GetUserData(
+ browser_plugin::kBrowserPluginGuestManagerKeyName));
+ if (!guest_manager) {
+ guest_manager = BrowserPluginGuestManager::Create(context);
+ context->SetUserData(browser_plugin::kBrowserPluginGuestManagerKeyName,
+ guest_manager);
+ }
+ return guest_manager;
+}
+
// static
-BrowserPluginGuestManager* BrowserPluginGuestManager::Create() {
+BrowserPluginGuestManager* BrowserPluginGuestManager::Create(
+ BrowserContext* context) {
if (factory_)
- return factory_->CreateBrowserPluginGuestManager();
- return new BrowserPluginGuestManager();
+ return factory_->CreateBrowserPluginGuestManager(context);
+ return new BrowserPluginGuestManager(context);
+}
+
+int BrowserPluginGuestManager::GetNextInstanceID() {
+ if (!GetDelegate())
+ return 0;
+ return GetDelegate()->GetNextInstanceID();
}
BrowserPluginGuest* BrowserPluginGuestManager::CreateGuest(
@@ -62,10 +92,7 @@ BrowserPluginGuest* BrowserPluginGuestManager::CreateGuest(
// BrowserPlugin in a component extension iframe. In that case, we use the
// iframe's URL to determine the extension.
const GURL& embedder_site_url = embedder_site_instance->GetSiteURL();
- GURL validated_frame_url(params.embedder_frame_url);
- embedder_process_host->FilterURL(false, &validated_frame_url);
- const std::string& host = content::HasWebUIScheme(embedder_site_url) ?
- validated_frame_url.host() : embedder_site_url.host();
+ const std::string& host = embedder_site_url.host();
lazyboy 2014/05/01 20:06:59 Is the check for WebUI pages gone b/c of signin pa
Fady Samuel 2014/05/01 21:05:28 Yup. Once BrowserPluginGuestManager::CreateGuest m
std::string url_encoded_partition = net::EscapeQueryParamValue(
params.storage_partition_id, false);
@@ -101,43 +128,38 @@ BrowserPluginGuest* BrowserPluginGuestManager::CreateGuest(
BrowserPluginGuest* BrowserPluginGuestManager::GetGuestByInstanceID(
int instance_id,
int embedder_render_process_id) const {
- if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id,
- instance_id)) {
- return NULL;
- }
- GuestInstanceMap::const_iterator it =
- guest_web_contents_by_instance_id_.find(instance_id);
- if (it == guest_web_contents_by_instance_id_.end())
+ if (!GetDelegate())
return NULL;
- return static_cast<WebContentsImpl*>(it->second)->GetBrowserPluginGuest();
+
+ WebContentsImpl* guest_web_contents = static_cast<WebContentsImpl*>(
+ GetDelegate()->GetGuestByInstanceID(instance_id,
+ embedder_render_process_id));
+
+ return guest_web_contents ?
+ guest_web_contents->GetBrowserPluginGuest() : NULL;
}
void BrowserPluginGuestManager::AddGuest(int instance_id,
- WebContentsImpl* guest_web_contents) {
- DCHECK(guest_web_contents_by_instance_id_.find(instance_id) ==
- guest_web_contents_by_instance_id_.end());
- guest_web_contents_by_instance_id_[instance_id] = guest_web_contents;
+ WebContents* guest_web_contents) {
+ if (!GetDelegate())
+ return;
+ GetDelegate()->AddGuest(instance_id, guest_web_contents);
}
void BrowserPluginGuestManager::RemoveGuest(int instance_id) {
- DCHECK(guest_web_contents_by_instance_id_.find(instance_id) !=
- guest_web_contents_by_instance_id_.end());
- guest_web_contents_by_instance_id_.erase(instance_id);
+ if (!GetDelegate())
+ return;
+ GetDelegate()->RemoveGuest(instance_id);
}
bool BrowserPluginGuestManager::CanEmbedderAccessInstanceIDMaybeKill(
int embedder_render_process_id,
int instance_id) const {
- if (!CanEmbedderAccessInstanceID(embedder_render_process_id, instance_id)) {
- // The embedder process is trying to access a guest it does not own.
- content::RecordAction(
- base::UserMetricsAction("BadMessageTerminate_BPGM"));
- base::KillProcess(
- RenderProcessHost::FromID(embedder_render_process_id)->GetHandle(),
- content::RESULT_CODE_KILLED_BAD_MESSAGE, false);
+ if (!GetDelegate())
return false;
- }
- return true;
+
+ return GetDelegate()->CanEmbedderAccessInstanceIDMaybeKill(
+ embedder_render_process_id, instance_id);
}
void BrowserPluginGuestManager::OnMessageReceived(const IPC::Message& message,
@@ -155,74 +177,37 @@ void BrowserPluginGuestManager::OnMessageReceived(const IPC::Message& message,
guest->OnMessageReceivedFromEmbedder(message);
}
-// static
-bool BrowserPluginGuestManager::CanEmbedderAccessGuest(
- int embedder_render_process_id,
- BrowserPluginGuest* guest) {
- // The embedder can access the guest if it has not been attached and its
- // opener's embedder lives in the same process as the given embedder.
- if (!guest->attached()) {
- if (!guest->opener())
- return false;
-
- return embedder_render_process_id ==
- guest->opener()->embedder_web_contents()->GetRenderProcessHost()->
- GetID();
- }
-
- return embedder_render_process_id ==
- guest->embedder_web_contents()->GetRenderProcessHost()->GetID();
+SiteInstance* BrowserPluginGuestManager::GetGuestSiteInstance(
+ const GURL& guest_site) {
+ if (!GetDelegate())
+ return NULL;
+ return GetDelegate()->GetGuestSiteInstance(guest_site);
}
-bool BrowserPluginGuestManager::CanEmbedderAccessInstanceID(
- int embedder_render_process_id,
- int instance_id) const {
- // The embedder is trying to access a guest with a negative or zero
- // instance ID.
- if (instance_id <= browser_plugin::kInstanceIDNone)
- return false;
-
- // The embedder is trying to access an instance ID that has not yet been
- // allocated by BrowserPluginGuestManager. This could cause instance ID
- // collisions in the future, and potentially give one embedder access to a
- // guest it does not own.
- if (instance_id > next_instance_id_)
- return false;
-
- GuestInstanceMap::const_iterator it =
- guest_web_contents_by_instance_id_.find(instance_id);
- if (it == guest_web_contents_by_instance_id_.end())
- return true;
- BrowserPluginGuest* guest =
- static_cast<WebContentsImpl*>(it->second)->GetBrowserPluginGuest();
-
- return CanEmbedderAccessGuest(embedder_render_process_id, guest);
+static bool BrowserPluginGuestCallback(
+ const BrowserPluginGuestManager::GuestCallback& callback,
+ WebContents* guest_web_contents) {
+ return callback.Run(static_cast<WebContentsImpl*>(guest_web_contents)
+ ->GetBrowserPluginGuest());
}
-SiteInstance* BrowserPluginGuestManager::GetGuestSiteInstance(
- const GURL& guest_site) {
- for (GuestInstanceMap::const_iterator it =
- guest_web_contents_by_instance_id_.begin();
- it != guest_web_contents_by_instance_id_.end(); ++it) {
- if (it->second->GetSiteInstance()->GetSiteURL() == guest_site)
- return it->second->GetSiteInstance();
- }
- return NULL;
+bool BrowserPluginGuestManager::ForEachGuest(
+ WebContents* embedder_web_contents, const GuestCallback& callback) {
+ if (!GetDelegate())
+ return false;
+ return GetDelegate()->ForEachGuest(embedder_web_contents,
+ base::Bind(&BrowserPluginGuestCallback,
+ callback));
}
-bool BrowserPluginGuestManager::ForEachGuest(
- WebContentsImpl* embedder_web_contents, const GuestCallback& callback) {
- for (GuestInstanceMap::iterator it =
- guest_web_contents_by_instance_id_.begin();
- it != guest_web_contents_by_instance_id_.end(); ++it) {
- BrowserPluginGuest* guest = it->second->GetBrowserPluginGuest();
- if (embedder_web_contents != guest->embedder_web_contents())
- continue;
-
- if (callback.Run(guest))
- return true;
+void BrowserPluginGuestManager::RequestInstanceID(
+ const std::string& src,
+ const InstanceIDResponseCallback& callback) {
+ if (!GetDelegate()) {
+ callback.Run(0);
+ return;
}
- return false;
+ GetDelegate()->RequestInstanceID(src, callback);
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698