Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "components/nacl/renderer/ppb_nacl_private_impl.h" | 5 #include "components/nacl/renderer/ppb_nacl_private_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/containers/scoped_ptr_hash_map.h" | 10 #include "base/containers/scoped_ptr_hash_map.h" |
| 11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/rand_util.h" | 13 #include "base/rand_util.h" |
| 14 #include "components/nacl/common/nacl_host_messages.h" | 14 #include "components/nacl/common/nacl_host_messages.h" |
| 15 #include "components/nacl/common/nacl_messages.h" | 15 #include "components/nacl/common/nacl_messages.h" |
| 16 #include "components/nacl/common/nacl_switches.h" | 16 #include "components/nacl/common/nacl_switches.h" |
| 17 #include "components/nacl/common/nacl_types.h" | 17 #include "components/nacl/common/nacl_types.h" |
| 18 #include "components/nacl/renderer/json_manifest.h" | |
| 18 #include "components/nacl/renderer/manifest_service_channel.h" | 19 #include "components/nacl/renderer/manifest_service_channel.h" |
| 19 #include "components/nacl/renderer/nexe_load_manager.h" | 20 #include "components/nacl/renderer/nexe_load_manager.h" |
| 20 #include "components/nacl/renderer/pnacl_translation_resource_host.h" | 21 #include "components/nacl/renderer/pnacl_translation_resource_host.h" |
| 21 #include "components/nacl/renderer/sandbox_arch.h" | 22 #include "components/nacl/renderer/sandbox_arch.h" |
| 22 #include "components/nacl/renderer/trusted_plugin_channel.h" | 23 #include "components/nacl/renderer/trusted_plugin_channel.h" |
| 23 #include "content/public/common/content_client.h" | 24 #include "content/public/common/content_client.h" |
| 24 #include "content/public/common/content_switches.h" | 25 #include "content/public/common/content_switches.h" |
| 25 #include "content/public/common/sandbox_init.h" | 26 #include "content/public/common/sandbox_init.h" |
| 26 #include "content/public/renderer/pepper_plugin_instance.h" | 27 #include "content/public/renderer/pepper_plugin_instance.h" |
| 27 #include "content/public/renderer/render_thread.h" | 28 #include "content/public/renderer/render_thread.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 | 75 |
| 75 base::LazyInstance<InstanceInfoMap> g_instance_info = | 76 base::LazyInstance<InstanceInfoMap> g_instance_info = |
| 76 LAZY_INSTANCE_INITIALIZER; | 77 LAZY_INSTANCE_INITIALIZER; |
| 77 | 78 |
| 78 typedef base::ScopedPtrHashMap<PP_Instance, NexeLoadManager> | 79 typedef base::ScopedPtrHashMap<PP_Instance, NexeLoadManager> |
| 79 NexeLoadManagerMap; | 80 NexeLoadManagerMap; |
| 80 | 81 |
| 81 base::LazyInstance<NexeLoadManagerMap> g_load_manager_map = | 82 base::LazyInstance<NexeLoadManagerMap> g_load_manager_map = |
| 82 LAZY_INSTANCE_INITIALIZER; | 83 LAZY_INSTANCE_INITIALIZER; |
| 83 | 84 |
| 84 NexeLoadManager* GetNexeLoadManager(PP_Instance instance) { | 85 typedef base::ScopedPtrHashMap<int32_t, nacl::JsonManifest> JsonManifestMap; |
| 86 | |
| 87 base::LazyInstance<JsonManifestMap> g_manifest_map = | |
| 88 LAZY_INSTANCE_INITIALIZER; | |
| 89 | |
| 90 const int kPNaClManifestId = 0; | |
|
bbudge
2014/05/01 23:32:33
Could you make this the largest int32?
teravest
2014/05/02 14:23:15
Done.
| |
| 91 int g_next_manifest_id = 1; // Hmm. | |
|
bbudge
2014/05/01 23:32:33
Then this could start at 0.
teravest
2014/05/02 14:23:15
Done. That's better, thanks.
| |
| 92 | |
| 93 nacl::NexeLoadManager* GetNexeLoadManager(PP_Instance instance) { | |
| 85 NexeLoadManagerMap& map = g_load_manager_map.Get(); | 94 NexeLoadManagerMap& map = g_load_manager_map.Get(); |
| 86 NexeLoadManagerMap::iterator iter = map.find(instance); | 95 NexeLoadManagerMap::iterator iter = map.find(instance); |
| 87 if (iter != map.end()) | 96 if (iter != map.end()) |
| 88 return iter->second; | 97 return iter->second; |
| 89 return NULL; | 98 return NULL; |
| 90 } | 99 } |
| 91 | 100 |
| 92 int GetRoutingID(PP_Instance instance) { | 101 int GetRoutingID(PP_Instance instance) { |
| 93 // Check that we are on the main renderer thread. | 102 // Check that we are on the main renderer thread. |
| 94 DCHECK(content::RenderThread::Get()); | 103 DCHECK(content::RenderThread::Get()); |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 844 return PP_FALSE; | 853 return PP_FALSE; |
| 845 } | 854 } |
| 846 | 855 |
| 847 PP_Bool DevInterfacesEnabled(PP_Instance instance) { | 856 PP_Bool DevInterfacesEnabled(PP_Instance instance) { |
| 848 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 857 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 849 if (load_manager) | 858 if (load_manager) |
| 850 return PP_FromBool(load_manager->DevInterfacesEnabled()); | 859 return PP_FromBool(load_manager->DevInterfacesEnabled()); |
| 851 return PP_FALSE; | 860 return PP_FALSE; |
| 852 } | 861 } |
| 853 | 862 |
| 863 int32_t CreatePNaClManifest(PP_Instance /* instance */) { | |
| 864 return kPNaClManifestId; | |
| 865 } | |
| 866 | |
| 867 int32_t CreateJsonManifest(PP_Instance instance, | |
| 868 const char* manifest_url, | |
| 869 const char* isa_type, | |
| 870 const char* manifest_data) { | |
| 871 int32_t manifest_id = g_next_manifest_id; | |
| 872 g_next_manifest_id++; | |
| 873 | |
| 874 scoped_ptr<nacl::JsonManifest> j( | |
| 875 new nacl::JsonManifest( | |
| 876 manifest_url, | |
| 877 isa_type, | |
| 878 PP_ToBool(IsNonSFIModeEnabled()), | |
| 879 PP_ToBool(NaClDebugEnabledForURL(manifest_url)))); | |
| 880 JsonManifest::ErrorInfo error_info; | |
| 881 if (j->Init(manifest_data, &error_info)) { | |
| 882 g_manifest_map.Get().add(manifest_id, j.Pass()); | |
| 883 return manifest_id; | |
| 884 } | |
| 885 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | |
| 886 if (load_manager) | |
| 887 load_manager->ReportLoadError(error_info.error, error_info.string); | |
| 888 return -1; | |
| 889 } | |
| 890 | |
| 891 void DestroyManifest(PP_Instance /* instance */, | |
| 892 int32_t manifest_id) { | |
| 893 if (manifest_id == kPNaClManifestId) | |
| 894 return; | |
| 895 g_manifest_map.Get().erase(manifest_id); | |
| 896 } | |
| 897 | |
| 898 PP_Bool ManifestGetProgramURL(PP_Instance instance, | |
| 899 int32_t manifest_id, | |
| 900 PP_Var* pp_full_url, | |
| 901 PP_PNaClOptions* pnacl_options, | |
| 902 PP_Bool* pp_uses_nonsfi_mode) { | |
| 903 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | |
| 904 if (manifest_id == kPNaClManifestId) { | |
| 905 if (load_manager) { | |
| 906 load_manager->ReportLoadError( | |
| 907 PP_NACL_ERROR_MANIFEST_GET_NEXE_URL, | |
| 908 "pnacl manifest does not contain a program."); | |
| 909 } | |
| 910 return PP_FALSE; | |
| 911 } | |
| 912 | |
| 913 JsonManifestMap::iterator it = g_manifest_map.Get().find(manifest_id); | |
| 914 if (it == g_manifest_map.Get().end()) | |
| 915 return PP_FALSE; | |
| 916 | |
| 917 bool uses_nonsfi_mode; | |
| 918 std::string full_url; | |
| 919 JsonManifest::ErrorInfo error_info; | |
| 920 if (it->second->GetProgramURL(&full_url, pnacl_options, &uses_nonsfi_mode, | |
| 921 &error_info)) { | |
| 922 *pp_full_url = ppapi::StringVar::StringToPPVar(full_url); | |
| 923 *pp_uses_nonsfi_mode = PP_FromBool(uses_nonsfi_mode); | |
| 924 return PP_TRUE; | |
| 925 } | |
| 926 | |
| 927 if (load_manager) | |
| 928 load_manager->ReportLoadError(error_info.error, error_info.string); | |
| 929 return PP_FALSE; | |
| 930 } | |
| 931 | |
| 932 PP_Bool ManifestResolveKey(PP_Instance instance, | |
| 933 int32_t manifest_id, | |
| 934 const char* key, | |
| 935 PP_Var* pp_full_url, | |
| 936 PP_PNaClOptions* pnacl_options) { | |
| 937 if (manifest_id == kPNaClManifestId) { | |
| 938 pnacl_options->translate = PP_FALSE; | |
| 939 // We can only resolve keys in the files/ namespace. | |
| 940 const std::string kFilesPrefix = "files/"; | |
| 941 std::string key_string(key); | |
| 942 if (key_string.find(kFilesPrefix) == std::string::npos) { | |
| 943 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | |
| 944 if (load_manager) | |
| 945 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_RESOLVE_URL, | |
| 946 "key did not start with files/"); | |
| 947 return PP_FALSE; | |
| 948 } | |
| 949 std::string key_basename = key_string.substr(kFilesPrefix.length()); | |
| 950 std::string pnacl_url = | |
| 951 std::string("chrome://pnacl-translator/") + GetSandboxArch() + "/" + | |
| 952 key_basename; | |
| 953 *pp_full_url = ppapi::StringVar::StringToPPVar(pnacl_url); | |
| 954 return PP_TRUE; | |
| 955 } | |
| 956 | |
| 957 JsonManifestMap::iterator it = g_manifest_map.Get().find(manifest_id); | |
| 958 if (it == g_manifest_map.Get().end()) | |
| 959 return PP_FALSE; | |
| 960 | |
| 961 std::string full_url; | |
| 962 bool ok = it->second->ResolveKey(key, &full_url, pnacl_options); | |
| 963 if (ok) | |
| 964 *pp_full_url = ppapi::StringVar::StringToPPVar(full_url); | |
| 965 return PP_FromBool(ok); | |
| 966 } | |
| 967 | |
| 854 const PPB_NaCl_Private nacl_interface = { | 968 const PPB_NaCl_Private nacl_interface = { |
| 855 &LaunchSelLdr, | 969 &LaunchSelLdr, |
| 856 &StartPpapiProxy, | 970 &StartPpapiProxy, |
| 857 &UrandomFD, | 971 &UrandomFD, |
| 858 &Are3DInterfacesDisabled, | 972 &Are3DInterfacesDisabled, |
| 859 &BrokerDuplicateHandle, | 973 &BrokerDuplicateHandle, |
| 860 &GetReadonlyPnaclFD, | 974 &GetReadonlyPnaclFD, |
| 861 &CreateTemporaryFile, | 975 &CreateTemporaryFile, |
| 862 &GetNumberOfProcessors, | 976 &GetNumberOfProcessors, |
| 863 &IsNonSFIModeEnabled, | 977 &IsNonSFIModeEnabled, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 882 &Vlog, | 996 &Vlog, |
| 883 &InitializePlugin, | 997 &InitializePlugin, |
| 884 &GetNexeSize, | 998 &GetNexeSize, |
| 885 &RequestNaClManifest, | 999 &RequestNaClManifest, |
| 886 &GetManifestBaseURL, | 1000 &GetManifestBaseURL, |
| 887 &ResolvesRelativeToPluginBaseURL, | 1001 &ResolvesRelativeToPluginBaseURL, |
| 888 &ParseDataURL, | 1002 &ParseDataURL, |
| 889 &ProcessNaClManifest, | 1003 &ProcessNaClManifest, |
| 890 &GetManifestURLArgument, | 1004 &GetManifestURLArgument, |
| 891 &IsPNaCl, | 1005 &IsPNaCl, |
| 892 &DevInterfacesEnabled | 1006 &DevInterfacesEnabled, |
| 1007 &CreatePNaClManifest, | |
| 1008 &CreateJsonManifest, | |
| 1009 &DestroyManifest, | |
| 1010 &ManifestGetProgramURL, | |
| 1011 &ManifestResolveKey | |
| 893 }; | 1012 }; |
| 894 | 1013 |
| 895 } // namespace | 1014 } // namespace |
| 896 | 1015 |
| 897 const PPB_NaCl_Private* GetNaClPrivateInterface() { | 1016 const PPB_NaCl_Private* GetNaClPrivateInterface() { |
| 898 return &nacl_interface; | 1017 return &nacl_interface; |
| 899 } | 1018 } |
| 900 | 1019 |
| 901 } // namespace nacl | 1020 } // namespace nacl |
| OLD | NEW |