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

Side by Side Diff: components/nacl/renderer/ppb_nacl_private_impl.cc

Issue 149403005: Pepper: Make StartSelLdr asynchronous. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CompletionCallback cleanup in service_runtime Created 6 years, 10 months 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
« no previous file with comments | « no previous file | ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #ifndef DISABLE_NACL 7 #ifndef DISABLE_NACL
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 // Check that we are on the main renderer thread. 72 // Check that we are on the main renderer thread.
73 DCHECK(content::RenderThread::Get()); 73 DCHECK(content::RenderThread::Get());
74 content::RendererPpapiHost *host = 74 content::RendererPpapiHost *host =
75 content::RendererPpapiHost::GetForPPInstance(instance); 75 content::RendererPpapiHost::GetForPPInstance(instance);
76 if (!host) 76 if (!host)
77 return 0; 77 return 0;
78 return host->GetRoutingIDForWidget(instance); 78 return host->GetRoutingIDForWidget(instance);
79 } 79 }
80 80
81 // Launch NaCl's sel_ldr process. 81 // Launch NaCl's sel_ldr process.
82 PP_ExternalPluginResult LaunchSelLdr(PP_Instance instance, 82 void LaunchSelLdr(PP_Instance instance,
83 const char* alleged_url, 83 const char* alleged_url,
84 PP_Bool uses_irt, 84 PP_Bool uses_irt,
85 PP_Bool uses_ppapi, 85 PP_Bool uses_ppapi,
86 PP_Bool enable_ppapi_dev, 86 PP_Bool enable_ppapi_dev,
87 PP_Bool enable_dyncode_syscalls, 87 PP_Bool enable_dyncode_syscalls,
88 PP_Bool enable_exception_handling, 88 PP_Bool enable_exception_handling,
89 PP_Bool enable_crash_throttling, 89 PP_Bool enable_crash_throttling,
90 void* imc_handle, 90 void* imc_handle,
91 struct PP_Var* error_message) { 91 struct PP_Var* error_message,
92 PP_CompletionCallback callback) {
92 nacl::FileDescriptor result_socket; 93 nacl::FileDescriptor result_socket;
93 IPC::Sender* sender = content::RenderThread::Get(); 94 IPC::Sender* sender = content::RenderThread::Get();
94 DCHECK(sender); 95 DCHECK(sender);
95 *error_message = PP_MakeUndefined(); 96 *error_message = PP_MakeUndefined();
96 int routing_id = 0; 97 int routing_id = 0;
97 // If the nexe uses ppapi APIs, we need a routing ID. 98 // If the nexe uses ppapi APIs, we need a routing ID.
98 // To get the routing ID, we must be on the main thread. 99 // To get the routing ID, we must be on the main thread.
99 // Some nexes do not use ppapi and launch from the background thread, 100 // Some nexes do not use ppapi and launch from the background thread,
100 // so those nexes can skip finding a routing_id. 101 // so those nexes can skip finding a routing_id.
101 if (uses_ppapi) { 102 if (uses_ppapi) {
102 routing_id = GetRoutingID(instance); 103 routing_id = GetRoutingID(instance);
103 if (!routing_id) 104 if (!routing_id) {
104 return PP_EXTERNAL_PLUGIN_FAILED; 105 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
106 FROM_HERE,
107 base::Bind(callback.func, callback.user_data,
108 static_cast<int32_t>(PP_ERROR_FAILED)));
109 return;
110 }
105 } 111 }
106 112
107 InstanceInfo instance_info; 113 InstanceInfo instance_info;
108 instance_info.url = GURL(alleged_url); 114 instance_info.url = GURL(alleged_url);
109 115
110 uint32_t perm_bits = ppapi::PERMISSION_NONE; 116 uint32_t perm_bits = ppapi::PERMISSION_NONE;
111 // Conditionally block 'Dev' interfaces. We do this for the NaCl process, so 117 // Conditionally block 'Dev' interfaces. We do this for the NaCl process, so
112 // it's clearer to developers when they are using 'Dev' inappropriately. We 118 // it's clearer to developers when they are using 'Dev' inappropriately. We
113 // must also check on the trusted side of the proxy. 119 // must also check on the trusted side of the proxy.
114 if (enable_ppapi_dev) 120 if (enable_ppapi_dev)
115 perm_bits |= ppapi::PERMISSION_DEV; 121 perm_bits |= ppapi::PERMISSION_DEV;
116 instance_info.permissions = 122 instance_info.permissions =
117 ppapi::PpapiPermissions::GetForCommandLine(perm_bits); 123 ppapi::PpapiPermissions::GetForCommandLine(perm_bits);
118 std::string error_message_string; 124 std::string error_message_string;
119 nacl::NaClLaunchResult launch_result; 125 nacl::NaClLaunchResult launch_result;
120 126
121 if (!sender->Send(new NaClHostMsg_LaunchNaCl( 127 if (!sender->Send(new NaClHostMsg_LaunchNaCl(
122 nacl::NaClLaunchParams(instance_info.url.spec(), 128 nacl::NaClLaunchParams(instance_info.url.spec(),
123 routing_id, 129 routing_id,
124 perm_bits, 130 perm_bits,
125 PP_ToBool(uses_irt), 131 PP_ToBool(uses_irt),
126 PP_ToBool(enable_dyncode_syscalls), 132 PP_ToBool(enable_dyncode_syscalls),
127 PP_ToBool(enable_exception_handling), 133 PP_ToBool(enable_exception_handling),
128 PP_ToBool(enable_crash_throttling)), 134 PP_ToBool(enable_crash_throttling)),
129 &launch_result, 135 &launch_result,
130 &error_message_string))) { 136 &error_message_string))) {
131 return PP_EXTERNAL_PLUGIN_FAILED; 137 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
138 FROM_HERE,
139 base::Bind(callback.func, callback.user_data,
140 static_cast<int32_t>(PP_ERROR_FAILED)));
141 return;
132 } 142 }
133 if (!error_message_string.empty()) { 143 if (!error_message_string.empty()) {
134 *error_message = ppapi::StringVar::StringToPPVar(error_message_string); 144 *error_message = ppapi::StringVar::StringToPPVar(error_message_string);
135 return PP_EXTERNAL_PLUGIN_FAILED; 145 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
146 FROM_HERE,
147 base::Bind(callback.func, callback.user_data,
148 static_cast<int32_t>(PP_ERROR_FAILED)));
149 return;
136 } 150 }
137 result_socket = launch_result.imc_channel_handle; 151 result_socket = launch_result.imc_channel_handle;
138 instance_info.channel_handle = launch_result.ipc_channel_handle; 152 instance_info.channel_handle = launch_result.ipc_channel_handle;
139 instance_info.plugin_pid = launch_result.plugin_pid; 153 instance_info.plugin_pid = launch_result.plugin_pid;
140 instance_info.plugin_child_id = launch_result.plugin_child_id; 154 instance_info.plugin_child_id = launch_result.plugin_child_id;
141 // Don't save instance_info if channel handle is invalid. 155 // Don't save instance_info if channel handle is invalid.
142 bool invalid_handle = instance_info.channel_handle.name.empty(); 156 bool invalid_handle = instance_info.channel_handle.name.empty();
143 #if defined(OS_POSIX) 157 #if defined(OS_POSIX)
144 if (!invalid_handle) 158 if (!invalid_handle)
145 invalid_handle = (instance_info.channel_handle.socket.fd == -1); 159 invalid_handle = (instance_info.channel_handle.socket.fd == -1);
146 #endif 160 #endif
147 if (!invalid_handle) 161 if (!invalid_handle)
148 g_instance_info.Get()[instance] = instance_info; 162 g_instance_info.Get()[instance] = instance_info;
149 163
150 *(static_cast<NaClHandle*>(imc_handle)) = 164 *(static_cast<NaClHandle*>(imc_handle)) =
151 nacl::ToNativeHandle(result_socket); 165 nacl::ToNativeHandle(result_socket);
152 166 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
153 return PP_EXTERNAL_PLUGIN_OK; 167 FROM_HERE,
168 base::Bind(callback.func, callback.user_data,
169 static_cast<int32_t>(PP_OK)));
154 } 170 }
155 171
156 PP_ExternalPluginResult StartPpapiProxy(PP_Instance instance) { 172 PP_ExternalPluginResult StartPpapiProxy(PP_Instance instance) {
157 InstanceInfoMap& map = g_instance_info.Get(); 173 InstanceInfoMap& map = g_instance_info.Get();
158 InstanceInfoMap::iterator it = map.find(instance); 174 InstanceInfoMap::iterator it = map.find(instance);
159 if (it == map.end()) { 175 if (it == map.end()) {
160 DLOG(ERROR) << "Could not find instance ID"; 176 DLOG(ERROR) << "Could not find instance ID";
161 return PP_EXTERNAL_PLUGIN_FAILED; 177 return PP_EXTERNAL_PLUGIN_FAILED;
162 } 178 }
163 InstanceInfo instance_info = it->second; 179 InstanceInfo instance_info = it->second;
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 477
462 namespace nacl { 478 namespace nacl {
463 479
464 const PPB_NaCl_Private* GetNaClPrivateInterface() { 480 const PPB_NaCl_Private* GetNaClPrivateInterface() {
465 return &nacl_interface; 481 return &nacl_interface;
466 } 482 }
467 483
468 } // namespace nacl 484 } // namespace nacl
469 485
470 #endif // DISABLE_NACL 486 #endif // DISABLE_NACL
OLDNEW
« no previous file with comments | « no previous file | ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698