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

Side by Side Diff: mojo/shell/application_manager.cc

Issue 1679573002: Move shell interfaces into the shell.mojom namespace. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@delegate
Patch Set: . Created 4 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 | « mojo/shell/application_manager.h ('k') | mojo/shell/application_manager_apptest.cc » ('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 "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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 122
123 ApplicationInstance* ApplicationManager::GetApplicationInstance( 123 ApplicationInstance* ApplicationManager::GetApplicationInstance(
124 const Identity& identity) const { 124 const Identity& identity) const {
125 const auto& it = identity_to_instance_.find(identity); 125 const auto& it = identity_to_instance_.find(identity);
126 return it != identity_to_instance_.end() ? it->second : nullptr; 126 return it != identity_to_instance_.end() ? it->second : nullptr;
127 } 127 }
128 128
129 void ApplicationManager::CreateInstanceForHandle( 129 void ApplicationManager::CreateInstanceForHandle(
130 ScopedHandle channel, 130 ScopedHandle channel,
131 const GURL& url, 131 const GURL& url,
132 CapabilityFilterPtr filter, 132 mojom::CapabilityFilterPtr filter,
133 InterfaceRequest<mojom::PIDReceiver> pid_receiver) { 133 InterfaceRequest<mojom::PIDReceiver> pid_receiver) {
134 // Instances created by others are considered unique, and thus have no 134 // Instances created by others are considered unique, and thus have no
135 // identity. As such they cannot be connected to by anyone else, and so we 135 // identity. As such they cannot be connected to by anyone else, and so we
136 // never call ConnectToClient(). 136 // never call ConnectToClient().
137 // TODO(beng): GetPermissiveCapabilityFilter() here obviously cannot make it 137 // TODO(beng): GetPermissiveCapabilityFilter() here obviously cannot make it
138 // to production. See note in application_manager.mojom. 138 // to production. See note in application_manager.mojom.
139 // http://crbug.com/555392 139 // http://crbug.com/555392
140 CapabilityFilter local_filter = filter->filter.To<CapabilityFilter>(); 140 CapabilityFilter local_filter = filter->filter.To<CapabilityFilter>();
141 Identity target_id(url, std::string(), local_filter); 141 Identity target_id(url, std::string(), local_filter);
142 ApplicationInstance* instance = nullptr; 142 ApplicationInstance* instance = nullptr;
143 InterfaceRequest<Application> application_request = 143 InterfaceRequest<mojom::Application> application_request =
144 CreateInstance(target_id, base::Closure(), &instance); 144 CreateInstance(target_id, base::Closure(), &instance);
145 instance->BindPIDReceiver(std::move(pid_receiver)); 145 instance->BindPIDReceiver(std::move(pid_receiver));
146 scoped_ptr<NativeRunner> runner = 146 scoped_ptr<NativeRunner> runner =
147 native_runner_factory_->Create(base::FilePath()); 147 native_runner_factory_->Create(base::FilePath());
148 runner->InitHost(std::move(channel), std::move(application_request)); 148 runner->InitHost(std::move(channel), std::move(application_request));
149 instance->SetNativeRunner(runner.get()); 149 instance->SetNativeRunner(runner.get());
150 native_runners_.push_back(std::move(runner)); 150 native_runners_.push_back(std::move(runner));
151 } 151 }
152 152
153 void ApplicationManager::AddListener( 153 void ApplicationManager::AddListener(
(...skipping 14 matching lines...) Expand all
168 instance.second->set_pid(pid); 168 instance.second->set_pid(pid);
169 break; 169 break;
170 } 170 }
171 } 171 }
172 listeners_.ForAllPtrs( 172 listeners_.ForAllPtrs(
173 [this, id, pid](mojom::ApplicationManagerListener* listener) { 173 [this, id, pid](mojom::ApplicationManagerListener* listener) {
174 listener->ApplicationPIDAvailable(id, pid); 174 listener->ApplicationPIDAvailable(id, pid);
175 }); 175 });
176 } 176 }
177 177
178 InterfaceRequest<Application> ApplicationManager::CreateAndConnectToInstance( 178 InterfaceRequest<mojom::Application>
179 scoped_ptr<ConnectToApplicationParams> params, 179 ApplicationManager::CreateAndConnectToInstance(
180 ApplicationInstance** resulting_instance) { 180 scoped_ptr<ConnectToApplicationParams> params,
181 ApplicationInstance** resulting_instance) {
181 ApplicationInstance* instance = nullptr; 182 ApplicationInstance* instance = nullptr;
182 InterfaceRequest<Application> application_request = 183 InterfaceRequest<mojom::Application> application_request =
183 CreateInstance(params->target(), params->on_application_end(), &instance); 184 CreateInstance(params->target(), params->on_application_end(), &instance);
184 instance->ConnectToClient(std::move(params)); 185 instance->ConnectToClient(std::move(params));
185 if (resulting_instance) 186 if (resulting_instance)
186 *resulting_instance = instance; 187 *resulting_instance = instance;
187 return application_request; 188 return application_request;
188 } 189 }
189 190
190 InterfaceRequest<Application> ApplicationManager::CreateInstance( 191 InterfaceRequest<mojom::Application> ApplicationManager::CreateInstance(
191 const Identity& target_id, 192 const Identity& target_id,
192 const base::Closure& on_application_end, 193 const base::Closure& on_application_end,
193 ApplicationInstance** resulting_instance) { 194 ApplicationInstance** resulting_instance) {
194 ApplicationPtr application; 195 mojom::ApplicationPtr application;
195 InterfaceRequest<Application> application_request = GetProxy(&application); 196 InterfaceRequest<mojom::Application> application_request =
197 GetProxy(&application);
196 ApplicationInstance* instance = new ApplicationInstance( 198 ApplicationInstance* instance = new ApplicationInstance(
197 std::move(application), this, target_id, Shell::kInvalidApplicationID, 199 std::move(application), this, target_id,
198 on_application_end); 200 mojom::Shell::kInvalidApplicationID, on_application_end);
199 DCHECK(identity_to_instance_.find(target_id) == 201 DCHECK(identity_to_instance_.find(target_id) ==
200 identity_to_instance_.end()); 202 identity_to_instance_.end());
201 identity_to_instance_[target_id] = instance; 203 identity_to_instance_[target_id] = instance;
202 mojom::ApplicationInfoPtr application_info = 204 mojom::ApplicationInfoPtr application_info =
203 CreateApplicationInfoForInstance(instance); 205 CreateApplicationInfoForInstance(instance);
204 listeners_.ForAllPtrs( 206 listeners_.ForAllPtrs(
205 [this, &application_info](mojom::ApplicationManagerListener* listener) { 207 [this, &application_info](mojom::ApplicationManagerListener* listener) {
206 listener->ApplicationInstanceCreated(application_info.Clone()); 208 listener->ApplicationInstanceCreated(application_info.Clone());
207 }); 209 });
208 instance->InitializeApplication(); 210 instance->InitializeApplication();
209 if (resulting_instance) 211 if (resulting_instance)
210 *resulting_instance = instance; 212 *resulting_instance = instance;
211 return application_request; 213 return application_request;
212 } 214 }
213 215
214 void ApplicationManager::HandleFetchCallback( 216 void ApplicationManager::HandleFetchCallback(
215 scoped_ptr<ConnectToApplicationParams> params, 217 scoped_ptr<ConnectToApplicationParams> params,
216 scoped_ptr<Fetcher> fetcher) { 218 scoped_ptr<Fetcher> fetcher) {
217 if (!fetcher) { 219 if (!fetcher) {
218 // Network error. Drop |params| to tell the requestor. 220 // Network error. Drop |params| to tell the requestor.
219 params->connect_callback().Run(Shell::kInvalidApplicationID, 221 params->connect_callback().Run(mojom::Shell::kInvalidApplicationID,
220 Shell::kInvalidApplicationID); 222 mojom::Shell::kInvalidApplicationID);
221 return; 223 return;
222 } 224 }
223 225
224 GURL redirect_url = fetcher->GetRedirectURL(); 226 GURL redirect_url = fetcher->GetRedirectURL();
225 if (!redirect_url.is_empty()) { 227 if (!redirect_url.is_empty()) {
226 // And around we go again... Whee! 228 // And around we go again... Whee!
227 // TODO(sky): this loses the original URL info. 229 // TODO(sky): this loses the original URL info.
228 URLRequestPtr new_request = URLRequest::New(); 230 URLRequestPtr new_request = URLRequest::New();
229 new_request->url = redirect_url.spec(); 231 new_request->url = redirect_url.spec();
230 HttpHeaderPtr header = HttpHeader::New(); 232 HttpHeaderPtr header = HttpHeader::New();
231 header->name = "Referer"; 233 header->name = "Referer";
232 header->value = fetcher->GetRedirectReferer().spec(); 234 header->value = fetcher->GetRedirectReferer().spec();
233 new_request->headers.push_back(std::move(header)); 235 new_request->headers.push_back(std::move(header));
234 params->SetTargetURLRequest(std::move(new_request)); 236 params->SetTargetURLRequest(std::move(new_request));
235 ConnectToApplication(std::move(params)); 237 ConnectToApplication(std::move(params));
236 return; 238 return;
237 } 239 }
238 240
239 // We already checked if the application was running before we fetched it, but 241 // We already checked if the application was running before we fetched it, but
240 // it might have started while the fetch was outstanding. We don't want to 242 // it might have started while the fetch was outstanding. We don't want to
241 // have two copies of the app running, so check again. 243 // have two copies of the app running, so check again.
242 if (ConnectToRunningApplication(&params)) 244 if (ConnectToRunningApplication(&params))
243 return; 245 return;
244 246
245 Identity source = params->source(); 247 Identity source = params->source();
246 Identity target = params->target(); 248 Identity target = params->target();
247 Shell::ConnectToApplicationCallback connect_callback = 249 mojom::Shell::ConnectToApplicationCallback connect_callback =
248 params->connect_callback(); 250 params->connect_callback();
249 params->set_connect_callback(EmptyConnectCallback()); 251 params->set_connect_callback(EmptyConnectCallback());
250 ApplicationInstance* app = nullptr; 252 ApplicationInstance* app = nullptr;
251 InterfaceRequest<Application> request( 253 InterfaceRequest<mojom::Application> request(
252 CreateAndConnectToInstance(std::move(params), &app)); 254 CreateAndConnectToInstance(std::move(params), &app));
253 255
254 uint32_t content_handler_id = package_manager_->HandleWithContentHandler( 256 uint32_t content_handler_id = package_manager_->HandleWithContentHandler(
255 fetcher.get(), source, target.url(), target.filter(), &request); 257 fetcher.get(), source, target.url(), target.filter(), &request);
256 if (content_handler_id != Shell::kInvalidApplicationID) { 258 if (content_handler_id != mojom::Shell::kInvalidApplicationID) {
257 app->set_requesting_content_handler_id(content_handler_id); 259 app->set_requesting_content_handler_id(content_handler_id);
258 connect_callback.Run(app->id(), content_handler_id); 260 connect_callback.Run(app->id(), content_handler_id);
259 return; 261 return;
260 } 262 }
261 263
262 // TODO(erg): Have a better way of switching the sandbox on. For now, switch 264 // TODO(erg): Have a better way of switching the sandbox on. For now, switch
263 // it on hard coded when we're using some of the sandboxable core services. 265 // it on hard coded when we're using some of the sandboxable core services.
264 bool start_sandboxed = false; 266 bool start_sandboxed = false;
265 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 267 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
266 switches::kMojoNoSandbox)) { 268 switches::kMojoNoSandbox)) {
267 start_sandboxed = (target.url() == GURL("mojo://core_services/") && 269 start_sandboxed = (target.url() == GURL("mojo://core_services/") &&
268 target.qualifier() == "Core") || 270 target.qualifier() == "Core") ||
269 target.url() == GURL("mojo://html_viewer/"); 271 target.url() == GURL("mojo://html_viewer/");
270 } 272 }
271 273
272 connect_callback.Run(app->id(), Shell::kInvalidApplicationID); 274 connect_callback.Run(app->id(), mojom::Shell::kInvalidApplicationID);
273 275
274 fetcher->AsPath( 276 fetcher->AsPath(
275 task_runner_, 277 task_runner_,
276 base::Bind(&ApplicationManager::RunNativeApplication, 278 base::Bind(&ApplicationManager::RunNativeApplication,
277 weak_ptr_factory_.GetWeakPtr(), 279 weak_ptr_factory_.GetWeakPtr(),
278 base::Passed(std::move(request)), start_sandboxed, 280 base::Passed(std::move(request)), start_sandboxed,
279 base::Passed(std::move(fetcher)), base::Unretained(app))); 281 base::Passed(std::move(fetcher)), base::Unretained(app)));
280 } 282 }
281 283
282 void ApplicationManager::RunNativeApplication( 284 void ApplicationManager::RunNativeApplication(
283 InterfaceRequest<Application> application_request, 285 InterfaceRequest<mojom::Application> application_request,
284 bool start_sandboxed, 286 bool start_sandboxed,
285 scoped_ptr<Fetcher> fetcher, 287 scoped_ptr<Fetcher> fetcher,
286 ApplicationInstance* instance, 288 ApplicationInstance* instance,
287 const base::FilePath& path, 289 const base::FilePath& path,
288 bool path_exists) { 290 bool path_exists) {
289 // We only passed fetcher to keep it alive. Done with it now. 291 // We only passed fetcher to keep it alive. Done with it now.
290 fetcher.reset(); 292 fetcher.reset();
291 293
292 DCHECK(application_request.is_pending()); 294 DCHECK(application_request.is_pending());
293 295
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 362
361 void ApplicationManager::CleanupRunner(NativeRunner* runner) { 363 void ApplicationManager::CleanupRunner(NativeRunner* runner) {
362 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) { 364 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) {
363 if (it->get() == runner) { 365 if (it->get() == runner) {
364 native_runners_.erase(it); 366 native_runners_.erase(it);
365 return; 367 return;
366 } 368 }
367 } 369 }
368 } 370 }
369 371
370 Shell::ConnectToApplicationCallback EmptyConnectCallback() { 372 mojom::Shell::ConnectToApplicationCallback EmptyConnectCallback() {
371 return base::Bind(&OnEmptyOnConnectCallback); 373 return base::Bind(&OnEmptyOnConnectCallback);
372 } 374 }
373 375
374 } // namespace shell 376 } // namespace shell
375 } // namespace mojo 377 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/shell/application_manager.h ('k') | mojo/shell/application_manager_apptest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698