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