diff options
24 files changed, 69 insertions, 45 deletions
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index be21678..640fa37 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc @@ -398,7 +398,6 @@ bool AwContentBrowserClient::CanCreateWindow( bool opener_suppressed, content::ResourceContext* context, int render_process_id, - bool is_guest, int opener_id, bool* no_javascript_access) { // We unconditionally allow popup windows at this stage and will give diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h index 9e4f5f3..49a2abc 100644 --- a/android_webview/browser/aw_content_browser_client.h +++ b/android_webview/browser/aw_content_browser_client.h @@ -133,7 +133,6 @@ class AwContentBrowserClient : public content::ContentBrowserClient { bool opener_suppressed, content::ResourceContext* context, int render_process_id, - bool is_guest, int opener_id, bool* no_javascript_access) OVERRIDE; virtual std::string GetWorkerProcessTitle( diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 376b97f..29f2d6b 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -34,6 +34,7 @@ #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/extensions/api/web_request/web_request_api.h" #include "chrome/browser/extensions/browser_permissions_policy_delegate.h" +#include "chrome/browser/extensions/extension_renderer_state.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/extension_web_ui.h" @@ -2140,7 +2141,6 @@ bool ChromeContentBrowserClient::CanCreateWindow( bool opener_suppressed, content::ResourceContext* context, int render_process_id, - bool is_guest, int opener_id, bool* no_javascript_access) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); @@ -2174,6 +2174,12 @@ bool ChromeContentBrowserClient::CanCreateWindow( return true; } + ExtensionRendererState* renderer_state = + ExtensionRendererState::GetInstance(); + ExtensionRendererState::WebViewInfo webview_info; + bool is_guest = renderer_state->GetWebViewInfo(render_process_id, + opener_id, + &webview_info); if (is_guest) return true; diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index f7d7dba..57ca5ab 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h @@ -223,7 +223,6 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { bool opener_suppressed, content::ResourceContext* context, int render_process_id, - bool is_guest, int opener_id, bool* no_javascript_access) OVERRIDE; virtual std::string GetWorkerProcessTitle( diff --git a/chrome/browser/devtools/devtools_targets_ui.cc b/chrome/browser/devtools/devtools_targets_ui.cc index 868d8da..321d962 100644 --- a/chrome/browser/devtools/devtools_targets_ui.cc +++ b/chrome/browser/devtools/devtools_targets_ui.cc @@ -163,7 +163,9 @@ void RenderViewHostTargetsUIHandler::UpdateTargets() { // Revisit this when multiple OOP frames are supported. RenderFrameHost* rfh = rvh->GetMainFrame(); rfh_to_descriptor[rfh] = descriptor; - if (rvh->GetProcess()->IsGuest() || rfh->IsCrossProcessSubframe()) { + content::WebContents* web_contents = + content::WebContents::FromRenderViewHost(rvh); + if (GuestViewBase::IsGuest(web_contents) || rfh->IsCrossProcessSubframe()) { nested_frames.push_back(rfh); } else { list_value->Append(descriptor); diff --git a/chrome/browser/guest_view/guest_view_base.cc b/chrome/browser/guest_view/guest_view_base.cc index 274270f..625904e 100644 --- a/chrome/browser/guest_view/guest_view_base.cc +++ b/chrome/browser/guest_view/guest_view_base.cc @@ -101,6 +101,11 @@ GuestViewBase* GuestViewBase::From(int embedder_process_id, } // static +bool GuestViewBase::IsGuest(WebContents* web_contents) { + return !!GuestViewBase::FromWebContents(web_contents); +} + +// static bool GuestViewBase::GetGuestPartitionConfigForSite( const GURL& site, std::string* partition_domain, diff --git a/chrome/browser/guest_view/guest_view_base.h b/chrome/browser/guest_view/guest_view_base.h index 46b89c2..059a786 100644 --- a/chrome/browser/guest_view/guest_view_base.h +++ b/chrome/browser/guest_view/guest_view_base.h @@ -52,6 +52,8 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate { static GuestViewBase* From(int embedder_process_id, int instance_id); + static bool IsGuest(content::WebContents* web_contents); + // For GuestViewBases, we create special guest processes, which host the // tag content separately from the main application that embeds the tag. // A GuestViewBase can specify both the partition name and whether the storage diff --git a/chrome/browser/prerender/prerender_link_manager.cc b/chrome/browser/prerender/prerender_link_manager.cc index 1f4d862..d24ccc5 100644 --- a/chrome/browser/prerender/prerender_link_manager.cc +++ b/chrome/browser/prerender/prerender_link_manager.cc @@ -13,6 +13,7 @@ #include "base/memory/scoped_ptr.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram.h" +#include "chrome/browser/guest_view/guest_view_base.h" #include "chrome/browser/prerender/prerender_contents.h" #include "chrome/browser/prerender/prerender_handle.h" #include "chrome/browser/prerender/prerender_manager.h" @@ -165,11 +166,13 @@ void PrerenderLinkManager::OnAddPrerender(int launcher_child_id, DCHECK_EQ(static_cast<LinkPrerender*>(NULL), FindByLauncherChildIdAndPrerenderId(launcher_child_id, prerender_id)); - content::RenderProcessHost* rph = - content::RenderProcessHost::FromID(launcher_child_id); + content::RenderViewHost* rvh = + content::RenderViewHost::FromID(launcher_child_id, render_view_route_id); + content::WebContents* web_contents = + rvh ? content::WebContents::FromRenderViewHost(rvh) : NULL; // Guests inside <webview> do not support cross-process navigation and so we // do not allow guests to prerender content. - if (rph && rph->IsGuest()) + if (GuestViewBase::IsGuest(web_contents)) return; // Check if the launcher is itself an unswapped prerender. diff --git a/chrome/browser/task_manager/extension_information.cc b/chrome/browser/task_manager/extension_information.cc index d95531e..b657adf 100644 --- a/chrome/browser/task_manager/extension_information.cc +++ b/chrome/browser/task_manager/extension_information.cc @@ -7,6 +7,7 @@ #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/guest_view/guest_view_base.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/task_manager/renderer_resource.h" @@ -147,7 +148,7 @@ void ExtensionInformation::GetAll(const NewWebContentsCallback& callback) { bool ExtensionInformation::CheckOwnership(WebContents* web_contents) { // Don't add WebContents that belong to a guest (those are handled by // GuestInformation). Otherwise they will be added twice. - if (web_contents->GetRenderProcessHost()->IsGuest()) + if (GuestViewBase::IsGuest(web_contents)) return false; // Extension WebContents tracked by this class will always host extension diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index 5659342..026f3b5 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc @@ -331,6 +331,18 @@ BrowserPluginGuest* BrowserPluginGuest::Create( return guest; } +// static +bool BrowserPluginGuest::IsGuest(WebContentsImpl* web_contents) { + return web_contents && web_contents->GetBrowserPluginGuest(); +} + +// static +bool BrowserPluginGuest::IsGuest(RenderViewHostImpl* render_view_host) { + return render_view_host && IsGuest( + static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost( + render_view_host))); +} + RenderWidgetHostView* BrowserPluginGuest::GetEmbedderRenderWidgetHostView() { if (!attached()) return NULL; diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index 3f595e4..032e605 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h @@ -60,6 +60,7 @@ namespace content { class BrowserPluginGuestManager; class BrowserPluginHostFactory; +class RenderViewHostImpl; class RenderWidgetHostView; class SiteInstance; class WebCursor; @@ -96,6 +97,12 @@ class CONTENT_EXPORT BrowserPluginGuest scoped_ptr<base::DictionaryValue> extra_params, BrowserPluginGuest* opener); + // Returns whether the given WebContents is a BrowserPlugin guest. + static bool IsGuest(WebContentsImpl* web_contents); + + // Returns whether the given RenderviewHost is a BrowserPlugin guest. + static bool IsGuest(RenderViewHostImpl* render_view_host); + // Returns a WeakPtr to this BrowserPluginGuest. base::WeakPtr<BrowserPluginGuest> AsWeakPtr(); diff --git a/content/browser/browser_plugin/browser_plugin_message_filter.cc b/content/browser/browser_plugin/browser_plugin_message_filter.cc index ace1e82..e82fb7a 100644 --- a/content/browser/browser_plugin/browser_plugin_message_filter.cc +++ b/content/browser/browser_plugin/browser_plugin_message_filter.cc @@ -19,11 +19,9 @@ namespace content { -BrowserPluginMessageFilter::BrowserPluginMessageFilter(int render_process_id, - bool is_guest) +BrowserPluginMessageFilter::BrowserPluginMessageFilter(int render_process_id) : BrowserMessageFilter(BrowserPluginMsgStart), - render_process_id_(render_process_id), - is_guest_(is_guest) { + render_process_id_(render_process_id) { } BrowserPluginMessageFilter::~BrowserPluginMessageFilter() { diff --git a/content/browser/browser_plugin/browser_plugin_message_filter.h b/content/browser/browser_plugin/browser_plugin_message_filter.h index 81e94b2..136c6cc 100644 --- a/content/browser/browser_plugin/browser_plugin_message_filter.h +++ b/content/browser/browser_plugin/browser_plugin_message_filter.h @@ -17,7 +17,7 @@ class BrowserContext; // on the IPC thread before other message filters handle them. class BrowserPluginMessageFilter : public BrowserMessageFilter { public: - BrowserPluginMessageFilter(int render_process_id, bool is_guest); + BrowserPluginMessageFilter(int render_process_id); // BrowserMessageFilter implementation. virtual void OverrideThreadForMessage( @@ -37,7 +37,6 @@ class BrowserPluginMessageFilter : public BrowserMessageFilter { void OnSwapBuffersACK(const FrameHostMsg_BuffersSwappedACK_Params& params); int render_process_id_; - int is_guest_; DISALLOW_COPY_AND_ASSIGN(BrowserPluginMessageFilter); }; diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc index 03d8b40..6fa1ccf 100644 --- a/content/browser/renderer_host/render_message_filter.cc +++ b/content/browser/renderer_host/render_message_filter.cc @@ -325,7 +325,6 @@ class RenderMessageFilter::OpenChannelToNpapiPluginCallback RenderMessageFilter::RenderMessageFilter( int render_process_id, - bool is_guest, PluginServiceImpl* plugin_service, BrowserContext* browser_context, net::URLRequestContextGetter* request_context, @@ -344,7 +343,6 @@ RenderMessageFilter::RenderMessageFilter( incognito_(browser_context->IsOffTheRecord()), dom_storage_context_(dom_storage_context), render_process_id_(render_process_id), - is_guest_(is_guest), cpu_usage_(0), audio_manager_(audio_manager), media_internals_(media_internals) { @@ -527,7 +525,6 @@ void RenderMessageFilter::OnCreateWindow( params.opener_suppressed, resource_context_, render_process_id_, - is_guest_, params.opener_id, &no_javascript_access); diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h index e1f90a8..038b30a 100644 --- a/content/browser/renderer_host/render_message_filter.h +++ b/content/browser/renderer_host/render_message_filter.h @@ -87,7 +87,6 @@ class RenderMessageFilter : public BrowserMessageFilter { public: // Create the filter. RenderMessageFilter(int render_process_id, - bool is_guest, PluginServiceImpl * plugin_service, BrowserContext* browser_context, net::URLRequestContextGetter* request_context, @@ -307,8 +306,6 @@ class RenderMessageFilter : public BrowserMessageFilter { int render_process_id_; - bool is_guest_; - std::set<OpenChannelToNpapiPluginCallback*> plugin_host_clients_; // Records the last time we sampled CPU usage of the renderer process. diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index a38027c..db99799 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -630,13 +630,12 @@ void RenderProcessHostImpl::CreateMessageFilters() { // Add BrowserPluginMessageFilter to ensure it gets the first stab at messages // from guests. scoped_refptr<BrowserPluginMessageFilter> bp_message_filter( - new BrowserPluginMessageFilter(GetID(), IsGuest())); + new BrowserPluginMessageFilter(GetID())); AddFilter(bp_message_filter.get()); scoped_refptr<RenderMessageFilter> render_message_filter( new RenderMessageFilter( GetID(), - IsGuest(), #if defined(ENABLE_PLUGINS) PluginServiceImpl::GetInstance(), #else @@ -724,7 +723,7 @@ void RenderProcessHostImpl::CreateMessageFilters() { AddFilter(new PepperRendererConnection(GetID())); #endif AddFilter(new SpeechRecognitionDispatcherHost( - IsGuest(), GetID(), storage_partition_impl_->GetURLRequestContext())); + GetID(), storage_partition_impl_->GetURLRequestContext())); AddFilter(new FileAPIMessageFilter( GetID(), storage_partition_impl_->GetURLRequestContext(), diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index dbb2e74..51fc3dc 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -20,7 +20,6 @@ class GURL; class SkBitmap; -class WebKeyboardEvent; struct ViewHostMsg_CreateWindow_Params; struct FrameHostMsg_DidCommitProvisionalLoad_Params; struct ViewMsg_PostMessage_Params; diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index c20ad5d..5afb35d 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -26,6 +26,7 @@ #include "cc/output/compositor_frame_ack.h" #include "content/browser/accessibility/accessibility_mode_helper.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" +#include "content/browser/browser_plugin/browser_plugin_guest.h" #include "content/browser/gpu/compositor_util.h" #include "content/browser/gpu/gpu_process_host.h" #include "content/browser/gpu/gpu_process_host_ui_shim.h" @@ -238,7 +239,10 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, SetOverscrollControllerEnabled(overscroll_enabled); #endif - if (GetProcess()->IsGuest() || !CommandLine::ForCurrentProcess()->HasSwitch( + RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( + IsRenderView() ? RenderViewHost::From(this) : NULL); + if (BrowserPluginGuest::IsGuest(rvh) || + !CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableHangMonitor)) { hang_monitor_timeout_.reset(new TimeoutMonitor( base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive, diff --git a/content/browser/speech/speech_recognition_dispatcher_host.cc b/content/browser/speech/speech_recognition_dispatcher_host.cc index 7f62ae8..0197bcf 100644 --- a/content/browser/speech/speech_recognition_dispatcher_host.cc +++ b/content/browser/speech/speech_recognition_dispatcher_host.cc @@ -21,11 +21,9 @@ namespace content { SpeechRecognitionDispatcherHost::SpeechRecognitionDispatcherHost( - bool is_guest, int render_process_id, net::URLRequestContextGetter* context_getter) : BrowserMessageFilter(SpeechRecognitionMsgStart), - is_guest_(is_guest), render_process_id_(render_process_id), context_getter_(context_getter), weak_factory_(this) { @@ -86,15 +84,14 @@ void SpeechRecognitionDispatcherHost::OnStartRequest( int embedder_render_process_id = 0; int embedder_render_view_id = MSG_ROUTING_NONE; - if (is_guest_) { + RenderViewHostImpl* render_view_host = + RenderViewHostImpl::FromID(render_process_id_, params.render_view_id); + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + WebContents::FromRenderViewHost(render_view_host)); + BrowserPluginGuest* guest = web_contents->GetBrowserPluginGuest(); + if (guest) { // If the speech API request was from a guest, save the context of the // embedder since we will use it to decide permission. - RenderViewHostImpl* render_view_host = - RenderViewHostImpl::FromID(render_process_id_, params.render_view_id); - WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( - WebContents::FromRenderViewHost(render_view_host)); - BrowserPluginGuest* guest = web_contents->GetBrowserPluginGuest(); - embedder_render_process_id = guest->embedder_web_contents()->GetRenderProcessHost()->GetID(); DCHECK_NE(embedder_render_process_id, 0); diff --git a/content/browser/speech/speech_recognition_dispatcher_host.h b/content/browser/speech/speech_recognition_dispatcher_host.h index 0a76b67..f8853f1 100644 --- a/content/browser/speech/speech_recognition_dispatcher_host.h +++ b/content/browser/speech/speech_recognition_dispatcher_host.h @@ -28,7 +28,6 @@ class CONTENT_EXPORT SpeechRecognitionDispatcherHost public SpeechRecognitionEventListener { public: SpeechRecognitionDispatcherHost( - bool is_guest, int render_process_id, net::URLRequestContextGetter* context_getter); @@ -73,7 +72,6 @@ class CONTENT_EXPORT SpeechRecognitionDispatcherHost void OnAbortRequest(int render_view_id, int request_id); void OnStopCaptureRequest(int render_view_id, int request_id); - bool is_guest_; int render_process_id_; scoped_refptr<net::URLRequestContextGetter> context_getter_; diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 6fea12a..a2bdcb1 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -1322,7 +1322,7 @@ void WebContentsImpl::CreateNewWindow( // script-related windows), by passing in the current SiteInstance. However, // if the opener is being suppressed (in a non-guest), we create a new // SiteInstance in its own BrowsingInstance. - bool is_guest = GetRenderProcessHost()->IsGuest(); + bool is_guest = BrowserPluginGuest::IsGuest(this); // If the opener is to be suppressed, the new window can be in any process. // Since routing ids are process specific, we must not have one passed in @@ -1591,7 +1591,7 @@ WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { RemoveDestructionObserver(new_contents); // Don't initialize the guest WebContents immediately. - if (new_contents->GetRenderProcessHost()->IsGuest()) + if (BrowserPluginGuest::IsGuest(new_contents)) return new_contents; if (!new_contents->GetRenderProcessHost()->HasConnection() || diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index 5ed4f6c..4b740e4 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc @@ -9,6 +9,7 @@ #include "base/file_util.h" #include "base/metrics/histogram.h" #include "base/strings/utf_string_conversions.h" +#include "content/browser/browser_plugin/browser_plugin_guest.h" #include "content/browser/download/drag_download_util.h" #include "content/browser/frame_host/interstitial_page_impl.h" #include "content/browser/frame_host/navigation_entry_impl.h" @@ -113,9 +114,11 @@ RenderWidgetHostViewAura* ToRenderWidgetHostViewAura( RenderWidgetHostView* view) { if (!view || RenderViewHostFactory::has_factory()) return NULL; // Can't cast to RenderWidgetHostViewAura in unit tests. - RenderProcessHostImpl* process = static_cast<RenderProcessHostImpl*>( - view->GetRenderWidgetHost()->GetProcess()); - if (process->IsGuest()) + + RenderViewHost* rvh = RenderViewHost::From(view->GetRenderWidgetHost()); + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + rvh ? WebContents::FromRenderViewHost(rvh) : NULL); + if (BrowserPluginGuest::IsGuest(web_contents)) return NULL; return static_cast<RenderWidgetHostViewAura*>(view); } @@ -1080,7 +1083,7 @@ void WebContentsViewAura::CreateView( // The use cases for WindowObserver do not apply to Browser Plugins: // 1) guests do not support NPAPI plugins. // 2) guests' window bounds are supposed to come from its embedder. - if (!web_contents_->GetRenderProcessHost()->IsGuest()) + if (!BrowserPluginGuest::IsGuest(web_contents_)) window_observer_.reset(new WindowObserver(this)); // delegate_->GetDragDestDelegate() creates a new delegate on every call. diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index 4c9b4bf..b48cfe5 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc @@ -224,7 +224,6 @@ bool ContentBrowserClient::CanCreateWindow( bool opener_suppressed, content::ResourceContext* context, int render_process_id, - bool is_guest, int opener_id, bool* no_javascript_access) { *no_javascript_access = false; diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 806f961..54efa8b 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h @@ -485,7 +485,6 @@ class CONTENT_EXPORT ContentBrowserClient { bool opener_suppressed, content::ResourceContext* context, int render_process_id, - bool is_guest, int opener_id, bool* no_javascript_access); |