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
18class Profile;
19
20namespace extensions {
21struct UnloadedExtensionInfo;
22}
23
24namespace 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.
28class 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