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 10#include "base/basictypes.h" 11#include "base/scoped_observer.h" 12#include "chrome/browser/extensions/webstore_standalone_installer.h" 13#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" 14#include "content/public/browser/web_contents_observer.h" 15 16class ExtensionEnableFlow; 17class Profile; 18 19namespace content { 20class WebContents; 21} 22 23namespace extensions { 24class Extension; 25class ExtensionRegistry; 26} 27 28// EphemeralAppLauncher manages the launching of ephemeral apps. It handles 29// display of a prompt, initiates install of the app (if necessary) and finally 30// launches the app. 31class EphemeralAppLauncher : public extensions::WebstoreStandaloneInstaller, 32 public content::WebContentsObserver, 33 public ExtensionEnableFlowDelegate { 34 public: 35 typedef WebstoreStandaloneInstaller::Callback Callback; 36 37 // Create for the app launcher. 38 static scoped_refptr<EphemeralAppLauncher> CreateForLauncher( 39 const std::string& webstore_item_id, 40 Profile* profile, 41 gfx::NativeWindow parent_window, 42 const Callback& callback); 43 44 // Create for a link within a browser tab. 45 static scoped_refptr<EphemeralAppLauncher> CreateForLink( 46 const std::string& webstore_item_id, 47 content::WebContents* web_contents); 48 49 // Initiate app launch. 50 void Start(); 51 52 private: 53 friend class base::RefCountedThreadSafe<EphemeralAppLauncher>; 54 55 EphemeralAppLauncher(const std::string& webstore_item_id, 56 Profile* profile, 57 gfx::NativeWindow parent_window, 58 const Callback& callback); 59 EphemeralAppLauncher(const std::string& webstore_item_id, 60 content::WebContents* web_contents, 61 const Callback& callback); 62 63 virtual ~EphemeralAppLauncher(); 64 65 void LaunchApp(const extensions::Extension* extension) const; 66 67 // WebstoreStandaloneInstaller implementation. 68 virtual bool CheckRequestorAlive() const OVERRIDE; 69 virtual const GURL& GetRequestorURL() const OVERRIDE; 70 virtual bool ShouldShowPostInstallUI() const OVERRIDE; 71 virtual bool ShouldShowAppInstalledBubble() const OVERRIDE; 72 virtual content::WebContents* GetWebContents() const OVERRIDE; 73 virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() 74 const OVERRIDE; 75 virtual bool CheckInlineInstallPermitted( 76 const base::DictionaryValue& webstore_data, 77 std::string* error) const OVERRIDE; 78 virtual bool CheckRequestorPermitted( 79 const base::DictionaryValue& webstore_data, 80 std::string* error) const OVERRIDE; 81 virtual bool CheckInstallValid( 82 const base::DictionaryValue& manifest, 83 std::string* error) OVERRIDE; 84 virtual scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() OVERRIDE; 85 virtual scoped_ptr<extensions::WebstoreInstaller::Approval> 86 CreateApproval() const OVERRIDE; 87 virtual void CompleteInstall(const std::string& error) OVERRIDE; 88 89 // content::WebContentsObserver implementation. 90 virtual void WebContentsDestroyed() OVERRIDE; 91 92 // ExtensionEnableFlowDelegate implementation. 93 virtual void ExtensionEnableFlowFinished() OVERRIDE; 94 virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE; 95 96 gfx::NativeWindow parent_window_; 97 scoped_ptr<content::WebContents> dummy_web_contents_; 98 99 // Created in CheckInstallValid(). 100 scoped_refptr<extensions::Extension> extension_; 101 102 scoped_ptr<ExtensionEnableFlow> extension_enable_flow_; 103 104 DISALLOW_COPY_AND_ASSIGN(EphemeralAppLauncher); 105}; 106 107#endif // CHROME_BROWSER_APPS_EPHEMERAL_APP_LAUNCHER_H_ 108