Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: ppapi/native_client/src/trusted/plugin/plugin.cc

Issue 8974020: Change pnacl to read all resources from the extension. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "native_client/src/trusted/plugin/plugin.h" 10 #include "native_client/src/trusted/plugin/plugin.h"
(...skipping 848 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 // destroyed. 859 // destroyed.
860 const char* event_type_; 860 const char* event_type_;
861 nacl::string url_; 861 nacl::string url_;
862 Plugin::LengthComputable length_computable_; 862 Plugin::LengthComputable length_computable_;
863 uint64_t loaded_bytes_; 863 uint64_t loaded_bytes_;
864 uint64_t total_bytes_; 864 uint64_t total_bytes_;
865 }; 865 };
866 866
867 const char* const Plugin::kNaClMIMEType = "application/x-nacl"; 867 const char* const Plugin::kNaClMIMEType = "application/x-nacl";
868 868
869 bool Plugin::IsForeignMIMEType() const { 869 bool Plugin::NexeIsContentHandler() const {
870 // Tests if the MIME type is not a NaCl MIME type.
871 // If the MIME type is foreign, then this NEXE is being used as a content
872 // type handler rather than directly by an HTML document.
870 return 873 return
871 !mime_type().empty() && 874 !mime_type().empty() &&
872 mime_type() != kNaClMIMEType; 875 mime_type() != kNaClMIMEType;
873 } 876 }
874 877
875 878
876 Plugin* Plugin::New(PP_Instance pp_instance) { 879 Plugin* Plugin::New(PP_Instance pp_instance) {
877 PLUGIN_PRINTF(("Plugin::New (pp_instance=%"NACL_PRId32")\n", pp_instance)); 880 PLUGIN_PRINTF(("Plugin::New (pp_instance=%"NACL_PRId32")\n", pp_instance));
878 #if NACL_WINDOWS && !defined(NACL_STANDALONE) 881 #if NACL_WINDOWS && !defined(NACL_STANDALONE)
879 if (!NaClHandlePassBrowserCtor()) { 882 if (!NaClHandlePassBrowserCtor()) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 enable_dev_interfaces_ = (dev_settings != NULL); 932 enable_dev_interfaces_ = (dev_settings != NULL);
930 933
931 const char* type_attr = LookupArgument(kTypeAttribute); 934 const char* type_attr = LookupArgument(kTypeAttribute);
932 if (type_attr != NULL) { 935 if (type_attr != NULL) {
933 mime_type_ = nacl::string(type_attr); 936 mime_type_ = nacl::string(type_attr);
934 std::transform(mime_type_.begin(), mime_type_.end(), mime_type_.begin(), 937 std::transform(mime_type_.begin(), mime_type_.end(), mime_type_.begin(),
935 tolower); 938 tolower);
936 } 939 }
937 940
938 const char* manifest_url = LookupArgument(kSrcManifestAttribute); 941 const char* manifest_url = LookupArgument(kSrcManifestAttribute);
939 // If the MIME type is foreign, then 'src' will be the URL for the content 942 if (NexeIsContentHandler()) {
940 // and 'nacl' will be the URL for the manifest. 943 // For content handlers 'src' will be the URL for the content
941 if (IsForeignMIMEType()) { 944 // and 'nacl' will be the URL for the manifest.
942 manifest_url = LookupArgument(kNaClManifestAttribute); 945 manifest_url = LookupArgument(kNaClManifestAttribute);
946 // For content handlers the NEXE runs in the security context of the
947 // content it is rendering and the NEXE itself appears to be a
948 // cross-origin resource stored in a Chrome extension. We request
949 // universal access during the NEXE load so that we can read the NEXE.
943 } 950 }
944 // Use the document URL as the base for resolving relative URLs to find the 951 // Use the document URL as the base for resolving relative URLs to find the
945 // manifest. This takes into account the setting of <base> tags that 952 // manifest. This takes into account the setting of <base> tags that
946 // precede the embed/object. 953 // precede the embed/object.
947 CHECK(url_util_ != NULL); 954 CHECK(url_util_ != NULL);
948 pp::Var base_var = url_util_->GetDocumentURL(*this); 955 pp::Var base_var = url_util_->GetDocumentURL(*this);
949 if (!base_var.is_string()) { 956 if (!base_var.is_string()) {
950 PLUGIN_PRINTF(("Plugin::Init (unable to find document url)\n")); 957 PLUGIN_PRINTF(("Plugin::Init (unable to find document url)\n"));
951 return false; 958 return false;
952 } 959 }
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 program_url, 1636 program_url,
1630 translate_callback)); 1637 translate_callback));
1631 return; 1638 return;
1632 } else { 1639 } else {
1633 pp::CompletionCallback open_callback = 1640 pp::CompletionCallback open_callback =
1634 callback_factory_.NewRequiredCallback(&Plugin::NexeFileDidOpen); 1641 callback_factory_.NewRequiredCallback(&Plugin::NexeFileDidOpen);
1635 // Will always call the callback on success or failure. 1642 // Will always call the callback on success or failure.
1636 CHECK( 1643 CHECK(
1637 nexe_downloader_.Open(program_url, 1644 nexe_downloader_.Open(program_url,
1638 DOWNLOAD_TO_FILE, 1645 DOWNLOAD_TO_FILE,
1646 NexeIsContentHandler(),
1639 open_callback, 1647 open_callback,
1640 &UpdateDownloadProgress)); 1648 &UpdateDownloadProgress));
1641 return; 1649 return;
1642 } 1650 }
1643 } 1651 }
1644 // Failed to select the program and/or the translator. 1652 // Failed to select the program and/or the translator.
1645 ReportLoadError(error_info); 1653 ReportLoadError(error_info);
1646 } 1654 }
1647 1655
1648 void Plugin::RequestNaClManifest(const nacl::string& url) { 1656 void Plugin::RequestNaClManifest(const nacl::string& url) {
(...skipping 21 matching lines...) Expand all
1670 set_nacl_ready_state(OPENED); 1678 set_nacl_ready_state(OPENED);
1671 EnqueueProgressEvent(kProgressEventLoadStart); 1679 EnqueueProgressEvent(kProgressEventLoadStart);
1672 bool is_data_uri = GetUrlScheme(nmf_resolved_url.AsString()) == SCHEME_DATA; 1680 bool is_data_uri = GetUrlScheme(nmf_resolved_url.AsString()) == SCHEME_DATA;
1673 HistogramEnumerateManifestIsDataURI(static_cast<int>(is_data_uri)); 1681 HistogramEnumerateManifestIsDataURI(static_cast<int>(is_data_uri));
1674 if (is_data_uri) { 1682 if (is_data_uri) {
1675 pp::CompletionCallback open_callback = 1683 pp::CompletionCallback open_callback =
1676 callback_factory_.NewRequiredCallback(&Plugin::NaClManifestBufferReady); 1684 callback_factory_.NewRequiredCallback(&Plugin::NaClManifestBufferReady);
1677 // Will always call the callback on success or failure. 1685 // Will always call the callback on success or failure.
1678 CHECK(nexe_downloader_.Open(nmf_resolved_url.AsString(), 1686 CHECK(nexe_downloader_.Open(nmf_resolved_url.AsString(),
1679 DOWNLOAD_TO_BUFFER, 1687 DOWNLOAD_TO_BUFFER,
1688 NexeIsContentHandler(),
1680 open_callback, 1689 open_callback,
1681 NULL)); 1690 NULL));
1682 } else { 1691 } else {
1683 pp::CompletionCallback open_callback = 1692 pp::CompletionCallback open_callback =
1684 callback_factory_.NewRequiredCallback(&Plugin::NaClManifestFileDidOpen); 1693 callback_factory_.NewRequiredCallback(&Plugin::NaClManifestFileDidOpen);
1685 // Will always call the callback on success or failure. 1694 // Will always call the callback on success or failure.
1686 CHECK(nexe_downloader_.Open(nmf_resolved_url.AsString(), 1695 CHECK(nexe_downloader_.Open(nmf_resolved_url.AsString(),
1687 DOWNLOAD_TO_FILE, 1696 DOWNLOAD_TO_FILE,
1697 NexeIsContentHandler(),
1688 open_callback, 1698 open_callback,
1689 NULL)); 1699 NULL));
1690 } 1700 }
1691 } 1701 }
1692 1702
1693 1703
1694 bool Plugin::SetManifestObject(const nacl::string& manifest_json, 1704 bool Plugin::SetManifestObject(const nacl::string& manifest_json,
1695 ErrorInfo* error_info) { 1705 ErrorInfo* error_info) {
1696 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", 1706 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n",
1697 manifest_json.c_str())); 1707 manifest_json.c_str()));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 PLUGIN_PRINTF(("Plugin::GetFileDesc (url=%s)\n", url.c_str())); 1758 PLUGIN_PRINTF(("Plugin::GetFileDesc (url=%s)\n", url.c_str()));
1749 int32_t file_desc_ok_to_close = NACL_NO_FILE_DESC; 1759 int32_t file_desc_ok_to_close = NACL_NO_FILE_DESC;
1750 std::map<nacl::string, int32_t>::iterator it = url_fd_map_.find(url); 1760 std::map<nacl::string, int32_t>::iterator it = url_fd_map_.find(url);
1751 if (it != url_fd_map_.end()) 1761 if (it != url_fd_map_.end())
1752 file_desc_ok_to_close = DUP(it->second); 1762 file_desc_ok_to_close = DUP(it->second);
1753 return file_desc_ok_to_close; 1763 return file_desc_ok_to_close;
1754 } 1764 }
1755 1765
1756 1766
1757 bool Plugin::StreamAsFile(const nacl::string& url, 1767 bool Plugin::StreamAsFile(const nacl::string& url,
1768 bool permits_extension_urls,
1758 PP_CompletionCallback callback) { 1769 PP_CompletionCallback callback) {
1759 PLUGIN_PRINTF(("Plugin::StreamAsFile (url='%s')\n", url.c_str())); 1770 PLUGIN_PRINTF(("Plugin::StreamAsFile (url='%s', permits_extension_urls=%d)\n",
1771 url.c_str(), permits_extension_urls));
1760 FileDownloader* downloader = new FileDownloader(); 1772 FileDownloader* downloader = new FileDownloader();
1761 downloader->Initialize(this); 1773 downloader->Initialize(this);
1762 url_downloaders_.insert(downloader); 1774 url_downloaders_.insert(downloader);
1763 pp::CompletionCallback open_callback = 1775 pp::CompletionCallback open_callback =
1764 callback_factory_.NewRequiredCallback( 1776 callback_factory_.NewRequiredCallback(
1765 &Plugin::UrlDidOpenForStreamAsFile, downloader, callback); 1777 &Plugin::UrlDidOpenForStreamAsFile, downloader, callback);
1766 // Untrusted loads are always relative to the page's origin. 1778 // Untrusted loads are always relative to the page's origin.
1767 CHECK(url_util_ != NULL); 1779 CHECK(url_util_ != NULL);
1768 pp::Var resolved_url = 1780 pp::Var resolved_url =
1769 url_util_->ResolveRelativeToURL(pp::Var(plugin_base_url()), url); 1781 url_util_->ResolveRelativeToURL(pp::Var(plugin_base_url()), url);
1770 if (!resolved_url.is_string()) { 1782 if (!resolved_url.is_string()) {
1771 PLUGIN_PRINTF(("Plugin::StreamAsFile: " 1783 PLUGIN_PRINTF(("Plugin::StreamAsFile: "
1772 "could not resolve url \"%s\" relative to plugin \"%s\".", 1784 "could not resolve url \"%s\" relative to plugin \"%s\".",
1773 url.c_str(), 1785 url.c_str(),
1774 plugin_base_url().c_str())); 1786 plugin_base_url().c_str()));
1775 return false; 1787 return false;
1776 } 1788 }
1777 // If true, will always call the callback on success or failure. 1789 // If true, will always call the callback on success or failure.
1778 return downloader->Open(url, 1790 return downloader->Open(url,
1779 DOWNLOAD_TO_FILE, 1791 DOWNLOAD_TO_FILE,
1792 permits_extension_urls || NexeIsContentHandler(),
1780 open_callback, 1793 open_callback,
1781 &UpdateDownloadProgress); 1794 &UpdateDownloadProgress);
1782 } 1795 }
1783 1796
1784 #ifndef HACK_FOR_MACOS_HANG_REMOVED 1797 #ifndef HACK_FOR_MACOS_HANG_REMOVED
1785 // The following is needed to avoid a plugin startup hang in the 1798 // The following is needed to avoid a plugin startup hang in the
1786 // MacOS "chrome_browser_tests under gyp" stage. 1799 // MacOS "chrome_browser_tests under gyp" stage.
1787 // TODO(sehr,mseaborn): remove this hack. 1800 // TODO(sehr,mseaborn): remove this hack.
1788 void (plugin::Plugin::*pmem)(int32_t, 1801 void (plugin::Plugin::*pmem)(int32_t,
1789 plugin::FileDownloader*&, 1802 plugin::FileDownloader*&,
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
2044 std::string scheme = canonicalized.AsString().substr(comps.scheme.begin, 2057 std::string scheme = canonicalized.AsString().substr(comps.scheme.begin,
2045 comps.scheme.len); 2058 comps.scheme.len);
2046 if (scheme == kChromeExtensionUriScheme) 2059 if (scheme == kChromeExtensionUriScheme)
2047 return SCHEME_CHROME_EXTENSION; 2060 return SCHEME_CHROME_EXTENSION;
2048 if (scheme == kDataUriScheme) 2061 if (scheme == kDataUriScheme)
2049 return SCHEME_DATA; 2062 return SCHEME_DATA;
2050 return SCHEME_OTHER; 2063 return SCHEME_OTHER;
2051 } 2064 }
2052 2065
2053 } // namespace plugin 2066 } // namespace plugin
OLDNEW
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/plugin.h ('k') | ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698