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 CHROME_BROWSER_APPS_EPHEMERAL_APP_LAUNCHER_H_ 6 #define CHROME_BROWSER_APPS_EPHEMERAL_APP_LAUNCHER_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/callback.h" 13 #include "base/scoped_observer.h" 14 #include "chrome/browser/extensions/webstore_standalone_installer.h" 15 #include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" 16 #include "content/public/browser/web_contents_observer.h" 17 18 class ExtensionEnableFlow; 19 class Profile; 20 21 namespace content { 22 class WebContents; 23 } 24 25 namespace extensions { 26 class Extension; 27 class ExtensionInstallChecker; 28 class ExtensionRegistry; 29 } 30 31 // EphemeralAppLauncher manages the launching of ephemeral apps. It handles 32 // display of a prompt, initiates install of the app (if necessary) and finally 33 // launches the app. 34 class EphemeralAppLauncher : public extensions::WebstoreStandaloneInstaller, 35 public content::WebContentsObserver, 36 public ExtensionEnableFlowDelegate { 37 public: 38 typedef base::Callback<void(extensions::webstore_install::Result result, 39 const std::string& error)> LaunchCallback; 40 41 // Returns true if launching ephemeral apps is enabled. 42 static bool IsFeatureEnabled(); 43 44 // Create for the app launcher. 45 static scoped_refptr<EphemeralAppLauncher> CreateForLauncher( 46 const std::string& webstore_item_id, 47 Profile* profile, 48 gfx::NativeWindow parent_window, 49 const LaunchCallback& callback); 50 51 // Create for a web contents. 52 static scoped_refptr<EphemeralAppLauncher> CreateForWebContents( 53 const std::string& webstore_item_id, 54 content::WebContents* web_contents, 55 const LaunchCallback& callback); 56 57 // Initiate app launch. 58 void Start(); 59 60 protected: 61 EphemeralAppLauncher(const std::string& webstore_item_id, 62 Profile* profile, 63 gfx::NativeWindow parent_window, 64 const LaunchCallback& callback); 65 EphemeralAppLauncher(const std::string& webstore_item_id, 66 content::WebContents* web_contents, 67 const LaunchCallback& callback); 68 69 virtual ~EphemeralAppLauncher(); 70 71 // Creates an install checker. Allows tests to mock the install checker. 72 virtual scoped_ptr<extensions::ExtensionInstallChecker> 73 CreateInstallChecker(); 74 75 // WebstoreStandaloneInstaller implementation overridden in tests. 76 virtual scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() OVERRIDE; 77 virtual scoped_ptr<extensions::WebstoreInstaller::Approval> CreateApproval() 78 const OVERRIDE; 79 80 private: 81 friend class base::RefCountedThreadSafe<EphemeralAppLauncher>; 82 friend class EphemeralAppLauncherTest; 83 84 // Returns true if an app that is already installed in extension system can 85 // be launched. 86 bool CanLaunchInstalledApp(const extensions::Extension* extension, 87 extensions::webstore_install::Result* reason, 88 std::string* error); 89 90 // Initiates the enable flow for an app before it can be launched. 91 void EnableInstalledApp(const extensions::Extension* extension); 92 93 // After the ephemeral installation or enable flow are complete, attempts to 94 // launch the app and notify the client of the outcome. 95 void MaybeLaunchApp(); 96 97 // Launches an app. At this point, it is assumed that the app is enabled and 98 // can be launched. 99 void LaunchApp(const extensions::Extension* extension) const; 100 101 // Navigates to the launch URL of a hosted app in a new browser tab. 102 bool LaunchHostedApp(const extensions::Extension* extension) const; 103 104 // Notifies the client of the launch outcome. 105 void InvokeCallback(extensions::webstore_install::Result result, 106 const std::string& error); 107 108 // Aborts the ephemeral install and notifies the client of the outcome. 109 void AbortLaunch(extensions::webstore_install::Result result, 110 const std::string& error); 111 112 // Determines whether the app can be installed ephemerally. 113 void CheckEphemeralInstallPermitted(); 114 115 // Install checker callback. 116 void OnInstallChecked(int check_failures); 117 118 // WebstoreStandaloneInstaller implementation. 119 virtual void InitInstallData( 120 extensions::ActiveInstallData* install_data) const OVERRIDE; 121 virtual bool CheckRequestorAlive() const OVERRIDE; 122 virtual const GURL& GetRequestorURL() const OVERRIDE; 123 virtual bool ShouldShowPostInstallUI() const OVERRIDE; 124 virtual bool ShouldShowAppInstalledBubble() const OVERRIDE; 125 virtual content::WebContents* GetWebContents() const OVERRIDE; 126 virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() 127 const OVERRIDE; 128 virtual bool CheckInlineInstallPermitted( 129 const base::DictionaryValue& webstore_data, 130 std::string* error) const OVERRIDE; 131 virtual bool CheckRequestorPermitted( 132 const base::DictionaryValue& webstore_data, 133 std::string* error) const OVERRIDE; 134 virtual void OnManifestParsed() OVERRIDE; 135 virtual void CompleteInstall(extensions::webstore_install::Result result, 136 const std::string& error) OVERRIDE; 137 138 // content::WebContentsObserver implementation. 139 virtual void WebContentsDestroyed() OVERRIDE; 140 141 // ExtensionEnableFlowDelegate implementation. 142 virtual void ExtensionEnableFlowFinished() OVERRIDE; 143 virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE; 144 145 LaunchCallback launch_callback_; 146 147 gfx::NativeWindow parent_window_; 148 scoped_ptr<content::WebContents> dummy_web_contents_; 149 150 scoped_ptr<ExtensionEnableFlow> extension_enable_flow_; 151 152 scoped_ptr<extensions::ExtensionInstallChecker> install_checker_; 153 154 DISALLOW_COPY_AND_ASSIGN(EphemeralAppLauncher); 155 }; 156 157 #endif // CHROME_BROWSER_APPS_EPHEMERAL_APP_LAUNCHER_H_ 158