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

Unified Diff: chrome/renderer/chrome_content_renderer_client.cc

Issue 1394283003: Move more extensions code into ChromeExtensionsRendererClient. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: IWYU Created 5 years, 2 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: chrome/renderer/chrome_content_renderer_client.cc
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 72a3cd95e4555fec9c144a5e2873fe9c520d6a45..ff7b30953983415b06dfd2f0a92ddd754effbcab 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -19,7 +19,6 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/crash_keys.h"
-#include "chrome/common/extensions/extension_metrics.h"
#include "chrome/common/localized_error.h"
#include "chrome/common/pepper_permission_util.h"
#include "chrome/common/render_messages.h"
@@ -110,25 +109,11 @@
#if defined(ENABLE_EXTENSIONS)
#include "chrome/common/extensions/chrome_extensions_client.h"
-#include "chrome/common/extensions/extension_process_policy.h"
-#include "chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.h"
#include "chrome/renderer/extensions/chrome_extensions_renderer_client.h"
-#include "chrome/renderer/extensions/renderer_permissions_policy_delegate.h"
-#include "chrome/renderer/extensions/resource_request_policy.h"
-#include "chrome/renderer/media/cast_ipc_dispatcher.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/extension_set.h"
#include "extensions/common/extension_urls.h"
#include "extensions/common/switches.h"
#include "extensions/renderer/dispatcher.h"
-#include "extensions/renderer/extension_frame_helper.h"
-#include "extensions/renderer/extension_helper.h"
-#include "extensions/renderer/extensions_render_frame_observer.h"
-#include "extensions/renderer/guest_view/extensions_guest_view_container.h"
-#include "extensions/renderer/guest_view/extensions_guest_view_container_dispatcher.h"
-#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h"
#include "extensions/renderer/renderer_extension_registry.h"
-#include "extensions/renderer/script_context.h"
#endif
#if defined(ENABLE_IPC_FUZZER)
@@ -162,11 +147,6 @@ using autofill::PasswordAutofillAgent;
using autofill::PasswordGenerationAgent;
using base::ASCIIToUTF16;
using base::UserMetricsAction;
-using content::PluginInstanceThrottler;
-using content::RenderFrame;
-using content::RenderThread;
-using content::WebPluginInfo;
-using extensions::Extension;
using blink::WebCache;
using blink::WebConsoleMessage;
using blink::WebDataSource;
@@ -182,11 +162,14 @@ using blink::WebURLError;
using blink::WebURLRequest;
using blink::WebURLResponse;
using blink::WebVector;
+using content::PluginInstanceThrottler;
+using content::RenderFrame;
+using content::RenderThread;
+using content::WebPluginInfo;
+using extensions::Extension;
namespace {
-ChromeContentRendererClient* g_current_client;
-
// Whitelist PPAPI for Android Runtime for Chromium. (See crbug.com/383937)
#if defined(ENABLE_PLUGINS)
const char* const kPredefinedAllowedCameraDeviceOrigins[] = {
@@ -273,16 +256,6 @@ bool SpellCheckReplacer::Visit(content::RenderView* render_view) {
}
#endif
-#if defined(ENABLE_EXTENSIONS)
-void IsGuestViewApiAvailableToScriptContext(
- bool* api_is_available,
- extensions::ScriptContext* context) {
- if (context->GetAvailability("guestViewInternal").is_available()) {
- *api_is_available = true;
- }
-}
-#endif
-
#if defined(ENABLE_PLUGINS)
// Presence of the poster param within plugin object tags.
// These numeric values are used in UMA logs; do not change them.
@@ -369,8 +342,6 @@ class MediaLoadDeferrer : public content::RenderFrameObserver {
} // namespace
ChromeContentRendererClient::ChromeContentRendererClient() {
- g_current_client = this;
-
#if defined(ENABLE_EXTENSIONS)
extensions::ExtensionsClient::Set(
extensions::ChromeExtensionsClient::GetInstance());
@@ -387,7 +358,6 @@ ChromeContentRendererClient::ChromeContentRendererClient() {
}
ChromeContentRendererClient::~ChromeContentRendererClient() {
- g_current_client = NULL;
}
void ChromeContentRendererClient::RenderThreadStarted() {
@@ -397,21 +367,7 @@ void ChromeContentRendererClient::RenderThreadStarted() {
web_cache_observer_.reset(new web_cache::WebCacheRenderProcessObserver());
#if defined(ENABLE_EXTENSIONS)
- extension_dispatcher_delegate_.reset(
- new ChromeExtensionsDispatcherDelegate());
- // ChromeRenderViewTest::SetUp() creates its own ExtensionDispatcher and
- // injects it using SetExtensionDispatcher(). Don't overwrite it.
- if (!extension_dispatcher_) {
- extension_dispatcher_.reset(
- new extensions::Dispatcher(extension_dispatcher_delegate_.get()));
- }
- permissions_policy_delegate_.reset(
- new extensions::RendererPermissionsPolicyDelegate(
- extension_dispatcher_.get()));
- resource_request_policy_.reset(
- new extensions::ResourceRequestPolicy(extension_dispatcher_.get()));
- guest_view_container_dispatcher_.reset(
- new extensions::ExtensionsGuestViewContainerDispatcher());
+ ChromeExtensionsRendererClient::GetInstance()->RenderThreadStarted();
#endif
prescient_networking_dispatcher_.reset(
@@ -431,15 +387,11 @@ void ChromeContentRendererClient::RenderThreadStarted() {
prerender_dispatcher_.reset(new prerender::PrerenderDispatcher());
#if defined(ENABLE_WEBRTC)
webrtc_logging_message_filter_ = new WebRtcLoggingMessageFilter(
- RenderThread::Get()->GetIOMessageLoopProxy());
+ thread->GetIOMessageLoopProxy());
#endif
thread->AddObserver(chrome_observer_.get());
thread->AddObserver(web_cache_observer_.get());
-#if defined(ENABLE_EXTENSIONS)
- thread->AddObserver(extension_dispatcher_.get());
- thread->AddObserver(guest_view_container_dispatcher_.get());
-#endif
#if defined(FULL_SAFE_BROWSING)
thread->AddObserver(phishing_classifier_.get());
#endif
@@ -450,10 +402,6 @@ void ChromeContentRendererClient::RenderThreadStarted() {
#if defined(ENABLE_WEBRTC)
thread->AddFilter(webrtc_logging_message_filter_.get());
#endif
-#if defined(ENABLE_EXTENSIONS)
- thread->AddFilter(new CastIPCDispatcher(
- RenderThread::Get()->GetIOMessageLoopProxy()));
-#endif
thread->RegisterExtension(extensions_v8::ExternalExtension::Get());
thread->RegisterExtension(extensions_v8::LoadTimesExtension::Get());
@@ -528,7 +476,8 @@ void ChromeContentRendererClient::RenderFrameCreated(
switches::kInstantProcess);
extensions::Dispatcher* ext_dispatcher = NULL;
#if defined(ENABLE_EXTENSIONS)
- ext_dispatcher = extension_dispatcher_.get();
+ ext_dispatcher =
+ ChromeExtensionsRendererClient::GetInstance()->extension_dispatcher();
#endif
ContentSettingsObserver* content_settings = new ContentSettingsObserver(
render_frame, ext_dispatcher, should_whitelist_for_content_settings);
@@ -538,9 +487,8 @@ void ChromeContentRendererClient::RenderFrameCreated(
}
#if defined(ENABLE_EXTENSIONS)
- new extensions::ExtensionsRenderFrameObserver(render_frame);
- new extensions::ExtensionFrameHelper(render_frame, ext_dispatcher);
- ext_dispatcher->OnRenderFrameCreated(render_frame);
+ ChromeExtensionsRendererClient::GetInstance()->RenderFrameCreated(
+ render_frame);
#endif
#if defined(ENABLE_PLUGINS)
@@ -582,9 +530,8 @@ void ChromeContentRendererClient::RenderFrameCreated(
void ChromeContentRendererClient::RenderViewCreated(
content::RenderView* render_view) {
-
#if defined(ENABLE_EXTENSIONS)
- new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
+ ChromeExtensionsRendererClient::GetInstance()->RenderViewCreated(render_view);
#endif
new PageLoadHistograms(render_view);
#if defined(ENABLE_PRINTING)
@@ -621,18 +568,6 @@ SkBitmap* ChromeContentRendererClient::GetSadWebViewBitmap() {
GetImageNamed(IDR_SAD_WEBVIEW).ToSkBitmap());
}
-#if defined(ENABLE_EXTENSIONS)
-const Extension* ChromeContentRendererClient::GetExtensionByOrigin(
- const WebSecurityOrigin& origin) const {
- if (!base::EqualsASCII(base::StringPiece16(origin.protocol()),
- extensions::kExtensionScheme))
- return NULL;
-
- const std::string extension_id = origin.host().utf8().data();
- return extensions::RendererExtensionRegistry::Get()->GetByID(extension_id);
-}
-#endif
-
bool ChromeContentRendererClient::OverrideCreatePlugin(
content::RenderFrame* render_frame,
blink::WebLocalFrame* frame,
@@ -640,13 +575,9 @@ bool ChromeContentRendererClient::OverrideCreatePlugin(
WebPlugin** plugin) {
std::string orig_mime_type = params.mimeType.utf8();
#if defined(ENABLE_EXTENSIONS)
- if (orig_mime_type == content::kBrowserPluginMimeType) {
- bool guest_view_api_available = false;
- extension_dispatcher_->script_context_set().ForEach(
- render_frame, base::Bind(&IsGuestViewApiAvailableToScriptContext,
- &guest_view_api_available));
- if (guest_view_api_available)
- return false;
+ if (!ChromeExtensionsRendererClient::GetInstance()->OverrideCreatePlugin(
+ render_frame, params)) {
+ return false;
}
#endif
@@ -1190,27 +1121,10 @@ bool ChromeContentRendererClient::
bool ChromeContentRendererClient::AllowPopup() {
#if defined(ENABLE_EXTENSIONS)
- extensions::ScriptContext* current_context =
- extension_dispatcher_->script_context_set().GetCurrent();
- if (!current_context || !current_context->extension())
- return false;
- // See http://crbug.com/117446 for the subtlety of this check.
- switch (current_context->context_type()) {
- case extensions::Feature::UNSPECIFIED_CONTEXT:
- case extensions::Feature::WEB_PAGE_CONTEXT:
- case extensions::Feature::UNBLESSED_EXTENSION_CONTEXT:
- case extensions::Feature::WEBUI_CONTEXT:
- case extensions::Feature::SERVICE_WORKER_CONTEXT:
- return false;
- case extensions::Feature::BLESSED_EXTENSION_CONTEXT:
- case extensions::Feature::CONTENT_SCRIPT_CONTEXT:
- return true;
- case extensions::Feature::BLESSED_WEB_PAGE_CONTEXT:
- return !current_context->web_frame()->parent();
- }
- NOTREACHED();
-#endif
+ return ChromeExtensionsRendererClient::GetInstance()->AllowPopup();
+#else
return false;
+#endif
}
bool ChromeContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
@@ -1251,47 +1165,10 @@ bool ChromeContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
}
#if defined(ENABLE_EXTENSIONS)
- const extensions::RendererExtensionRegistry* extension_registry =
- extensions::RendererExtensionRegistry::Get();
-
- // Determine if the new URL is an extension (excluding bookmark apps).
- const Extension* new_url_extension = extensions::GetNonBookmarkAppExtension(
- *extension_registry->GetMainThreadExtensionSet(), url);
- bool is_extension_url = !!new_url_extension;
-
- // If the navigation would cross an app extent boundary, we also need
- // to defer to the browser to ensure process isolation. This is not necessary
- // for server redirects, which will be transferred to a new process by the
- // browser process when they are ready to commit. It is necessary for client
- // redirects, which won't be transferred in the same way.
- if (!is_server_redirect &&
- CrossesExtensionExtents(frame, url, is_extension_url,
- is_initial_navigation)) {
- // Include the referrer in this case since we're going from a hosted web
- // page. (the packaged case is handled previously by the extension
- // navigation test)
- *send_referrer = true;
-
- const Extension* extension =
- extension_registry->GetExtensionOrAppByURL(url);
- if (extension && extension->is_app()) {
- extensions::RecordAppLaunchType(
- extension_misc::APP_LAUNCH_CONTENT_NAVIGATION, extension->GetType());
- }
+ bool should_fork = ChromeExtensionsRendererClient::ShouldFork(
+ frame, url, is_initial_navigation, is_server_redirect, send_referrer);
+ if (should_fork)
return true;
- }
-
- // If this is a reload, check whether it has the wrong process type. We
- // should send it to the browser if it's an extension URL (e.g., hosted app)
- // in a normal process, or if it's a process for an extension that has been
- // uninstalled. Without --site-per-process mode, we never fork processes for
- // subframes, so this check only makes sense for top-level frames.
- // TODO(alexmos,nasko): Figure out how this check should work when reloading
- // subframes in --site-per-process mode.
- if (!frame->parent() && frame->document().url() == url) {
- if (is_extension_url != IsStandaloneExtensionProcess())
- return true;
- }
#endif // defined(ENABLE_EXTENSIONS)
return false;
@@ -1306,17 +1183,8 @@ bool ChromeContentRendererClient::WillSendRequest(
// Check whether the request should be allowed. If not allowed, we reset the
// URL to something invalid to prevent the request and cause an error.
#if defined(ENABLE_EXTENSIONS)
- if (url.SchemeIs(extensions::kExtensionScheme) &&
- !resource_request_policy_->CanRequestResource(url, frame,
- transition_type)) {
- *new_url = GURL(chrome::kExtensionInvalidRequestURL);
- return true;
- }
-
- if (url.SchemeIs(extensions::kExtensionResourceScheme) &&
- !resource_request_policy_->CanRequestExtensionResourceScheme(url,
- frame)) {
- *new_url = GURL(chrome::kExtensionResourceInvalidRequestURL);
+ if (ChromeExtensionsRendererClient::GetInstance()->WillSendRequest(
+ frame, transition_type, url, new_url)) {
return true;
}
#endif
@@ -1334,6 +1202,7 @@ bool ChromeContentRendererClient::WillSendRequest(
type = SearchBox::FALLBACK_ICON;
else if (url.host() == chrome::kChromeUIThumbnailHost)
type = SearchBox::THUMB;
+
if (type != SearchBox::NONE)
return search_box->GenerateImageURLFromTransientURL(url, type, new_url);
}
@@ -1365,79 +1234,6 @@ bool ChromeContentRendererClient::ShouldOverridePageVisibilityState(
return true;
}
-#if defined(ENABLE_EXTENSIONS)
-void ChromeContentRendererClient::SetExtensionDispatcherForTest(
- extensions::Dispatcher* extension_dispatcher) {
- extension_dispatcher_.reset(extension_dispatcher);
- permissions_policy_delegate_.reset(
- new extensions::RendererPermissionsPolicyDelegate(
- extension_dispatcher_.get()));
- RenderThread::Get()->RegisterExtension(
- extensions::SafeBuiltins::CreateV8Extension());
-}
-
-extensions::Dispatcher*
-ChromeContentRendererClient::GetExtensionDispatcherForTest() {
- return extension_dispatcher_.get();
-}
-
-bool ChromeContentRendererClient::CrossesExtensionExtents(
- blink::WebLocalFrame* frame,
- const GURL& new_url,
- bool is_extension_url,
- bool is_initial_navigation) {
- DCHECK(!frame->parent());
- GURL old_url(frame->document().url());
-
- extensions::RendererExtensionRegistry* extension_registry =
- extensions::RendererExtensionRegistry::Get();
-
- // If old_url is still empty and this is an initial navigation, then this is
- // a window.open operation. We should look at the opener URL. Note that the
- // opener is a local frame in this case.
- if (is_initial_navigation && old_url.is_empty() && frame->opener()) {
- WebLocalFrame* opener_frame = frame->opener()->toWebLocalFrame();
-
- // If we're about to open a normal web page from a same-origin opener stuck
- // in an extension process, we want to keep it in process to allow the
- // opener to script it.
- WebDocument opener_document = opener_frame->document();
- WebSecurityOrigin opener_origin = opener_document.securityOrigin();
- bool opener_is_extension_url = !opener_origin.isUnique() &&
- extension_registry->GetExtensionOrAppByURL(
- opener_document.url()) != NULL;
- if (!is_extension_url &&
- !opener_is_extension_url &&
- IsStandaloneExtensionProcess() &&
- opener_origin.canRequest(WebURL(new_url)))
- return false;
-
- // In all other cases, we want to compare against the URL that determines
- // the type of process. In default Chrome, that's the URL of the opener's
- // top frame and not the opener frame itself. In --site-per-process, we
- // can use the opener frame itself.
- // TODO(nick): Either wire this up to SiteIsolationPolicy, or to state on
- // |opener_frame|/its ancestors.
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kSitePerProcess) ||
- base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kIsolateExtensions))
- old_url = opener_frame->document().url();
- else
- old_url = opener_frame->top()->document().url();
- }
-
- // Only consider keeping non-app URLs in an app process if this window
- // has an opener (in which case it might be an OAuth popup that tries to
- // script an iframe within the app).
- bool should_consider_workaround = !!frame->opener();
-
- return extensions::CrossesExtensionProcessBoundary(
- *extension_registry->GetMainThreadExtensionSet(), old_url, new_url,
- should_consider_workaround);
-}
-#endif // defined(ENABLE_EXTENSIONS)
-
#if defined(ENABLE_SPELLCHECK)
void ChromeContentRendererClient::SetSpellcheck(SpellCheck* spellcheck) {
RenderThread* thread = RenderThread::Get();
@@ -1451,16 +1247,6 @@ void ChromeContentRendererClient::SetSpellcheck(SpellCheck* spellcheck) {
}
#endif
-// static
-bool ChromeContentRendererClient::WasWebRequestUsedBySomeExtensions() {
-#if defined(ENABLE_EXTENSIONS)
- return g_current_client->extension_dispatcher_
- ->WasWebRequestUsedBySomeExtensions();
-#else
- return false;
-#endif
-}
-
const void* ChromeContentRendererClient::CreatePPAPIInterface(
const std::string& interface_name) {
#if defined(ENABLE_PLUGINS) && !defined(DISABLE_NACL)
@@ -1610,14 +1396,10 @@ ChromeContentRendererClient::CreateBrowserPluginDelegate(
const std::string& mime_type,
const GURL& original_url) {
#if defined(ENABLE_EXTENSIONS)
- if (mime_type == content::kBrowserPluginMimeType) {
- return new extensions::ExtensionsGuestViewContainer(render_frame);
- } else {
- return new extensions::MimeHandlerViewContainer(
- render_frame, mime_type, original_url);
- }
+ return ChromeExtensionsRendererClient::CreateBrowserPluginDelegate(
+ render_frame, mime_type, original_url);
#else
- return NULL;
+ return nullptr;
#endif
}
« no previous file with comments | « chrome/renderer/chrome_content_renderer_client.h ('k') | chrome/renderer/extensions/chrome_extensions_renderer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698