Home | History | Annotate | Download | only in drive
      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