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 #include "extensions/browser/extension_registry_observer.h" 17 18 class Profile; 19 20 namespace extensions { 21 struct UnloadedExtensionInfo; 22 } 23 24 namespace apps { 25 26 // Monitors apps being reloaded and performs app specific actions (like launch 27 // or restart) on them. Also provides an interface to schedule these actions. 28 class AppLoadService : public KeyedService, 29 public content::NotificationObserver, 30 public extensions::ExtensionRegistryObserver { 31 public: 32 enum PostReloadActionType { 33 LAUNCH, 34 RESTART, 35 LAUNCH_WITH_COMMAND_LINE, 36 }; 37 38 struct PostReloadAction { 39 PostReloadAction(); 40 41 PostReloadActionType action_type; 42 base::CommandLine command_line; 43 base::FilePath current_dir; 44 }; 45 46 explicit AppLoadService(Profile* profile); 47 virtual ~AppLoadService(); 48 49 // Reload the application with the given id and then send it the OnRestarted 50 // event. 51 void RestartApplication(const std::string& extension_id); 52 53 // Reload the application with the given id if it is currently running. 54 void RestartApplicationIfRunning(const std::string& extension_id); 55 56 // Loads (or reloads) the app with |extension_path|, then launches it. Any 57 // command line parameters from |command_line| will be passed along via 58 // launch parameters. Returns true if loading the extension has begun 59 // successfully. 60 bool LoadAndLaunch(const base::FilePath& extension_path, 61 const base::CommandLine& command_line, 62 const base::FilePath& current_dir); 63 64 static AppLoadService* Get(Profile* profile); 65 66 private: 67 // content::NotificationObserver. 68 virtual void Observe(int type, 69 const content::NotificationSource& source, 70 const content::NotificationDetails& details) OVERRIDE; 71 72 // extensions::ExtensionRegistryObserver. 73 virtual void OnExtensionUnloaded( 74 content::BrowserContext* browser_context, 75 const extensions::Extension* extension, 76 extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE; 77 78 bool WasUnloadedForReload( 79 const extensions::ExtensionId& extension_id, 80 const extensions::UnloadedExtensionInfo::Reason reason); 81 bool HasPostReloadAction(const std::string& extension_id); 82 83 // Map of extension id to reload action. Absence from the map implies 84 // no action. 85 std::map<std::string, PostReloadAction> post_reload_actions_; 86 content::NotificationRegistrar registrar_; 87 Profile* profile_; 88 89 DISALLOW_COPY_AND_ASSIGN(AppLoadService); 90 }; 91 92 } // namespace apps 93 94 #endif // APPS_APP_LOAD_SERVICE_H_ 95