| 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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 return NULL; | 347 return NULL; |
| 348 } | 348 } |
| 349 | 349 |
| 350 PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule (%s, %s)\n", | 350 PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule (%s, %s)\n", |
| 351 helper_url.c_str(), | 351 helper_url.c_str(), |
| 352 nacl_subprocess.get()->detailed_description().c_str())); | 352 nacl_subprocess.get()->detailed_description().c_str())); |
| 353 | 353 |
| 354 return nacl_subprocess.release(); | 354 return nacl_subprocess.release(); |
| 355 } | 355 } |
| 356 | 356 |
| 357 Plugin* Plugin::New(PP_Instance pp_instance) { | |
| 358 PLUGIN_PRINTF(("Plugin::New (pp_instance=%" NACL_PRId32 ")\n", pp_instance)); | |
| 359 Plugin* plugin = new Plugin(pp_instance); | |
| 360 PLUGIN_PRINTF(("Plugin::New (plugin=%p)\n", static_cast<void*>(plugin))); | |
| 361 return plugin; | |
| 362 } | |
| 363 | |
| 364 // All failures of this function will show up as "Missing Plugin-in", so | 357 // All failures of this function will show up as "Missing Plugin-in", so |
| 365 // there is no need to log to JS console that there was an initialization | 358 // there is no need to log to JS console that there was an initialization |
| 366 // failure. Note that module loading functions will log their own errors. | 359 // failure. Note that module loading functions will log their own errors. |
| 367 bool Plugin::Init(uint32_t argc, const char* argn[], const char* argv[]) { | 360 bool Plugin::Init(uint32_t argc, const char* argn[], const char* argv[]) { |
| 368 PLUGIN_PRINTF(("Plugin::Init (argc=%" NACL_PRIu32 ")\n", argc)); | 361 PLUGIN_PRINTF(("Plugin::Init (argc=%" NACL_PRIu32 ")\n", argc)); |
| 369 nacl_interface_->InitializePlugin(pp_instance(), argc, argn, argv); | 362 nacl_interface_->InitializePlugin(pp_instance(), argc, argn, argv); |
| 370 url_util_ = pp::URLUtil_Dev::Get(); | |
| 371 if (url_util_ == NULL) | |
| 372 return false; | |
| 373 | |
| 374 wrapper_factory_ = new nacl::DescWrapperFactory(); | 363 wrapper_factory_ = new nacl::DescWrapperFactory(); |
| 375 pp::Var manifest_url(pp::PASS_REF, nacl_interface_->GetManifestURLArgument( | 364 pp::Var manifest_url(pp::PASS_REF, nacl_interface_->GetManifestURLArgument( |
| 376 pp_instance())); | 365 pp_instance())); |
| 377 if (manifest_url.is_string() && !manifest_url.AsString().empty()) | 366 if (manifest_url.is_string() && !manifest_url.AsString().empty()) |
| 378 RequestNaClManifest(manifest_url.AsString()); | 367 RequestNaClManifest(manifest_url.AsString()); |
| 379 return true; | 368 return true; |
| 380 } | 369 } |
| 381 | 370 |
| 382 Plugin::Plugin(PP_Instance pp_instance) | 371 Plugin::Plugin(PP_Instance pp_instance) |
| 383 : pp::Instance(pp_instance), | 372 : pp::Instance(pp_instance), |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 ReportLoadError(error_info); | 636 ReportLoadError(error_info); |
| 648 return; | 637 return; |
| 649 } | 638 } |
| 650 | 639 |
| 651 ProcessNaClManifest(json_buffer); | 640 ProcessNaClManifest(json_buffer); |
| 652 } | 641 } |
| 653 | 642 |
| 654 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { | 643 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { |
| 655 HistogramSizeKB("NaCl.Perf.Size.Manifest", | 644 HistogramSizeKB("NaCl.Perf.Size.Manifest", |
| 656 static_cast<int32_t>(manifest_json.length() / 1024)); | 645 static_cast<int32_t>(manifest_json.length() / 1024)); |
| 657 ErrorInfo error_info; | 646 if (!SetManifestObject(manifest_json)) |
| 658 if (!SetManifestObject(manifest_json, &error_info)) { | |
| 659 ReportLoadError(error_info); | |
| 660 return; | 647 return; |
| 661 } | |
| 662 | 648 |
| 663 nacl::string program_url; | 649 nacl::string program_url; |
| 664 PP_PNaClOptions pnacl_options = {PP_FALSE, PP_FALSE, 2}; | 650 PP_PNaClOptions pnacl_options = {PP_FALSE, PP_FALSE, 2}; |
| 665 bool uses_nonsfi_mode; | 651 bool uses_nonsfi_mode; |
| 652 ErrorInfo error_info; |
| 666 if (manifest_->GetProgramURL( | 653 if (manifest_->GetProgramURL( |
| 667 &program_url, &pnacl_options, &uses_nonsfi_mode, &error_info)) { | 654 &program_url, &pnacl_options, &uses_nonsfi_mode, &error_info)) { |
| 668 // TODO(teravest): Make ProcessNaClManifest take responsibility for more of | 655 // TODO(teravest): Make ProcessNaClManifest take responsibility for more of |
| 669 // this function. | 656 // this function. |
| 670 nacl_interface_->ProcessNaClManifest(pp_instance(), program_url.c_str()); | 657 nacl_interface_->ProcessNaClManifest(pp_instance(), program_url.c_str()); |
| 671 uses_nonsfi_mode_ = uses_nonsfi_mode; | 658 uses_nonsfi_mode_ = uses_nonsfi_mode; |
| 672 if (pnacl_options.translate) { | 659 if (pnacl_options.translate) { |
| 673 pp::CompletionCallback translate_callback = | 660 pp::CompletionCallback translate_callback = |
| 674 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate); | 661 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate); |
| 675 // Will always call the callback on success or failure. | 662 // Will always call the callback on success or failure. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 // Will always call the callback on success or failure. | 722 // Will always call the callback on success or failure. |
| 736 CHECK(nexe_downloader_.Open(nmf_resolved_url.AsString(), | 723 CHECK(nexe_downloader_.Open(nmf_resolved_url.AsString(), |
| 737 DOWNLOAD_TO_FILE, | 724 DOWNLOAD_TO_FILE, |
| 738 open_callback, | 725 open_callback, |
| 739 false, | 726 false, |
| 740 NULL)); | 727 NULL)); |
| 741 } | 728 } |
| 742 } | 729 } |
| 743 | 730 |
| 744 | 731 |
| 745 bool Plugin::SetManifestObject(const nacl::string& manifest_json, | 732 bool Plugin::SetManifestObject(const nacl::string& manifest_json) { |
| 746 ErrorInfo* error_info) { | |
| 747 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", | 733 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", |
| 748 manifest_json.c_str())); | 734 manifest_json.c_str())); |
| 749 if (error_info == NULL) | 735 ErrorInfo error_info; |
| 750 return false; | 736 |
| 751 // Determine whether lookups should use portable (i.e., pnacl versions) | 737 // Determine whether lookups should use portable (i.e., pnacl versions) |
| 752 // rather than platform-specific files. | 738 // rather than platform-specific files. |
| 753 bool is_pnacl = nacl_interface_->IsPNaCl(pp_instance()); | 739 bool is_pnacl = nacl_interface_->IsPNaCl(pp_instance()); |
| 754 bool nonsfi_mode_enabled = | 740 bool nonsfi_mode_enabled = |
| 755 PP_ToBool(nacl_interface_->IsNonSFIModeEnabled()); | 741 PP_ToBool(nacl_interface_->IsNonSFIModeEnabled()); |
| 756 pp::Var manifest_base_url = | 742 pp::Var manifest_base_url = |
| 757 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance())); | 743 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance())); |
| 758 std::string manifest_base_url_str = manifest_base_url.AsString(); | 744 std::string manifest_base_url_str = manifest_base_url.AsString(); |
| 759 bool pnacl_debug = GetNaClInterface()->NaClDebugEnabledForURL( | 745 bool pnacl_debug = GetNaClInterface()->NaClDebugEnabledForURL( |
| 760 manifest_base_url_str.c_str()); | 746 manifest_base_url_str.c_str()); |
| 761 const char* sandbox_isa = nacl_interface_->GetSandboxArch(); | 747 const char* sandbox_isa = nacl_interface_->GetSandboxArch(); |
| 762 nacl::scoped_ptr<JsonManifest> json_manifest( | 748 nacl::scoped_ptr<JsonManifest> json_manifest( |
| 763 new JsonManifest(url_util_, | 749 new JsonManifest(pp::URLUtil_Dev::Get(), |
| 764 manifest_base_url_str, | 750 manifest_base_url_str, |
| 765 (is_pnacl ? kPortableArch : sandbox_isa), | 751 (is_pnacl ? kPortableArch : sandbox_isa), |
| 766 nonsfi_mode_enabled, | 752 nonsfi_mode_enabled, |
| 767 pnacl_debug)); | 753 pnacl_debug)); |
| 768 if (!json_manifest->Init(manifest_json, error_info)) { | 754 if (!json_manifest->Init(manifest_json, &error_info)) { |
| 755 ReportLoadError(error_info); |
| 769 return false; | 756 return false; |
| 770 } | 757 } |
| 771 manifest_.reset(json_manifest.release()); | 758 manifest_.reset(json_manifest.release()); |
| 772 return true; | 759 return true; |
| 773 } | 760 } |
| 774 | 761 |
| 775 void Plugin::UrlDidOpenForStreamAsFile( | 762 void Plugin::UrlDidOpenForStreamAsFile( |
| 776 int32_t pp_error, | 763 int32_t pp_error, |
| 777 FileDownloader* url_downloader, | 764 FileDownloader* url_downloader, |
| 778 pp::CompletionCallback callback) { | 765 pp::CompletionCallback callback) { |
| 779 PLUGIN_PRINTF(("Plugin::UrlDidOpen (pp_error=%" NACL_PRId32 | 766 PLUGIN_PRINTF(("Plugin::UrlDidOpen (pp_error=%" NACL_PRId32 |
| 780 ", url_downloader=%p)\n", pp_error, | 767 ", url_downloader=%p)\n", pp_error, |
| 781 static_cast<void*>(url_downloader))); | 768 static_cast<void*>(url_downloader))); |
| 782 url_downloaders_.erase(url_downloader); | 769 url_downloaders_.erase(url_downloader); |
| 783 nacl::scoped_ptr<FileDownloader> scoped_url_downloader(url_downloader); | 770 nacl::scoped_ptr<FileDownloader> scoped_url_downloader(url_downloader); |
| 784 NaClFileInfo tmp_info(scoped_url_downloader->GetFileInfo()); | 771 NaClFileInfo tmp_info(scoped_url_downloader->GetFileInfo()); |
| 785 NaClFileInfoAutoCloser *info = new NaClFileInfoAutoCloser(&tmp_info); | 772 NaClFileInfoAutoCloser *info = new NaClFileInfoAutoCloser(&tmp_info); |
| 786 | 773 |
| 787 if (pp_error != PP_OK) { | 774 if (pp_error != PP_OK) { |
| 788 callback.Run(pp_error); | 775 callback.Run(pp_error); |
| 789 delete info; | 776 delete info; |
| 790 } else if (info->get_desc() > NACL_NO_FILE_DESC) { | 777 } else if (info->get_desc() > NACL_NO_FILE_DESC) { |
| 791 std::map<nacl::string, NaClFileInfoAutoCloser*>::iterator it = | 778 std::map<nacl::string, NaClFileInfoAutoCloser*>::iterator it = |
| 792 url_file_info_map_.find(url_downloader->url()); | 779 url_file_info_map_.find(url_downloader->url()); |
| 793 if (it != url_file_info_map_.end()) { | 780 if (it != url_file_info_map_.end()) |
| 794 delete it->second; | 781 delete it->second; |
| 795 } | |
| 796 url_file_info_map_[url_downloader->url()] = info; | 782 url_file_info_map_[url_downloader->url()] = info; |
| 797 callback.Run(PP_OK); | 783 callback.Run(PP_OK); |
| 798 } else { | 784 } else { |
| 799 callback.Run(PP_ERROR_FAILED); | 785 callback.Run(PP_ERROR_FAILED); |
| 800 delete info; | 786 delete info; |
| 801 } | 787 } |
| 802 } | 788 } |
| 803 | 789 |
| 804 struct NaClFileInfo Plugin::GetFileInfo(const nacl::string& url) { | 790 struct NaClFileInfo Plugin::GetFileInfo(const nacl::string& url) { |
| 805 struct NaClFileInfo info; | 791 struct NaClFileInfo info; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 // We shouldn't hit this if the file URL is in an installed app. | 953 // We shouldn't hit this if the file URL is in an installed app. |
| 968 if (file_handle == PP_kInvalidFileHandle) | 954 if (file_handle == PP_kInvalidFileHandle) |
| 969 return false; | 955 return false; |
| 970 | 956 |
| 971 // FileDownloader takes ownership of the file handle. | 957 // FileDownloader takes ownership of the file handle. |
| 972 downloader->OpenFast(url, file_handle, file_token_lo, file_token_hi); | 958 downloader->OpenFast(url, file_handle, file_token_lo, file_token_hi); |
| 973 return true; | 959 return true; |
| 974 } | 960 } |
| 975 | 961 |
| 976 bool Plugin::DocumentCanRequest(const std::string& url) { | 962 bool Plugin::DocumentCanRequest(const std::string& url) { |
| 977 CHECK(url_util_ != NULL); | 963 CHECK(pp::Module::Get()->core()->IsMainThread()); |
| 978 return url_util_->DocumentCanRequest(this, pp::Var(url)); | 964 CHECK(pp::URLUtil_Dev::Get() != NULL); |
| 965 return pp::URLUtil_Dev::Get()->DocumentCanRequest(this, pp::Var(url)); |
| 979 } | 966 } |
| 980 | 967 |
| 981 void Plugin::set_exit_status(int exit_status) { | 968 void Plugin::set_exit_status(int exit_status) { |
| 982 pp::Core* core = pp::Module::Get()->core(); | 969 pp::Core* core = pp::Module::Get()->core(); |
| 983 if (core->IsMainThread()) { | 970 if (core->IsMainThread()) { |
| 984 SetExitStatusOnMainThread(PP_OK, exit_status); | 971 SetExitStatusOnMainThread(PP_OK, exit_status); |
| 985 } else { | 972 } else { |
| 986 pp::CompletionCallback callback = | 973 pp::CompletionCallback callback = |
| 987 callback_factory_.NewCallback(&Plugin::SetExitStatusOnMainThread, | 974 callback_factory_.NewCallback(&Plugin::SetExitStatusOnMainThread, |
| 988 exit_status); | 975 exit_status); |
| 989 core->CallOnMainThread(0, callback, 0); | 976 core->CallOnMainThread(0, callback, 0); |
| 990 } | 977 } |
| 991 } | 978 } |
| 992 | 979 |
| 993 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, | 980 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, |
| 994 int exit_status) { | 981 int exit_status) { |
| 995 DCHECK(pp::Module::Get()->core()->IsMainThread()); | 982 DCHECK(pp::Module::Get()->core()->IsMainThread()); |
| 996 DCHECK(nacl_interface_); | 983 DCHECK(nacl_interface_); |
| 997 nacl_interface_->SetExitStatus(pp_instance(), exit_status); | 984 nacl_interface_->SetExitStatus(pp_instance(), exit_status); |
| 998 } | 985 } |
| 999 | 986 |
| 1000 | 987 |
| 1001 } // namespace plugin | 988 } // namespace plugin |
| OLD | NEW |