OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "mojo/shell/application_manager.h" | 5 #include "mojo/shell/application_manager.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 | 171 |
172 void ApplicationManager::CreateInstanceForHandle( | 172 void ApplicationManager::CreateInstanceForHandle( |
173 ScopedHandle channel, | 173 ScopedHandle channel, |
174 const String& url, | 174 const String& url, |
175 mojom::CapabilityFilterPtr filter, | 175 mojom::CapabilityFilterPtr filter, |
176 mojom::PIDReceiverRequest pid_receiver) { | 176 mojom::PIDReceiverRequest pid_receiver) { |
177 // We don't call ConnectToClient() here since the instance was created | 177 // We don't call ConnectToClient() here since the instance was created |
178 // manually by other code, not in response to a Connect() request. The newly | 178 // manually by other code, not in response to a Connect() request. The newly |
179 // created instance is identified by |url| and may be subsequently reached by | 179 // created instance is identified by |url| and may be subsequently reached by |
180 // client code using this identity. | 180 // client code using this identity. |
181 CapabilityFilter local_filter = filter->filter.To<CapabilityFilter>(); | |
182 // TODO(beng): obtain userid from the inbound connection. | 181 // TODO(beng): obtain userid from the inbound connection. |
183 Identity target_id(url.To<GURL>(), std::string(), | 182 Identity target_id(url.To<GURL>(), std::string(), |
184 mojom::Connector::kUserInherit, local_filter); | 183 mojom::Connector::kUserInherit); |
| 184 target_id.SetFilter(filter->filter.To<CapabilityFilter>()); |
185 mojom::ShellClientRequest request; | 185 mojom::ShellClientRequest request; |
186 ApplicationInstance* instance = CreateInstance(target_id, &request); | 186 ApplicationInstance* instance = CreateInstance(target_id, &request); |
187 instance->BindPIDReceiver(std::move(pid_receiver)); | 187 instance->BindPIDReceiver(std::move(pid_receiver)); |
188 scoped_ptr<NativeRunner> runner = | 188 scoped_ptr<NativeRunner> runner = |
189 native_runner_factory_->Create(base::FilePath()); | 189 native_runner_factory_->Create(base::FilePath()); |
190 runner->InitHost(std::move(channel), std::move(request)); | 190 runner->InitHost(std::move(channel), std::move(request)); |
191 instance->SetNativeRunner(runner.get()); | 191 instance->SetNativeRunner(runner.get()); |
192 native_runners_.push_back(std::move(runner)); | 192 native_runners_.push_back(std::move(runner)); |
193 } | 193 } |
194 | 194 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 const String& resolved_qualifier, | 297 const String& resolved_qualifier, |
298 mojom::CapabilityFilterPtr base_filter, | 298 mojom::CapabilityFilterPtr base_filter, |
299 const String& file_url) { | 299 const String& file_url) { |
300 // It's possible that when this manifest request was issued, another one was | 300 // It's possible that when this manifest request was issued, another one was |
301 // already in-progress and completed by the time this one did, and so the | 301 // already in-progress and completed by the time this one did, and so the |
302 // requested application may already be running. | 302 // requested application may already be running. |
303 if (ConnectToExistingInstance(¶ms)) | 303 if (ConnectToExistingInstance(¶ms)) |
304 return; | 304 return; |
305 | 305 |
306 Identity source = params->source(); | 306 Identity source = params->source(); |
307 CapabilityFilter filter = params->target().filter(); | 307 // |base_filter| can be null when there is no manifest, e.g. for URL types |
308 // TODO(beng): this clobbers the filter passed via Connect(). | 308 // not resolvable by the resolver. |
| 309 CapabilityFilter filter = GetPermissiveCapabilityFilter(); |
309 if (!base_filter.is_null()) | 310 if (!base_filter.is_null()) |
310 filter = base_filter->filter.To<CapabilityFilter>(); | 311 filter = base_filter->filter.To<CapabilityFilter>(); |
311 Identity target(params->target().url(), params->target().qualifier(), | 312 Identity target = params->target(); |
312 params->target().user_id(), filter); | 313 target.SetFilter(filter); |
313 | 314 |
314 mojom::ShellClientRequest request; | 315 mojom::ShellClientRequest request; |
315 ApplicationInstance* instance = CreateInstance(target, &request); | 316 ApplicationInstance* instance = CreateInstance(target, &request); |
316 instance->ConnectToClient(std::move(params)); | 317 instance->ConnectToClient(std::move(params)); |
317 | 318 |
318 if (LoadWithLoader(target, &request)) | 319 if (LoadWithLoader(target, &request)) |
319 return; | 320 return; |
320 | 321 |
321 CHECK(!file_url.is_null() && !base_filter.is_null()); | 322 CHECK(!file_url.is_null() && !base_filter.is_null()); |
322 | 323 |
323 GURL resolved_gurl = resolved_url.To<GURL>(); | 324 GURL resolved_gurl = resolved_url.To<GURL>(); |
324 if (target.url().spec() != resolved_url) { | 325 if (target.url().spec() != resolved_url) { |
325 // In cases where a package alias is resolved, we have to use the qualifier | 326 // In cases where a package alias is resolved, we have to use the qualifier |
326 // from the original request rather than for the package itself, which will | 327 // from the original request rather than for the package itself, which will |
327 // always be the same. | 328 // always be the same. |
328 CreateShellClient(source, | 329 CreateShellClient( |
329 Identity(resolved_gurl, target.qualifier(), | 330 source, Identity(resolved_gurl, target.qualifier(), target.user_id()), |
330 target.user_id(), filter), | 331 target.url(), std::move(request)); |
331 target.url(), std::move(request)); | |
332 } else { | 332 } else { |
333 bool start_sandboxed = false; | 333 bool start_sandboxed = false; |
334 base::FilePath path = util::UrlToFilePath(file_url.To<GURL>()); | 334 base::FilePath path = util::UrlToFilePath(file_url.To<GURL>()); |
335 scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path); | 335 scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path); |
336 runner->Start(path, target, start_sandboxed, std::move(request), | 336 runner->Start(path, target, start_sandboxed, std::move(request), |
337 base::Bind(&ApplicationManager::ApplicationPIDAvailable, | 337 base::Bind(&ApplicationManager::ApplicationPIDAvailable, |
338 weak_ptr_factory_.GetWeakPtr(), instance->id()), | 338 weak_ptr_factory_.GetWeakPtr(), instance->id()), |
339 base::Bind(&ApplicationManager::CleanupRunner, | 339 base::Bind(&ApplicationManager::CleanupRunner, |
340 weak_ptr_factory_.GetWeakPtr(), runner.get())); | 340 weak_ptr_factory_.GetWeakPtr(), runner.get())); |
341 instance->SetNativeRunner(runner.get()); | 341 instance->SetNativeRunner(runner.get()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 info->qualifier = instance->identity().qualifier(); | 376 info->qualifier = instance->identity().qualifier(); |
377 if (instance->identity().url().spec() == "mojo://shell/") | 377 if (instance->identity().url().spec() == "mojo://shell/") |
378 info->pid = base::Process::Current().Pid(); | 378 info->pid = base::Process::Current().Pid(); |
379 else | 379 else |
380 info->pid = instance->pid(); | 380 info->pid = instance->pid(); |
381 return info; | 381 return info; |
382 } | 382 } |
383 | 383 |
384 } // namespace shell | 384 } // namespace shell |
385 } // namespace mojo | 385 } // namespace mojo |
OLD | NEW |