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

Side by Side Diff: services/shell/shell.cc

Issue 1882423004: Move shell service to toplevel shell namespace (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 8 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 | « services/shell/shell.h ('k') | services/shell/shell.gyp » ('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 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 "services/shell/shell.h" 5 #include "services/shell/shell.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 13 matching lines...) Expand all
24 #include "mojo/util/filename_util.h" 24 #include "mojo/util/filename_util.h"
25 #include "services/shell/connect_util.h" 25 #include "services/shell/connect_util.h"
26 #include "services/shell/public/cpp/connector.h" 26 #include "services/shell/public/cpp/connector.h"
27 #include "services/shell/public/cpp/names.h" 27 #include "services/shell/public/cpp/names.h"
28 #include "services/shell/public/cpp/shell_connection.h" 28 #include "services/shell/public/cpp/shell_connection.h"
29 #include "services/shell/public/interfaces/connector.mojom.h" 29 #include "services/shell/public/interfaces/connector.mojom.h"
30 #include "services/shell/public/interfaces/shell.mojom.h" 30 #include "services/shell/public/interfaces/shell.mojom.h"
31 #include "services/shell/public/interfaces/shell_client.mojom.h" 31 #include "services/shell/public/interfaces/shell_client.mojom.h"
32 #include "url/gurl.h" 32 #include "url/gurl.h"
33 33
34 namespace mojo {
35 namespace shell { 34 namespace shell {
35
36 namespace { 36 namespace {
37
37 const char kCatalogName[] = "mojo:catalog"; 38 const char kCatalogName[] = "mojo:catalog";
38 const char kShellName[] = "mojo:shell"; 39 const char kShellName[] = "mojo:shell";
39 const char kCapabilityClass_UserID[] = "user_id"; 40 const char kCapabilityClass_UserID[] = "user_id";
40 const char kCapabilityClass_ClientProcess[] = "client_process"; 41 const char kCapabilityClass_ClientProcess[] = "client_process";
41 const char kCapabilityClass_InstanceName[] = "instance_name"; 42 const char kCapabilityClass_InstanceName[] = "instance_name";
42 const char kCapabilityClass_AllUsers[] = "all_users"; 43 const char kCapabilityClass_AllUsers[] = "all_users";
43 44
44 void EmptyResolverCallback(mojom::ResolveResultPtr result) {} 45 void EmptyResolverCallback(mojom::ResolveResultPtr result) {}
45 46
46 } 47 } // namespace
47 48
48 Identity CreateShellIdentity() { 49 Identity CreateShellIdentity() {
49 return Identity(kShellName, mojom::kRootUserID); 50 return Identity(kShellName, mojom::kRootUserID);
50 } 51 }
51 52
52 Identity CreateCatalogIdentity() { 53 Identity CreateCatalogIdentity() {
53 return Identity(kCatalogName, mojom::kRootUserID); 54 return Identity(kCatalogName, mojom::kRootUserID);
54 } 55 }
55 56
56 CapabilitySpec GetPermissiveCapabilities() { 57 CapabilitySpec GetPermissiveCapabilities() {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 ~Instance() override { 130 ~Instance() override {
130 if (parent_) 131 if (parent_)
131 parent_->RemoveChild(this); 132 parent_->RemoveChild(this);
132 // |children_| will be modified during destruction. 133 // |children_| will be modified during destruction.
133 std::set<Instance*> children = children_; 134 std::set<Instance*> children = children_;
134 for (auto child : children) 135 for (auto child : children)
135 shell_->OnInstanceError(child); 136 shell_->OnInstanceError(child);
136 } 137 }
137 138
138 Instance* parent() { return parent_; } 139 Instance* parent() { return parent_; }
140
139 void AddChild(Instance* child) { 141 void AddChild(Instance* child) {
140 children_.insert(child); 142 children_.insert(child);
141 child->parent_ = this; 143 child->parent_ = this;
142 } 144 }
145
143 void RemoveChild(Instance* child) { 146 void RemoveChild(Instance* child) {
144 auto it = children_.find(child); 147 auto it = children_.find(child);
145 DCHECK(it != children_.end()); 148 DCHECK(it != children_.end());
146 children_.erase(it); 149 children_.erase(it);
147 child->parent_ = nullptr; 150 child->parent_ = nullptr;
148 } 151 }
149 152
150 void ConnectToClient(scoped_ptr<ConnectParams> params) { 153 void ConnectToClient(std::unique_ptr<ConnectParams> params) {
151 CHECK(shell_client_.is_bound()); 154 CHECK(shell_client_.is_bound());
152 params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, 155 params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED,
153 identity_.user_id(), id_); 156 identity_.user_id(), id_);
154 uint32_t source_id = mojom::kInvalidInstanceID; 157 uint32_t source_id = mojom::kInvalidInstanceID;
155 CapabilityRequest spec; 158 CapabilityRequest spec;
156 spec.interfaces.insert("*"); 159 spec.interfaces.insert("*");
157 Instance* source = shell_->GetExistingInstance(params->source()); 160 Instance* source = shell_->GetExistingInstance(params->source());
158 if (source) { 161 if (source) {
159 spec = GenerateCapabilityRequestForConnection( 162 spec = GenerateCapabilityRequestForConnection(
160 source->capability_spec_, identity_, capability_spec_); 163 source->capability_spec_, identity_, capability_spec_);
(...skipping 21 matching lines...) Expand all
182 mojom::ShellClientPtr client; 185 mojom::ShellClientPtr client;
183 client.Bind(mojom::ShellClientPtrInfo( 186 client.Bind(mojom::ShellClientPtrInfo(
184 std::move(client_process_connection->shell_client), 0)); 187 std::move(client_process_connection->shell_client), 0));
185 pid_receiver_binding_.Bind( 188 pid_receiver_binding_.Bind(
186 std::move(client_process_connection->pid_receiver_request)); 189 std::move(client_process_connection->pid_receiver_request));
187 StartWithClient(std::move(client)); 190 StartWithClient(std::move(client));
188 } 191 }
189 192
190 void StartWithFilePath(const base::FilePath& path) { 193 void StartWithFilePath(const base::FilePath& path) {
191 CHECK(!shell_client_); 194 CHECK(!shell_client_);
192 scoped_ptr<NativeRunner> runner = 195 std::unique_ptr<NativeRunner> runner =
193 shell_->native_runner_factory_->Create(path); 196 shell_->native_runner_factory_->Create(path);
194 bool start_sandboxed = false; 197 bool start_sandboxed = false;
195 mojom::ShellClientPtr client = runner->Start( 198 mojom::ShellClientPtr client = runner->Start(
196 path, identity_, start_sandboxed, 199 path, identity_, start_sandboxed,
197 base::Bind(&Instance::PIDAvailable, weak_factory_.GetWeakPtr()), 200 base::Bind(&Instance::PIDAvailable, weak_factory_.GetWeakPtr()),
198 base::Bind(&shell::Shell::CleanupRunner, 201 base::Bind(&shell::Shell::CleanupRunner,
199 shell_->weak_ptr_factory_.GetWeakPtr(), runner.get())); 202 shell_->weak_ptr_factory_.GetWeakPtr(), runner.get()));
200 shell_->native_runners_.push_back(std::move(runner)); 203 shell_->native_runners_.push_back(std::move(runner));
201 StartWithClient(std::move(client)); 204 StartWithClient(std::move(client));
202 } 205 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 237
235 if (!ValidateIdentity(target, callback)) 238 if (!ValidateIdentity(target, callback))
236 return; 239 return;
237 if (!ValidateClientProcessConnection(&client_process_connection, target, 240 if (!ValidateClientProcessConnection(&client_process_connection, target,
238 callback)) { 241 callback)) {
239 return; 242 return;
240 } 243 }
241 if (!ValidateCapabilities(target, callback)) 244 if (!ValidateCapabilities(target, callback))
242 return; 245 return;
243 246
244 scoped_ptr<ConnectParams> params(new ConnectParams); 247 std::unique_ptr<ConnectParams> params(new ConnectParams);
245 params->set_source(identity_); 248 params->set_source(identity_);
246 params->set_target(target); 249 params->set_target(target);
247 params->set_remote_interfaces(std::move(remote_interfaces)); 250 params->set_remote_interfaces(std::move(remote_interfaces));
248 params->set_local_interfaces(std::move(local_interfaces)); 251 params->set_local_interfaces(std::move(local_interfaces));
249 params->set_client_process_connection(std::move(client_process_connection)); 252 params->set_client_process_connection(std::move(client_process_connection));
250 params->set_connect_callback(callback); 253 params->set_connect_callback(callback);
251 shell_->Connect(std::move(params)); 254 shell_->Connect(std::move(params));
252 } 255 }
253 256
254 void Clone(mojom::ConnectorRequest request) override { 257 void Clone(mojom::ConnectorRequest request) override {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 shell::Shell* const shell_; 408 shell::Shell* const shell_;
406 409
407 // An id that identifies this instance. Distinct from pid, as a single process 410 // An id that identifies this instance. Distinct from pid, as a single process
408 // may vend multiple application instances, and this object may exist before a 411 // may vend multiple application instances, and this object may exist before a
409 // process is launched. 412 // process is launched.
410 const uint32_t id_; 413 const uint32_t id_;
411 const Identity identity_; 414 const Identity identity_;
412 const CapabilitySpec capability_spec_; 415 const CapabilitySpec capability_spec_;
413 const bool allow_any_application_; 416 const bool allow_any_application_;
414 mojom::ShellClientPtr shell_client_; 417 mojom::ShellClientPtr shell_client_;
415 Binding<mojom::PIDReceiver> pid_receiver_binding_; 418 mojo::Binding<mojom::PIDReceiver> pid_receiver_binding_;
416 BindingSet<mojom::Connector> connectors_; 419 mojo::BindingSet<mojom::Connector> connectors_;
417 BindingSet<mojom::Shell> shell_bindings_; 420 mojo::BindingSet<mojom::Shell> shell_bindings_;
418 NativeRunner* runner_ = nullptr; 421 NativeRunner* runner_ = nullptr;
419 base::ProcessId pid_ = base::kNullProcessId; 422 base::ProcessId pid_ = base::kNullProcessId;
420 Instance* parent_ = nullptr; 423 Instance* parent_ = nullptr;
421 std::set<Instance*> children_; 424 std::set<Instance*> children_;
422 base::WeakPtrFactory<Instance> weak_factory_; 425 base::WeakPtrFactory<Instance> weak_factory_;
423 426
424 DISALLOW_COPY_AND_ASSIGN(Instance); 427 DISALLOW_COPY_AND_ASSIGN(Instance);
425 }; 428 };
426 429
427 // static 430 // static
428 Shell::TestAPI::TestAPI(Shell* shell) : shell_(shell) {} 431 Shell::TestAPI::TestAPI(Shell* shell) : shell_(shell) {}
429 Shell::TestAPI::~TestAPI() {} 432 Shell::TestAPI::~TestAPI() {}
430 433
431 bool Shell::TestAPI::HasRunningInstanceForName(const std::string& name) const { 434 bool Shell::TestAPI::HasRunningInstanceForName(const std::string& name) const {
432 for (const auto& entry : shell_->identity_to_instance_) { 435 for (const auto& entry : shell_->identity_to_instance_) {
433 if (entry.first.name() == name) 436 if (entry.first.name() == name)
434 return true; 437 return true;
435 } 438 }
436 return false; 439 return false;
437 } 440 }
438 441
439 //////////////////////////////////////////////////////////////////////////////// 442 ////////////////////////////////////////////////////////////////////////////////
440 // Shell, public: 443 // Shell, public:
441 444
442 Shell::Shell(scoped_ptr<NativeRunnerFactory> native_runner_factory, 445 Shell::Shell(std::unique_ptr<NativeRunnerFactory> native_runner_factory,
443 mojom::ShellClientPtr catalog) 446 mojom::ShellClientPtr catalog)
444 : native_runner_factory_(std::move(native_runner_factory)), 447 : native_runner_factory_(std::move(native_runner_factory)),
445 weak_ptr_factory_(this) { 448 weak_ptr_factory_(this) {
446 mojom::ShellClientPtr client; 449 mojom::ShellClientPtr client;
447 mojom::ShellClientRequest request = GetProxy(&client); 450 mojom::ShellClientRequest request = mojo::GetProxy(&client);
448 Instance* instance = CreateInstance(Identity(), CreateShellIdentity(), 451 Instance* instance = CreateInstance(Identity(), CreateShellIdentity(),
449 GetPermissiveCapabilities()); 452 GetPermissiveCapabilities());
450 instance->StartWithClient(std::move(client)); 453 instance->StartWithClient(std::move(client));
451 singletons_.insert(kShellName); 454 singletons_.insert(kShellName);
452 shell_connection_.reset(new ShellConnection(this, std::move(request))); 455 shell_connection_.reset(new ShellConnection(this, std::move(request)));
453 456
454 if (catalog) 457 if (catalog)
455 InitCatalog(std::move(catalog)); 458 InitCatalog(std::move(catalog));
456 } 459 }
457 460
458 Shell::~Shell() { 461 Shell::~Shell() {
459 TerminateShellConnections(); 462 TerminateShellConnections();
460 STLDeleteValues(&name_to_loader_); 463 STLDeleteValues(&name_to_loader_);
461 for (auto& runner : native_runners_) 464 for (auto& runner : native_runners_)
462 runner.reset(); 465 runner.reset();
463 } 466 }
464 467
465 void Shell::SetInstanceQuitCallback( 468 void Shell::SetInstanceQuitCallback(
466 base::Callback<void(const Identity&)> callback) { 469 base::Callback<void(const Identity&)> callback) {
467 instance_quit_callback_ = callback; 470 instance_quit_callback_ = callback;
468 } 471 }
469 472
470 void Shell::Connect(scoped_ptr<ConnectParams> params) { 473 void Shell::Connect(std::unique_ptr<ConnectParams> params) {
471 Connect(std::move(params), nullptr); 474 Connect(std::move(params), nullptr);
472 } 475 }
473 476
474 mojom::ShellClientRequest Shell::InitInstanceForEmbedder( 477 mojom::ShellClientRequest Shell::InitInstanceForEmbedder(
475 const std::string& name) { 478 const std::string& name) {
476 scoped_ptr<ConnectParams> params(new ConnectParams); 479 std::unique_ptr<ConnectParams> params(new ConnectParams);
477 480
478 Identity embedder_identity(name, mojom::kRootUserID); 481 Identity embedder_identity(name, mojom::kRootUserID);
479 params->set_source(embedder_identity); 482 params->set_source(embedder_identity);
480 params->set_target(embedder_identity); 483 params->set_target(embedder_identity);
481 484
482 mojom::ShellClientPtr client; 485 mojom::ShellClientPtr client;
483 mojom::ShellClientRequest request = GetProxy(&client); 486 mojom::ShellClientRequest request = mojo::GetProxy(&client);
484 Connect(std::move(params), std::move(client)); 487 Connect(std::move(params), std::move(client));
485 488
486 return request; 489 return request;
487 } 490 }
488 491
489 void Shell::SetLoaderForName(scoped_ptr<Loader> loader, 492 void Shell::SetLoaderForName(std::unique_ptr<Loader> loader,
490 const std::string& name) { 493 const std::string& name) {
491 auto it = name_to_loader_.find(name); 494 auto it = name_to_loader_.find(name);
492 if (it != name_to_loader_.end()) 495 if (it != name_to_loader_.end())
493 delete it->second; 496 delete it->second;
494 name_to_loader_[name] = loader.release(); 497 name_to_loader_[name] = loader.release();
495 } 498 }
496 499
497 //////////////////////////////////////////////////////////////////////////////// 500 ////////////////////////////////////////////////////////////////////////////////
498 // Shell, ShellClient implementation: 501 // Shell, ShellClient implementation:
499 502
(...skipping 18 matching lines...) Expand all
518 521
519 void Shell::InitCatalog(mojom::ShellClientPtr catalog) { 522 void Shell::InitCatalog(mojom::ShellClientPtr catalog) {
520 Instance* instance = CreateInstance(CreateShellIdentity(), 523 Instance* instance = CreateInstance(CreateShellIdentity(),
521 CreateCatalogIdentity(), 524 CreateCatalogIdentity(),
522 CapabilitySpec()); 525 CapabilitySpec());
523 singletons_.insert(kCatalogName); 526 singletons_.insert(kCatalogName);
524 instance->StartWithClient(std::move(catalog)); 527 instance->StartWithClient(std::move(catalog));
525 528
526 // TODO(beng): this doesn't work anymore. 529 // TODO(beng): this doesn't work anymore.
527 // Seed the catalog with manifest info for the shell & catalog. 530 // Seed the catalog with manifest info for the shell & catalog.
528 shell::mojom::ShellResolverPtr resolver; 531 mojom::ShellResolverPtr resolver;
529 shell_connection_->connector()->ConnectToInterface(kCatalogName, &resolver); 532 shell_connection_->connector()->ConnectToInterface(kCatalogName, &resolver);
530 resolver->ResolveMojoName(kCatalogName, base::Bind(&EmptyResolverCallback)); 533 resolver->ResolveMojoName(kCatalogName, base::Bind(&EmptyResolverCallback));
531 resolver->ResolveMojoName(kShellName, base::Bind(&EmptyResolverCallback)); 534 resolver->ResolveMojoName(kShellName, base::Bind(&EmptyResolverCallback));
532 } 535 }
533 536
534 void Shell::TerminateShellConnections() { 537 void Shell::TerminateShellConnections() {
535 Instance* instance = GetExistingInstance(CreateShellIdentity()); 538 Instance* instance = GetExistingInstance(CreateShellIdentity());
536 DCHECK(instance); 539 DCHECK(instance);
537 OnInstanceError(instance); 540 OnInstanceError(instance);
538 } 541 }
539 542
540 void Shell::OnInstanceError(Instance* instance) { 543 void Shell::OnInstanceError(Instance* instance) {
541 const Identity identity = instance->identity(); 544 const Identity identity = instance->identity();
542 // Remove the shell. 545 // Remove the shell.
543 auto it = identity_to_instance_.find(identity); 546 auto it = identity_to_instance_.find(identity);
544 DCHECK(it != identity_to_instance_.end()); 547 DCHECK(it != identity_to_instance_.end());
545 int id = instance->id(); 548 int id = instance->id();
546 delete it->second; 549 delete it->second;
547 identity_to_instance_.erase(it); 550 identity_to_instance_.erase(it);
548 instance_listeners_.ForAllPtrs([this, id](mojom::InstanceListener* listener) { 551 instance_listeners_.ForAllPtrs([this, id](mojom::InstanceListener* listener) {
549 listener->InstanceDestroyed(id); 552 listener->InstanceDestroyed(id);
550 }); 553 });
551 if (!instance_quit_callback_.is_null()) 554 if (!instance_quit_callback_.is_null())
552 instance_quit_callback_.Run(identity); 555 instance_quit_callback_.Run(identity);
553 } 556 }
554 557
555 void Shell::Connect(scoped_ptr<ConnectParams> params, 558 void Shell::Connect(std::unique_ptr<ConnectParams> params,
556 mojom::ShellClientPtr client) { 559 mojom::ShellClientPtr client) {
557 TRACE_EVENT_INSTANT1("mojo_shell", "Shell::Connect", 560 TRACE_EVENT_INSTANT1("mojo_shell", "Shell::Connect",
558 TRACE_EVENT_SCOPE_THREAD, "original_name", 561 TRACE_EVENT_SCOPE_THREAD, "original_name",
559 params->target().name()); 562 params->target().name());
560 DCHECK(IsValidName(params->target().name())); 563 DCHECK(IsValidName(params->target().name()));
561 DCHECK(base::IsValidGUID(params->target().user_id())); 564 DCHECK(base::IsValidGUID(params->target().user_id()));
562 DCHECK_NE(mojom::kInheritUserID, params->target().user_id()); 565 DCHECK_NE(mojom::kInheritUserID, params->target().user_id());
563 DCHECK(!client.is_bound() || !identity_to_instance_.count(params->target())); 566 DCHECK(!client.is_bound() || !identity_to_instance_.count(params->target()));
564 567
565 // Connect to an existing matching instance, if possible. 568 // Connect to an existing matching instance, if possible.
566 if (!client.is_bound() && ConnectToExistingInstance(&params)) 569 if (!client.is_bound() && ConnectToExistingInstance(&params))
567 return; 570 return;
568 571
569 // The catalog needs to see the source identity as that of the originating 572 // The catalog needs to see the source identity as that of the originating
570 // app so it loads the correct store. Since the catalog is itself run as root 573 // app so it loads the correct store. Since the catalog is itself run as root
571 // when this re-enters Connect() it'll be handled by 574 // when this re-enters Connect() it'll be handled by
572 // ConnectToExistingInstance(). 575 // ConnectToExistingInstance().
573 mojom::ShellResolverPtr resolver; 576 mojom::ShellResolverPtr resolver;
574 ConnectToInterface(this, Identity(kShellName, params->target().user_id()), 577 ConnectToInterface(this, Identity(kShellName, params->target().user_id()),
575 CreateCatalogIdentity(), &resolver); 578 CreateCatalogIdentity(), &resolver);
576 579
577 std::string name = params->target().name(); 580 std::string name = params->target().name();
578 mojom::ShellResolver* resolver_raw = resolver.get(); 581 mojom::ShellResolver* resolver_raw = resolver.get();
579 resolver_raw->ResolveMojoName( 582 resolver_raw->ResolveMojoName(
580 name, 583 name, base::Bind(&shell::Shell::OnGotResolvedName,
581 base::Bind(&Shell::OnGotResolvedName, weak_ptr_factory_.GetWeakPtr(), 584 weak_ptr_factory_.GetWeakPtr(),
582 base::Passed(std::move(resolver)), base::Passed(&params), 585 base::Passed(std::move(resolver)), base::Passed(&params),
583 base::Passed(&client))); 586 base::Passed(&client)));
584 } 587 }
585 588
586 Shell::Instance* Shell::GetExistingInstance(const Identity& identity) const { 589 Shell::Instance* Shell::GetExistingInstance(const Identity& identity) const {
587 const auto& it = identity_to_instance_.find(identity); 590 const auto& it = identity_to_instance_.find(identity);
588 Instance* instance = it != identity_to_instance_.end() ? it->second : nullptr; 591 Instance* instance = it != identity_to_instance_.end() ? it->second : nullptr;
589 if (instance) 592 if (instance)
590 return instance; 593 return instance;
591 594
592 if (singletons_.find(identity.name()) != singletons_.end()) { 595 if (singletons_.find(identity.name()) != singletons_.end()) {
593 for (auto entry : identity_to_instance_) { 596 for (auto entry : identity_to_instance_) {
594 if (entry.first.name() == identity.name() && 597 if (entry.first.name() == identity.name() &&
595 entry.first.instance() == identity.instance()) { 598 entry.first.instance() == identity.instance()) {
596 return entry.second; 599 return entry.second;
597 } 600 }
598 } 601 }
599 } 602 }
600 return nullptr; 603 return nullptr;
601 } 604 }
602 605
603 void Shell::NotifyPIDAvailable(uint32_t id, base::ProcessId pid) { 606 void Shell::NotifyPIDAvailable(uint32_t id, base::ProcessId pid) {
604 instance_listeners_.ForAllPtrs([id, pid](mojom::InstanceListener* listener) { 607 instance_listeners_.ForAllPtrs([id, pid](mojom::InstanceListener* listener) {
605 listener->InstancePIDAvailable(id, pid); 608 listener->InstancePIDAvailable(id, pid);
606 }); 609 });
607 } 610 }
608 611
609 bool Shell::ConnectToExistingInstance(scoped_ptr<ConnectParams>* params) { 612 bool Shell::ConnectToExistingInstance(std::unique_ptr<ConnectParams>* params) {
610 Instance* instance = GetExistingInstance((*params)->target()); 613 Instance* instance = GetExistingInstance((*params)->target());
611 if (instance) 614 if (instance)
612 instance->ConnectToClient(std::move(*params)); 615 instance->ConnectToClient(std::move(*params));
613 return !!instance; 616 return !!instance;
614 } 617 }
615 618
616 Shell::Instance* Shell::CreateInstance(const Identity& source, 619 Shell::Instance* Shell::CreateInstance(const Identity& source,
617 const Identity& target, 620 const Identity& target,
618 const CapabilitySpec& spec) { 621 const CapabilitySpec& spec) {
619 CHECK(target.user_id() != mojom::kInheritUserID); 622 CHECK(target.user_id() != mojom::kInheritUserID);
620 Instance* instance = new Instance(this, target, spec); 623 Instance* instance = new Instance(this, target, spec);
621 DCHECK(identity_to_instance_.find(target) == 624 DCHECK(identity_to_instance_.find(target) ==
622 identity_to_instance_.end()); 625 identity_to_instance_.end());
623 Instance* source_instance = GetExistingInstance(source); 626 Instance* source_instance = GetExistingInstance(source);
624 if (source_instance) 627 if (source_instance)
625 source_instance->AddChild(instance); 628 source_instance->AddChild(instance);
626 identity_to_instance_[target] = instance; 629 identity_to_instance_[target] = instance;
627 mojom::InstanceInfoPtr info = instance->CreateInstanceInfo(); 630 mojom::InstanceInfoPtr info = instance->CreateInstanceInfo();
628 instance_listeners_.ForAllPtrs( 631 instance_listeners_.ForAllPtrs(
629 [this, &info](mojom::InstanceListener* listener) { 632 [this, &info](mojom::InstanceListener* listener) {
630 listener->InstanceCreated(info.Clone()); 633 listener->InstanceCreated(info.Clone());
631 }); 634 });
632 return instance; 635 return instance;
633 } 636 }
634 637
635 void Shell::AddInstanceListener(mojom::InstanceListenerPtr listener) { 638 void Shell::AddInstanceListener(mojom::InstanceListenerPtr listener) {
636 // TODO(beng): filter instances provided by those visible to this client. 639 // TODO(beng): filter instances provided by those visible to this client.
637 Array<mojom::InstanceInfoPtr> instances; 640 mojo::Array<mojom::InstanceInfoPtr> instances;
638 for (auto& instance : identity_to_instance_) 641 for (auto& instance : identity_to_instance_)
639 instances.push_back(instance.second->CreateInstanceInfo()); 642 instances.push_back(instance.second->CreateInstanceInfo());
640 listener->SetExistingInstances(std::move(instances)); 643 listener->SetExistingInstances(std::move(instances));
641 644
642 instance_listeners_.AddPtr(std::move(listener)); 645 instance_listeners_.AddPtr(std::move(listener));
643 } 646 }
644 647
645 void Shell::CreateShellClientWithFactory(const Identity& shell_client_factory, 648 void Shell::CreateShellClientWithFactory(const Identity& shell_client_factory,
646 const std::string& name, 649 const std::string& name,
647 mojom::ShellClientRequest request) { 650 mojom::ShellClientRequest request) {
648 mojom::ShellClientFactory* factory = 651 mojom::ShellClientFactory* factory =
649 GetShellClientFactory(shell_client_factory); 652 GetShellClientFactory(shell_client_factory);
650 factory->CreateShellClient(std::move(request), name); 653 factory->CreateShellClient(std::move(request), name);
651 } 654 }
652 655
653 mojom::ShellClientFactory* Shell::GetShellClientFactory( 656 mojom::ShellClientFactory* Shell::GetShellClientFactory(
654 const Identity& shell_client_factory_identity) { 657 const Identity& shell_client_factory_identity) {
655 auto it = shell_client_factories_.find(shell_client_factory_identity); 658 auto it = shell_client_factories_.find(shell_client_factory_identity);
656 if (it != shell_client_factories_.end()) 659 if (it != shell_client_factories_.end())
657 return it->second.get(); 660 return it->second.get();
658 661
659 Identity source_identity(kShellName, mojom::kInheritUserID); 662 Identity source_identity(kShellName, mojom::kInheritUserID);
660 mojom::ShellClientFactoryPtr factory; 663 mojom::ShellClientFactoryPtr factory;
661 ConnectToInterface(this, source_identity, shell_client_factory_identity, 664 ConnectToInterface(this, source_identity, shell_client_factory_identity,
662 &factory); 665 &factory);
663 mojom::ShellClientFactory* factory_interface = factory.get(); 666 mojom::ShellClientFactory* factory_interface = factory.get();
664 factory.set_connection_error_handler( 667 factory.set_connection_error_handler(base::Bind(
665 base::Bind(&Shell::OnShellClientFactoryLost, 668 &shell::Shell::OnShellClientFactoryLost, weak_ptr_factory_.GetWeakPtr(),
666 weak_ptr_factory_.GetWeakPtr(), 669 shell_client_factory_identity));
667 shell_client_factory_identity));
668 shell_client_factories_[shell_client_factory_identity] = std::move(factory); 670 shell_client_factories_[shell_client_factory_identity] = std::move(factory);
669 return factory_interface; 671 return factory_interface;
670 } 672 }
671 673
672 void Shell::OnShellClientFactoryLost(const Identity& which) { 674 void Shell::OnShellClientFactoryLost(const Identity& which) {
673 // Remove the mapping. 675 // Remove the mapping.
674 auto it = shell_client_factories_.find(which); 676 auto it = shell_client_factories_.find(which);
675 DCHECK(it != shell_client_factories_.end()); 677 DCHECK(it != shell_client_factories_.end());
676 shell_client_factories_.erase(it); 678 shell_client_factories_.erase(it);
677 } 679 }
678 680
679 void Shell::OnGotResolvedName(mojom::ShellResolverPtr resolver, 681 void Shell::OnGotResolvedName(mojom::ShellResolverPtr resolver,
680 scoped_ptr<ConnectParams> params, 682 std::unique_ptr<ConnectParams> params,
681 mojom::ShellClientPtr client, 683 mojom::ShellClientPtr client,
682 mojom::ResolveResultPtr result) { 684 mojom::ResolveResultPtr result) {
683 std::string instance_name = params->target().instance(); 685 std::string instance_name = params->target().instance();
684 if (instance_name == GetNamePath(params->target().name()) && 686 if (instance_name == GetNamePath(params->target().name()) &&
685 result->qualifier != GetNamePath(result->resolved_name)) { 687 result->qualifier != GetNamePath(result->resolved_name)) {
686 instance_name = result->qualifier; 688 instance_name = result->qualifier;
687 } 689 }
688 Identity target(params->target().name(), params->target().user_id(), 690 Identity target(params->target().name(), params->target().user_id(),
689 instance_name); 691 instance_name);
690 params->set_target(target); 692 params->set_target(target);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 CHECK(!result->package_url.is_null() && !result->capabilities.is_null()); 743 CHECK(!result->package_url.is_null() && !result->capabilities.is_null());
742 744
743 if (target.name() != result->resolved_name) { 745 if (target.name() != result->resolved_name) {
744 instance->StartWithClient(std::move(client)); 746 instance->StartWithClient(std::move(client));
745 Identity factory(result->resolved_name, target.user_id(), 747 Identity factory(result->resolved_name, target.user_id(),
746 instance_name); 748 instance_name);
747 CreateShellClientWithFactory(factory, target.name(), 749 CreateShellClientWithFactory(factory, target.name(),
748 std::move(request)); 750 std::move(request));
749 } else { 751 } else {
750 instance->StartWithFilePath( 752 instance->StartWithFilePath(
751 util::UrlToFilePath(result->package_url.To<GURL>())); 753 mojo::util::UrlToFilePath(result->package_url.To<GURL>()));
752 } 754 }
753 } 755 }
754 } 756 }
755 757
756 // Now that the instance has a ShellClient, we can connect to it. 758 // Now that the instance has a ShellClient, we can connect to it.
757 instance->ConnectToClient(std::move(params)); 759 instance->ConnectToClient(std::move(params));
758 } 760 }
759 761
760 bool Shell::LoadWithLoader(const Identity& target, 762 bool Shell::LoadWithLoader(const Identity& target,
761 mojom::ShellClientRequest* request) { 763 mojom::ShellClientRequest* request) {
(...skipping 18 matching lines...) Expand all
780 void Shell::CleanupRunner(NativeRunner* runner) { 782 void Shell::CleanupRunner(NativeRunner* runner) {
781 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) { 783 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) {
782 if (it->get() == runner) { 784 if (it->get() == runner) {
783 native_runners_.erase(it); 785 native_runners_.erase(it);
784 return; 786 return;
785 } 787 }
786 } 788 }
787 } 789 }
788 790
789 } // namespace shell 791 } // namespace shell
790 } // namespace mojo
OLDNEW
« no previous file with comments | « services/shell/shell.h ('k') | services/shell/shell.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698