OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_instance.h" | 5 #include "mojo/shell/application_instance.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 ApplicationInstance::ApplicationInstance( | 22 ApplicationInstance::ApplicationInstance( |
23 mojom::ShellClientPtr shell_client, | 23 mojom::ShellClientPtr shell_client, |
24 ApplicationManager* manager, | 24 ApplicationManager* manager, |
25 const Identity& identity) | 25 const Identity& identity) |
26 : manager_(manager), | 26 : manager_(manager), |
27 id_(GenerateUniqueID()), | 27 id_(GenerateUniqueID()), |
28 identity_(identity), | 28 identity_(identity), |
29 allow_any_application_(identity.filter().size() == 1 && | 29 allow_any_application_(identity.filter().size() == 1 && |
30 identity.filter().count("*") == 1), | 30 identity.filter().count("*") == 1), |
31 shell_client_(std::move(shell_client)), | 31 shell_client_(std::move(shell_client)), |
32 binding_(this), | |
33 pid_receiver_binding_(this), | 32 pid_receiver_binding_(this), |
34 queue_requests_(false), | |
35 native_runner_(nullptr), | 33 native_runner_(nullptr), |
36 pid_(base::kNullProcessId) { | 34 pid_(base::kNullProcessId) { |
37 DCHECK_NE(kInvalidApplicationID, id_); | 35 DCHECK_NE(kInvalidApplicationID, id_); |
38 } | 36 } |
39 | 37 |
40 ApplicationInstance::~ApplicationInstance() { | 38 ApplicationInstance::~ApplicationInstance() {} |
41 for (auto request : queued_client_requests_) | |
42 request->connect_callback().Run(kInvalidApplicationID); | |
43 STLDeleteElements(&queued_client_requests_); | |
44 } | |
45 | 39 |
46 void ApplicationInstance::InitializeApplication() { | 40 void ApplicationInstance::InitializeApplication() { |
47 shell_client_->Initialize(binding_.CreateInterfacePtrAndBind(), | 41 shell_client_->Initialize(connectors_.CreateInterfacePtrAndBind(this), |
48 identity_.url().spec(), id_, identity_.user_id()); | 42 identity_.url().spec(), id_, identity_.user_id()); |
49 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); | 43 connectors_.set_connection_error_handler( |
| 44 base::Bind(&ApplicationManager::OnApplicationInstanceError, |
| 45 base::Unretained(manager_), base::Unretained(this))); |
50 } | 46 } |
51 | 47 |
52 void ApplicationInstance::ConnectToClient(scoped_ptr<ConnectParams> params) { | 48 void ApplicationInstance::ConnectToClient(scoped_ptr<ConnectParams> params) { |
53 if (queue_requests_) { | 49 params->connect_callback().Run(id_); |
54 queued_client_requests_.push_back(params.release()); | 50 AllowedInterfaces interfaces; |
55 return; | 51 interfaces.insert("*"); |
56 } | 52 if (!params->source().is_null()) |
| 53 interfaces = GetAllowedInterfaces(params->source().filter(), identity_); |
57 | 54 |
58 CallAcceptConnection(std::move(params)); | 55 ApplicationInstance* source = |
| 56 manager_->GetApplicationInstance(params->source()); |
| 57 uint32_t source_id = source ? source->id() : kInvalidApplicationID; |
| 58 shell_client_->AcceptConnection( |
| 59 params->source().url().spec(), params->source().user_id(), source_id, |
| 60 params->TakeRemoteInterfaces(), params->TakeLocalInterfaces(), |
| 61 Array<String>::From(interfaces), params->target().url().spec()); |
59 } | 62 } |
60 | 63 |
61 void ApplicationInstance::SetNativeRunner(NativeRunner* native_runner) { | 64 void ApplicationInstance::SetNativeRunner(NativeRunner* native_runner) { |
62 native_runner_ = native_runner; | 65 native_runner_ = native_runner; |
63 } | 66 } |
64 | 67 |
65 void ApplicationInstance::BindPIDReceiver( | 68 void ApplicationInstance::BindPIDReceiver( |
66 InterfaceRequest<mojom::PIDReceiver> pid_receiver) { | 69 InterfaceRequest<mojom::PIDReceiver> pid_receiver) { |
67 pid_receiver_binding_.Bind(std::move(pid_receiver)); | 70 pid_receiver_binding_.Bind(std::move(pid_receiver)); |
68 } | 71 } |
69 | 72 |
70 // Shell implementation: | |
71 void ApplicationInstance::GetConnector(mojom::ConnectorRequest request) { | |
72 connectors_.AddBinding(this, std::move(request)); | |
73 } | |
74 | |
75 void ApplicationInstance::QuitApplication() { | |
76 queue_requests_ = true; | |
77 shell_client_->OnQuitRequested( | |
78 base::Bind(&ApplicationInstance::OnQuitRequestedResult, | |
79 base::Unretained(this))); | |
80 } | |
81 | |
82 // Connector implementation: | 73 // Connector implementation: |
83 void ApplicationInstance::Connect( | 74 void ApplicationInstance::Connect( |
84 const String& app_url, | 75 const String& app_url, |
85 uint32_t user_id, | 76 uint32_t user_id, |
86 shell::mojom::InterfaceProviderRequest remote_interfaces, | 77 shell::mojom::InterfaceProviderRequest remote_interfaces, |
87 shell::mojom::InterfaceProviderPtr local_interfaces, | 78 shell::mojom::InterfaceProviderPtr local_interfaces, |
88 const ConnectCallback& callback) { | 79 const ConnectCallback& callback) { |
89 GURL url = app_url.To<GURL>(); | 80 GURL url = app_url.To<GURL>(); |
90 if (!url.is_valid()) { | 81 if (!url.is_valid()) { |
91 LOG(ERROR) << "Error: invalid URL: " << app_url; | 82 LOG(ERROR) << "Error: invalid URL: " << app_url; |
(...skipping 25 matching lines...) Expand all Loading... |
117 manager_->ApplicationPIDAvailable(id_, pid); | 108 manager_->ApplicationPIDAvailable(id_, pid); |
118 } | 109 } |
119 | 110 |
120 uint32_t ApplicationInstance::GenerateUniqueID() const { | 111 uint32_t ApplicationInstance::GenerateUniqueID() const { |
121 static uint32_t id = kInvalidApplicationID; | 112 static uint32_t id = kInvalidApplicationID; |
122 ++id; | 113 ++id; |
123 CHECK_NE(kInvalidApplicationID, id); | 114 CHECK_NE(kInvalidApplicationID, id); |
124 return id; | 115 return id; |
125 } | 116 } |
126 | 117 |
127 void ApplicationInstance::CallAcceptConnection( | |
128 scoped_ptr<ConnectParams> params) { | |
129 params->connect_callback().Run(id_); | |
130 AllowedInterfaces interfaces; | |
131 interfaces.insert("*"); | |
132 if (!params->source().is_null()) | |
133 interfaces = GetAllowedInterfaces(params->source().filter(), identity_); | |
134 | |
135 ApplicationInstance* source = | |
136 manager_->GetApplicationInstance(params->source()); | |
137 uint32_t source_id = source ? source->id() : kInvalidApplicationID; | |
138 shell_client_->AcceptConnection( | |
139 params->source().url().spec(), params->source().user_id(), source_id, | |
140 params->TakeRemoteInterfaces(), params->TakeLocalInterfaces(), | |
141 Array<String>::From(interfaces), params->target().url().spec()); | |
142 } | |
143 | |
144 void ApplicationInstance::OnConnectionError() { | |
145 std::vector<ConnectParams*> queued_client_requests; | |
146 queued_client_requests_.swap(queued_client_requests); | |
147 auto manager = manager_; | |
148 manager_->OnApplicationInstanceError(this); | |
149 //|this| is deleted. | |
150 | |
151 // If any queued requests came to shell during time it was shutting down, | |
152 // start them now. | |
153 for (auto request : queued_client_requests) | |
154 manager->Connect(make_scoped_ptr(request)); | |
155 } | |
156 | |
157 void ApplicationInstance::OnQuitRequestedResult(bool can_quit) { | |
158 if (can_quit) | |
159 return; | |
160 | |
161 queue_requests_ = false; | |
162 for (auto request : queued_client_requests_) | |
163 CallAcceptConnection(make_scoped_ptr(request)); | |
164 | |
165 queued_client_requests_.clear(); | |
166 } | |
167 | |
168 } // namespace shell | 118 } // namespace shell |
169 } // namespace mojo | 119 } // namespace mojo |
OLD | NEW |