extension_app_shim_handler_mac.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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>
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/app_lifetime_monitor.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "apps/app_shim/app_shim_handler_mac.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/extensions/shell_window_registry.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Profile;
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FilePath;
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebContents;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace extensions {
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Extension;
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace apps {
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This app shim handler that handles events for app shims that correspond to an
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// extension.
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ExtensionAppShimHandler : public AppShimHandler,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                public content::NotificationObserver,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                public AppLifetimeMonitor::Observer {
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class Delegate {
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   public:
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual ~Delegate() {}
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool ProfileExistsForPath(const base::FilePath& path);
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual Profile* ProfileForPath(const base::FilePath& path);
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual extensions::ShellWindowRegistry::ShellWindowList GetWindows(
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        Profile* profile, const std::string& extension_id);
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual const extensions::Extension* GetAppExtension(
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        Profile* profile, const std::string& extension_id);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void LaunchApp(Profile* profile,
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           const extensions::Extension* extension);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void LaunchShim(Profile* profile,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const extensions::Extension* extension);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void MaybeTerminate();
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExtensionAppShimHandler();
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ExtensionAppShimHandler();
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // AppShimHandler overrides:
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool OnShimLaunch(Host* host, AppShimLaunchType launch_type) OVERRIDE;
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnShimClose(Host* host) OVERRIDE;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnShimFocus(Host* host, AppShimFocusType focus_type) OVERRIDE;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnShimSetHidden(Host* host, bool hidden) OVERRIDE;
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnShimQuit(Host* host) OVERRIDE;
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // AppLifetimeMonitor::Observer overrides:
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppStart(Profile* profile, const std::string& app_id) OVERRIDE;
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppActivated(Profile* profile,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const std::string& app_id) OVERRIDE;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppDeactivated(Profile* profile,
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const std::string& app_id) OVERRIDE;
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnAppStop(Profile* profile, const std::string& app_id) OVERRIDE;
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnChromeTerminating() OVERRIDE;
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // content::NotificationObserver overrides:
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Observe(int type,
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const content::NotificationSource& source,
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const content::NotificationDetails& details) OVERRIDE;
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef std::map<std::pair<Profile*, std::string>, AppShimHandler::Host*>
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      HostMap;
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Exposed for testing.
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_delegate(Delegate* delegate);
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HostMap& hosts() { return hosts_; }
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::NotificationRegistrar& registrar() { return registrar_; }
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<Delegate> delegate_;
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HostMap hosts_;
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::NotificationRegistrar registrar_;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool browser_opened_ever_;
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace apps
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // APPS_APP_SHIM_EXTENSION_APP_SHIM_HANDLER_H_
106