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

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

Issue 741453002: Make sure that Content Handled application can be connected multiple times. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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
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/application_manager/application_manager.h" 5 #include "mojo/application_manager/application_manager.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 } 46 }
47 47
48 GURL ApplicationManager::Delegate::ResolveURL(const GURL& url) { 48 GURL ApplicationManager::Delegate::ResolveURL(const GURL& url) {
49 return url; 49 return url;
50 } 50 }
51 51
52 52
53 class ApplicationManager::LoadCallbacksImpl 53 class ApplicationManager::LoadCallbacksImpl
54 : public ApplicationLoader::LoadCallbacks { 54 : public ApplicationLoader::LoadCallbacks {
55 public: 55 public:
56 LoadCallbacksImpl(base::WeakPtr<ApplicationManager> manager, 56 LoadCallbacksImpl(base::WeakPtr<ApplicationManager> manager)
57 const GURL& requested_url, 57 : manager_(manager) {}
DaveMoore 2014/11/18 17:00:45 The changes simplified the code in application_man
58 const GURL& resolved_url,
59 const GURL& requestor_url,
60 ServiceProviderPtr service_provider)
61 : manager_(manager),
62 requested_url_(requested_url),
63 resolved_url_(resolved_url),
64 requestor_url_(requestor_url),
65 service_provider_(service_provider.Pass()) {}
66 58
67 private: 59 private:
68 ~LoadCallbacksImpl() override {} 60 ~LoadCallbacksImpl() override {}
69 61
70 // LoadCallbacks implementation
71 ScopedMessagePipeHandle RegisterApplication() override {
72 ScopedMessagePipeHandle shell_handle;
73 if (manager_) {
74 manager_->RegisterLoadedApplication(requested_url_,
75 resolved_url_,
76 requestor_url_,
77 service_provider_.Pass(),
78 &shell_handle);
79 }
80 return shell_handle.Pass();
81 }
82
83 void LoadWithContentHandler(const GURL& content_handler_url, 62 void LoadWithContentHandler(const GURL& content_handler_url,
63 ScopedMessagePipeHandle shell_handle,
84 URLResponsePtr url_response) override { 64 URLResponsePtr url_response) override {
85 if (manager_) { 65 if (manager_) {
86 manager_->LoadWithContentHandler(requested_url_, 66 manager_->LoadWithContentHandler(content_handler_url, shell_handle.Pass(),
87 resolved_url_, 67 url_response.Pass());
88 requestor_url_,
89 content_handler_url,
90 url_response.Pass(),
91 service_provider_.Pass());
92 } 68 }
93 } 69 }
94 70
95 base::WeakPtr<ApplicationManager> manager_; 71 base::WeakPtr<ApplicationManager> manager_;
96 GURL requested_url_;
97 GURL resolved_url_;
98 GURL requestor_url_;
99 ServiceProviderPtr service_provider_;
100 }; 72 };
101 73
102 class ApplicationManager::ShellImpl : public Shell, public ErrorHandler { 74 class ApplicationManager::ShellImpl : public Shell, public ErrorHandler {
103 public: 75 public:
104 ShellImpl(ScopedMessagePipeHandle handle, 76 ShellImpl(ScopedMessagePipeHandle handle,
105 ApplicationManager* manager, 77 ApplicationManager* manager,
106 const GURL& requested_url, 78 const GURL& requested_url,
107 const GURL& url) 79 const GURL& url)
108 : ShellImpl(manager, requested_url, url) { 80 : ShellImpl(manager, requested_url, url) {
109 binding_.Bind(handle.Pass()); 81 binding_.Bind(handle.Pass());
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 ConnectToApplicationImpl(requested_url, resolved_url, requestor_url, 215 ConnectToApplicationImpl(requested_url, resolved_url, requestor_url,
244 service_provider.Pass(), loader); 216 service_provider.Pass(), loader);
245 return; 217 return;
246 } 218 }
247 219
248 LOG(WARNING) << "Could not find loader to load application: " 220 LOG(WARNING) << "Could not find loader to load application: "
249 << requested_url.spec(); 221 << requested_url.spec();
250 } 222 }
251 223
252 void ApplicationManager::ConnectToApplicationImpl( 224 void ApplicationManager::ConnectToApplicationImpl(
253 const GURL& requested_url, const GURL& resolved_url, 225 const GURL& requested_url,
254 const GURL& requestor_url, ServiceProviderPtr service_provider, 226 const GURL& resolved_url,
227 const GURL& requestor_url,
228 ServiceProviderPtr service_provider,
255 ApplicationLoader* loader) { 229 ApplicationLoader* loader) {
230 ShellImpl* shell = nullptr;
256 URLToShellImplMap::const_iterator shell_it = 231 URLToShellImplMap::const_iterator shell_it =
257 url_to_shell_impl_.find(resolved_url); 232 url_to_shell_impl_.find(resolved_url);
258 if (shell_it != url_to_shell_impl_.end()) { 233 if (shell_it != url_to_shell_impl_.end()) {
259 ConnectToClient(shell_it->second, resolved_url, requestor_url, 234 shell = shell_it->second;
260 service_provider.Pass()); 235 } else {
261 return; 236 MessagePipe pipe;
237 shell =
238 new ShellImpl(pipe.handle0.Pass(), this, requested_url, resolved_url);
Aaron Boodman 2014/11/19 01:47:24 Argh, I just realized we can't make this simplific
qsr 2014/11/19 13:42:37 I guess you mean it has to be treated identically
Aaron Boodman 2014/11/19 15:58:15 Yes.
qsr 2014/11/19 16:37:21 Only for content handled app. For usual app, we ha
Aaron Boodman 2014/11/20 00:59:01 OK, I don't follow exactly why this changes whethe
239 url_to_shell_impl_[resolved_url] = shell;
240 shell->client()->Initialize(GetArgsForURL(requested_url));
241
242 scoped_refptr<LoadCallbacksImpl> callbacks(
243 new LoadCallbacksImpl(weak_ptr_factory_.GetWeakPtr()));
244 loader->Load(this, resolved_url, pipe.handle1.Pass(), callbacks);
262 } 245 }
263 246 ConnectToClient(shell, resolved_url, requestor_url, service_provider.Pass());
264 scoped_refptr<LoadCallbacksImpl> callbacks(
265 new LoadCallbacksImpl(weak_ptr_factory_.GetWeakPtr(),
266 requested_url,
267 resolved_url,
268 requestor_url,
269 service_provider.Pass()));
270 loader->Load(this, resolved_url, callbacks);
271 } 247 }
272 248
273 void ApplicationManager::ConnectToClient(ShellImpl* shell_impl, 249 void ApplicationManager::ConnectToClient(ShellImpl* shell_impl,
274 const GURL& url, 250 const GURL& url,
275 const GURL& requestor_url, 251 const GURL& requestor_url,
276 ServiceProviderPtr service_provider) { 252 ServiceProviderPtr service_provider) {
277 if (interceptor_) { 253 if (interceptor_) {
278 shell_impl->ConnectToClient( 254 shell_impl->ConnectToClient(
279 requestor_url, 255 requestor_url,
280 interceptor_->OnConnectToClient(url, service_provider.Pass())); 256 interceptor_->OnConnectToClient(url, service_provider.Pass()));
281 } else { 257 } else {
282 shell_impl->ConnectToClient(requestor_url, service_provider.Pass()); 258 shell_impl->ConnectToClient(requestor_url, service_provider.Pass());
283 } 259 }
284 } 260 }
285 261
286 void ApplicationManager::RegisterExternalApplication( 262 void ApplicationManager::RegisterExternalApplication(
287 const GURL& url, 263 const GURL& url,
288 ScopedMessagePipeHandle shell_handle) { 264 ScopedMessagePipeHandle shell_handle) {
289 ShellImpl* shell_impl = new ShellImpl(shell_handle.Pass(), this, url, url); 265 ShellImpl* shell_impl = new ShellImpl(shell_handle.Pass(), this, url, url);
290 url_to_shell_impl_[url] = shell_impl; 266 url_to_shell_impl_[url] = shell_impl;
291 267
292 URLToArgsMap::const_iterator args_it = url_to_args_.find(url); 268 URLToArgsMap::const_iterator args_it = url_to_args_.find(url);
293 Array<String> args; 269 Array<String> args;
294 if (args_it != url_to_args_.end()) 270 if (args_it != url_to_args_.end())
295 args = Array<String>::From(args_it->second); 271 args = Array<String>::From(args_it->second);
296 shell_impl->client()->Initialize(args.Pass()); 272 shell_impl->client()->Initialize(args.Pass());
297 } 273 }
298 274
299 void ApplicationManager::RegisterLoadedApplication(
300 const GURL& requested_url,
301 const GURL& resolved_url,
302 const GURL& requestor_url,
303 ServiceProviderPtr service_provider,
304 ScopedMessagePipeHandle* shell_handle) {
305 ShellImpl* shell_impl = NULL;
306 URLToShellImplMap::iterator iter = url_to_shell_impl_.find(resolved_url);
307 if (iter != url_to_shell_impl_.end()) {
308 // This can happen because services are loaded asynchronously. So if we get
309 // two requests for the same service close to each other, we might get here
310 // and find that we already have it.
311 shell_impl = iter->second;
312 } else {
313 MessagePipe pipe;
314 shell_impl =
315 new ShellImpl(pipe.handle1.Pass(), this, requested_url, resolved_url);
316 url_to_shell_impl_[resolved_url] = shell_impl;
317 *shell_handle = pipe.handle0.Pass();
318 shell_impl->client()->Initialize(GetArgsForURL(requested_url));
319 }
320
321 ConnectToClient(shell_impl, resolved_url, requestor_url,
322 service_provider.Pass());
323 }
324
325 void ApplicationManager::LoadWithContentHandler( 275 void ApplicationManager::LoadWithContentHandler(
326 const GURL& requested_url,
327 const GURL& resolved_url,
328 const GURL& requestor_url,
329 const GURL& content_handler_url, 276 const GURL& content_handler_url,
330 URLResponsePtr url_response, 277 ScopedMessagePipeHandle shell_handle,
331 ServiceProviderPtr service_provider) { 278 URLResponsePtr url_response) {
332 ContentHandlerConnection* connection = NULL; 279 ContentHandlerConnection* connection = NULL;
333 URLToContentHandlerMap::iterator iter = 280 URLToContentHandlerMap::iterator iter =
334 url_to_content_handler_.find(content_handler_url); 281 url_to_content_handler_.find(content_handler_url);
335 if (iter != url_to_content_handler_.end()) { 282 if (iter != url_to_content_handler_.end()) {
336 connection = iter->second; 283 connection = iter->second;
337 } else { 284 } else {
338 connection = new ContentHandlerConnection(this, content_handler_url); 285 connection = new ContentHandlerConnection(this, content_handler_url);
339 url_to_content_handler_[content_handler_url] = connection; 286 url_to_content_handler_[content_handler_url] = connection;
340 } 287 }
341 288
342 ShellPtr shell_proxy; 289 connection->content_handler()->StartApplication(
343 ShellImpl* shell_impl = 290 MakeProxy<Shell>(shell_handle.Pass()), url_response.Pass());
344 new ShellImpl(&shell_proxy, this, requested_url, resolved_url);
345 content_shell_impls_.insert(shell_impl);
346 shell_impl->client()->Initialize(GetArgsForURL(requested_url));
347
348 connection->content_handler()->StartApplication(shell_proxy.Pass(),
349 url_response.Pass());
350 ConnectToClient(
351 shell_impl, resolved_url, requestor_url, service_provider.Pass());
352 } 291 }
353 292
354 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, 293 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader,
355 const GURL& url) { 294 const GURL& url) {
356 URLToLoaderMap::iterator it = url_to_loader_.find(url); 295 URLToLoaderMap::iterator it = url_to_loader_.find(url);
357 if (it != url_to_loader_.end()) 296 if (it != url_to_loader_.end())
358 delete it->second; 297 delete it->second;
359 url_to_loader_[url] = loader.release(); 298 url_to_loader_[url] = loader.release();
360 } 299 }
361 300
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 return pipe.handle0.Pass(); 374 return pipe.handle0.Pass();
436 } 375 }
437 376
438 Array<String> ApplicationManager::GetArgsForURL(const GURL& url) { 377 Array<String> ApplicationManager::GetArgsForURL(const GURL& url) {
439 URLToArgsMap::const_iterator args_it = url_to_args_.find(url); 378 URLToArgsMap::const_iterator args_it = url_to_args_.find(url);
440 if (args_it != url_to_args_.end()) 379 if (args_it != url_to_args_.end())
441 return Array<String>::From(args_it->second); 380 return Array<String>::From(args_it->second);
442 return Array<String>(); 381 return Array<String>();
443 } 382 }
444 } // namespace mojo 383 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698