190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef APPS_APP_SHIM_EXTENSION_APP_SHIM_HANDLER_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define APPS_APP_SHIM_EXTENSION_APP_SHIM_HANDLER_H_
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <map>
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string>
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <vector>
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/app_lifetime_monitor.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "apps/app_shim/app_shim_handler_mac.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "apps/shell_window_registry.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/weak_ptr.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Profile;
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FilePath;
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebContents;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace extensions {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Extension;
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace apps {
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class ShellWindow;
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This app shim handler that handles events for app shims that correspond to an
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// extension.
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ExtensionAppShimHandler : public AppShimHandler,
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                public content::NotificationObserver,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                public AppLifetimeMonitor::Observer {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class Delegate {
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   public:
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual ~Delegate() {}
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool ProfileExistsForPath(const base::FilePath& path);
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual Profile* ProfileForPath(const base::FilePath& path);
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    virtual void LoadProfileAsync(const base::FilePath& path,
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  base::Callback<void(Profile*)> callback);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    virtual ShellWindowRegistry::ShellWindowList GetWindows(
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        Profile* profile, const std::string& extension_id);
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual const extensions::Extension* GetAppExtension(
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        Profile* profile, const std::string& extension_id);
58d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    virtual void EnableExtension(Profile* profile,
59d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                                 const std::string& extension_id,
60d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                                 const base::Callback<void()>& callback);
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void LaunchApp(Profile* profile,
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const extensions::Extension* extension,
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const std::vector<base::FilePath>& files);
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void LaunchShim(Profile* profile,
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const extensions::Extension* extension);
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void MaybeTerminate();
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExtensionAppShimHandler();
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ExtensionAppShimHandler();
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  AppShimHandler::Host* FindHost(Profile* profile, const std::string& app_id);
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void QuitAppForWindow(ShellWindow* shell_window);
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static void HideAppForWindow(ShellWindow* shell_window);
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static void FocusAppForWindow(ShellWindow* shell_window);
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Brings the window to the front without showing it and instructs the shim to
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // request user attention. Returns false if there is no shim for this window.
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  static bool RequestUserAttentionForWindow(ShellWindow* shell_window);
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // AppShimHandler overrides:
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void OnShimLaunch(Host* host,
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            AppShimLaunchType launch_type,
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            const std::vector<base::FilePath>& files) OVERRIDE;
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnShimClose(Host* host) OVERRIDE;
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void OnShimFocus(Host* host,
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           AppShimFocusType focus_type,
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const std::vector<base::FilePath>& files) OVERRIDE;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnShimSetHidden(Host* host, bool hidden) OVERRIDE;
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnShimQuit(Host* host) OVERRIDE;
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // AppLifetimeMonitor::Observer overrides:
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppStart(Profile* profile, const std::string& app_id) OVERRIDE;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppActivated(Profile* profile,
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const std::string& app_id) OVERRIDE;
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppDeactivated(Profile* profile,
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const std::string& app_id) OVERRIDE;
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppStop(Profile* profile, const std::string& app_id) OVERRIDE;
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnChromeTerminating() OVERRIDE;
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // content::NotificationObserver overrides:
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Observe(int type,
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const content::NotificationSource& source,
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const content::NotificationDetails& details) OVERRIDE;
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef std::map<std::pair<Profile*, std::string>, AppShimHandler::Host*>
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      HostMap;
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Exposed for testing.
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_delegate(Delegate* delegate);
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HostMap& hosts() { return hosts_; }
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::NotificationRegistrar& registrar() { return registrar_; }
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This is passed to Delegate::LoadProfileAsync for shim-initiated launches
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // where the profile was not yet loaded.
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void OnProfileLoaded(Host* host,
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       AppShimLaunchType launch_type,
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       const std::vector<base::FilePath>& files,
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       Profile* profile);
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
127d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // This is passed to Delegate::EnableViaPrompt for shim-initiated launches
128d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // where the extension is disabled.
129d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  void OnExtensionEnabled(const base::FilePath& profile_path,
130d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                          const std::string& app_id,
131d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                          const std::vector<base::FilePath>& files);
132d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<Delegate> delegate_;
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HostMap hosts_;
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::NotificationRegistrar registrar_;
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::WeakPtrFactory<ExtensionAppShimHandler> weak_factory_;
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionAppShimHandler);
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace apps
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // APPS_APP_SHIM_EXTENSION_APP_SHIM_HANDLER_H_
147