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

Side by Side Diff: chrome/common/chrome_content_client.cc

Issue 11049004: Remove Legacy NPAPI Flash Sandbox support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/common/chrome_content_client.h" 5 #include "chrome/common/chrome_content_client.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/cpu.h" 8 #include "base/cpu.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 switches::kEnableBundledPpapiFlash); 297 switches::kEnableBundledPpapiFlash);
298 298
299 *plugin = CreatePepperFlashInfo(flash_path, FLAPPER_VERSION_STRING); 299 *plugin = CreatePepperFlashInfo(flash_path, FLAPPER_VERSION_STRING);
300 *override_npapi_flash = force_enable || IsPepperFlashEnabledByDefault(); 300 *override_npapi_flash = force_enable || IsPepperFlashEnabledByDefault();
301 return true; 301 return true;
302 #else 302 #else
303 return false; 303 return false;
304 #endif // FLAPPER_AVAILABLE 304 #endif // FLAPPER_AVAILABLE
305 } 305 }
306 306
307 #if defined(OS_WIN)
308 // Launches the privileged flash broker, used when flash is sandboxed.
309 // The broker is the same flash dll, except that it uses a different
310 // entrypoint (BrokerMain) and it is hosted in windows' generic surrogate
311 // process rundll32. After launching the broker we need to pass to
312 // the flash plugin the process id of the broker via the command line
313 // using --flash-broker=pid.
314 // More info about rundll32 at http://support.microsoft.com/kb/164787.
315 bool LoadFlashBroker(const FilePath& plugin_path, CommandLine* cmd_line) {
316 FilePath rundll;
317 if (!PathService::Get(base::DIR_SYSTEM, &rundll))
318 return false;
319 rundll = rundll.AppendASCII("rundll32.exe");
320 // Rundll32 cannot handle paths with spaces, so we use the short path.
321 wchar_t short_path[MAX_PATH];
322 if (0 == ::GetShortPathNameW(plugin_path.value().c_str(),
323 short_path, arraysize(short_path)))
324 return false;
325 // Here is the kicker, if the user has disabled 8.3 (short path) support
326 // on the volume GetShortPathNameW does not fail but simply returns the
327 // input path. In this case if the path had any spaces then rundll32 will
328 // incorrectly interpret its parameters. So we quote the path, even though
329 // the kb/164787 says you should not.
330 std::wstring cmd_final =
331 base::StringPrintf(L"%ls \"%ls\",BrokerMain browser=chrome",
332 rundll.value().c_str(),
333 short_path);
334 base::ProcessHandle process;
335 base::LaunchOptions options;
336 options.start_hidden = true;
337 if (!base::LaunchProcess(cmd_final, options, &process))
338 return false;
339
340 cmd_line->AppendSwitchASCII("flash-broker",
341 base::Int64ToString(::GetProcessId(process)));
342
343 // The flash broker, unders some circumstances can linger beyond the lifetime
344 // of the flash player, so we put it in a job object, when the browser
345 // terminates the job object is destroyed (by the OS) and the flash broker
346 // is terminated.
347 HANDLE job = ::CreateJobObjectW(NULL, NULL);
348 if (base::SetJobObjectAsKillOnJobClose(job)) {
349 ::AssignProcessToJobObject(job, process);
350 // Yes, we are leaking the object here. Read comment above.
351 } else {
352 ::CloseHandle(job);
353 return false;
354 }
355
356 ::CloseHandle(process);
357 return true;
358 }
359 #endif // OS_WIN
360
361 } // namespace 307 } // namespace
362 308
363 namespace chrome { 309 namespace chrome {
364 310
365 const char* const ChromeContentClient::kPDFPluginName = ::kPDFPluginName; 311 const char* const ChromeContentClient::kPDFPluginName = ::kPDFPluginName;
366 const char* const ChromeContentClient::kNaClPluginName = ::kNaClPluginName; 312 const char* const ChromeContentClient::kNaClPluginName = ::kNaClPluginName;
367 const char* const ChromeContentClient::kNaClOldPluginName = 313 const char* const ChromeContentClient::kNaClOldPluginName =
368 ::kNaClOldPluginName; 314 ::kNaClOldPluginName;
369 315
370 void ChromeContentClient::SetActiveURL(const GURL& url) { 316 void ChromeContentClient::SetActiveURL(const GURL& url) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 int resource_id, 397 int resource_id,
452 ui::ScaleFactor scale_factor) const { 398 ui::ScaleFactor scale_factor) const {
453 return ResourceBundle::GetSharedInstance().GetRawDataResource( 399 return ResourceBundle::GetSharedInstance().GetRawDataResource(
454 resource_id, scale_factor); 400 resource_id, scale_factor);
455 } 401 }
456 402
457 gfx::Image& ChromeContentClient::GetNativeImageNamed(int resource_id) const { 403 gfx::Image& ChromeContentClient::GetNativeImageNamed(int resource_id) const {
458 return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); 404 return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id);
459 } 405 }
460 406
461 #if defined(OS_WIN)
462 bool ChromeContentClient::SandboxPlugin(CommandLine* command_line,
463 sandbox::TargetPolicy* policy) {
464 std::wstring plugin_dll = command_line->
465 GetSwitchValueNative(switches::kPluginPath);
466
467 FilePath builtin_flash;
468 if (!PathService::Get(chrome::FILE_FLASH_PLUGIN_EXISTING, &builtin_flash))
469 return false;
470
471 FilePath plugin_path(plugin_dll);
472 if (plugin_path.BaseName() != builtin_flash.BaseName())
473 return false;
474
475 if (base::win::GetVersion() <= base::win::VERSION_XP ||
476 CommandLine::ForCurrentProcess()->HasSwitch(
477 switches::kDisableFlashSandbox)) {
478 return false;
479 }
480
481 // Add policy for the plugin proxy window pump event
482 // used by WebPluginDelegateProxy::HandleInputEvent().
483 if (policy->AddRule(sandbox::TargetPolicy::SUBSYS_HANDLES,
484 sandbox::TargetPolicy::HANDLES_DUP_ANY,
485 L"Event") != sandbox::SBOX_ALL_OK) {
486 NOTREACHED();
487 return false;
488 }
489
490 // Add the policy for the pipes.
491 if (policy->AddRule(sandbox::TargetPolicy::SUBSYS_NAMED_PIPES,
492 sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
493 L"\\\\.\\pipe\\chrome.*") != sandbox::SBOX_ALL_OK) {
494 NOTREACHED();
495 return false;
496 }
497
498 // Spawn the flash broker and apply sandbox policy.
499 if (LoadFlashBroker(plugin_path, command_line)) {
500 // UI job restrictions break windowless Flash, so just pick up single
501 // process limit for now.
502 policy->SetJobLevel(sandbox::JOB_UNPROTECTED, 0);
503 policy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS,
504 sandbox::USER_INTERACTIVE);
505 // Allow the Flash plugin to forward some messages back to Chrome.
506 if (base::win::GetVersion() == base::win::VERSION_VISTA) {
507 // Per-window message filters required on Win7 or later must be added to:
508 // render_widget_host_view_win.cc RenderWidgetHostViewWin::ReparentWindow
509 ::ChangeWindowMessageFilter(WM_MOUSEWHEEL, MSGFLT_ADD);
510 ::ChangeWindowMessageFilter(WM_APPCOMMAND, MSGFLT_ADD);
511 }
512 policy->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW);
513 } else {
514 // Could not start the broker, use a very weak policy instead.
515 DLOG(WARNING) << "Failed to start flash broker";
516 policy->SetJobLevel(sandbox::JOB_UNPROTECTED, 0);
517 policy->SetTokenLevel(
518 sandbox::USER_UNPROTECTED, sandbox::USER_UNPROTECTED);
519 }
520
521 return true;
522 }
523 #endif
524
525 #if defined(OS_MACOSX) && !defined(OS_IOS) 407 #if defined(OS_MACOSX) && !defined(OS_IOS)
526 bool ChromeContentClient::GetSandboxProfileForSandboxType( 408 bool ChromeContentClient::GetSandboxProfileForSandboxType(
527 int sandbox_type, 409 int sandbox_type,
528 int* sandbox_profile_resource_id) const { 410 int* sandbox_profile_resource_id) const {
529 DCHECK(sandbox_profile_resource_id); 411 DCHECK(sandbox_profile_resource_id);
530 if (sandbox_type == CHROME_SANDBOX_TYPE_NACL_LOADER) { 412 if (sandbox_type == CHROME_SANDBOX_TYPE_NACL_LOADER) {
531 *sandbox_profile_resource_id = IDR_NACL_SANDBOX_PROFILE; 413 *sandbox_profile_resource_id = IDR_NACL_SANDBOX_PROFILE;
532 return true; 414 return true;
533 } 415 }
534 return false; 416 return false;
535 } 417 }
536 418
537 std::string ChromeContentClient::GetCarbonInterposePath() const { 419 std::string ChromeContentClient::GetCarbonInterposePath() const {
538 return std::string(kInterposeLibraryPath); 420 return std::string(kInterposeLibraryPath);
539 } 421 }
540 #endif 422 #endif
541 423
542 bool ChromeContentClient::GetBundledFieldTrialPepperFlash( 424 bool ChromeContentClient::GetBundledFieldTrialPepperFlash(
543 content::PepperPluginInfo* plugin, 425 content::PepperPluginInfo* plugin,
544 bool* override_npapi_flash) { 426 bool* override_npapi_flash) {
545 if (!ConductingPepperFlashFieldTrial()) 427 if (!ConductingPepperFlashFieldTrial())
546 return false; 428 return false;
547 return GetBundledPepperFlash(plugin, override_npapi_flash); 429 return GetBundledPepperFlash(plugin, override_npapi_flash);
548 } 430 }
549 431
550 } // namespace chrome 432 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698