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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_APPS_DRIVE_DRIVE_APP_PROVIDER_H_ 6 #define CHROME_BROWSER_APPS_DRIVE_DRIVE_APP_PROVIDER_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "base/macros.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_vector.h" 15 #include "base/memory/weak_ptr.h" 16 #include "chrome/browser/drive/drive_app_registry_observer.h" 17 #include "extensions/browser/extension_registry_observer.h" 18 19 namespace drive { 20 struct DriveAppInfo; 21 } 22 23 class BrowserContextKeyedServiceFactory; 24 class DriveAppConverter; 25 class DriveAppMapping; 26 class DriveServiceBridge; 27 class ExtensionService; 28 class Profile; 29 30 // DriveAppProvider is the integration point for Drive apps. It ensures each 31 // Drive app has a corresponding Chrome app in the extension system. If there 32 // is no matching Chrome app, a local URL app would be created. The class 33 // processes app changes from both DriveAppRegistry and extension system to 34 // keep the two in sync. 35 class DriveAppProvider : public drive::DriveAppRegistryObserver, 36 public extensions::ExtensionRegistryObserver { 37 public: 38 explicit DriveAppProvider(Profile* profile); 39 virtual ~DriveAppProvider(); 40 41 // Appends PKS factories this class depends on. 42 static void AppendDependsOnFactories( 43 std::set<BrowserContextKeyedServiceFactory*>* factories); 44 45 void SetDriveServiceBridgeForTest(scoped_ptr<DriveServiceBridge> test_bridge); 46 47 private: 48 friend class DriveAppProviderTest; 49 50 typedef std::set<std::string> IdSet; 51 typedef std::vector<drive::DriveAppInfo> DriveAppInfos; 52 53 // Maps |drive_app_id| to |new_app|'s id in mapping. Auto uninstall existing 54 // mapped app if it is an URL app. 55 void UpdateMappingAndExtensionSystem(const std::string& drive_app_id, 56 const extensions::Extension* new_app, 57 bool is_new_app_generated); 58 59 // Deferred processing of relevant extension installed message. 60 void ProcessDeferredOnExtensionInstalled(const std::string drive_app_id, 61 const std::string chrome_app_id); 62 63 void SchedulePendingConverters(); 64 void OnLocalAppConverted(const DriveAppConverter* converter, bool success); 65 66 bool IsMappedUrlAppUpToDate(const drive::DriveAppInfo& drive_app) const; 67 68 void AddOrUpdateDriveApp(const drive::DriveAppInfo& drive_app); 69 void ProcessRemovedDriveApp(const std::string& drive_app_id); 70 71 // drive::DriveAppRegistryObserver overrides: 72 virtual void OnDriveAppRegistryUpdated() OVERRIDE; 73 74 // extensions::ExtensionRegistryObserver overrides: 75 virtual void OnExtensionInstalled( 76 content::BrowserContext* browser_context, 77 const extensions::Extension* extension, 78 bool is_update) OVERRIDE; 79 virtual void OnExtensionUninstalled( 80 content::BrowserContext* browser_context, 81 const extensions::Extension* extension, 82 extensions::UninstallReason reason) OVERRIDE; 83 84 Profile* profile_; 85 86 scoped_ptr<DriveServiceBridge> service_bridge_; 87 scoped_ptr<DriveAppMapping> mapping_; 88 DriveAppInfos drive_apps_; 89 90 // Tracks the pending web app convertions. 91 ScopedVector<DriveAppConverter> pending_converters_; 92 93 base::WeakPtrFactory<DriveAppProvider> weak_ptr_factory_; 94 95 DISALLOW_COPY_AND_ASSIGN(DriveAppProvider); 96 }; 97 98 #endif // CHROME_BROWSER_APPS_DRIVE_DRIVE_APP_PROVIDER_H_ 99