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