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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 #ifdef NACL_OSX | 112 #ifdef NACL_OSX |
113 // TODO(kochi): For crbug.com/102808, this is a stopgap solution for Lion | 113 // TODO(kochi): For crbug.com/102808, this is a stopgap solution for Lion |
114 // until we expose IME API to .nexe. This disables any IME interference | 114 // until we expose IME API to .nexe. This disables any IME interference |
115 // against key inputs, so you cannot use off-the-spot IME input for NaCl apps. | 115 // against key inputs, so you cannot use off-the-spot IME input for NaCl apps. |
116 // This makes discrepancy among platforms and therefore we should remove | 116 // This makes discrepancy among platforms and therefore we should remove |
117 // this hack when IME API is made available. | 117 // this hack when IME API is made available. |
118 // The default for non-Mac platforms is still off-the-spot IME mode. | 118 // The default for non-Mac platforms is still off-the-spot IME mode. |
119 pp::TextInputController(this).SetTextInputType(PP_TEXTINPUT_TYPE_NONE); | 119 pp::TextInputController(this).SetTextInputType(PP_TEXTINPUT_TYPE_NONE); |
120 #endif | 120 #endif |
121 | 121 |
122 // Remember the embed/object argn/argv pairs. | |
123 argn_ = new char*[argc]; | |
124 argv_ = new char*[argc]; | |
125 argc_ = 0; | |
126 for (int i = 0; i < argc; ++i) { | 122 for (int i = 0; i < argc; ++i) { |
127 if (NULL != argn_ && NULL != argv_) { | 123 std::string name(argn[i]); |
128 argn_[argc_] = strdup(argn[i]); | 124 std::string value(argv[i]); |
dmichael (off chromium)
2014/02/12 22:06:46
nit: arguably, you could not have these temp varia
| |
129 argv_[argc_] = strdup(argv[i]); | 125 args_[name] = value; |
130 if (NULL == argn_[argc_] || NULL == argv_[argc_]) { | |
131 // Give up on passing arguments. | |
132 free(argn_[argc_]); | |
133 free(argv_[argc_]); | |
134 continue; | |
135 } | |
136 ++argc_; | |
137 } | |
138 } | 126 } |
139 // TODO(sehr): this leaks strings if there is a subsequent failure. | |
140 | 127 |
141 // Set up the factory used to produce DescWrappers. | 128 // Set up the factory used to produce DescWrappers. |
142 wrapper_factory_ = new nacl::DescWrapperFactory(); | 129 wrapper_factory_ = new nacl::DescWrapperFactory(); |
143 if (NULL == wrapper_factory_) { | 130 if (NULL == wrapper_factory_) { |
144 return false; | 131 return false; |
145 } | 132 } |
146 PLUGIN_PRINTF(("Plugin::Init (wrapper_factory=%p)\n", | 133 PLUGIN_PRINTF(("Plugin::Init (wrapper_factory=%p)\n", |
147 static_cast<void*>(wrapper_factory_))); | 134 static_cast<void*>(wrapper_factory_))); |
148 | 135 |
149 PLUGIN_PRINTF(("Plugin::Init (return 1)\n")); | 136 PLUGIN_PRINTF(("Plugin::Init (return 1)\n")); |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
491 nacl_subprocess->description()); | 478 nacl_subprocess->description()); |
492 return NULL; | 479 return NULL; |
493 } | 480 } |
494 | 481 |
495 PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule (%s)\n", | 482 PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule (%s)\n", |
496 nacl_subprocess.get()->detailed_description().c_str())); | 483 nacl_subprocess.get()->detailed_description().c_str())); |
497 | 484 |
498 return nacl_subprocess.release(); | 485 return nacl_subprocess.release(); |
499 } | 486 } |
500 | 487 |
501 char* Plugin::LookupArgument(const char* key) { | 488 std::string Plugin::LookupArgument(const std::string& key) const { |
502 char** keys = argn_; | 489 std::map<std::string, std::string>::const_iterator it = args_.find(key); |
503 for (int ii = 0, len = argc_; ii < len; ++ii) { | 490 if (it != args_.end()) |
504 if (!strcmp(keys[ii], key)) { | 491 return it->second; |
505 return argv_[ii]; | |
506 } | |
507 } | |
508 return NULL; | 492 return NULL; |
dmichael (off chromium)
2014/02/12 22:06:46
I think it would be clearer to return std::string(
| |
509 } | 493 } |
510 | 494 |
511 const char* const Plugin::kNaClMIMEType = "application/x-nacl"; | 495 const char* const Plugin::kNaClMIMEType = "application/x-nacl"; |
512 const char* const Plugin::kPnaclMIMEType = "application/x-pnacl"; | 496 const char* const Plugin::kPnaclMIMEType = "application/x-pnacl"; |
513 | 497 |
514 bool Plugin::NexeIsContentHandler() const { | 498 bool Plugin::NexeIsContentHandler() const { |
515 // Tests if the MIME type is not a NaCl MIME type. | 499 // Tests if the MIME type is not a NaCl MIME type. |
516 // If the MIME type is foreign, then this NEXE is being used as a content | 500 // If the MIME type is foreign, then this NEXE is being used as a content |
517 // type handler rather than directly by an HTML document. | 501 // type handler rather than directly by an HTML document. |
518 return | 502 return |
(...skipping 30 matching lines...) Expand all Loading... | |
549 if (url_util_ == NULL) | 533 if (url_util_ == NULL) |
550 return false; | 534 return false; |
551 | 535 |
552 PLUGIN_PRINTF(("Plugin::Init (url_util_=%p)\n", | 536 PLUGIN_PRINTF(("Plugin::Init (url_util_=%p)\n", |
553 static_cast<const void*>(url_util_))); | 537 static_cast<const void*>(url_util_))); |
554 | 538 |
555 bool status = EarlyInit(static_cast<int>(argc), argn, argv); | 539 bool status = EarlyInit(static_cast<int>(argc), argn, argv); |
556 if (status) { | 540 if (status) { |
557 // Look for the developer attribute; if it's present, enable 'dev' | 541 // Look for the developer attribute; if it's present, enable 'dev' |
558 // interfaces. | 542 // interfaces. |
559 const char* dev_settings = LookupArgument(kDevAttribute); | 543 enable_dev_interfaces_ = args_.find(kDevAttribute) != args_.end(); |
560 enable_dev_interfaces_ = (dev_settings != NULL); | |
561 | 544 |
562 const char* type_attr = LookupArgument(kTypeAttribute); | 545 mime_type_ = LookupArgument(kTypeAttribute); |
563 if (type_attr != NULL) { | 546 std::transform(mime_type_.begin(), mime_type_.end(), mime_type_.begin(), |
564 mime_type_ = nacl::string(type_attr); | 547 tolower); |
565 std::transform(mime_type_.begin(), mime_type_.end(), mime_type_.begin(), | |
566 tolower); | |
567 } | |
568 | 548 |
569 const char* manifest_url = LookupArgument(kSrcManifestAttribute); | 549 std::string manifest_url; |
570 if (NexeIsContentHandler()) { | 550 if (NexeIsContentHandler()) { |
571 // For content handlers 'src' will be the URL for the content | 551 // For content handlers 'src' will be the URL for the content |
572 // and 'nacl' will be the URL for the manifest. | 552 // and 'nacl' will be the URL for the manifest. |
573 manifest_url = LookupArgument(kNaClManifestAttribute); | 553 manifest_url = LookupArgument(kNaClManifestAttribute); |
574 // For content handlers the NEXE runs in the security context of the | 554 // For content handlers the NEXE runs in the security context of the |
575 // content it is rendering and the NEXE itself appears to be a | 555 // content it is rendering and the NEXE itself appears to be a |
576 // cross-origin resource stored in a Chrome extension. | 556 // cross-origin resource stored in a Chrome extension. |
557 } else { | |
558 manifest_url = LookupArgument(kSrcManifestAttribute); | |
577 } | 559 } |
578 // Use the document URL as the base for resolving relative URLs to find the | 560 // Use the document URL as the base for resolving relative URLs to find the |
579 // manifest. This takes into account the setting of <base> tags that | 561 // manifest. This takes into account the setting of <base> tags that |
580 // precede the embed/object. | 562 // precede the embed/object. |
581 CHECK(url_util_ != NULL); | 563 CHECK(url_util_ != NULL); |
582 pp::Var base_var = url_util_->GetDocumentURL(this); | 564 pp::Var base_var = url_util_->GetDocumentURL(this); |
583 if (!base_var.is_string()) { | 565 if (!base_var.is_string()) { |
584 PLUGIN_PRINTF(("Plugin::Init (unable to find document url)\n")); | 566 PLUGIN_PRINTF(("Plugin::Init (unable to find document url)\n")); |
585 return false; | 567 return false; |
586 } | 568 } |
587 set_plugin_base_url(base_var.AsString()); | 569 set_plugin_base_url(base_var.AsString()); |
588 if (manifest_url == NULL) { | 570 if (manifest_url.empty()) { |
589 // TODO(sehr,polina): this should be a hard error when scripting | 571 // TODO(sehr,polina): this should be a hard error when scripting |
590 // the src property is no longer allowed. | 572 // the src property is no longer allowed. |
591 PLUGIN_PRINTF(("Plugin::Init:" | 573 PLUGIN_PRINTF(("Plugin::Init:" |
592 " WARNING: no 'src' property, so no manifest loaded.\n")); | 574 " WARNING: no 'src' property, so no manifest loaded.\n")); |
593 if (NULL != LookupArgument(kNaClManifestAttribute)) { | 575 if (args_.find(kNaClManifestAttribute) != args_.end()) { |
594 PLUGIN_PRINTF(("Plugin::Init:" | 576 PLUGIN_PRINTF(("Plugin::Init:" |
595 " WARNING: 'nacl' property is incorrect. Use 'src'.\n")); | 577 " WARNING: 'nacl' property is incorrect. Use 'src'.\n")); |
596 } | 578 } |
597 } else { | 579 } else { |
598 // Issue a GET for the manifest_url. The manifest file will be parsed to | 580 // Issue a GET for the manifest_url. The manifest file will be parsed to |
599 // determine the nexe URL. | 581 // determine the nexe URL. |
600 // Sets src property to full manifest URL. | 582 // Sets src property to full manifest URL. |
601 RequestNaClManifest(manifest_url); | 583 RequestNaClManifest(manifest_url.c_str()); |
602 } | 584 } |
603 } | 585 } |
604 | 586 |
605 PLUGIN_PRINTF(("Plugin::Init (status=%d)\n", status)); | 587 PLUGIN_PRINTF(("Plugin::Init (status=%d)\n", status)); |
606 return status; | 588 return status; |
607 } | 589 } |
608 | 590 |
609 Plugin::Plugin(PP_Instance pp_instance) | 591 Plugin::Plugin(PP_Instance pp_instance) |
610 : pp::InstancePrivate(pp_instance), | 592 : pp::InstancePrivate(pp_instance), |
611 scriptable_plugin_(NULL), | 593 scriptable_plugin_(NULL), |
612 argc_(-1), | |
613 argn_(NULL), | |
614 argv_(NULL), | |
615 main_subprocess_("main subprocess", NULL, NULL), | 594 main_subprocess_("main subprocess", NULL, NULL), |
616 nexe_error_reported_(false), | 595 nexe_error_reported_(false), |
617 wrapper_factory_(NULL), | 596 wrapper_factory_(NULL), |
618 enable_dev_interfaces_(false), | 597 enable_dev_interfaces_(false), |
619 is_installed_(false), | 598 is_installed_(false), |
620 init_time_(0), | 599 init_time_(0), |
621 ready_time_(0), | 600 ready_time_(0), |
622 nexe_size_(0), | 601 nexe_size_(0), |
623 time_of_last_progress_event_(0), | 602 time_of_last_progress_event_(0), |
624 exit_status_(-1), | 603 exit_status_(-1), |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
684 // threads. | 663 // threads. |
685 // | 664 // |
686 // The main_subprocess object, which wraps the main service_runtime | 665 // The main_subprocess object, which wraps the main service_runtime |
687 // object, is dtor'd implicitly after the explicit code below runs, | 666 // object, is dtor'd implicitly after the explicit code below runs, |
688 // so the main service runtime object will not have been dtor'd, | 667 // so the main service runtime object will not have been dtor'd, |
689 // though the Shutdown method may have been called, during the | 668 // though the Shutdown method may have been called, during the |
690 // lifetime of the service threads. | 669 // lifetime of the service threads. |
691 ShutDownSubprocesses(); | 670 ShutDownSubprocesses(); |
692 | 671 |
693 delete wrapper_factory_; | 672 delete wrapper_factory_; |
694 delete[] argv_; | |
695 delete[] argn_; | |
696 | 673 |
697 HistogramTimeSmall( | 674 HistogramTimeSmall( |
698 "NaCl.Perf.ShutdownTime.Total", | 675 "NaCl.Perf.ShutdownTime.Total", |
699 (NaClGetTimeOfDayMicroseconds() - shutdown_start) | 676 (NaClGetTimeOfDayMicroseconds() - shutdown_start) |
700 / NACL_MICROS_PER_MILLI); | 677 / NACL_MICROS_PER_MILLI); |
701 | 678 |
702 PLUGIN_PRINTF(("Plugin::~Plugin (this=%p, return)\n", | 679 PLUGIN_PRINTF(("Plugin::~Plugin (this=%p, return)\n", |
703 static_cast<void*>(this))); | 680 static_cast<void*>(this))); |
704 } | 681 } |
705 | 682 |
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1529 DCHECK(pp::Module::Get()->core()->IsMainThread()); | 1506 DCHECK(pp::Module::Get()->core()->IsMainThread()); |
1530 DCHECK(nacl_interface_); | 1507 DCHECK(nacl_interface_); |
1531 exit_status_ = exit_status; | 1508 exit_status_ = exit_status; |
1532 nacl_interface_->SetReadOnlyProperty(pp_instance(), | 1509 nacl_interface_->SetReadOnlyProperty(pp_instance(), |
1533 pp::Var("exitStatus").pp_var(), | 1510 pp::Var("exitStatus").pp_var(), |
1534 pp::Var(exit_status_).pp_var()); | 1511 pp::Var(exit_status_).pp_var()); |
1535 } | 1512 } |
1536 | 1513 |
1537 | 1514 |
1538 } // namespace plugin | 1515 } // namespace plugin |
OLD | NEW |