application_manager.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen// Copyright 2014 The Chromium Authors. All rights reserved.
2b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen// Use of this source code is governed by a BSD-style license that can be
3b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen// found in the LICENSE file.
4b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
5b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#ifndef MOJO_APPLICATION_MANAGER_APPLICATION_MANAGER_H_
6b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#define MOJO_APPLICATION_MANAGER_APPLICATION_MANAGER_H_
7b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
8b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include <map>
9b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
10b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "base/basictypes.h"
11b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "base/gtest_prod_util.h"
12b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "base/memory/scoped_ptr.h"
13b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "base/memory/weak_ptr.h"
14b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "mojo/application_manager/application_loader.h"
15b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "mojo/application_manager/application_manager_export.h"
16b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "mojo/public/interfaces/application/service_provider.mojom.h"
17b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen#include "url/gurl.h"
18b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
19b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazennamespace mojo {
20b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
21ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenclass MOJO_APPLICATION_MANAGER_EXPORT ApplicationManager {
22b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen public:
23b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  class MOJO_APPLICATION_MANAGER_EXPORT Delegate {
24b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen   public:
252bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    virtual ~Delegate();
26b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    // Send when the Applicaiton holding the handle on the other end of the
27b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    // Shell pipe goes away.
28334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren    virtual void OnApplicationError(const GURL& url) = 0;
29334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren  };
30b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
31b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // API for testing.
32b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  class MOJO_APPLICATION_MANAGER_EXPORT TestAPI {
33b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen   public:
3443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    explicit TestAPI(ApplicationManager* manager);
35b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    ~TestAPI();
36b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
37b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    // Returns true if the shared instance has been created.
38b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    static bool HasCreatedInstance();
39b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    // Returns true if there is a ShellImpl for this URL.
4048d8878e34b0d9983166418378125b63faac9aabGriff Hazen    bool HasFactoryForURL(const GURL& url) const;
41ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
4243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen   private:
43cd05a19c0775e69e93e4c93b0a48ab044b531d7aGriff Hazen    ApplicationManager* manager_;
44b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
45b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    DISALLOW_COPY_AND_ASSIGN(TestAPI);
4648d8878e34b0d9983166418378125b63faac9aabGriff Hazen  };
47b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
48b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Interface class for debugging only.
49b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  class Interceptor {
50b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen   public:
51b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    virtual ~Interceptor() {}
52b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    // Called when ApplicationManager::Connect is called.
53b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    virtual ServiceProviderPtr OnConnectToClient(
54b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        const GURL& url,
55b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen        ServiceProviderPtr service_provider) = 0;
56b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  };
57b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
58b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  ApplicationManager();
59b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  ~ApplicationManager();
60b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
61b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Returns a shared instance, creating it if necessary.
62b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  static ApplicationManager* GetInstance();
63b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
64b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void SetDelegate(Delegate* delegate) { delegate_ = delegate; }
65b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
66b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Loads a service if necessary and establishes a new client connection.
67b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void ConnectToApplication(const GURL& application_url,
68b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                            const GURL& requestor_url,
6943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen                            ServiceProviderPtr service_provider);
70ab78e9b2a147c8de7b5cf231b97aad9d8c4f106cGriff Hazen
71ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen  template <typename Interface>
72ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen  inline void ConnectToService(const GURL& application_url,
73ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                               InterfacePtr<Interface>* ptr) {
7443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    ScopedMessagePipeHandle service_handle =
7543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen        ConnectToServiceByName(application_url, Interface::Name_);
7643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen    ptr->Bind(service_handle.Pass());
7743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  }
7843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
7943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  ScopedMessagePipeHandle ConnectToServiceByName(
8043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen      const GURL& application_url,
81334514fd61bd192cee3475b3ba44adb4f54a1f89Chris Wren      const std::string& interface_name);
82b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
83b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
84b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
85ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen  // Sets the default Loader to be used if not overridden by SetLoaderForURL()
8643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  // or SetLoaderForScheme().
87b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void set_default_loader(scoped_ptr<ApplicationLoader> loader) {
88b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen    default_loader_ = loader.Pass();
89b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  }
90b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Sets a Loader to be used for a specific url.
91b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, const GURL& url);
92b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Sets a Loader to be used for a specific url scheme.
93b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void SetLoaderForScheme(scoped_ptr<ApplicationLoader> loader,
94b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen                          const std::string& scheme);
9543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  // These strings will be passed to the Initialize() method when an
96b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Application is instantiated.
97b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  void SetArgsForURL(const std::vector<std::string>& args, const GURL& url);
98b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen
99b56de0d1a113c71a2808303009ab4d9708ed6e84Griff Hazen  // Allows to interpose a debugger to service connections.
10043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  void SetInterceptor(Interceptor* interceptor);
10143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
10243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  // Destroys all Shell-ends of connections established with Applications.
10343c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  // Applications connected by this ApplicationManager will observe pipe errors
10443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  // and have a chance to shutdown.
10543c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  void TerminateShellConnections();
10643c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
10743c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen private:
10843c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  struct ContentHandlerConnection;
10943c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  class LoadCallbacksImpl;
11043c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  class ShellImpl;
11143c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen
11243c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  typedef std::map<std::string, ApplicationLoader*> SchemeToLoaderMap;
11343c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  typedef std::map<GURL, ApplicationLoader*> URLToLoaderMap;
11443c5718722bab1f836b7c94f2ec0bc19e653037cGriff Hazen  typedef std::map<GURL, ShellImpl*> URLToShellImplMap;
115ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen  typedef std::map<GURL, ContentHandlerConnection*> URLToContentHandlerMap;
1162bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  typedef std::map<GURL, std::vector<std::string> > URLToArgsMap;
1172bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1182bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  void ConnectToClient(ShellImpl* shell_impl,
1192bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                       const GURL& url,
1202bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                       const GURL& requestor_url,
1212bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                       ServiceProviderPtr service_provider);
1222bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
123ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen  void RegisterLoadedApplication(const GURL& service_url,
124ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                                 const GURL& requestor_url,
125ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                                 ServiceProviderPtr service_provider,
1262bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                                 ScopedMessagePipeHandle* shell_handle);
127ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
128300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen  void LoadWithContentHandler(const GURL& content_url,
129300ad7c234a0ccfc41ae7fdbdcdd57faece2a8e0Griff Hazen                              const GURL& requestor_url,
1302bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                              const GURL& content_handler_url,
1312bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                              URLResponsePtr url_response,
1322bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen                              ServiceProviderPtr service_provider);
1332bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1342bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  // Returns the Loader to use for a url (using default if not overridden.)
1352bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  // The preference is to use a loader that's been specified for an url first,
1362bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  // then one that's been specified for a scheme, then the default.
1372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  ApplicationLoader* GetLoaderForURL(const GURL& url);
1382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1392bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  // Removes a ShellImpl when it encounters an error.
1402bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  void OnShellImplError(ShellImpl* shell_impl);
1412bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1422bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  Delegate* delegate_;
1432bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  // Loader management.
1442bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  URLToLoaderMap url_to_loader_;
1452bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  SchemeToLoaderMap scheme_to_loader_;
1462bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  scoped_ptr<ApplicationLoader> default_loader_;
1472bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  Interceptor* interceptor_;
1482bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1492bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  URLToShellImplMap url_to_shell_impl_;
1502bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  URLToContentHandlerMap url_to_content_handler_;
1512bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  URLToArgsMap url_to_args_;
1522bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1532bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  base::WeakPtrFactory<ApplicationManager> weak_ptr_factory_;
1542bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1552bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen  DISALLOW_COPY_AND_ASSIGN(ApplicationManager);
1562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen};
1572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1582bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen}  // namespace mojo
1592bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen
1602bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen#endif  // MOJO_APPLICATION_MANAGER_APPLICATION_MANAGER_H_
1612bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen