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

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

Issue 1126393006: core_services: Run different services in different processes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix unit tests by never having an empty qualifier. Created 5 years, 7 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/identity.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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 16 matching lines...) Expand all
27 namespace { 27 namespace {
28 28
29 // Used by TestAPI. 29 // Used by TestAPI.
30 bool has_created_instance = false; 30 bool has_created_instance = false;
31 31
32 } // namespace 32 } // namespace
33 33
34 class ApplicationManager::ContentHandlerConnection : public ErrorHandler { 34 class ApplicationManager::ContentHandlerConnection : public ErrorHandler {
35 public: 35 public:
36 ContentHandlerConnection(ApplicationManager* manager, 36 ContentHandlerConnection(ApplicationManager* manager,
37 const GURL& content_handler_url) 37 const GURL& content_handler_url,
38 : manager_(manager), content_handler_url_(content_handler_url) { 38 const std::string& qualifier)
39 : manager_(manager),
40 content_handler_url_(content_handler_url),
41 content_handler_qualifier_(qualifier) {
39 ServiceProviderPtr services; 42 ServiceProviderPtr services;
40 manager->ConnectToApplication(content_handler_url, GURL(), 43 manager->ConnectToApplicationWithParameters(
41 GetProxy(&services), nullptr, 44 content_handler_url, qualifier, GURL(), GetProxy(&services), nullptr,
42 base::Closure()); 45 base::Closure(), std::vector<std::string>());
43 MessagePipe pipe; 46 MessagePipe pipe;
44 content_handler_.Bind(pipe.handle0.Pass()); 47 content_handler_.Bind(pipe.handle0.Pass());
45 services->ConnectToService(ContentHandler::Name_, pipe.handle1.Pass()); 48 services->ConnectToService(ContentHandler::Name_, pipe.handle1.Pass());
46 content_handler_.set_error_handler(this); 49 content_handler_.set_error_handler(this);
47 } 50 }
48 51
49 ContentHandler* content_handler() { return content_handler_.get(); } 52 ContentHandler* content_handler() { return content_handler_.get(); }
50 53
51 GURL content_handler_url() { return content_handler_url_; } 54 GURL content_handler_url() { return content_handler_url_; }
55 std::string content_handler_qualifier() { return content_handler_qualifier_; }
52 56
53 private: 57 private:
54 // ErrorHandler implementation: 58 // ErrorHandler implementation:
55 void OnConnectionError() override { manager_->OnContentHandlerError(this); } 59 void OnConnectionError() override { manager_->OnContentHandlerError(this); }
56 60
57 ApplicationManager* manager_; 61 ApplicationManager* manager_;
58 GURL content_handler_url_; 62 GURL content_handler_url_;
63 std::string content_handler_qualifier_;
59 ContentHandlerPtr content_handler_; 64 ContentHandlerPtr content_handler_;
60 65
61 DISALLOW_COPY_AND_ASSIGN(ContentHandlerConnection); 66 DISALLOW_COPY_AND_ASSIGN(ContentHandlerConnection);
62 }; 67 };
63 68
64 // static 69 // static
65 ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager) 70 ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager)
66 : manager_(manager) { 71 : manager_(manager) {
67 } 72 }
68 73
(...skipping 24 matching lines...) Expand all
93 STLDeleteValues(&identity_to_shell_impl_); 98 STLDeleteValues(&identity_to_shell_impl_);
94 } 99 }
95 100
96 void ApplicationManager::ConnectToApplication( 101 void ApplicationManager::ConnectToApplication(
97 const GURL& requested_url, 102 const GURL& requested_url,
98 const GURL& requestor_url, 103 const GURL& requestor_url,
99 InterfaceRequest<ServiceProvider> services, 104 InterfaceRequest<ServiceProvider> services,
100 ServiceProviderPtr exposed_services, 105 ServiceProviderPtr exposed_services,
101 const base::Closure& on_application_end) { 106 const base::Closure& on_application_end) {
102 ConnectToApplicationWithParameters( 107 ConnectToApplicationWithParameters(
103 requested_url, requestor_url, services.Pass(), exposed_services.Pass(), 108 requested_url, std::string(), requestor_url, services.Pass(),
104 on_application_end, std::vector<std::string>()); 109 exposed_services.Pass(), on_application_end, std::vector<std::string>());
105 } 110 }
106 111
107 void ApplicationManager::ConnectToApplicationWithParameters( 112 void ApplicationManager::ConnectToApplicationWithParameters(
108 const GURL& requested_url, 113 const GURL& requested_url,
114 const std::string& qualifier,
109 const GURL& requestor_url, 115 const GURL& requestor_url,
110 InterfaceRequest<ServiceProvider> services, 116 InterfaceRequest<ServiceProvider> services,
111 ServiceProviderPtr exposed_services, 117 ServiceProviderPtr exposed_services,
112 const base::Closure& on_application_end, 118 const base::Closure& on_application_end,
113 const std::vector<std::string>& pre_redirect_parameters) { 119 const std::vector<std::string>& pre_redirect_parameters) {
114 TRACE_EVENT_INSTANT1( 120 TRACE_EVENT_INSTANT1(
115 "mojo_shell", "ApplicationManager::ConnectToApplicationWithParameters", 121 "mojo_shell", "ApplicationManager::ConnectToApplicationWithParameters",
116 TRACE_EVENT_SCOPE_THREAD, "requested_url", requested_url.spec()); 122 TRACE_EVENT_SCOPE_THREAD, "requested_url", requested_url.spec());
117 DCHECK(requested_url.is_valid()); 123 DCHECK(requested_url.is_valid());
118 124
119 // We check both the mapped and resolved urls for existing shell_impls because 125 // We check both the mapped and resolved urls for existing shell_impls because
120 // external applications can be registered for the unresolved mojo:foo urls. 126 // external applications can be registered for the unresolved mojo:foo urls.
121 127
122 GURL mapped_url = delegate_->ResolveMappings(requested_url); 128 GURL mapped_url = delegate_->ResolveMappings(requested_url);
123 if (ConnectToRunningApplication(mapped_url, requestor_url, &services, 129 if (ConnectToRunningApplication(mapped_url, qualifier, requestor_url,
124 &exposed_services)) { 130 &services, &exposed_services)) {
125 return; 131 return;
126 } 132 }
127 133
128 GURL resolved_url = delegate_->ResolveMojoURL(mapped_url); 134 GURL resolved_url = delegate_->ResolveMojoURL(mapped_url);
129 if (ConnectToRunningApplication(resolved_url, requestor_url, &services, 135 if (ConnectToRunningApplication(resolved_url, qualifier, requestor_url,
130 &exposed_services)) { 136 &services, &exposed_services)) {
131 return; 137 return;
132 } 138 }
133 139
134 // The application is not running, let's compute the parameters. 140 // The application is not running, let's compute the parameters.
135 if (ConnectToApplicationWithLoader( 141 if (ConnectToApplicationWithLoader(
136 requested_url, mapped_url, requestor_url, &services, 142 requested_url, qualifier, mapped_url, requestor_url, &services,
137 &exposed_services, on_application_end, pre_redirect_parameters, 143 &exposed_services, on_application_end, pre_redirect_parameters,
138 GetLoaderForURL(mapped_url))) { 144 GetLoaderForURL(mapped_url))) {
139 return; 145 return;
140 } 146 }
141 147
142 if (ConnectToApplicationWithLoader( 148 if (ConnectToApplicationWithLoader(
143 requested_url, resolved_url, requestor_url, &services, 149 requested_url, qualifier, resolved_url, requestor_url, &services,
144 &exposed_services, on_application_end, pre_redirect_parameters, 150 &exposed_services, on_application_end, pre_redirect_parameters,
145 GetLoaderForURL(resolved_url))) { 151 GetLoaderForURL(resolved_url))) {
146 return; 152 return;
147 } 153 }
148 154
149 if (ConnectToApplicationWithLoader( 155 if (ConnectToApplicationWithLoader(
150 requested_url, resolved_url, requestor_url, &services, 156 requested_url, qualifier, resolved_url, requestor_url, &services,
151 &exposed_services, on_application_end, pre_redirect_parameters, 157 &exposed_services, on_application_end, pre_redirect_parameters,
152 default_loader_.get())) { 158 default_loader_.get())) {
153 return; 159 return;
154 } 160 }
155 161
156 auto callback = base::Bind(&ApplicationManager::HandleFetchCallback, 162 auto callback = base::Bind(
157 weak_ptr_factory_.GetWeakPtr(), requested_url, 163 &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(),
158 requestor_url, base::Passed(services.Pass()), 164 requested_url, qualifier, requestor_url, base::Passed(services.Pass()),
159 base::Passed(exposed_services.Pass()), 165 base::Passed(exposed_services.Pass()), on_application_end,
160 on_application_end, pre_redirect_parameters); 166 pre_redirect_parameters);
161 167
162 if (resolved_url.SchemeIsFile()) { 168 if (resolved_url.SchemeIsFile()) {
163 new LocalFetcher( 169 new LocalFetcher(
164 resolved_url, GetBaseURLAndQuery(resolved_url, nullptr), 170 resolved_url, GetBaseURLAndQuery(resolved_url, nullptr),
165 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE)); 171 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE));
166 return; 172 return;
167 } 173 }
168 174
169 if (!network_service_) 175 if (!network_service_)
170 ConnectToService(GURL("mojo:network_service"), &network_service_); 176 ConnectToService(GURL("mojo:network_service"), &network_service_);
171 177
172 const NativeApplicationCleanup cleanup = 178 const NativeApplicationCleanup cleanup =
173 base::CommandLine::ForCurrentProcess()->HasSwitch( 179 base::CommandLine::ForCurrentProcess()->HasSwitch(
174 switches::kDontDeleteOnDownload) 180 switches::kDontDeleteOnDownload)
175 ? NativeApplicationCleanup::DONT_DELETE 181 ? NativeApplicationCleanup::DONT_DELETE
176 : NativeApplicationCleanup::DELETE; 182 : NativeApplicationCleanup::DELETE;
177 183
178 new NetworkFetcher(disable_cache_, resolved_url, network_service_.get(), 184 new NetworkFetcher(disable_cache_, resolved_url, network_service_.get(),
179 base::Bind(callback, cleanup)); 185 base::Bind(callback, cleanup));
180 } 186 }
181 187
182 bool ApplicationManager::ConnectToRunningApplication( 188 bool ApplicationManager::ConnectToRunningApplication(
183 const GURL& resolved_url, 189 const GURL& resolved_url,
190 const std::string& qualifier,
184 const GURL& requestor_url, 191 const GURL& requestor_url,
185 InterfaceRequest<ServiceProvider>* services, 192 InterfaceRequest<ServiceProvider>* services,
186 ServiceProviderPtr* exposed_services) { 193 ServiceProviderPtr* exposed_services) {
187 GURL application_url = GetBaseURLAndQuery(resolved_url, nullptr); 194 GURL application_url = GetBaseURLAndQuery(resolved_url, nullptr);
188 ShellImpl* shell_impl = GetShellImpl(application_url); 195 ShellImpl* shell_impl = GetShellImpl(application_url, qualifier);
189 if (!shell_impl) 196 if (!shell_impl)
190 return false; 197 return false;
191 198
192 ConnectToClient(shell_impl, resolved_url, requestor_url, services->Pass(), 199 ConnectToClient(shell_impl, resolved_url, requestor_url, services->Pass(),
193 exposed_services->Pass()); 200 exposed_services->Pass());
194 return true; 201 return true;
195 } 202 }
196 203
197 bool ApplicationManager::ConnectToApplicationWithLoader( 204 bool ApplicationManager::ConnectToApplicationWithLoader(
198 const GURL& requested_url, 205 const GURL& requested_url,
206 const std::string& qualifier,
199 const GURL& resolved_url, 207 const GURL& resolved_url,
200 const GURL& requestor_url, 208 const GURL& requestor_url,
201 InterfaceRequest<ServiceProvider>* services, 209 InterfaceRequest<ServiceProvider>* services,
202 ServiceProviderPtr* exposed_services, 210 ServiceProviderPtr* exposed_services,
203 const base::Closure& on_application_end, 211 const base::Closure& on_application_end,
204 const std::vector<std::string>& parameters, 212 const std::vector<std::string>& parameters,
205 ApplicationLoader* loader) { 213 ApplicationLoader* loader) {
206 if (!loader) 214 if (!loader)
207 return false; 215 return false;
208 216
209 const GURL app_url = 217 const GURL app_url =
210 requested_url.scheme() == "mojo" ? requested_url : resolved_url; 218 requested_url.scheme() == "mojo" ? requested_url : resolved_url;
211 219
212 loader->Load( 220 loader->Load(
213 resolved_url, 221 resolved_url,
214 RegisterShell(app_url, requestor_url, services->Pass(), 222 RegisterShell(app_url, qualifier, requestor_url, services->Pass(),
215 exposed_services->Pass(), on_application_end, parameters)); 223 exposed_services->Pass(), on_application_end, parameters));
216 return true; 224 return true;
217 } 225 }
218 226
219 InterfaceRequest<Application> ApplicationManager::RegisterShell( 227 InterfaceRequest<Application> ApplicationManager::RegisterShell(
220 const GURL& app_url, 228 const GURL& app_url,
229 const std::string& qualifier,
221 const GURL& requestor_url, 230 const GURL& requestor_url,
222 InterfaceRequest<ServiceProvider> services, 231 InterfaceRequest<ServiceProvider> services,
223 ServiceProviderPtr exposed_services, 232 ServiceProviderPtr exposed_services,
224 const base::Closure& on_application_end, 233 const base::Closure& on_application_end,
225 const std::vector<std::string>& parameters) { 234 const std::vector<std::string>& parameters) {
226 Identity app_identity(app_url); 235 Identity app_identity(app_url, qualifier);
227 236
228 ApplicationPtr application; 237 ApplicationPtr application;
229 InterfaceRequest<Application> application_request = GetProxy(&application); 238 InterfaceRequest<Application> application_request = GetProxy(&application);
230 ShellImpl* shell = 239 ShellImpl* shell =
231 new ShellImpl(application.Pass(), this, app_identity, on_application_end); 240 new ShellImpl(application.Pass(), this, app_identity, on_application_end);
232 identity_to_shell_impl_[app_identity] = shell; 241 identity_to_shell_impl_[app_identity] = shell;
233 shell->InitializeApplication(Array<String>::From(parameters)); 242 shell->InitializeApplication(Array<String>::From(parameters));
234 ConnectToClient(shell, app_url, requestor_url, services.Pass(), 243 ConnectToClient(shell, app_url, requestor_url, services.Pass(),
235 exposed_services.Pass()); 244 exposed_services.Pass());
236 return application_request.Pass(); 245 return application_request.Pass();
237 } 246 }
238 247
239 ShellImpl* ApplicationManager::GetShellImpl(const GURL& url) { 248 ShellImpl* ApplicationManager::GetShellImpl(const GURL& url,
240 const auto& shell_it = identity_to_shell_impl_.find(Identity(url)); 249 const std::string& qualifier) {
250 const auto& shell_it = identity_to_shell_impl_.find(Identity(url, qualifier));
241 if (shell_it != identity_to_shell_impl_.end()) 251 if (shell_it != identity_to_shell_impl_.end())
242 return shell_it->second; 252 return shell_it->second;
243 return nullptr; 253 return nullptr;
244 } 254 }
245 255
246 void ApplicationManager::ConnectToClient( 256 void ApplicationManager::ConnectToClient(
247 ShellImpl* shell_impl, 257 ShellImpl* shell_impl,
248 const GURL& resolved_url, 258 const GURL& resolved_url,
249 const GURL& requestor_url, 259 const GURL& requestor_url,
250 InterfaceRequest<ServiceProvider> services, 260 InterfaceRequest<ServiceProvider> services,
251 ServiceProviderPtr exposed_services) { 261 ServiceProviderPtr exposed_services) {
252 shell_impl->ConnectToClient(resolved_url, requestor_url, services.Pass(), 262 shell_impl->ConnectToClient(resolved_url, requestor_url, services.Pass(),
253 exposed_services.Pass()); 263 exposed_services.Pass());
254 } 264 }
255 265
256 void ApplicationManager::HandleFetchCallback( 266 void ApplicationManager::HandleFetchCallback(
257 const GURL& requested_url, 267 const GURL& requested_url,
268 const std::string& qualifier,
258 const GURL& requestor_url, 269 const GURL& requestor_url,
259 InterfaceRequest<ServiceProvider> services, 270 InterfaceRequest<ServiceProvider> services,
260 ServiceProviderPtr exposed_services, 271 ServiceProviderPtr exposed_services,
261 const base::Closure& on_application_end, 272 const base::Closure& on_application_end,
262 const std::vector<std::string>& parameters, 273 const std::vector<std::string>& parameters,
263 NativeApplicationCleanup cleanup, 274 NativeApplicationCleanup cleanup,
264 scoped_ptr<Fetcher> fetcher) { 275 scoped_ptr<Fetcher> fetcher) {
265 if (!fetcher) { 276 if (!fetcher) {
266 // Network error. Drop |application_request| to tell requestor. 277 // Network error. Drop |application_request| to tell requestor.
267 return; 278 return;
268 } 279 }
269 280
270 GURL redirect_url = fetcher->GetRedirectURL(); 281 GURL redirect_url = fetcher->GetRedirectURL();
271 if (!redirect_url.is_empty()) { 282 if (!redirect_url.is_empty()) {
272 // And around we go again... Whee! 283 // And around we go again... Whee!
273 // TODO(sky): this loses |requested_url|. 284 // TODO(sky): this loses |requested_url|.
274 ConnectToApplicationWithParameters(redirect_url, requestor_url, 285 ConnectToApplicationWithParameters(redirect_url, qualifier, requestor_url,
275 services.Pass(), exposed_services.Pass(), 286 services.Pass(), exposed_services.Pass(),
276 on_application_end, parameters); 287 on_application_end, parameters);
277 return; 288 return;
278 } 289 }
279 290
280 // We already checked if the application was running before we fetched it, but 291 // We already checked if the application was running before we fetched it, but
281 // it might have started while the fetch was outstanding. We don't want to 292 // it might have started while the fetch was outstanding. We don't want to
282 // have two copies of the app running, so check again. 293 // have two copies of the app running, so check again.
283 // 294 //
284 // Also, it's possible the original URL was redirected to an app that is 295 // Also, it's possible the original URL was redirected to an app that is
285 // already running. 296 // already running.
286 if (ConnectToRunningApplication(requested_url, requestor_url, &services, 297 if (ConnectToRunningApplication(requested_url, qualifier, requestor_url,
287 &exposed_services)) { 298 &services, &exposed_services)) {
288 return; 299 return;
289 } 300 }
290 301
291 const GURL app_url = 302 const GURL app_url =
292 requested_url.scheme() == "mojo" ? requested_url : fetcher->GetURL(); 303 requested_url.scheme() == "mojo" ? requested_url : fetcher->GetURL();
293 304
294 InterfaceRequest<Application> request( 305 InterfaceRequest<Application> request(
295 RegisterShell(app_url, requestor_url, services.Pass(), 306 RegisterShell(app_url, qualifier, requestor_url, services.Pass(),
296 exposed_services.Pass(), on_application_end, parameters)); 307 exposed_services.Pass(), on_application_end, parameters));
297 308
298 // If the response begins with a #!mojo <content-handler-url>, use it. 309 // If the response begins with a #!mojo <content-handler-url>, use it.
299 GURL content_handler_url; 310 GURL content_handler_url;
300 std::string shebang; 311 std::string shebang;
301 if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) { 312 if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) {
302 LoadWithContentHandler( 313 LoadWithContentHandler(
303 content_handler_url, request.Pass(), 314 content_handler_url, qualifier, request.Pass(),
304 fetcher->AsURLResponse(blocking_pool_, 315 fetcher->AsURLResponse(blocking_pool_,
305 static_cast<int>(shebang.size()))); 316 static_cast<int>(shebang.size())));
306 return; 317 return;
307 } 318 }
308 319
309 MimeTypeToURLMap::iterator iter = mime_type_to_url_.find(fetcher->MimeType()); 320 MimeTypeToURLMap::iterator iter = mime_type_to_url_.find(fetcher->MimeType());
310 if (iter != mime_type_to_url_.end()) { 321 if (iter != mime_type_to_url_.end()) {
311 LoadWithContentHandler(iter->second, request.Pass(), 322 LoadWithContentHandler(iter->second, qualifier, request.Pass(),
312 fetcher->AsURLResponse(blocking_pool_, 0)); 323 fetcher->AsURLResponse(blocking_pool_, 0));
313 return; 324 return;
314 } 325 }
315 326
316 auto alias_iter = application_package_alias_.find(app_url); 327 auto alias_iter = application_package_alias_.find(app_url);
317 if (alias_iter != application_package_alias_.end()) { 328 if (alias_iter != application_package_alias_.end()) {
329 // We replace the qualifier with the one our package alias requested.
318 URLResponsePtr response(URLResponse::New()); 330 URLResponsePtr response(URLResponse::New());
319 response->url = String::From(app_url.spec()); 331 response->url = String::From(app_url.spec());
320 LoadWithContentHandler(alias_iter->second, 332
321 request.Pass(), 333 std::string qualifier;
334 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
335 switches::kEnableMultiprocess)) {
336 // Why can't we use this in single process mode? Because of
337 // base::AtExitManager. If you link in ApplicationRunnerChromium into
338 // your code, and then we make initialize multiple copies of the
339 // application, we end up with multiple AtExitManagers and will check on
340 // the second one being created.
341 //
342 // Why doesn't that happen when running different apps? Because
343 // your_thing.mojo!base::AtExitManager and
344 // my_thing.mojo!base::AtExitManager are different symbols.
345 qualifier = alias_iter->second.second;
346 }
347
348 LoadWithContentHandler(alias_iter->second.first, qualifier, request.Pass(),
322 response.Pass()); 349 response.Pass());
323 return; 350 return;
324 } 351 }
325 352
326 // TODO(aa): Sanity check that the thing we got looks vaguely like a mojo 353 // TODO(aa): Sanity check that the thing we got looks vaguely like a mojo
327 // application. That could either mean looking for the platform-specific dll 354 // application. That could either mean looking for the platform-specific dll
328 // header, or looking for some specific mojo signature prepended to the 355 // header, or looking for some specific mojo signature prepended to the
329 // library. 356 // library.
330 // TODO(vtl): (Maybe this should be done by the factory/runner?) 357 // TODO(vtl): (Maybe this should be done by the factory/runner?)
331 358
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 } 400 }
374 401
375 void ApplicationManager::RegisterContentHandler( 402 void ApplicationManager::RegisterContentHandler(
376 const std::string& mime_type, 403 const std::string& mime_type,
377 const GURL& content_handler_url) { 404 const GURL& content_handler_url) {
378 DCHECK(content_handler_url.is_valid()) 405 DCHECK(content_handler_url.is_valid())
379 << "Content handler URL is invalid for mime type " << mime_type; 406 << "Content handler URL is invalid for mime type " << mime_type;
380 mime_type_to_url_[mime_type] = content_handler_url; 407 mime_type_to_url_[mime_type] = content_handler_url;
381 } 408 }
382 409
383
384 void ApplicationManager::RegisterApplicationPackageAlias( 410 void ApplicationManager::RegisterApplicationPackageAlias(
385 const GURL& alias, 411 const GURL& alias,
386 const GURL& content_handler_package) { 412 const GURL& content_handler_package,
387 application_package_alias_[alias] = content_handler_package; 413 const std::string& qualifier) {
414 application_package_alias_[alias] =
415 std::make_pair(content_handler_package, qualifier);
388 } 416 }
389 417
390 void ApplicationManager::LoadWithContentHandler( 418 void ApplicationManager::LoadWithContentHandler(
391 const GURL& content_handler_url, 419 const GURL& content_handler_url,
420 const std::string& qualifier,
392 InterfaceRequest<Application> application_request, 421 InterfaceRequest<Application> application_request,
393 URLResponsePtr url_response) { 422 URLResponsePtr url_response) {
394 ContentHandlerConnection* connection = nullptr; 423 ContentHandlerConnection* connection = nullptr;
395 URLToContentHandlerMap::iterator iter = 424 std::pair<GURL, std::string> key(content_handler_url, qualifier);
396 url_to_content_handler_.find(content_handler_url); 425 URLToContentHandlerMap::iterator iter = url_to_content_handler_.find(key);
397 if (iter != url_to_content_handler_.end()) { 426 if (iter != url_to_content_handler_.end()) {
398 connection = iter->second; 427 connection = iter->second;
399 } else { 428 } else {
400 connection = new ContentHandlerConnection(this, content_handler_url); 429 connection =
401 url_to_content_handler_[content_handler_url] = connection; 430 new ContentHandlerConnection(this, content_handler_url, qualifier);
431 url_to_content_handler_[key] = connection;
402 } 432 }
403 433
404 connection->content_handler()->StartApplication(application_request.Pass(), 434 connection->content_handler()->StartApplication(application_request.Pass(),
405 url_response.Pass()); 435 url_response.Pass());
406 } 436 }
407 437
408 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, 438 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader,
409 const GURL& url) { 439 const GURL& url) {
410 URLToLoaderMap::iterator it = url_to_loader_.find(url); 440 URLToLoaderMap::iterator it = url_to_loader_.find(url);
411 if (it != url_to_loader_.end()) 441 if (it != url_to_loader_.end())
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 DCHECK(it != identity_to_shell_impl_.end()); 486 DCHECK(it != identity_to_shell_impl_.end());
457 delete it->second; 487 delete it->second;
458 identity_to_shell_impl_.erase(it); 488 identity_to_shell_impl_.erase(it);
459 if (!on_application_end.is_null()) 489 if (!on_application_end.is_null())
460 on_application_end.Run(); 490 on_application_end.Run();
461 } 491 }
462 492
463 void ApplicationManager::OnContentHandlerError( 493 void ApplicationManager::OnContentHandlerError(
464 ContentHandlerConnection* content_handler) { 494 ContentHandlerConnection* content_handler) {
465 // Remove the mapping to the content handler. 495 // Remove the mapping to the content handler.
466 auto it = 496 auto it = url_to_content_handler_.find(
467 url_to_content_handler_.find(content_handler->content_handler_url()); 497 std::make_pair(content_handler->content_handler_url(),
498 content_handler->content_handler_qualifier()));
468 DCHECK(it != url_to_content_handler_.end()); 499 DCHECK(it != url_to_content_handler_.end());
469 delete it->second; 500 delete it->second;
470 url_to_content_handler_.erase(it); 501 url_to_content_handler_.erase(it);
471 } 502 }
472 503
473 ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName( 504 ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName(
474 const GURL& application_url, 505 const GURL& application_url,
475 const std::string& interface_name) { 506 const std::string& interface_name) {
476 ServiceProviderPtr services; 507 ServiceProviderPtr services;
477 ConnectToApplication(application_url, GURL(), GetProxy(&services), nullptr, 508 ConnectToApplication(application_url, GURL(), GetProxy(&services), nullptr,
478 base::Closure()); 509 base::Closure());
479 MessagePipe pipe; 510 MessagePipe pipe;
480 services->ConnectToService(interface_name, pipe.handle1.Pass()); 511 services->ConnectToService(interface_name, pipe.handle1.Pass());
481 return pipe.handle0.Pass(); 512 return pipe.handle0.Pass();
482 } 513 }
483 514
484 void ApplicationManager::CleanupRunner(NativeRunner* runner) { 515 void ApplicationManager::CleanupRunner(NativeRunner* runner) {
485 native_runners_.erase( 516 native_runners_.erase(
486 std::find(native_runners_.begin(), native_runners_.end(), runner)); 517 std::find(native_runners_.begin(), native_runners_.end(), runner));
487 } 518 }
488 519
489 } // namespace shell 520 } // namespace shell
490 } // namespace mojo 521 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/shell/application_manager.h ('k') | mojo/shell/identity.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698