blob: 041b1ab5c5a362b4c5dca9db1b77653c55f05a48 [file] [log] [blame]
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01001// 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
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010011#include "base/command_line.h"
12#include "base/files/file_path.h"
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000013#include "components/keyed_service/core/keyed_service.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010014#include "content/public/browser/notification_observer.h"
15#include "content/public/browser/notification_registrar.h"
Primiano Tucci1320f922014-09-30 14:45:55 +010016#include "extensions/browser/extension_registry_observer.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010017
18class Profile;
19
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010020namespace extensions {
21struct UnloadedExtensionInfo;
22}
23
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010024namespace 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.
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000028class AppLoadService : public KeyedService,
Primiano Tucci1320f922014-09-30 14:45:55 +010029 public content::NotificationObserver,
30 public extensions::ExtensionRegistryObserver {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010031 public:
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010032 enum PostReloadActionType {
33 LAUNCH,
34 RESTART,
35 LAUNCH_WITH_COMMAND_LINE,
36 };
37
38 struct PostReloadAction {
39 PostReloadAction();
40
41 PostReloadActionType action_type;
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000042 base::CommandLine command_line;
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010043 base::FilePath current_dir;
44 };
45
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010046 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
Torne (Richard Coles)5f1c9432014-08-12 13:47:38 +010053 // Reload the application with the given id if it is currently running.
54 void RestartApplicationIfRunning(const std::string& extension_id);
55
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010056 // 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,
Torne (Richard Coles)a1401312014-03-18 10:20:56 +000061 const base::CommandLine& command_line,
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010062 const base::FilePath& current_dir);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010063
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
Primiano Tucci1320f922014-09-30 14:45:55 +010072 // extensions::ExtensionRegistryObserver.
73 virtual void OnExtensionUnloaded(
74 content::BrowserContext* browser_context,
75 const extensions::Extension* extension,
76 extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
77
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010078 bool WasUnloadedForReload(
Primiano Tucci1320f922014-09-30 14:45:55 +010079 const extensions::ExtensionId& extension_id,
80 const extensions::UnloadedExtensionInfo::Reason reason);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010081 bool HasPostReloadAction(const std::string& extension_id);
82
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010083 // Map of extension id to reload action. Absence from the map implies
84 // no action.
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010085 std::map<std::string, PostReloadAction> post_reload_actions_;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010086 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_