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