Chromium Code Reviews| 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 |