| 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 <numeric> | 7 #include <numeric> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 | 812 |
| 813 int64_t GetNexeSize(PP_Instance instance) { | 813 int64_t GetNexeSize(PP_Instance instance) { |
| 814 NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 814 NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 815 DCHECK(load_manager); | 815 DCHECK(load_manager); |
| 816 if (load_manager) | 816 if (load_manager) |
| 817 return load_manager->nexe_size(); | 817 return load_manager->nexe_size(); |
| 818 return 0; | 818 return 0; |
| 819 } | 819 } |
| 820 | 820 |
| 821 void DownloadManifestToBuffer(PP_Instance instance, | 821 void DownloadManifestToBuffer(PP_Instance instance, |
| 822 struct PP_Var* out_data, | 822 int32_t* out_manifest_id, |
| 823 struct PP_CompletionCallback callback); | 823 struct PP_CompletionCallback callback); |
| 824 | 824 |
| 825 int32_t CreateJsonManifest(PP_Instance instance, |
| 826 const std::string& manifest_url, |
| 827 const std::string& manifest_data); |
| 828 |
| 825 void RequestNaClManifest(PP_Instance instance, | 829 void RequestNaClManifest(PP_Instance instance, |
| 826 const char* url, | 830 const char* url, |
| 827 PP_Var* out_data, | 831 int32_t* out_manifest_id, |
| 828 PP_CompletionCallback callback) { | 832 PP_CompletionCallback callback) { |
| 829 NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 833 NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 830 DCHECK(load_manager); | 834 DCHECK(load_manager); |
| 831 if (!load_manager) { | 835 if (!load_manager) { |
| 832 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( | 836 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
| 833 FROM_HERE, | 837 FROM_HERE, |
| 834 base::Bind(callback.func, callback.user_data, | 838 base::Bind(callback.func, callback.user_data, |
| 835 static_cast<int32_t>(PP_ERROR_FAILED))); | 839 static_cast<int32_t>(PP_ERROR_FAILED))); |
| 836 return; | 840 return; |
| 837 } | 841 } |
| 838 | 842 |
| 839 if (!load_manager->RequestNaClManifest(url)) { | 843 if (!load_manager->RequestNaClManifest(url)) { |
| 840 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( | 844 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
| 841 FROM_HERE, | 845 FROM_HERE, |
| 842 base::Bind(callback.func, callback.user_data, | 846 base::Bind(callback.func, callback.user_data, |
| 843 static_cast<int32_t>(PP_ERROR_FAILED))); | 847 static_cast<int32_t>(PP_ERROR_FAILED))); |
| 844 return; | 848 return; |
| 845 } | 849 } |
| 846 | 850 |
| 847 const GURL& base_url = load_manager->manifest_base_url(); | 851 const GURL& base_url = load_manager->manifest_base_url(); |
| 848 if (base_url.SchemeIs("data")) { | 852 if (base_url.SchemeIs("data")) { |
| 849 GURL gurl(base_url); | 853 GURL gurl(base_url); |
| 850 std::string mime_type; | 854 std::string mime_type; |
| 851 std::string charset; | 855 std::string charset; |
| 852 std::string data; | 856 std::string data; |
| 853 int32_t error = PP_ERROR_FAILED; | 857 int32_t error = PP_ERROR_FAILED; |
| 854 if (net::DataURL::Parse(gurl, &mime_type, &charset, &data)) { | 858 if (net::DataURL::Parse(gurl, &mime_type, &charset, &data)) { |
| 855 if (data.size() <= ManifestDownloader::kNaClManifestMaxFileBytes) { | 859 if (data.size() <= ManifestDownloader::kNaClManifestMaxFileBytes) { |
| 856 error = PP_OK; | 860 error = PP_OK; |
| 857 *out_data = ppapi::StringVar::StringToPPVar(data); | 861 *out_manifest_id = CreateJsonManifest(instance, base_url.spec(), data); |
| 858 } else { | 862 } else { |
| 859 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_TOO_LARGE, | 863 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_TOO_LARGE, |
| 860 "manifest file too large."); | 864 "manifest file too large."); |
| 861 } | 865 } |
| 862 } else { | 866 } else { |
| 863 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_LOAD_URL, | 867 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_LOAD_URL, |
| 864 "could not load manifest url."); | 868 "could not load manifest url."); |
| 865 } | 869 } |
| 866 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( | 870 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
| 867 FROM_HERE, | 871 FROM_HERE, |
| 868 base::Bind(callback.func, callback.user_data, error)); | 872 base::Bind(callback.func, callback.user_data, error)); |
| 869 } else { | 873 } else { |
| 870 DownloadManifestToBuffer(instance, out_data, callback); | 874 DownloadManifestToBuffer(instance, out_manifest_id, callback); |
| 871 } | 875 } |
| 872 } | 876 } |
| 873 | 877 |
| 874 PP_Var GetManifestBaseURL(PP_Instance instance) { | 878 PP_Var GetManifestBaseURL(PP_Instance instance) { |
| 875 NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 879 NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 876 DCHECK(load_manager); | 880 DCHECK(load_manager); |
| 877 if (!load_manager) | 881 if (!load_manager) |
| 878 return PP_MakeUndefined(); | 882 return PP_MakeUndefined(); |
| 879 const GURL& gurl = load_manager->manifest_base_url(); | 883 const GURL& gurl = load_manager->manifest_base_url(); |
| 880 if (!gurl.is_valid()) | 884 if (!gurl.is_valid()) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 911 | 915 |
| 912 PP_Bool DevInterfacesEnabled(PP_Instance instance) { | 916 PP_Bool DevInterfacesEnabled(PP_Instance instance) { |
| 913 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 917 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 914 if (load_manager) | 918 if (load_manager) |
| 915 return PP_FromBool(load_manager->DevInterfacesEnabled()); | 919 return PP_FromBool(load_manager->DevInterfacesEnabled()); |
| 916 return PP_FALSE; | 920 return PP_FALSE; |
| 917 } | 921 } |
| 918 | 922 |
| 919 void DownloadManifestToBufferCompletion(PP_Instance instance, | 923 void DownloadManifestToBufferCompletion(PP_Instance instance, |
| 920 struct PP_CompletionCallback callback, | 924 struct PP_CompletionCallback callback, |
| 921 struct PP_Var* out_data, | 925 int32_t* out_manifest_id, |
| 922 base::Time start_time, | 926 base::Time start_time, |
| 923 PP_NaClError pp_nacl_error, | 927 PP_NaClError pp_nacl_error, |
| 924 const std::string& data); | 928 const std::string& data); |
| 925 | 929 |
| 926 void DownloadManifestToBuffer(PP_Instance instance, | 930 void DownloadManifestToBuffer(PP_Instance instance, |
| 927 struct PP_Var* out_data, | 931 int32_t* out_manifest_id, |
| 928 struct PP_CompletionCallback callback) { | 932 struct PP_CompletionCallback callback) { |
| 929 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 933 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 930 DCHECK(load_manager); | 934 DCHECK(load_manager); |
| 931 content::PepperPluginInstance* plugin_instance = | 935 content::PepperPluginInstance* plugin_instance = |
| 932 content::PepperPluginInstance::Get(instance); | 936 content::PepperPluginInstance::Get(instance); |
| 933 if (!load_manager || !plugin_instance) { | 937 if (!load_manager || !plugin_instance) { |
| 934 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( | 938 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
| 935 FROM_HERE, | 939 FROM_HERE, |
| 936 base::Bind(callback.func, callback.user_data, | 940 base::Bind(callback.func, callback.user_data, |
| 937 static_cast<int32_t>(PP_ERROR_FAILED))); | 941 static_cast<int32_t>(PP_ERROR_FAILED))); |
| 938 } | 942 } |
| 939 const blink::WebDocument& document = | 943 const blink::WebDocument& document = |
| 940 plugin_instance->GetContainer()->element().document(); | 944 plugin_instance->GetContainer()->element().document(); |
| 941 | 945 |
| 942 const GURL& gurl = load_manager->manifest_base_url(); | 946 const GURL& gurl = load_manager->manifest_base_url(); |
| 943 scoped_ptr<blink::WebURLLoader> url_loader( | 947 scoped_ptr<blink::WebURLLoader> url_loader( |
| 944 CreateWebURLLoader(document, gurl)); | 948 CreateWebURLLoader(document, gurl)); |
| 945 blink::WebURLRequest request = CreateWebURLRequest(document, gurl); | 949 blink::WebURLRequest request = CreateWebURLRequest(document, gurl); |
| 946 | 950 |
| 947 // ManifestDownloader deletes itself after invoking the callback. | 951 // ManifestDownloader deletes itself after invoking the callback. |
| 948 ManifestDownloader* manifest_downloader = new ManifestDownloader( | 952 ManifestDownloader* manifest_downloader = new ManifestDownloader( |
| 949 url_loader.Pass(), | 953 url_loader.Pass(), |
| 950 load_manager->is_installed(), | 954 load_manager->is_installed(), |
| 951 base::Bind(DownloadManifestToBufferCompletion, | 955 base::Bind(DownloadManifestToBufferCompletion, |
| 952 instance, callback, out_data, base::Time::Now())); | 956 instance, callback, out_manifest_id, base::Time::Now())); |
| 953 manifest_downloader->Load(request); | 957 manifest_downloader->Load(request); |
| 954 } | 958 } |
| 955 | 959 |
| 956 void DownloadManifestToBufferCompletion(PP_Instance instance, | 960 void DownloadManifestToBufferCompletion(PP_Instance instance, |
| 957 struct PP_CompletionCallback callback, | 961 struct PP_CompletionCallback callback, |
| 958 struct PP_Var* out_data, | 962 int32_t* out_manifest_id, |
| 959 base::Time start_time, | 963 base::Time start_time, |
| 960 PP_NaClError pp_nacl_error, | 964 PP_NaClError pp_nacl_error, |
| 961 const std::string& data) { | 965 const std::string& data) { |
| 962 base::TimeDelta download_time = base::Time::Now() - start_time; | 966 base::TimeDelta download_time = base::Time::Now() - start_time; |
| 963 HistogramTimeSmall("NaCl.Perf.StartupTime.ManifestDownload", | 967 HistogramTimeSmall("NaCl.Perf.StartupTime.ManifestDownload", |
| 964 download_time.InMilliseconds()); | 968 download_time.InMilliseconds()); |
| 965 | 969 |
| 966 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 970 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 967 if (!load_manager) { | 971 if (!load_manager) { |
| 968 callback.func(callback.user_data, PP_ERROR_ABORTED); | 972 callback.func(callback.user_data, PP_ERROR_ABORTED); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 990 "access to manifest url was denied."); | 994 "access to manifest url was denied."); |
| 991 break; | 995 break; |
| 992 default: | 996 default: |
| 993 NOTREACHED(); | 997 NOTREACHED(); |
| 994 pp_error = PP_ERROR_FAILED; | 998 pp_error = PP_ERROR_FAILED; |
| 995 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_LOAD_URL, | 999 load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_LOAD_URL, |
| 996 "could not load manifest url."); | 1000 "could not load manifest url."); |
| 997 } | 1001 } |
| 998 | 1002 |
| 999 if (pp_error == PP_OK) { | 1003 if (pp_error == PP_OK) { |
| 1000 std::string contents; | 1004 std::string base_url = load_manager->manifest_base_url().spec(); |
| 1001 *out_data = ppapi::StringVar::StringToPPVar(data); | 1005 *out_manifest_id = CreateJsonManifest(instance, base_url, data); |
| 1002 } | 1006 } |
| 1003 callback.func(callback.user_data, pp_error); | 1007 callback.func(callback.user_data, pp_error); |
| 1004 } | 1008 } |
| 1005 | 1009 |
| 1006 int32_t CreatePNaClManifest(PP_Instance /* instance */) { | 1010 int32_t CreatePNaClManifest(PP_Instance /* instance */) { |
| 1007 return GetPNaClManifestId(); | 1011 return GetPNaClManifestId(); |
| 1008 } | 1012 } |
| 1009 | 1013 |
| 1010 int32_t CreateJsonManifest(PP_Instance instance, | 1014 int32_t CreateJsonManifest(PP_Instance instance, |
| 1011 const char* manifest_url, | 1015 const std::string& manifest_url, |
| 1012 const char* manifest_data) { | 1016 const std::string& manifest_data) { |
| 1017 HistogramSizeKB("NaCl.Perf.Size.Manifest", |
| 1018 static_cast<int32_t>(manifest_data.length() / 1024)); |
| 1019 |
| 1013 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); | 1020 nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
| 1014 if (!load_manager) | 1021 if (!load_manager) |
| 1015 return -1; | 1022 return -1; |
| 1016 int32_t manifest_id = g_next_manifest_id.Get(); | 1023 int32_t manifest_id = g_next_manifest_id.Get(); |
| 1017 g_next_manifest_id.Get()++; | 1024 g_next_manifest_id.Get()++; |
| 1018 | 1025 |
| 1019 const char* isa_type; | 1026 const char* isa_type; |
| 1020 if (load_manager->IsPNaCl()) | 1027 if (load_manager->IsPNaCl()) |
| 1021 isa_type = kPortableArch; | 1028 isa_type = kPortableArch; |
| 1022 else | 1029 else |
| 1023 isa_type = GetSandboxArch(); | 1030 isa_type = GetSandboxArch(); |
| 1024 | 1031 |
| 1025 scoped_ptr<nacl::JsonManifest> j( | 1032 scoped_ptr<nacl::JsonManifest> j( |
| 1026 new nacl::JsonManifest( | 1033 new nacl::JsonManifest( |
| 1027 manifest_url, | 1034 manifest_url.c_str(), |
| 1028 isa_type, | 1035 isa_type, |
| 1029 IsNonSFIModeEnabled(), | 1036 IsNonSFIModeEnabled(), |
| 1030 PP_ToBool(NaClDebugEnabledForURL(manifest_url)))); | 1037 PP_ToBool(NaClDebugEnabledForURL(manifest_url.c_str())))); |
| 1031 JsonManifest::ErrorInfo error_info; | 1038 JsonManifest::ErrorInfo error_info; |
| 1032 if (j->Init(manifest_data, &error_info)) { | 1039 if (j->Init(manifest_data.c_str(), &error_info)) { |
| 1033 g_manifest_map.Get().add(manifest_id, j.Pass()); | 1040 g_manifest_map.Get().add(manifest_id, j.Pass()); |
| 1034 return manifest_id; | 1041 return manifest_id; |
| 1035 } | 1042 } |
| 1036 load_manager->ReportLoadError(error_info.error, error_info.string); | 1043 load_manager->ReportLoadError(error_info.error, error_info.string); |
| 1037 return -1; | 1044 return -1; |
| 1038 } | 1045 } |
| 1039 | 1046 |
| 1040 void DestroyManifest(PP_Instance /* instance */, | 1047 void DestroyManifest(PP_Instance /* instance */, |
| 1041 int32_t manifest_id) { | 1048 int32_t manifest_id) { |
| 1042 if (manifest_id == GetPNaClManifestId()) | 1049 if (manifest_id == GetPNaClManifestId()) |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1454 &Vlog, | 1461 &Vlog, |
| 1455 &InitializePlugin, | 1462 &InitializePlugin, |
| 1456 &GetNexeSize, | 1463 &GetNexeSize, |
| 1457 &RequestNaClManifest, | 1464 &RequestNaClManifest, |
| 1458 &GetManifestBaseURL, | 1465 &GetManifestBaseURL, |
| 1459 &ResolvesRelativeToPluginBaseURL, | 1466 &ResolvesRelativeToPluginBaseURL, |
| 1460 &ProcessNaClManifest, | 1467 &ProcessNaClManifest, |
| 1461 &GetManifestURLArgument, | 1468 &GetManifestURLArgument, |
| 1462 &DevInterfacesEnabled, | 1469 &DevInterfacesEnabled, |
| 1463 &CreatePNaClManifest, | 1470 &CreatePNaClManifest, |
| 1464 &CreateJsonManifest, | |
| 1465 &DestroyManifest, | 1471 &DestroyManifest, |
| 1466 &ManifestGetProgramURL, | 1472 &ManifestGetProgramURL, |
| 1467 &ManifestResolveKey, | 1473 &ManifestResolveKey, |
| 1468 &GetPNaClResourceInfo, | 1474 &GetPNaClResourceInfo, |
| 1469 &GetCpuFeatureAttrs, | 1475 &GetCpuFeatureAttrs, |
| 1470 &PostMessageToJavaScript, | 1476 &PostMessageToJavaScript, |
| 1471 &DownloadNexe | 1477 &DownloadNexe |
| 1472 }; | 1478 }; |
| 1473 | 1479 |
| 1474 } // namespace | 1480 } // namespace |
| 1475 | 1481 |
| 1476 const PPB_NaCl_Private* GetNaClPrivateInterface() { | 1482 const PPB_NaCl_Private* GetNaClPrivateInterface() { |
| 1477 return &nacl_interface; | 1483 return &nacl_interface; |
| 1478 } | 1484 } |
| 1479 | 1485 |
| 1480 } // namespace nacl | 1486 } // namespace nacl |
| OLD | NEW |