• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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