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_SHIM_EXTENSION_APP_SHIM_HANDLER_MAC_H_ 6 #define APPS_APP_SHIM_EXTENSION_APP_SHIM_HANDLER_MAC_H_ 7 8 #include <map> 9 #include <string> 10 #include <vector> 11 12 #include "apps/app_lifetime_monitor.h" 13 #include "apps/app_shim/app_shim_handler_mac.h" 14 #include "apps/app_window_registry.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "base/memory/weak_ptr.h" 17 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_registrar.h" 19 20 class Profile; 21 22 namespace base { 23 class FilePath; 24 } 25 26 namespace content { 27 class WebContents; 28 } 29 30 namespace extensions { 31 class Extension; 32 } 33 34 namespace apps { 35 36 class AppWindow; 37 38 // This app shim handler that handles events for app shims that correspond to an 39 // extension. 40 class ExtensionAppShimHandler : public AppShimHandler, 41 public content::NotificationObserver, 42 public AppLifetimeMonitor::Observer { 43 public: 44 class Delegate { 45 public: 46 virtual ~Delegate() {} 47 48 virtual bool ProfileExistsForPath(const base::FilePath& path); 49 virtual Profile* ProfileForPath(const base::FilePath& path); 50 virtual void LoadProfileAsync(const base::FilePath& path, 51 base::Callback<void(Profile*)> callback); 52 53 virtual AppWindowRegistry::AppWindowList GetWindows( 54 Profile* profile, 55 const std::string& extension_id); 56 57 virtual const extensions::Extension* GetAppExtension( 58 Profile* profile, const std::string& extension_id); 59 virtual void EnableExtension(Profile* profile, 60 const std::string& extension_id, 61 const base::Callback<void()>& callback); 62 virtual void LaunchApp(Profile* profile, 63 const extensions::Extension* extension, 64 const std::vector<base::FilePath>& files); 65 virtual void LaunchShim(Profile* profile, 66 const extensions::Extension* extension); 67 68 virtual void MaybeTerminate(); 69 }; 70 71 ExtensionAppShimHandler(); 72 virtual ~ExtensionAppShimHandler(); 73 74 AppShimHandler::Host* FindHost(Profile* profile, const std::string& app_id); 75 76 static void QuitAppForWindow(AppWindow* app_window); 77 78 static void HideAppForWindow(AppWindow* app_window); 79 80 static void FocusAppForWindow(AppWindow* app_window); 81 82 // Brings the window to the front without showing it and instructs the shim to 83 // request user attention. Returns false if there is no shim for this window. 84 static bool RequestUserAttentionForWindow(AppWindow* app_window); 85 86 // AppShimHandler overrides: 87 virtual void OnShimLaunch(Host* host, 88 AppShimLaunchType launch_type, 89 const std::vector<base::FilePath>& files) OVERRIDE; 90 virtual void OnShimClose(Host* host) OVERRIDE; 91 virtual void OnShimFocus(Host* host, 92 AppShimFocusType focus_type, 93 const std::vector<base::FilePath>& files) OVERRIDE; 94 virtual void OnShimSetHidden(Host* host, bool hidden) OVERRIDE; 95 virtual void OnShimQuit(Host* host) OVERRIDE; 96 97 // AppLifetimeMonitor::Observer overrides: 98 virtual void OnAppStart(Profile* profile, const std::string& app_id) OVERRIDE; 99 virtual void OnAppActivated(Profile* profile, 100 const std::string& app_id) OVERRIDE; 101 virtual void OnAppDeactivated(Profile* profile, 102 const std::string& app_id) OVERRIDE; 103 virtual void OnAppStop(Profile* profile, const std::string& app_id) OVERRIDE; 104 virtual void OnChromeTerminating() OVERRIDE; 105 106 // content::NotificationObserver overrides: 107 virtual void Observe(int type, 108 const content::NotificationSource& source, 109 const content::NotificationDetails& details) OVERRIDE; 110 111 protected: 112 typedef std::map<std::pair<Profile*, std::string>, AppShimHandler::Host*> 113 HostMap; 114 115 // Exposed for testing. 116 void set_delegate(Delegate* delegate); 117 HostMap& hosts() { return hosts_; } 118 content::NotificationRegistrar& registrar() { return registrar_; } 119 120 private: 121 // This is passed to Delegate::LoadProfileAsync for shim-initiated launches 122 // where the profile was not yet loaded. 123 void OnProfileLoaded(Host* host, 124 AppShimLaunchType launch_type, 125 const std::vector<base::FilePath>& files, 126 Profile* profile); 127 128 // This is passed to Delegate::EnableViaPrompt for shim-initiated launches 129 // where the extension is disabled. 130 void OnExtensionEnabled(const base::FilePath& profile_path, 131 const std::string& app_id, 132 const std::vector<base::FilePath>& files); 133 134 scoped_ptr<Delegate> delegate_; 135 136 HostMap hosts_; 137 138 content::NotificationRegistrar registrar_; 139 140 base::WeakPtrFactory<ExtensionAppShimHandler> weak_factory_; 141 142 DISALLOW_COPY_AND_ASSIGN(ExtensionAppShimHandler); 143 }; 144 145 } // namespace apps 146 147 #endif // APPS_APP_SHIM_EXTENSION_APP_SHIM_HANDLER_MAC_H_ 148