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

Unified Diff: chrome/renderer/render_view.cc

Issue 3040034: Block non-sandboxed plugins. (Closed) Base URL: git://codf21.jail/chromium.git
Patch Set: fix indentation; sync Created 10 years, 4 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
« no previous file with comments | « chrome/renderer/render_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/render_view.cc
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 9d97ee266be15d2eb75bc34e0438943dff77b31f..6a8f8e83d4ebd9abbd4009c82fb79a927b01f4d2 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -200,8 +200,8 @@ using WebKit::WebPageSerializer;
using WebKit::WebPageSerializerClient;
using WebKit::WebPlugin;
using WebKit::WebPluginContainer;
-using WebKit::WebPluginParams;
using WebKit::WebPluginDocument;
+using WebKit::WebPluginParams;
using WebKit::WebPoint;
using WebKit::WebPopupMenuInfo;
using WebKit::WebRange;
@@ -549,6 +549,24 @@ void RenderView::PluginCrashed(const FilePath& plugin_path) {
Send(new ViewHostMsg_CrashedPlugin(routing_id_, plugin_path));
}
+WebPlugin* RenderView::CreatePluginNoCheck(WebFrame* frame,
+ const WebPluginParams& params) {
+ WebPluginInfo info;
+ bool found;
+ std::string mime_type;
+ Send(new ViewHostMsg_GetPluginInfo(
+ params.url, frame->top()->url(), params.mimeType.utf8(), &found,
+ &info, &mime_type));
+ if (!found || !info.enabled)
+ return NULL;
+ scoped_refptr<pepper::PluginModule> pepper_module =
+ PepperPluginRegistry::GetInstance()->GetModule(info.path);
+ if (pepper_module)
+ return CreatePepperPlugin(frame, params, info.path, pepper_module.get());
+ else
+ return CreateNPAPIPlugin(frame, params, info.path, mime_type);
+}
+
#if defined(OS_MACOSX)
void RenderView::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) {
plugin_delegates_.insert(delegate);
@@ -2210,26 +2228,35 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame,
bool found = false;
WebPluginInfo info;
GURL url(params.url);
- std::string mime_type(params.mimeType.utf8());
std::string actual_mime_type;
Send(new ViewHostMsg_GetPluginInfo(url,
frame->top()->url(),
- mime_type,
+ params.mimeType.utf8(),
&found,
&info,
- &actual_mime_type));
+ &actual_mime_type));
if (!found || !info.enabled)
return NULL;
- if (!AllowContentType(CONTENT_SETTINGS_TYPE_PLUGINS) &&
- info.path.value() != kDefaultPluginLibraryName) {
- DCHECK(CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableClickToPlay));
- didNotAllowPlugins(frame);
- return CreatePluginPlaceholder(frame, params);
+ if (info.path.value() != kDefaultPluginLibraryName) {
+ if (!AllowContentType(CONTENT_SETTINGS_TYPE_PLUGINS)) {
+ DCHECK(CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableClickToPlay));
+ didNotAllowPlugins(frame);
+ return CreatePluginPlaceholder(frame, params);
+ }
+ scoped_refptr<pepper::PluginModule> pepper_module =
+ PepperPluginRegistry::GetInstance()->GetModule(info.path);
+ if (pepper_module)
+ return CreatePepperPlugin(frame, params, info.path, pepper_module.get());
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kBlockNonSandboxedPlugins)) {
+ Send(new ViewHostMsg_NonSandboxedPluginBlocked(routing_id_, info.name));
+ return CreatePluginPlaceholder(frame, params);
+ }
}
- return CreatePluginInternal(frame, params, &info, actual_mime_type);
+ return CreateNPAPIPlugin(frame, params, info.path, actual_mime_type);
}
WebWorker* RenderView::createWorker(WebFrame* frame, WebWorkerClient* client) {
@@ -3686,49 +3713,35 @@ void RenderView::ClearBlockedContentSettings() {
content_blocked_[i] = false;
}
-WebPlugin* RenderView::CreatePluginInternal(WebFrame* frame,
- const WebPluginParams& params,
- WebPluginInfo* plugin_info,
- const std::string& mime_type) {
- std::string actual_mime_type(mime_type);
- WebPluginInfo info;
- if (plugin_info != NULL) {
- info = *plugin_info;
- } else {
- bool found;
- std::string actual_mime_type(mime_type);
- Send(new ViewHostMsg_GetPluginInfo(
- params.url, frame->top()->url(), params.mimeType.utf8(), &found,
- &info, &actual_mime_type));
- if (!found)
- info.enabled = false;
- }
- if (!info.enabled)
- return NULL;
+WebPlugin* RenderView::CreatePepperPlugin(WebFrame* frame,
+ const WebPluginParams& params,
+ const FilePath& path,
+ pepper::PluginModule* pepper_module) {
+ WebPlugin* plugin = new pepper::WebPluginImpl(pepper_module, params,
+ pepper_delegate_.AsWeakPtr());
+ if (plugin && !frame->parent() && frame->document().isPluginDocument()) {
+ // If this is a full-page plugin hosting the internal PDF plugin, we want
+ // to notify the browser so that it can treat things like zooming
+ // differently.
+ // TODO(sanjeevr): Use a Pepper interface to determine this rather than
+ // hardcode this for the PDF plugin path.
+ FilePath pdf_path;
+ PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path);
+ if (path == pdf_path)
+ Send(new ViewHostMsg_SetDisplayingPDFContent(routing_id_));
+ }
+ return plugin;
+}
+WebPlugin* RenderView::CreateNPAPIPlugin(WebFrame* frame,
+ const WebPluginParams& params,
+ const FilePath& path,
+ const std::string& mime_type) {
+ std::string actual_mime_type(mime_type);
if (actual_mime_type.empty())
actual_mime_type = params.mimeType.utf8();
- scoped_refptr<pepper::PluginModule> pepper_module =
- PepperPluginRegistry::GetInstance()->GetModule(info.path);
- if (pepper_module) {
- WebPlugin* plugin = new pepper::WebPluginImpl(pepper_module, params,
- pepper_delegate_.AsWeakPtr());
- if (plugin && !frame->parent() && frame->document().isPluginDocument()) {
- // If this is a full-page plugin hosting the internal PDF plugin, we want
- // to notify the browser so that it can treat things like zooming
- // differently.
- // TODO(sanjeevr): Use a Pepper interface to determine this rather than
- // hardcode this for the PDF plugin path.
- FilePath pdf_path;
- PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path);
- if (info.path == pdf_path)
- Send(new ViewHostMsg_SetDisplayingPDFContent(routing_id_));
- }
- return plugin;
- }
-
- return new webkit_glue::WebPluginImpl(frame, params, info.path,
+ return new webkit_glue::WebPluginImpl(frame, params, path,
actual_mime_type, AsWeakPtr());
}
« no previous file with comments | « chrome/renderer/render_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698