| 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 #ifdef _MSC_VER | 5 #ifdef _MSC_VER |
| 6 // Do not warn about use of std::copy with raw pointers. | 6 // Do not warn about use of std::copy with raw pointers. |
| 7 #pragma warning(disable : 4996) | 7 #pragma warning(disable : 4996) |
| 8 #endif | 8 #endif |
| 9 | 9 |
| 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" | 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 void Plugin::HistogramTimeSmall(const std::string& name, | 69 void Plugin::HistogramTimeSmall(const std::string& name, |
| 70 int64_t ms) { | 70 int64_t ms) { |
| 71 if (ms < 0) return; | 71 if (ms < 0) return; |
| 72 uma_interface_.HistogramCustomTimes(name, | 72 uma_interface_.HistogramCustomTimes(name, |
| 73 ms, | 73 ms, |
| 74 kTimeSmallMin, kTimeSmallMax, | 74 kTimeSmallMin, kTimeSmallMax, |
| 75 kTimeSmallBuckets); | 75 kTimeSmallBuckets); |
| 76 } | 76 } |
| 77 | 77 |
| 78 void Plugin::HistogramEnumerateSelLdrLoadStatus(NaClErrorCode error_code) { | |
| 79 if (error_code < 0 || error_code > NACL_ERROR_CODE_MAX) | |
| 80 error_code = LOAD_STATUS_UNKNOWN; | |
| 81 | |
| 82 uma_interface_.HistogramEnumeration("NaCl.LoadStatus.SelLdr", | |
| 83 error_code, | |
| 84 NACL_ERROR_CODE_MAX); | |
| 85 | |
| 86 // Gather data to see if being installed changes load outcomes. | |
| 87 const char* name = nacl_interface_->GetIsInstalled(pp_instance()) ? | |
| 88 "NaCl.LoadStatus.SelLdr.InstalledApp" : | |
| 89 "NaCl.LoadStatus.SelLdr.NotInstalledApp"; | |
| 90 uma_interface_.HistogramEnumeration(name, error_code, NACL_ERROR_CODE_MAX); | |
| 91 } | |
| 92 | |
| 93 bool Plugin::LoadNaClModuleFromBackgroundThread( | 78 bool Plugin::LoadNaClModuleFromBackgroundThread( |
| 94 PP_FileHandle file_handle, | 79 PP_FileHandle file_handle, |
| 95 NaClSubprocess* subprocess, | 80 NaClSubprocess* subprocess, |
| 96 const SelLdrStartParams& params) { | 81 const SelLdrStartParams& params) { |
| 97 CHECK(!pp::Module::Get()->core()->IsMainThread()); | 82 CHECK(!pp::Module::Get()->core()->IsMainThread()); |
| 98 ServiceRuntime* service_runtime = | 83 ServiceRuntime* service_runtime = |
| 99 new ServiceRuntime(this, false, uses_nonsfi_mode_, | 84 new ServiceRuntime(this, false, uses_nonsfi_mode_, |
| 100 pp::BlockUntilComplete(), pp::BlockUntilComplete()); | 85 pp::BlockUntilComplete(), pp::BlockUntilComplete()); |
| 101 subprocess->set_service_runtime(service_runtime); | 86 subprocess->set_service_runtime(service_runtime); |
| 102 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " | 87 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 return nacl_subprocess.release(); | 294 return nacl_subprocess.release(); |
| 310 } | 295 } |
| 311 | 296 |
| 312 // All failures of this function will show up as "Missing Plugin-in", so | 297 // All failures of this function will show up as "Missing Plugin-in", so |
| 313 // there is no need to log to JS console that there was an initialization | 298 // there is no need to log to JS console that there was an initialization |
| 314 // failure. Note that module loading functions will log their own errors. | 299 // failure. Note that module loading functions will log their own errors. |
| 315 bool Plugin::Init(uint32_t argc, const char* argn[], const char* argv[]) { | 300 bool Plugin::Init(uint32_t argc, const char* argn[], const char* argv[]) { |
| 316 PLUGIN_PRINTF(("Plugin::Init (argc=%" NACL_PRIu32 ")\n", argc)); | 301 PLUGIN_PRINTF(("Plugin::Init (argc=%" NACL_PRIu32 ")\n", argc)); |
| 317 nacl_interface_->InitializePlugin(pp_instance(), argc, argn, argv); | 302 nacl_interface_->InitializePlugin(pp_instance(), argc, argn, argv); |
| 318 wrapper_factory_ = new nacl::DescWrapperFactory(); | 303 wrapper_factory_ = new nacl::DescWrapperFactory(); |
| 319 pp::Var manifest_url(pp::PASS_REF, nacl_interface_->GetManifestURLArgument( | 304 pp::CompletionCallback open_cb = |
| 320 pp_instance())); | 305 callback_factory_.NewCallback(&Plugin::NaClManifestFileDidOpen); |
| 321 if (manifest_url.is_string() && !manifest_url.AsString().empty()) | 306 nacl_interface_->RequestNaClManifest(pp_instance(), |
| 322 RequestNaClManifest(manifest_url.AsString()); | 307 open_cb.pp_completion_callback()); |
| 323 return true; | 308 return true; |
| 324 } | 309 } |
| 325 | 310 |
| 326 Plugin::Plugin(PP_Instance pp_instance) | 311 Plugin::Plugin(PP_Instance pp_instance) |
| 327 : pp::Instance(pp_instance), | 312 : pp::Instance(pp_instance), |
| 328 main_subprocess_("main subprocess", NULL, NULL), | 313 main_subprocess_("main subprocess", NULL, NULL), |
| 329 uses_nonsfi_mode_(false), | 314 uses_nonsfi_mode_(false), |
| 330 wrapper_factory_(NULL), | 315 wrapper_factory_(NULL), |
| 331 time_of_last_progress_event_(0), | 316 time_of_last_progress_event_(0), |
| 332 nacl_interface_(NULL), | 317 nacl_interface_(NULL), |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 nexe_file_info_, | 398 nexe_file_info_, |
| 414 uses_nonsfi_mode_, | 399 uses_nonsfi_mode_, |
| 415 true, /* enable_dyncode_syscalls */ | 400 true, /* enable_dyncode_syscalls */ |
| 416 true, /* enable_exception_handling */ | 401 true, /* enable_exception_handling */ |
| 417 false, /* enable_crash_throttling */ | 402 false, /* enable_crash_throttling */ |
| 418 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), | 403 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), |
| 419 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); | 404 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); |
| 420 } | 405 } |
| 421 | 406 |
| 422 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { | 407 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { |
| 423 bool was_successful; | |
| 424 | |
| 425 UNREFERENCED_PARAMETER(pp_error); | 408 UNREFERENCED_PARAMETER(pp_error); |
| 426 NaClLog(4, "Entered NexeFileDidOpenContinuation\n"); | 409 NaClLog(4, "Entered NexeFileDidOpenContinuation\n"); |
| 427 NaClLog(4, "NexeFileDidOpenContinuation: invoking" | 410 if (LoadNaClModuleContinuationIntern()) { |
| 428 " LoadNaClModuleContinuationIntern\n"); | |
| 429 was_successful = LoadNaClModuleContinuationIntern(); | |
| 430 if (was_successful) { | |
| 431 NaClLog(4, "NexeFileDidOpenContinuation: success;" | 411 NaClLog(4, "NexeFileDidOpenContinuation: success;" |
| 432 " setting histograms\n"); | 412 " setting histograms\n"); |
| 433 int64_t nexe_size = nacl_interface_->GetNexeSize(pp_instance()); | 413 int64_t nexe_size = nacl_interface_->GetNexeSize(pp_instance()); |
| 434 ReportLoadSuccess(nexe_size, nexe_size); | 414 nacl_interface_->ReportLoadSuccess( |
| 415 pp_instance(), program_url_.c_str(), nexe_size, nexe_size); |
| 435 } else { | 416 } else { |
| 436 NaClLog(4, "NexeFileDidOpenContinuation: failed."); | 417 NaClLog(4, "NexeFileDidOpenContinuation: failed."); |
| 437 } | 418 } |
| 438 NaClLog(4, "Leaving NexeFileDidOpenContinuation\n"); | 419 NaClLog(4, "Leaving NexeFileDidOpenContinuation\n"); |
| 439 } | 420 } |
| 440 | 421 |
| 441 void Plugin::NexeDidCrash(int32_t pp_error) { | 422 void Plugin::NexeDidCrash(int32_t pp_error) { |
| 442 PLUGIN_PRINTF(("Plugin::NexeDidCrash (pp_error=%" NACL_PRId32 ")\n", | 423 PLUGIN_PRINTF(("Plugin::NexeDidCrash (pp_error=%" NACL_PRId32 ")\n", |
| 443 pp_error)); | 424 pp_error)); |
| 444 if (pp_error != PP_OK) { | 425 if (pp_error != PP_OK) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 471 info, | 452 info, |
| 472 false, /* uses_nonsfi_mode */ | 453 false, /* uses_nonsfi_mode */ |
| 473 false, /* enable_dyncode_syscalls */ | 454 false, /* enable_dyncode_syscalls */ |
| 474 false, /* enable_exception_handling */ | 455 false, /* enable_exception_handling */ |
| 475 true, /* enable_crash_throttling */ | 456 true, /* enable_crash_throttling */ |
| 476 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), | 457 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), |
| 477 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); | 458 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); |
| 478 } | 459 } |
| 479 | 460 |
| 480 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { | 461 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { |
| 481 bool was_successful = LoadNaClModuleContinuationIntern(); | |
| 482 | |
| 483 NaClLog(4, "Entered BitcodeDidTranslateContinuation\n"); | 462 NaClLog(4, "Entered BitcodeDidTranslateContinuation\n"); |
| 484 UNREFERENCED_PARAMETER(pp_error); | 463 UNREFERENCED_PARAMETER(pp_error); |
| 485 if (was_successful) { | 464 if (LoadNaClModuleContinuationIntern()) { |
| 486 int64_t loaded; | 465 int64_t loaded; |
| 487 int64_t total; | 466 int64_t total; |
| 467 // TODO(teravest): Tighten this up so we can get rid of |
| 468 // GetCurrentProgress(). loaded should always equal total. |
| 488 pnacl_coordinator_->GetCurrentProgress(&loaded, &total); | 469 pnacl_coordinator_->GetCurrentProgress(&loaded, &total); |
| 489 ReportLoadSuccess(loaded, total); | 470 nacl_interface_->ReportLoadSuccess( |
| 471 pp_instance(), program_url_.c_str(), loaded, total); |
| 490 } | 472 } |
| 491 } | 473 } |
| 492 | 474 |
| 493 void Plugin::NaClManifestFileDidOpen(int32_t pp_error) { | 475 void Plugin::NaClManifestFileDidOpen(int32_t pp_error) { |
| 494 PLUGIN_PRINTF(("Plugin::NaClManifestFileDidOpen (pp_error=%" | 476 PLUGIN_PRINTF(("Plugin::NaClManifestFileDidOpen (pp_error=%" |
| 495 NACL_PRId32 ")\n", pp_error)); | 477 NACL_PRId32 ")\n", pp_error)); |
| 496 if (pp_error != PP_OK) | 478 if (pp_error != PP_OK) |
| 497 return; | 479 return; |
| 498 | 480 |
| 499 PP_Var pp_program_url; | 481 PP_Var pp_program_url; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 521 // Will always call the callback on success or failure. | 503 // Will always call the callback on success or failure. |
| 522 nacl_interface_->DownloadNexe(pp_instance(), | 504 nacl_interface_->DownloadNexe(pp_instance(), |
| 523 program_url_.c_str(), | 505 program_url_.c_str(), |
| 524 &nexe_file_info_, | 506 &nexe_file_info_, |
| 525 open_callback.pp_completion_callback()); | 507 open_callback.pp_completion_callback()); |
| 526 return; | 508 return; |
| 527 } | 509 } |
| 528 } | 510 } |
| 529 } | 511 } |
| 530 | 512 |
| 531 void Plugin::RequestNaClManifest(const nacl::string& url) { | |
| 532 PLUGIN_PRINTF(("Plugin::RequestNaClManifest (url='%s')\n", url.c_str())); | |
| 533 pp::CompletionCallback open_callback = | |
| 534 callback_factory_.NewCallback(&Plugin::NaClManifestFileDidOpen); | |
| 535 nacl_interface_->RequestNaClManifest(pp_instance(), | |
| 536 url.c_str(), | |
| 537 open_callback.pp_completion_callback()); | |
| 538 } | |
| 539 | |
| 540 void Plugin::ReportLoadSuccess(uint64_t loaded_bytes, uint64_t total_bytes) { | |
| 541 nacl_interface_->ReportLoadSuccess( | |
| 542 pp_instance(), program_url_.c_str(), loaded_bytes, total_bytes); | |
| 543 } | |
| 544 | |
| 545 | |
| 546 void Plugin::ReportLoadError(const ErrorInfo& error_info) { | 513 void Plugin::ReportLoadError(const ErrorInfo& error_info) { |
| 547 nacl_interface_->ReportLoadError(pp_instance(), | 514 nacl_interface_->ReportLoadError(pp_instance(), |
| 548 error_info.error_code(), | 515 error_info.error_code(), |
| 549 error_info.message().c_str(), | 516 error_info.message().c_str(), |
| 550 error_info.console_message().c_str()); | 517 error_info.console_message().c_str()); |
| 551 } | 518 } |
| 552 | 519 |
| 553 | |
| 554 void Plugin::ReportLoadAbort() { | |
| 555 nacl_interface_->ReportLoadAbort(pp_instance()); | |
| 556 } | |
| 557 | |
| 558 void Plugin::ReportSelLdrLoadStatus(int status) { | |
| 559 HistogramEnumerateSelLdrLoadStatus(static_cast<NaClErrorCode>(status)); | |
| 560 } | |
| 561 | |
| 562 bool Plugin::DocumentCanRequest(const std::string& url) { | 520 bool Plugin::DocumentCanRequest(const std::string& url) { |
| 563 CHECK(pp::Module::Get()->core()->IsMainThread()); | 521 CHECK(pp::Module::Get()->core()->IsMainThread()); |
| 564 CHECK(pp::URLUtil_Dev::Get() != NULL); | 522 CHECK(pp::URLUtil_Dev::Get() != NULL); |
| 565 return pp::URLUtil_Dev::Get()->DocumentCanRequest(this, pp::Var(url)); | 523 return pp::URLUtil_Dev::Get()->DocumentCanRequest(this, pp::Var(url)); |
| 566 } | 524 } |
| 567 | 525 |
| 568 void Plugin::set_exit_status(int exit_status) { | 526 void Plugin::set_exit_status(int exit_status) { |
| 569 pp::Core* core = pp::Module::Get()->core(); | 527 pp::Core* core = pp::Module::Get()->core(); |
| 570 if (core->IsMainThread()) { | 528 if (core->IsMainThread()) { |
| 571 SetExitStatusOnMainThread(PP_OK, exit_status); | 529 SetExitStatusOnMainThread(PP_OK, exit_status); |
| 572 } else { | 530 } else { |
| 573 pp::CompletionCallback callback = | 531 pp::CompletionCallback callback = |
| 574 callback_factory_.NewCallback(&Plugin::SetExitStatusOnMainThread, | 532 callback_factory_.NewCallback(&Plugin::SetExitStatusOnMainThread, |
| 575 exit_status); | 533 exit_status); |
| 576 core->CallOnMainThread(0, callback, 0); | 534 core->CallOnMainThread(0, callback, 0); |
| 577 } | 535 } |
| 578 } | 536 } |
| 579 | 537 |
| 580 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, | 538 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, |
| 581 int exit_status) { | 539 int exit_status) { |
| 582 DCHECK(pp::Module::Get()->core()->IsMainThread()); | 540 DCHECK(pp::Module::Get()->core()->IsMainThread()); |
| 583 DCHECK(nacl_interface_); | 541 DCHECK(nacl_interface_); |
| 584 nacl_interface_->SetExitStatus(pp_instance(), exit_status); | 542 nacl_interface_->SetExitStatus(pp_instance(), exit_status); |
| 585 } | 543 } |
| 586 | 544 |
| 587 | 545 |
| 588 } // namespace plugin | 546 } // namespace plugin |
| OLD | NEW |