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