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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 HistogramEnumerate(name, sample, 7, 6); | 276 HistogramEnumerate(name, sample, 7, 6); |
277 } | 277 } |
278 | 278 |
279 bool Plugin::LoadNaClModuleFromBackgroundThread( | 279 bool Plugin::LoadNaClModuleFromBackgroundThread( |
280 nacl::DescWrapper* wrapper, | 280 nacl::DescWrapper* wrapper, |
281 NaClSubprocess* subprocess, | 281 NaClSubprocess* subprocess, |
282 const Manifest* manifest, | 282 const Manifest* manifest, |
283 const SelLdrStartParams& params) { | 283 const SelLdrStartParams& params) { |
284 CHECK(!pp::Module::Get()->core()->IsMainThread()); | 284 CHECK(!pp::Module::Get()->core()->IsMainThread()); |
285 ServiceRuntime* service_runtime = | 285 ServiceRuntime* service_runtime = |
286 new ServiceRuntime(this, manifest, false, | 286 new ServiceRuntime(this, manifest, false, uses_nonsfi_mode_, |
287 pp::BlockUntilComplete(), pp::BlockUntilComplete()); | 287 pp::BlockUntilComplete(), pp::BlockUntilComplete()); |
288 subprocess->set_service_runtime(service_runtime); | 288 subprocess->set_service_runtime(service_runtime); |
289 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " | 289 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " |
290 "(service_runtime=%p)\n", | 290 "(service_runtime=%p)\n", |
291 static_cast<void*>(service_runtime))); | 291 static_cast<void*>(service_runtime))); |
292 | 292 |
293 // Now start the SelLdr instance. This must be created on the main thread. | 293 // Now start the SelLdr instance. This must be created on the main thread. |
294 bool service_runtime_started; | 294 bool service_runtime_started; |
295 pp::CompletionCallback sel_ldr_callback = | 295 pp::CompletionCallback sel_ldr_callback = |
296 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone, | 296 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 } | 332 } |
333 | 333 |
334 void Plugin::SignalStartSelLdrDone(int32_t pp_error, | 334 void Plugin::SignalStartSelLdrDone(int32_t pp_error, |
335 bool* started, | 335 bool* started, |
336 ServiceRuntime* service_runtime) { | 336 ServiceRuntime* service_runtime) { |
337 *started = (pp_error == PP_OK); | 337 *started = (pp_error == PP_OK); |
338 service_runtime->SignalStartSelLdrDone(); | 338 service_runtime->SignalStartSelLdrDone(); |
339 } | 339 } |
340 | 340 |
341 void Plugin::LoadNaClModule(nacl::DescWrapper* wrapper, | 341 void Plugin::LoadNaClModule(nacl::DescWrapper* wrapper, |
| 342 bool uses_nonsfi_mode, |
342 bool enable_dyncode_syscalls, | 343 bool enable_dyncode_syscalls, |
343 bool enable_exception_handling, | 344 bool enable_exception_handling, |
344 bool enable_crash_throttling, | 345 bool enable_crash_throttling, |
345 const pp::CompletionCallback& init_done_cb, | 346 const pp::CompletionCallback& init_done_cb, |
346 const pp::CompletionCallback& crash_cb) { | 347 const pp::CompletionCallback& crash_cb) { |
347 nacl::scoped_ptr<nacl::DescWrapper> scoped_wrapper(wrapper); | 348 nacl::scoped_ptr<nacl::DescWrapper> scoped_wrapper(wrapper); |
348 CHECK(pp::Module::Get()->core()->IsMainThread()); | 349 CHECK(pp::Module::Get()->core()->IsMainThread()); |
349 // Before forking a new sel_ldr process, ensure that we do not leak | 350 // Before forking a new sel_ldr process, ensure that we do not leak |
350 // the ServiceRuntime object for an existing subprocess, and that any | 351 // the ServiceRuntime object for an existing subprocess, and that any |
351 // associated listener threads do not go unjoined because if they | 352 // associated listener threads do not go unjoined because if they |
352 // outlive the Plugin object, they will not be memory safe. | 353 // outlive the Plugin object, they will not be memory safe. |
353 ShutDownSubprocesses(); | 354 ShutDownSubprocesses(); |
354 SelLdrStartParams params(manifest_base_url(), | 355 SelLdrStartParams params(manifest_base_url(), |
355 true /* uses_irt */, | 356 true /* uses_irt */, |
356 true /* uses_ppapi */, | 357 true /* uses_ppapi */, |
| 358 uses_nonsfi_mode, |
357 enable_dev_interfaces_, | 359 enable_dev_interfaces_, |
358 enable_dyncode_syscalls, | 360 enable_dyncode_syscalls, |
359 enable_exception_handling, | 361 enable_exception_handling, |
360 enable_crash_throttling); | 362 enable_crash_throttling); |
361 ErrorInfo error_info; | 363 ErrorInfo error_info; |
362 ServiceRuntime* service_runtime = | 364 ServiceRuntime* service_runtime = |
363 new ServiceRuntime(this, manifest_.get(), true, init_done_cb, crash_cb); | 365 new ServiceRuntime(this, manifest_.get(), true, uses_nonsfi_mode, |
| 366 init_done_cb, crash_cb); |
364 main_subprocess_.set_service_runtime(service_runtime); | 367 main_subprocess_.set_service_runtime(service_runtime); |
365 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime=%p)\n", | 368 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime=%p)\n", |
366 static_cast<void*>(service_runtime))); | 369 static_cast<void*>(service_runtime))); |
367 if (NULL == service_runtime) { | 370 if (NULL == service_runtime) { |
368 error_info.SetReport( | 371 error_info.SetReport( |
369 PP_NACL_ERROR_SEL_LDR_INIT, | 372 PP_NACL_ERROR_SEL_LDR_INIT, |
370 "sel_ldr init failure " + main_subprocess_.description()); | 373 "sel_ldr init failure " + main_subprocess_.description()); |
371 ReportLoadError(error_info); | 374 ReportLoadError(error_info); |
372 return; | 375 return; |
373 } | 376 } |
(...skipping 17 matching lines...) Expand all Loading... |
391 bool nexe_loaded = service_runtime->LoadNexeAndStart(wrapper, crash_cb); | 394 bool nexe_loaded = service_runtime->LoadNexeAndStart(wrapper, crash_cb); |
392 PLUGIN_PRINTF(("Plugin::LoadNaClModule (nexe_loaded=%d)\n", | 395 PLUGIN_PRINTF(("Plugin::LoadNaClModule (nexe_loaded=%d)\n", |
393 nexe_loaded)); | 396 nexe_loaded)); |
394 if (nexe_loaded) { | 397 if (nexe_loaded) { |
395 PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n", | 398 PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n", |
396 main_subprocess_.detailed_description().c_str())); | 399 main_subprocess_.detailed_description().c_str())); |
397 } | 400 } |
398 } | 401 } |
399 | 402 |
400 bool Plugin::LoadNaClModuleContinuationIntern(ErrorInfo* error_info) { | 403 bool Plugin::LoadNaClModuleContinuationIntern(ErrorInfo* error_info) { |
401 if (!main_subprocess_.StartSrpcServices()) { | 404 if (!uses_nonsfi_mode_) { |
402 // The NaCl process probably crashed. On Linux, a crash causes this error, | 405 if (!main_subprocess_.StartSrpcServices()) { |
403 // while on other platforms, the error is detected below, when we attempt to | 406 // The NaCl process probably crashed. On Linux, a crash causes this |
404 // start the proxy. Report a module initialization error here, to make it | 407 // error, while on other platforms, the error is detected below, when we |
405 // less confusing for developers. | 408 // attempt to start the proxy. Report a module initialization error here, |
406 NaClLog(LOG_ERROR, "LoadNaClModuleContinuationIntern: " | 409 // to make it less confusing for developers. |
407 "StartSrpcServices failed\n"); | 410 NaClLog(LOG_ERROR, "LoadNaClModuleContinuationIntern: " |
408 error_info->SetReport(PP_NACL_ERROR_START_PROXY_MODULE, | 411 "StartSrpcServices failed\n"); |
409 "could not initialize module."); | 412 error_info->SetReport(PP_NACL_ERROR_START_PROXY_MODULE, |
410 return false; | 413 "could not initialize module."); |
| 414 return false; |
| 415 } |
411 } | 416 } |
412 PP_ExternalPluginResult ipc_result = | 417 PP_ExternalPluginResult ipc_result = |
413 nacl_interface_->StartPpapiProxy(pp_instance()); | 418 nacl_interface_->StartPpapiProxy(pp_instance()); |
414 if (ipc_result == PP_EXTERNAL_PLUGIN_OK) { | 419 if (ipc_result == PP_EXTERNAL_PLUGIN_OK) { |
415 // Log the amound of time that has passed between the trusted plugin being | 420 // Log the amound of time that has passed between the trusted plugin being |
416 // initialized and the untrusted plugin being initialized. This is | 421 // initialized and the untrusted plugin being initialized. This is |
417 // (roughly) the cost of using NaCl, in terms of startup time. | 422 // (roughly) the cost of using NaCl, in terms of startup time. |
418 HistogramStartupTimeMedium( | 423 HistogramStartupTimeMedium( |
419 "NaCl.Perf.StartupTime.NaClOverhead", | 424 "NaCl.Perf.StartupTime.NaClOverhead", |
420 static_cast<float>(NaClGetTimeOfDayMicroseconds() - init_time_) | 425 static_cast<float>(NaClGetTimeOfDayMicroseconds() - init_time_) |
(...skipping 27 matching lines...) Expand all Loading... |
448 | 453 |
449 // Do not report UMA stats for translator-related nexes. | 454 // Do not report UMA stats for translator-related nexes. |
450 // TODO(sehr): define new UMA stats for translator related nexe events. | 455 // TODO(sehr): define new UMA stats for translator related nexe events. |
451 // NOTE: The PNaCl translator nexes are not built to use the IRT. This is | 456 // NOTE: The PNaCl translator nexes are not built to use the IRT. This is |
452 // done to save on address space and swap space. | 457 // done to save on address space and swap space. |
453 // TODO(jvoung): See if we still need the uses_ppapi variable, now that | 458 // TODO(jvoung): See if we still need the uses_ppapi variable, now that |
454 // LaunchSelLdr always happens on the main thread. | 459 // LaunchSelLdr always happens on the main thread. |
455 SelLdrStartParams params(manifest_base_url(), | 460 SelLdrStartParams params(manifest_base_url(), |
456 false /* uses_irt */, | 461 false /* uses_irt */, |
457 false /* uses_ppapi */, | 462 false /* uses_ppapi */, |
| 463 false /* uses_nonsfi_mode */, |
458 enable_dev_interfaces_, | 464 enable_dev_interfaces_, |
459 false /* enable_dyncode_syscalls */, | 465 false /* enable_dyncode_syscalls */, |
460 false /* enable_exception_handling */, | 466 false /* enable_exception_handling */, |
461 true /* enable_crash_throttling */); | 467 true /* enable_crash_throttling */); |
462 if (!LoadNaClModuleFromBackgroundThread(wrapper, nacl_subprocess.get(), | 468 if (!LoadNaClModuleFromBackgroundThread(wrapper, nacl_subprocess.get(), |
463 manifest, params)) { | 469 manifest, params)) { |
464 return NULL; | 470 return NULL; |
465 } | 471 } |
466 // We need not wait for the init_done callback. We can block | 472 // We need not wait for the init_done callback. We can block |
467 // here in StartSrpcServices, since helper NaCl modules | 473 // here in StartSrpcServices, since helper NaCl modules |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 } | 585 } |
580 } | 586 } |
581 | 587 |
582 PLUGIN_PRINTF(("Plugin::Init (status=%d)\n", status)); | 588 PLUGIN_PRINTF(("Plugin::Init (status=%d)\n", status)); |
583 return status; | 589 return status; |
584 } | 590 } |
585 | 591 |
586 Plugin::Plugin(PP_Instance pp_instance) | 592 Plugin::Plugin(PP_Instance pp_instance) |
587 : pp::Instance(pp_instance), | 593 : pp::Instance(pp_instance), |
588 main_subprocess_("main subprocess", NULL, NULL), | 594 main_subprocess_("main subprocess", NULL, NULL), |
| 595 uses_nonsfi_mode_(false), |
589 nexe_error_reported_(false), | 596 nexe_error_reported_(false), |
590 wrapper_factory_(NULL), | 597 wrapper_factory_(NULL), |
591 enable_dev_interfaces_(false), | 598 enable_dev_interfaces_(false), |
592 is_installed_(false), | 599 is_installed_(false), |
593 init_time_(0), | 600 init_time_(0), |
594 ready_time_(0), | 601 ready_time_(0), |
595 nexe_size_(0), | 602 nexe_size_(0), |
596 time_of_last_progress_event_(0), | 603 time_of_last_progress_event_(0), |
597 exit_status_(-1), | 604 exit_status_(-1), |
598 nacl_interface_(NULL), | 605 nacl_interface_(NULL), |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 LENGTH_IS_COMPUTABLE, | 760 LENGTH_IS_COMPUTABLE, |
754 nexe_bytes_read, | 761 nexe_bytes_read, |
755 nexe_bytes_read); | 762 nexe_bytes_read); |
756 | 763 |
757 load_start_ = NaClGetTimeOfDayMicroseconds(); | 764 load_start_ = NaClGetTimeOfDayMicroseconds(); |
758 nacl::scoped_ptr<nacl::DescWrapper> | 765 nacl::scoped_ptr<nacl::DescWrapper> |
759 wrapper(wrapper_factory()->MakeFileDesc(file_desc_ok_to_close, O_RDONLY)); | 766 wrapper(wrapper_factory()->MakeFileDesc(file_desc_ok_to_close, O_RDONLY)); |
760 NaClLog(4, "NexeFileDidOpen: invoking LoadNaClModule\n"); | 767 NaClLog(4, "NexeFileDidOpen: invoking LoadNaClModule\n"); |
761 LoadNaClModule( | 768 LoadNaClModule( |
762 wrapper.release(), | 769 wrapper.release(), |
| 770 uses_nonsfi_mode_, |
763 true, /* enable_dyncode_syscalls */ | 771 true, /* enable_dyncode_syscalls */ |
764 true, /* enable_exception_handling */ | 772 true, /* enable_exception_handling */ |
765 false, /* enable_crash_throttling */ | 773 false, /* enable_crash_throttling */ |
766 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), | 774 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), |
767 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); | 775 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); |
768 } | 776 } |
769 | 777 |
770 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { | 778 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { |
771 ErrorInfo error_info; | 779 ErrorInfo error_info; |
772 bool was_successful; | 780 bool was_successful; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 // Error should have been reported by pnacl. Just return. | 878 // Error should have been reported by pnacl. Just return. |
871 PLUGIN_PRINTF(("Plugin::BitcodeDidTranslate error in Pnacl\n")); | 879 PLUGIN_PRINTF(("Plugin::BitcodeDidTranslate error in Pnacl\n")); |
872 return; | 880 return; |
873 } | 881 } |
874 | 882 |
875 // Inform JavaScript that we successfully translated the bitcode to a nexe. | 883 // Inform JavaScript that we successfully translated the bitcode to a nexe. |
876 nacl::scoped_ptr<nacl::DescWrapper> | 884 nacl::scoped_ptr<nacl::DescWrapper> |
877 wrapper(pnacl_coordinator_.get()->ReleaseTranslatedFD()); | 885 wrapper(pnacl_coordinator_.get()->ReleaseTranslatedFD()); |
878 LoadNaClModule( | 886 LoadNaClModule( |
879 wrapper.release(), | 887 wrapper.release(), |
| 888 false, /* uses_nonsfi_mode */ |
880 false, /* enable_dyncode_syscalls */ | 889 false, /* enable_dyncode_syscalls */ |
881 false, /* enable_exception_handling */ | 890 false, /* enable_exception_handling */ |
882 true, /* enable_crash_throttling */ | 891 true, /* enable_crash_throttling */ |
883 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), | 892 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), |
884 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); | 893 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); |
885 } | 894 } |
886 | 895 |
887 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { | 896 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { |
888 ErrorInfo error_info; | 897 ErrorInfo error_info; |
889 bool was_successful = LoadNaClModuleContinuationIntern(&error_info); | 898 bool was_successful = LoadNaClModuleContinuationIntern(&error_info); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 ReportLoadError(error_info); | 1036 ReportLoadError(error_info); |
1028 return; | 1037 return; |
1029 } | 1038 } |
1030 | 1039 |
1031 ProcessNaClManifest(json_buffer); | 1040 ProcessNaClManifest(json_buffer); |
1032 } | 1041 } |
1033 | 1042 |
1034 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { | 1043 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { |
1035 HistogramSizeKB("NaCl.Perf.Size.Manifest", | 1044 HistogramSizeKB("NaCl.Perf.Size.Manifest", |
1036 static_cast<int32_t>(manifest_json.length() / 1024)); | 1045 static_cast<int32_t>(manifest_json.length() / 1024)); |
1037 nacl::string program_url; | |
1038 PnaclOptions pnacl_options; | |
1039 ErrorInfo error_info; | 1046 ErrorInfo error_info; |
1040 if (!SetManifestObject(manifest_json, &error_info)) { | 1047 if (!SetManifestObject(manifest_json, &error_info)) { |
1041 ReportLoadError(error_info); | 1048 ReportLoadError(error_info); |
1042 return; | 1049 return; |
1043 } | 1050 } |
1044 | 1051 |
1045 if (manifest_->GetProgramURL(&program_url, &pnacl_options, &error_info)) { | 1052 nacl::string program_url; |
| 1053 PnaclOptions pnacl_options; |
| 1054 bool uses_nonsfi_mode; |
| 1055 if (manifest_->GetProgramURL( |
| 1056 &program_url, &pnacl_options, &uses_nonsfi_mode, &error_info)) { |
1046 is_installed_ = GetUrlScheme(program_url) == SCHEME_CHROME_EXTENSION; | 1057 is_installed_ = GetUrlScheme(program_url) == SCHEME_CHROME_EXTENSION; |
| 1058 uses_nonsfi_mode_ = uses_nonsfi_mode; |
1047 set_nacl_ready_state(LOADING); | 1059 set_nacl_ready_state(LOADING); |
1048 // Inform JavaScript that we found a nexe URL to load. | 1060 // Inform JavaScript that we found a nexe URL to load. |
1049 EnqueueProgressEvent(PP_NACL_EVENT_PROGRESS); | 1061 EnqueueProgressEvent(PP_NACL_EVENT_PROGRESS); |
1050 if (pnacl_options.translate()) { | 1062 if (pnacl_options.translate()) { |
1051 pp::CompletionCallback translate_callback = | 1063 pp::CompletionCallback translate_callback = |
1052 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate); | 1064 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate); |
1053 // Will always call the callback on success or failure. | 1065 // Will always call the callback on success or failure. |
1054 pnacl_coordinator_.reset( | 1066 pnacl_coordinator_.reset( |
1055 PnaclCoordinator::BitcodeToNative(this, | 1067 PnaclCoordinator::BitcodeToNative(this, |
1056 program_url, | 1068 program_url, |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 | 1142 |
1131 bool Plugin::SetManifestObject(const nacl::string& manifest_json, | 1143 bool Plugin::SetManifestObject(const nacl::string& manifest_json, |
1132 ErrorInfo* error_info) { | 1144 ErrorInfo* error_info) { |
1133 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", | 1145 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", |
1134 manifest_json.c_str())); | 1146 manifest_json.c_str())); |
1135 if (error_info == NULL) | 1147 if (error_info == NULL) |
1136 return false; | 1148 return false; |
1137 // Determine whether lookups should use portable (i.e., pnacl versions) | 1149 // Determine whether lookups should use portable (i.e., pnacl versions) |
1138 // rather than platform-specific files. | 1150 // rather than platform-specific files. |
1139 bool is_pnacl = (mime_type() == kPnaclMIMEType); | 1151 bool is_pnacl = (mime_type() == kPnaclMIMEType); |
| 1152 bool nonsfi_mode_enabled = |
| 1153 PP_ToBool(nacl_interface_->IsNonSFIModeEnabled()); |
1140 bool pnacl_debug = GetNaClInterface()->NaClDebugStubEnabled(); | 1154 bool pnacl_debug = GetNaClInterface()->NaClDebugStubEnabled(); |
1141 nacl::scoped_ptr<JsonManifest> json_manifest( | 1155 nacl::scoped_ptr<JsonManifest> json_manifest( |
1142 new JsonManifest(url_util_, | 1156 new JsonManifest(url_util_, |
1143 manifest_base_url(), | 1157 manifest_base_url(), |
1144 (is_pnacl ? kPortableISA : GetSandboxISA()), | 1158 (is_pnacl ? kPortableISA : GetSandboxISA()), |
| 1159 nonsfi_mode_enabled, |
1145 pnacl_debug)); | 1160 pnacl_debug)); |
1146 if (!json_manifest->Init(manifest_json, error_info)) { | 1161 if (!json_manifest->Init(manifest_json, error_info)) { |
1147 return false; | 1162 return false; |
1148 } | 1163 } |
1149 manifest_.reset(json_manifest.release()); | 1164 manifest_.reset(json_manifest.release()); |
1150 return true; | 1165 return true; |
1151 } | 1166 } |
1152 | 1167 |
1153 void Plugin::UrlDidOpenForStreamAsFile(int32_t pp_error, | 1168 void Plugin::UrlDidOpenForStreamAsFile(int32_t pp_error, |
1154 FileDownloader*& url_downloader, | 1169 FileDownloader*& url_downloader, |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1479 DCHECK(pp::Module::Get()->core()->IsMainThread()); | 1494 DCHECK(pp::Module::Get()->core()->IsMainThread()); |
1480 DCHECK(nacl_interface_); | 1495 DCHECK(nacl_interface_); |
1481 exit_status_ = exit_status; | 1496 exit_status_ = exit_status; |
1482 nacl_interface_->SetReadOnlyProperty(pp_instance(), | 1497 nacl_interface_->SetReadOnlyProperty(pp_instance(), |
1483 pp::Var("exitStatus").pp_var(), | 1498 pp::Var("exitStatus").pp_var(), |
1484 pp::Var(exit_status_).pp_var()); | 1499 pp::Var(exit_status_).pp_var()); |
1485 } | 1500 } |
1486 | 1501 |
1487 | 1502 |
1488 } // namespace plugin | 1503 } // namespace plugin |
OLD | NEW |