Home | History | Annotate | Download | only in apps
      1 // Copyright 2013 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 APPS_APP_LOAD_SERVICE_H_
      6 #define APPS_APP_LOAD_SERVICE_H_
      7 
      8 #include <map>
      9 #include <string>
     10 
     11 #include "base/command_line.h"
     12 #include "base/files/file_path.h"
     13 #include "components/keyed_service/core/keyed_service.h"
     14 #include "content/public/browser/notification_observer.h"
     15 #include "content/public/browser/notification_registrar.h"
     16 
     17 class Profile;
     18 
     19 namespace extensions {
     20 struct UnloadedExtensionInfo;
     21 }
     22 
     23 namespace apps {
     24 
     25 // Monitors apps being reloaded and performs app specific actions (like launch
     26 // or restart) on them. Also provides an interface to schedule these actions.
     27 class AppLoadService : public KeyedService,
     28                        public content::NotificationObserver {
     29  public:
     30   enum PostReloadActionType {
     31     LAUNCH,
     32     RESTART,
     33     LAUNCH_WITH_COMMAND_LINE,
     34   };
     35 
     36   struct PostReloadAction {
     37     PostReloadAction();
     38 
     39     PostReloadActionType action_type;
     40     base::CommandLine command_line;
     41     base::FilePath current_dir;
     42   };
     43 
     44   explicit AppLoadService(Profile* profile);
     45   virtual ~AppLoadService();
     46 
     47   // Reload the application with the given id and then send it the OnRestarted
     48   // event.
     49   void RestartApplication(const std::string& extension_id);
     50 
     51   // Loads (or reloads) the app with |extension_path|, then launches it. Any
     52   // command line parameters from |command_line| will be passed along via
     53   // launch parameters. Returns true if loading the extension has begun
     54   // successfully.
     55   bool LoadAndLaunch(const base::FilePath& extension_path,
     56                      const base::CommandLine& command_line,
     57                      const base::FilePath& current_dir);
     58 
     59   static AppLoadService* Get(Profile* profile);
     60 
     61  private:
     62   // content::NotificationObserver.
     63   virtual void Observe(int type,
     64                        const content::NotificationSource& source,
     65                        const content::NotificationDetails& details) OVERRIDE;
     66 
     67   bool WasUnloadedForReload(
     68       const extensions::UnloadedExtensionInfo& unload_info);
     69   bool HasPostReloadAction(const std::string& extension_id);
     70 
     71   // Map of extension id to reload action. Absence from the map implies
     72   // no action.
     73   std::map<std::string, PostReloadAction> post_reload_actions_;
     74   content::NotificationRegistrar registrar_;
     75   Profile* profile_;
     76 
     77   DISALLOW_COPY_AND_ASSIGN(AppLoadService);
     78 };
     79 
     80 }  // namespace apps
     81 
     82 #endif  // APPS_APP_LOAD_SERVICE_H_
     83